summaryrefslogtreecommitdiff
path: root/libavcodec/rv30.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2009-01-11 08:03:45 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2009-01-11 08:03:45 +0000
commit6751a00a3f5c0ecaec134686cd1e02d16aaca099 (patch)
tree6bfd57a92669282bf1763f4b503e6822b2699087 /libavcodec/rv30.c
parentfd7f59639c43f0ab6b83ad2c1ceccafc553d7845 (diff)
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 Originally committed as revision 16529 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/rv30.c')
-rw-r--r--libavcodec/rv30.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/libavcodec/rv30.c b/libavcodec/rv30.c
index 97d87b0710..0528f010b6 100644
--- a/libavcodec/rv30.c
+++ b/libavcodec/rv30.c
@@ -38,6 +38,7 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
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 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
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 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx)
}
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;