diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2006-09-30 11:31:15 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2006-09-30 11:31:15 +0000 |
commit | 113533a58215ee692406fbc983148f8cf8bb6263 (patch) | |
tree | d6698003714fcd5ca7d67ff77520cd3ac94920cd /libavcodec | |
parent | 78a5ec27aa915a731b386c851bf83982236af3e7 (diff) | |
download | ffmpeg-113533a58215ee692406fbc983148f8cf8bb6263.tar.gz |
support resolution switching, fixes rv20errors.rm
Originally committed as revision 6390 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/rv10.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index da78ae7f91..47445da354 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -383,8 +383,9 @@ static int rv20_decode_picture_header(MpegEncContext *s) av_log(s->avctx, AV_LOG_DEBUG, "\n"); #endif #if 0 + av_log(s->avctx, AV_LOG_DEBUG, "%3dx%03d/%02Xx%02X ", s->width, s->height, s->width/4, s->height/4); for(i=0; i<s->avctx->extradata_size; i++){ - av_log(s->avctx, AV_LOG_DEBUG, "%2X ", ((uint8_t*)s->avctx->extradata)[i]); + av_log(s->avctx, AV_LOG_DEBUG, "%02X ", ((uint8_t*)s->avctx->extradata)[i]); if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " "); } av_log(s->avctx, AV_LOG_DEBUG, "\n"); @@ -431,17 +432,32 @@ static int rv20_decode_picture_header(MpegEncContext *s) } if(s->avctx->has_b_frames){ - int f=9; + int f, new_w, new_h; int v= s->avctx->extradata_size >= 4 ? ((uint8_t*)s->avctx->extradata)[1] : 0; if (get_bits(&s->gb, 1)){ av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n"); // return -1; } - seq= get_bits(&s->gb, 14)<<1; + seq= get_bits(&s->gb, 13)<<2; - if(v) - f= get_bits(&s->gb, av_log2(v)); + f= get_bits(&s->gb, av_log2(v)+1); + + if(f){ + new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f]; + new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f]; + }else{ + new_w= s->width; //FIXME wrong we of course must save the original in the context + new_h= s->height; + } + if(new_w != s->width || new_h != s->height){ + av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h); + MPV_common_end(s); + s->width = s->avctx->width = new_w; + s->height = s->avctx->height= new_h; + if (MPV_common_init(s) < 0) + return -1; + } if(s->avctx->debug & FF_DEBUG_PICT_INFO){ av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v); |