[FFmpeg-cvslog] ffv1: Remove slice count field with 1.3 and just count slices.

Michael Niedermayer git at videolan.org
Wed Apr 25 15:14:58 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Apr 25 15:01:32 2012 +0200| [60217b5b9cf713b1eeb7626473eac357cde25673] | committer: Michael Niedermayer

ffv1: Remove slice count field with 1.3 and just count slices.

This field was problematic because in case of damaged slices it can be
lost

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=60217b5b9cf713b1eeb7626473eac357cde25673
---

 libavcodec/ffv1.c |   21 +++++++++++++++------
 1 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index fc68c8c..c31c3ff 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -660,9 +660,8 @@ static void write_header(FFV1Context *f){
         put_rac(c, state, f->transparency);
 
         write_quant_tables(c, f->quant_table);
-    }else{
+    }else if(f->version < 3){
         put_symbol(c, state, f->slice_count, 0);
-        if(f->version < 3){
         for(i=0; i<f->slice_count; i++){
             FFV1Context *fs= f->slice_context[i];
             put_symbol(c, state, (fs->slice_x     +1)*f->num_h_slices / f->width   , 0);
@@ -674,7 +673,6 @@ static void write_header(FFV1Context *f){
                 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
             }
         }
-        }
     }
 }
 #endif /* CONFIG_FFV1_ENCODER */
@@ -1862,10 +1860,21 @@ static int read_header(FFV1Context *f){
                 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
                 return -1;
         }
-    }else{
+    }else if(f->version < 3){
         f->slice_count= get_symbol(c, state, 0);
-        if(f->slice_count > (unsigned)MAX_SLICES)
-            return -1;
+    }else{
+        const uint8_t *p= c->bytestream_end;
+        for(f->slice_count = 0; f->slice_count < MAX_SLICES && 3 < p - c->bytestream_start; f->slice_count++){
+            int trailer = 3 + 5*!!f->ec;
+            int size = AV_RB24(p-trailer);
+            if(size + trailer > p - c->bytestream_start)
+                break;
+            p -= size + trailer;
+        }
+    }
+    if(f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0){
+        av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid\n", f->slice_count);
+        return -1;
     }
 
     for(j=0; j<f->slice_count; j++){



More information about the ffmpeg-cvslog mailing list