changeset 8566:48a4d9f4c6f8 libavcodec

RV30 decoder passes possible frame sizes in extradata and selects an appropriate frame size from them in slice, make my decoder do that as well. This fixes issue 779
author kostya
date Sun, 11 Jan 2009 08:03:45 +0000
parents 6687083ec76a
children 0d5b2b0e7a87
files rv30.c
diffstat 1 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rv30.c	Sun Jan 11 00:48:20 2009 +0000
+++ b/rv30.c	Sun Jan 11 08:03:45 2009 +0000
@@ -38,6 +38,7 @@
     int mb_bits;
     int w = r->s.width, h = r->s.height;
     int mb_size;
+    int rpr;
 
     memset(si, 0, sizeof(SliceInfo));
     if(get_bits(gb, 3))
@@ -49,9 +50,14 @@
     si->quant = get_bits(gb, 5);
     skip_bits1(gb);
     si->pts = get_bits(gb, 13);
-    skip_bits(gb, r->rpr);
-    si->width  = w;
-    si->height = h;
+    rpr = get_bits(gb, r->rpr);
+    if(!rpr){
+        si->width  = w;
+        si->height = h;
+    }else{
+        si->width  = r->s.avctx->extradata[6 + rpr*2] << 2;
+        si->height = r->s.avctx->extradata[7 + rpr*2] << 2;
+    }
     mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
     mb_bits = ff_rv34_get_start_offset(gb, mb_size);
     si->start = get_bits(gb, mb_bits);
@@ -248,6 +254,10 @@
     }
     r->rpr = (avctx->extradata[1] & 7) >> 1;
     r->rpr = FFMIN(r->rpr + 1, 3);
+    if(avctx->extradata_size - 8 < (r->rpr - 1) * 2){
+        av_log(avctx, AV_LOG_ERROR, "Insufficient extradata - need at least %d bytes, got %d\n",
+               6 + r->rpr * 2, avctx->extradata_size);
+    }
     r->parse_slice_header = rv30_parse_slice_header;
     r->decode_intra_types = rv30_decode_intra_types;
     r->decode_mb_info     = rv30_decode_mb_info;