--- libavcodec/h264_parser.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 3ed7d77..bca0071 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -61,6 +61,7 @@ typedef struct H264ParseContext { int parse_history_count; int parse_last_mb; int64_t reference_dts; + int last_frame_num, last_picture_structure; } H264ParseContext; @@ -528,7 +529,19 @@ static inline int parse_nal_units(AVCodecParserContext *s, s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; else s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; - s->field_order = AV_FIELD_UNKNOWN; + if (p->poc.frame_num == p->last_frame_num && + p->last_picture_structure != AV_PICTURE_STRUCTURE_UNKNOWN && + p->last_picture_structure != AV_PICTURE_STRUCTURE_FRAME && + p->last_picture_structure != s->picture_structure) { + if (p->last_picture_structure == AV_PICTURE_STRUCTURE_TOP_FIELD) + s->field_order = AV_FIELD_TT; + else + s->field_order = AV_FIELD_BB; + } else { + s->field_order = AV_FIELD_UNKNOWN; + } + p->last_picture_structure = s->picture_structure; + p->last_frame_num = p->poc.frame_num; } av_freep(&nal.rbsp_buffer); @@ -677,6 +690,7 @@ static av_cold int init(AVCodecParserContext *s) H264ParseContext *p = s->priv_data; p->reference_dts = AV_NOPTS_VALUE; + p->last_frame_num = INT_MAX; ff_h264dsp_init(&p->h264dsp, 8, 1); return 0; } -- 2.10.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel