summaryrefslogtreecommitdiff
path: root/libavcodec/ffv1.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-04-25 15:01:32 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-04-25 15:01:32 +0200
commit60217b5b9cf713b1eeb7626473eac357cde25673 (patch)
tree700a56a2b6843ac23fb934562febd65ff5509ed2 /libavcodec/ffv1.c
parent3ed6917ab88424bff0d6c53e51781a93ec5fe8f7 (diff)
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@gmx.at>
Diffstat (limited to 'libavcodec/ffv1.c')
-rw-r--r--libavcodec/ffv1.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index fc68c8ca28..c31c3ff51e 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++){