use custom packet allocation only for DV
authorFabrice Bellard <fabrice@bellard.org>
Sat, 7 Jun 2003 18:36:27 +0000 (18:36 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Sat, 7 Jun 2003 18:36:27 +0000 (18:36 +0000)
Originally committed as revision 1937 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avidec.c

index 5d3bb8a..dbfef1d 100644 (file)
@@ -296,9 +296,17 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
     int n, d[8], size, i;
 
     memset(d, -1, sizeof(int)*8);
-
-    if (avi->type == 1 && avi->stream_index)
-        goto pkt_init;
+    
+    if (avi->type == 1 && avi->stream_index) {
+        /* duplicate DV packet */
+        av_init_packet(pkt);
+        pkt->data = avi->buf;
+        pkt->size = avi->buf_size;
+        pkt->destruct = __destruct_pkt;
+        pkt->stream_index = avi->stream_index;
+        avi->stream_index = !avi->stream_index;
+        return 0;
+    }
 
     for(i=url_ftell(pb); !url_feof(pb); i++) {
         int j;
@@ -346,31 +354,29 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
             && n < s->nb_streams
             && i + size <= avi->movi_end) {
         
-           uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE);
-           if (!tbuf)
-               return -1;
-           avi->buf = tbuf;
-            avi->buf_size = size;
-           get_buffer(pb, avi->buf, size);
-           if (size & 1)
-               get_byte(pb);
-           if (avi->type != 1)
-               avi->stream_index = n;
-           goto pkt_init;
+            if (avi->type == 1) {
+                uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE);
+                if (!tbuf)
+                    return -1;
+                avi->buf = tbuf;
+                avi->buf_size = size;
+                av_init_packet(pkt);
+                pkt->data = avi->buf;
+                pkt->size = avi->buf_size;
+                pkt->destruct = __destruct_pkt;
+                avi->stream_index = n;
+            } else {
+                av_new_packet(pkt, size);
+            }
+            get_buffer(pb, pkt->data, size);
+            if (size & 1)
+                get_byte(pb);
+            pkt->stream_index = n;
+            pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that
+            return 0;
         }
     }
-    
     return -1;
-
-pkt_init:
-    av_init_packet(pkt);
-    pkt->data = avi->buf;
-    pkt->size = avi->buf_size;
-    pkt->destruct = __destruct_pkt;
-    pkt->stream_index = avi->stream_index;
-    pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that
-    avi->stream_index = !avi->stream_index;
-    return 0;
 }
 
 static int avi_read_close(AVFormatContext *s)