changeset 2453:f67b63ed036d libavcodec

avoid buf_size == 0 checks in every decoder
author michael
date Sun, 23 Jan 2005 18:09:06 +0000
parents 73a66a4a6ab4
children 300f1207768d
files 4xm.c 8bps.c asv1.c avcodec.h cljr.c dv.c ffv1.c h261.c h263dec.c h264.c huffyuv.c indeo3.c lcl.c mdec.c mjpeg.c mpeg12.c msrle.c msvideo1.c png.c pnm.c qdrw.c qpeg.c qtrle.c rpza.c rv10.c smc.c snow.c svq1.c svq3.c truemotion1.c tscc.c utils.c vc9.c vcr1.c xl.c
diffstat 35 files changed, 24 insertions(+), 148 deletions(-) [+]
line wrap: on
line diff
--- a/4xm.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/4xm.c	Sun Jan 23 18:09:06 2005 +0000
@@ -605,11 +605,6 @@
     AVFrame *p, temp;
     int i, frame_4cc, frame_size;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     frame_4cc= get32(buf);
     if(buf_size != get32(buf+4)+8){
         av_log(f->avctx, AV_LOG_ERROR, "size missmatch %d %d\n", buf_size, get32(buf+4));
--- a/8bps.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/8bps.c	Sun Jan 23 18:09:06 2005 +0000
@@ -70,11 +70,6 @@
 	unsigned int planes = c->planes;
 	unsigned char *planemap = c->planemap;
   
-  
-	/* no supplementary picture */
-	if (buf_size == 0)
-		return 0;
-
 	if(c->pic.data[0])
 		avctx->release_buffer(avctx, &c->pic);
 
--- a/asv1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/asv1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -409,11 +409,6 @@
     AVFrame * const p= (AVFrame*)&a->picture;
     int mb_x, mb_y;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/avcodec.h	Sun Jan 23 17:59:01 2005 +0000
+++ b/avcodec.h	Sun Jan 23 18:09:06 2005 +0000
@@ -338,7 +338,10 @@
 #define CODEC_CAP_TRUNCATED       0x0008
 /* codec can export data for HW decoding (XvMC) */
 #define CODEC_CAP_HWACCEL         0x0010
-/** codec has a non zero delay and needs to be feeded with NULL at the end to get the delayed data */
+/** 
+ * codec has a non zero delay and needs to be feeded with NULL at the end to get the delayed data.
+ * if this is not set, the codec is guranteed to never be feeded with NULL data
+ */
 #define CODEC_CAP_DELAY           0x0020
 
 //the following defines might change, so dont expect compatibility if u use them
--- a/cljr.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/cljr.c	Sun Jan 23 18:09:06 2005 +0000
@@ -43,11 +43,6 @@
     AVFrame * const p= (AVFrame*)&a->picture;
     int x, y;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/dv.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/dv.c	Sun Jan 23 18:09:06 2005 +0000
@@ -888,10 +888,6 @@
 {
     DVVideoContext *s = avctx->priv_data;
   
-    /* special case for last picture */
-    if(buf_size==0)
-        return 0;
-    
     s->sys = dv_frame_profile(buf);
     if (!s->sys || buf_size < s->sys->frame_size)
         return -1; /* NOTE: we only accept several full frames */
--- a/ffv1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/ffv1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -952,10 +952,6 @@
 
     AVFrame *picture = data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     ff_init_range_decoder(c, buf, buf_size);
     ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
 
--- a/h261.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/h261.c	Sun Jan 23 18:09:06 2005 +0000
@@ -925,11 +925,6 @@
     s->flags= avctx->flags;
     s->flags2= avctx->flags2;
 
-    /* no supplementary picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-    
     h->gob_start_code_skipped=0;
 
 retry:
--- a/h263dec.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/h263dec.c	Sun Jan 23 18:09:06 2005 +0000
@@ -793,7 +793,7 @@
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .options = mpeg4_decoptions,
     .flush= ff_mpeg_flush,
 };
@@ -807,7 +807,7 @@
     NULL,
     ff_h263_decode_end,
     ff_h263_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
--- a/h264.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/h264.c	Sun Jan 23 18:09:06 2005 +0000
@@ -6592,7 +6592,7 @@
     NULL,
     decode_end,
     decode_frame,
-    /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
 };
 
 AVCodecParser h264_parser = {
--- a/huffyuv.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/huffyuv.c	Sun Jan 23 18:09:06 2005 +0000
@@ -770,10 +770,6 @@
 
     AVFrame *picture = data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-        
     s->bitstream_buffer= av_fast_realloc(s->bitstream_buffer, &s->bitstream_buffer_size, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
 
     s->dsp.bswap_buf((uint32_t*)s->bitstream_buffer, (uint32_t*)buf, buf_size/4);
--- a/indeo3.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/indeo3.c	Sun Jan 23 18:09:06 2005 +0000
@@ -1066,11 +1066,6 @@
     unsigned char *src, *dest;
     int y;
 
-    /* no supplementary picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     iv_decode_frame(s, buf, buf_size);
 
     if(s->frame.data[0])
--- a/lcl.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/lcl.c	Sun Jan 23 18:09:06 2005 +0000
@@ -214,10 +214,6 @@
 #endif
     unsigned int len = buf_size;
 
-	/* no supplementary picture */
-	if (buf_size == 0)
-		return 0;
-
 	if(c->pic.data[0])
 		avctx->release_buffer(avctx, &c->pic);
 
--- a/mdec.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/mdec.c	Sun Jan 23 18:09:06 2005 +0000
@@ -163,11 +163,6 @@
     AVFrame * const p= (AVFrame*)&a->picture;
     int i;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/mjpeg.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/mjpeg.c	Sun Jan 23 18:09:06 2005 +0000
@@ -1826,10 +1826,6 @@
     int start_code;
     AVFrame *picture = data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     buf_ptr = buf;
     buf_end = buf + buf_size;
     while (buf_ptr < buf_end) {
@@ -2002,10 +1998,6 @@
     uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
     uint32_t field_size, sod_offs;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     buf_ptr = buf;
     buf_end = buf + buf_size;
     
@@ -2115,10 +2107,6 @@
     uint8_t *buf_ptr, *buf_end, *recoded;
     int i = 0, j = 0;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     if (!avctx->width || !avctx->height)
 	return -1;
 
--- a/mpeg12.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/mpeg12.c	Sun Jan 23 18:09:06 2005 +0000
@@ -3100,7 +3100,7 @@
     NULL,
     mpeg_decode_end,
     mpeg_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
@@ -3113,7 +3113,7 @@
     NULL,
     mpeg_decode_end,
     mpeg_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
@@ -3127,7 +3127,7 @@
     NULL,
     mpeg_decode_end,
     mpeg_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
@@ -3190,7 +3190,7 @@
     NULL,
     mpeg_decode_end,
     mpeg_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
--- a/msrle.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/msrle.c	Sun Jan 23 18:09:06 2005 +0000
@@ -254,10 +254,6 @@
 {
     MsrleContext *s = (MsrleContext *)avctx->priv_data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     s->buf = buf;
     s->size = buf_size;
 
--- a/msvideo1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/msvideo1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -302,10 +302,6 @@
 {
     Msvideo1Context *s = (Msvideo1Context *)avctx->priv_data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     s->buf = buf;
     s->size = buf_size;
 
--- a/png.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/png.c	Sun Jan 23 18:09:06 2005 +0000
@@ -479,11 +479,6 @@
     uint32_t tag, length;
     int ret, crc;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-    
     s->bytestream_start=
     s->bytestream= buf;
     s->bytestream_end= buf + buf_size;
--- a/pnm.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/pnm.c	Sun Jan 23 18:09:06 2005 +0000
@@ -165,11 +165,6 @@
     int i, n, linesize, h;
     unsigned char *ptr;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-    
     s->bytestream_start=
     s->bytestream= buf;
     s->bytestream_end= buf + buf_size;
--- a/qdrw.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/qdrw.c	Sun Jan 23 18:09:06 2005 +0000
@@ -42,11 +42,6 @@
     int colors;
     int i;
     
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/qpeg.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/qpeg.c	Sun Jan 23 18:09:06 2005 +0000
@@ -237,11 +237,6 @@
     uint8_t* outdata;
     int delta;
     
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/qtrle.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/qtrle.c	Sun Jan 23 18:09:06 2005 +0000
@@ -530,10 +530,6 @@
 {
     QtrleContext *s = (QtrleContext *)avctx->priv_data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     s->buf = buf;
     s->size = buf_size;
 
--- a/rpza.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/rpza.c	Sun Jan 23 18:09:06 2005 +0000
@@ -248,10 +248,6 @@
 {
     RpzaContext *s = (RpzaContext *)avctx->priv_data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     s->buf = buf;
     s->size = buf_size;
 
--- a/rv10.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/rv10.c	Sun Jan 23 18:09:06 2005 +0000
@@ -763,7 +763,7 @@
     NULL,
     rv10_decode_end,
     rv10_decode_frame,
-    CODEC_CAP_DR1,
+    CODEC_CAP_DR1 | CODEC_CAP_DELAY,
     .flush= ff_mpeg_flush,
 };
 
--- a/smc.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/smc.c	Sun Jan 23 18:09:06 2005 +0000
@@ -448,10 +448,6 @@
 {
     SmcContext *s = (SmcContext *)avctx->priv_data;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     s->buf = buf;
     s->size = buf_size;
 
--- a/snow.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/snow.c	Sun Jan 23 18:09:06 2005 +0000
@@ -2911,11 +2911,6 @@
     int bytes_read;
     AVFrame *picture = data;
     int level, orientation, plane_index;
-    
-
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
 
     ff_init_range_decoder(c, buf, buf_size);
     ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
--- a/svq1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/svq1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -713,10 +713,6 @@
   int		result, i, x, y, width, height;
   AVFrame *pict = data; 
 
-  if(buf==NULL && buf_size==0){
-      return 0;
-  }
-  
   /* initialize bit buffer */
   init_get_bits(&s->gb,buf,buf_size*8);
 
--- a/svq3.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/svq3.c	Sun Jan 23 18:09:06 2005 +0000
@@ -1004,5 +1004,5 @@
     NULL,
     decode_end,
     svq3_decode_frame,
-    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
+    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
 };
--- a/truemotion1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/truemotion1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -873,10 +873,6 @@
     s->buf = buf;
     s->size = buf_size;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     if (truemotion1_decode_header(s) == -1)
         return -1;
 
--- a/tscc.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/tscc.c	Sun Jan 23 18:09:06 2005 +0000
@@ -155,10 +155,6 @@
 #endif
     int len = buf_size;
 
-    /* no supplementary picture */
-    if (buf_size == 0)
-        return 0;
-
     if(c->pic.data[0])
             avctx->release_buffer(avctx, &c->pic);
 
--- a/utils.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/utils.c	Sun Jan 23 18:09:06 2005 +0000
@@ -587,13 +587,17 @@
     *got_picture_ptr= 0;
     if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height))
         return -1;
-    ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 
-                               buf, buf_size);
+    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
+        ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 
+                                buf, buf_size);
 
-    emms_c(); //needed to avoid a emms_c() call before every return;
+        emms_c(); //needed to avoid a emms_c() call before every return;
     
-    if (*got_picture_ptr)                           
-        avctx->frame_number++;
+        if (*got_picture_ptr)                           
+            avctx->frame_number++;
+    }else
+        ret= 0;
+
     return ret;
 }
 
--- a/vc9.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/vc9.c	Sun Jan 23 18:09:06 2005 +0000
@@ -1705,7 +1705,7 @@
     NULL,
     vc9_decode_end,
     vc9_decode_frame,
-    0,
+    CODEC_CAP_DELAY,
     NULL
 };
 
@@ -1718,6 +1718,6 @@
     NULL,
     vc9_decode_end,
     vc9_decode_frame,
-    0,
+    CODEC_CAP_DELAY,
     NULL
 };
--- a/vcr1.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/vcr1.c	Sun Jan 23 18:09:06 2005 +0000
@@ -45,11 +45,6 @@
     uint8_t *bytestream= buf;
     int i, x, y;
 
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
-
     if(p->data[0])
         avctx->release_buffer(avctx, p);
 
--- a/xl.c	Sun Jan 23 17:59:01 2005 +0000
+++ b/xl.c	Sun Jan 23 18:09:06 2005 +0000
@@ -48,12 +48,6 @@
     int stride;
     uint32_t val;
     int y0, y1, y2, y3, c0, c1;
-        
-    
-    /* special case for last picture */
-    if (buf_size == 0) {
-        return 0;
-    }
 
     if(p->data[0])
         avctx->release_buffer(avctx, p);