]> git.sesse.net Git - ffmpeg/commitdiff
off by 1 error bugfix
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 29 Jun 2005 08:41:01 +0000 (08:41 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 29 Jun 2005 08:41:01 +0000 (08:41 +0000)
avoid adding duplicate global headers to the bitstream

Originally committed as revision 4410 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/parser.c

index 88c57096d4fc5126a2f922b779730447112eb19b..280bb45f578b518b27c056c88be44ebfadcbfffa 100644 (file)
@@ -142,13 +142,17 @@ int av_parser_parse(AVCodecParserContext *s,
     return index;
 }
 
+/**
+ *
+ * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
+ */
 int av_parser_change(AVCodecParserContext *s,
                      AVCodecContext *avctx,
                      uint8_t **poutbuf, int *poutbuf_size, 
                      const uint8_t *buf, int buf_size, int keyframe){
    
     if(s && s->parser->split){
-        if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) && !(avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
+        if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
             int i= s->parser->split(avctx, buf, buf_size);
             buf += i;
             buf_size -= i;
@@ -166,7 +170,7 @@ int av_parser_change(AVCodecParserContext *s,
             *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
             
             memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
-            memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size);
+            memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
             return 1;
         }
     }
@@ -456,7 +460,7 @@ static int mpegvideo_split(AVCodecContext *avctx,
     for(i=0; i<buf_size; i++){
         state= (state<<8) | buf[i];
         if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100)
-            return i-4;
+            return i-3;
     }
     return 0;
 }
@@ -548,7 +552,7 @@ static int mpeg4video_split(AVCodecContext *avctx,
     for(i=0; i<buf_size; i++){
         state= (state<<8) | buf[i];
         if(state == 0x1B3 || state == 0x1B6)
-            return i-4;
+            return i-3;
     }
     return 0;
 }