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
This commit is contained in:
parent
fd7f59639c
commit
6751a00a3f
1 changed files with 13 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue