]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
write error handling
authormichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 8 Oct 2004 20:09:52 +0000 (20:09 +0000)
committermichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Fri, 8 Oct 2004 20:09:52 +0000 (20:09 +0000)
git-svn-id: file:///var/local/repositories/ffmpeg/trunk@3572 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavformat/avformat.h
libavformat/avio.h
libavformat/aviobuf.c
libavformat/utils.c

index 4994b6ac78491ddf63db4334564a4b1852e018bb..4cd9da59e8cb8fe00d71e9ebe7de45660d9d69d8 100644 (file)
@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-#define LIBAVFORMAT_BUILD       4617
+#define LIBAVFORMAT_BUILD       4618
 
 #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
 #define LIBAVFORMAT_VERSION     FFMPEG_VERSION
index 53ed22a3a1a30d03bfa8fbabb0c00b20991c6d7e..f834ef34a79bbe54a53ea9d6e0265fd6b19d97b0 100644 (file)
@@ -70,7 +70,7 @@ typedef struct {
     unsigned char *buf_ptr, *buf_end;
     void *opaque;
     int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
-    void (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
+    int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
     int (*seek)(void *opaque, offset_t offset, int whence);
     offset_t pos; /* position in the file of the current buffer */
     int must_flush; /* true if the next seek should flush */
@@ -81,6 +81,7 @@ typedef struct {
     unsigned long checksum;
     unsigned char *checksum_ptr;
     unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
+    int error;         ///< contains the error code or 0 if no error happened
 } ByteIOContext;
 
 int init_put_byte(ByteIOContext *s,
@@ -89,7 +90,7 @@ int init_put_byte(ByteIOContext *s,
                   int write_flag,
                   void *opaque,
                   int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
-                  void (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
+                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
                   int (*seek)(void *opaque, offset_t offset, int whence));
 
 void put_byte(ByteIOContext *s, int b);
@@ -109,6 +110,7 @@ offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
 void url_fskip(ByteIOContext *s, offset_t offset);
 offset_t url_ftell(ByteIOContext *s);
 int url_feof(ByteIOContext *s);
+int url_ferror(ByteIOContext *s);
 
 #define URL_EOF (-1)
 int url_fgetc(ByteIOContext *s);
index 0ad63299a4f3ceab1f0314ca346dd1f92760870b..31c6a7fec55d5e55e86fac8b63cf9d737edb5cde 100644 (file)
@@ -28,7 +28,7 @@ int init_put_byte(ByteIOContext *s,
                   int write_flag,
                   void *opaque,
                   int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
-                  void (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
+                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
                   int (*seek)(void *opaque, offset_t offset, int whence))
 {
     s->buffer = buffer;
@@ -46,6 +46,7 @@ int init_put_byte(ByteIOContext *s,
     s->pos = 0;
     s->must_flush = 0;
     s->eof_reached = 0;
+    s->error = 0;
     s->is_streamed = 0;
     s->max_packet_size = 0;
     s->update_checksum= NULL;
@@ -57,8 +58,12 @@ int init_put_byte(ByteIOContext *s,
 static void flush_buffer(ByteIOContext *s)
 {
     if (s->buf_ptr > s->buffer) {
-        if (s->write_packet)
-            s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer);
+        if (s->write_packet && !s->error){
+            int ret= s->write_packet(s->opaque, s->buffer, s->buf_ptr - s->buffer);
+            if(ret < 0){
+                s->error = ret;
+            }
+        }
         if(s->update_checksum){
             s->checksum= s->update_checksum(s->checksum, s->checksum_ptr, s->buf_ptr - s->checksum_ptr);
             s->checksum_ptr= s->buffer;
@@ -172,6 +177,11 @@ int url_feof(ByteIOContext *s)
     return s->eof_reached;
 }
 
+int url_ferror(ByteIOContext *s)
+{
+    return s->error;
+}
+
 #ifdef CONFIG_ENCODERS
 void put_le32(ByteIOContext *s, unsigned int val)
 {
@@ -260,6 +270,8 @@ static void fill_buffer(ByteIOContext *s)
         /* do not modify buffer if EOF reached so that a seek back can
            be done without rereading data */
         s->eof_reached = 1;
+    if(len<0)
+        s->error= len;
     } else {
         s->pos += len;
         s->buf_ptr = s->buffer;
@@ -432,10 +444,10 @@ uint64_t get_be64(ByteIOContext *s)
 /* link with avio functions */
 
 #ifdef CONFIG_ENCODERS
-static void url_write_packet(void *opaque, uint8_t *buf, int buf_size)
+static int url_write_packet(void *opaque, uint8_t *buf, int buf_size)
 {
     URLContext *h = opaque;
-    url_write(h, buf, buf_size);
+    return url_write(h, buf, buf_size);
 }
 #else
 #define        url_write_packet NULL
@@ -609,7 +621,7 @@ typedef struct DynBuffer {
     uint8_t io_buffer[1];
 } DynBuffer;
 
-static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
+static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
 {
     DynBuffer *d = opaque;
     int new_size, new_allocated_size;
@@ -627,28 +639,32 @@ static void dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
     if (new_allocated_size > d->allocated_size) {
         d->buffer = av_realloc(d->buffer, new_allocated_size);
         if(d->buffer == NULL)
-             return ;
+             return -1234;
         d->allocated_size = new_allocated_size;
     }
     memcpy(d->buffer + d->pos, buf, buf_size);
     d->pos = new_size;
     if (d->pos > d->size)
         d->size = d->pos;
+    return buf_size;
 }
 
-static void dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size)
+static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size)
 {
     unsigned char buf1[4];
+    int ret;
 
     /* packetized write: output the header */
     buf1[0] = (buf_size >> 24);
     buf1[1] = (buf_size >> 16);
     buf1[2] = (buf_size >> 8);
     buf1[3] = (buf_size);
-    dyn_buf_write(opaque, buf1, 4);
+    ret= dyn_buf_write(opaque, buf1, 4);
+    if(ret < 0)
+        return ret;
 
     /* then the data */
-    dyn_buf_write(opaque, buf, buf_size);
+    return dyn_buf_write(opaque, buf, buf_size);
 }
 
 static int dyn_buf_seek(void *opaque, offset_t offset, int whence)
index 7129b39b760ea9a3b4cb40e59276bf9d9ad82467..788f4ab2c928a09cc5a937d88448eb1a76bf2273 100644 (file)
@@ -1996,11 +1996,16 @@ static void truncate_ts(AVStream *st, AVPacket *pkt){
  */
 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
 {
+    int ret;
+
     compute_pkt_fields2(s->streams[pkt->stream_index], pkt);
     
     truncate_ts(s->streams[pkt->stream_index], pkt);
 
-    return s->oformat->write_packet(s, pkt);
+    ret= s->oformat->write_packet(s, pkt);
+    if(!ret)
+        ret= url_ferror(&s->pb);
+    return ret;
 }
 
 /**
@@ -2111,6 +2116,8 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt){
         
         if(ret<0)
             return ret;
+        if(url_ferror(&s->pb))
+            return url_ferror(&s->pb);
     }
 }
 
@@ -2139,10 +2146,14 @@ int av_write_trailer(AVFormatContext *s)
         
         if(ret<0)
             goto fail;
+        if(url_ferror(&s->pb))
+            goto fail;
     }
 
     ret = s->oformat->write_trailer(s);
 fail:
+    if(ret == 0)
+       ret=url_ferror(&s->pb);
     for(i=0;i<s->nb_streams;i++)
         av_freep(&s->streams[i]->priv_data);
     av_freep(&s->priv_data);