Mercurial > libavcodec.hg
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;