diff rv30.c @ 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 51c9946c70f9
children 4a93620c5aac
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;