vc1: fix VC-1 Pulldown handling.

Pulldown flags are being set incorrectly and AVFrame->repeat_pict is not
being set.  Also, skipped frames exit header parsing too early and do not
set pulldown flags appropriately. Ticks_per_frame needs to be set and
time_base adjusted so player can extend frame duration by a field time.

This fixes problems encountered when attempting to transcode HD-DVD EVOB
files with HandBrake. Also makes these files play smoothly in avplay.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
John Stebbins 2011-08-25 12:36:13 -07:00 committed by Ronald S. Bultje
parent 1cf82cab08
commit 0d802ac54e
3 changed files with 36 additions and 2 deletions

View file

@ -45,6 +45,7 @@ static void vc1_extract_headers(AVCodecParserContext *s, AVCodecContext *avctx,
vpc->v.s.avctx = avctx;
vpc->v.parse_only = 1;
next = buf;
s->repeat_pict = 0;
for(start = buf, end = buf + buf_size; next < end; start = next){
int buf2_size, size;
@ -73,6 +74,20 @@ static void vc1_extract_headers(AVCodecParserContext *s, AVCodecContext *avctx,
else
s->pict_type = vpc->v.s.pict_type;
if (avctx->ticks_per_frame > 1){
// process pulldown flags
s->repeat_pict = 1;
// Pulldown flags are only valid when 'broadcast' has been set.
// So ticks_per_frame will be 2
if (vpc->v.rff){
// repeat field
s->repeat_pict = 2;
}else if (vpc->v.rptfrm){
// repeat frames
s->repeat_pict = vpc->v.rptfrm * 2 + 1;
}
}
break;
}
}