# HG changeset patch # User kostya # Date 1231661025 0 # Node ID 48a4d9f4c6f833a3321b8d65016a16e5d2ff1395 # Parent 6687083ec76a5e3137b2f8c35f91d64deff7ddac 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 diff -r 6687083ec76a -r 48a4d9f4c6f8 rv30.c --- 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;