ffv1: Always store slice size when error reobustness is enabled.
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 25 Apr 2012 10:01:44 +0000 (12:01 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 25 Apr 2012 10:01:44 +0000 (12:01 +0200)
This simplifies finding slices within a damaged bitstream.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/ffv1.c

index 3a957b1..5e8fd18 100644 (file)
@@ -1290,7 +1290,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
             flush_put_bits(&fs->pb); //nicer padding FIXME
             bytes= fs->ac_byte_count + (put_bits_count(&fs->pb)+7)/8;
         }
-        if(i>0){
+        if(i>0 || f->ec){
             av_assert0(bytes < pkt->size/f->slice_count);
             memmove(buf_p, fs->c.bytestream_start, bytes);
             av_assert0(bytes < (1<<24));
@@ -1990,8 +1990,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
         int trailer = 3 + 4*!!f->ec;
         int v;
 
-        if(i) v = AV_RB24(buf_p-trailer)+trailer;
-        else  v = buf_p - c->bytestream_start;
+        if(i || f->ec) v = AV_RB24(buf_p-trailer)+trailer;
+        else           v = buf_p - c->bytestream_start;
         if(buf_p - c->bytestream_start < v){
             av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
             return -1;