| @@ -61,6 +61,7 @@ typedef struct H264ParseContext { | |||||
| int parse_history_count; | int parse_history_count; | ||||
| int parse_last_mb; | int parse_last_mb; | ||||
| int64_t reference_dts; | int64_t reference_dts; | ||||
| int last_frame_num, last_picture_structure; | |||||
| } H264ParseContext; | } H264ParseContext; | ||||
| @@ -528,7 +529,19 @@ static inline int parse_nal_units(AVCodecParserContext *s, | |||||
| s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | s->picture_structure = AV_PICTURE_STRUCTURE_TOP_FIELD; | ||||
| else | else | ||||
| s->picture_structure = AV_PICTURE_STRUCTURE_BOTTOM_FIELD; | 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); | av_freep(&nal.rbsp_buffer); | ||||
| @@ -677,6 +690,7 @@ static av_cold int init(AVCodecParserContext *s) | |||||
| H264ParseContext *p = s->priv_data; | H264ParseContext *p = s->priv_data; | ||||
| p->reference_dts = AV_NOPTS_VALUE; | p->reference_dts = AV_NOPTS_VALUE; | ||||
| p->last_frame_num = INT_MAX; | |||||
| ff_h264dsp_init(&p->h264dsp, 8, 1); | ff_h264dsp_init(&p->h264dsp, 8, 1); | ||||
| return 0; | return 0; | ||||
| } | } | ||||