X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvc1_parser.c;h=a4130d9885693bae36ceda3398822982b0be3d21;hb=bd36ec55bef7c446079e192655d065fd86483876;hp=4ea9c4707650fd9b062e2f9a1b6fec8a6fd1bbc1;hpb=ada49f936eaafe12365c7b962355d6dcfbfc4029;p=ffmpeg diff --git a/libavcodec/vc1_parser.c b/libavcodec/vc1_parser.c index 4ea9c470765..a4130d98856 100644 --- a/libavcodec/vc1_parser.c +++ b/libavcodec/vc1_parser.c @@ -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; } } @@ -81,7 +96,7 @@ static void vc1_extract_headers(AVCodecParserContext *s, AVCodecContext *avctx, } /** - * finds the end of the current frame in the bitstream. + * Find the end of the current frame in the bitstream. * @return the position of the first byte of the next frame, or -1 */ static int vc1_find_frame_end(ParseContext *pc, const uint8_t *buf, @@ -169,11 +184,18 @@ static int vc1_split(AVCodecContext *avctx, return 0; } +static int vc1_parse_init(AVCodecParserContext *s) +{ + VC1ParseContext *vpc = s->priv_data; + vpc->v.s.slice_context_count = 1; + return 0; +} + AVCodecParser ff_vc1_parser = { - { CODEC_ID_VC1 }, - sizeof(VC1ParseContext), - NULL, - vc1_parse, - ff_parse1_close, - vc1_split, + .codec_ids = { CODEC_ID_VC1 }, + .priv_data_size = sizeof(VC1ParseContext), + .parser_init = vc1_parse_init, + .parser_parse = vc1_parse, + .parser_close = ff_parse1_close, + .split = vc1_split, };