From 23b15aa5d066d73a0691d982e764309fe8c0802a Mon Sep 17 00:00:00 2001 From: He Junyan Date: Mon, 5 Jul 2021 23:53:25 +0800 Subject: [PATCH] codecs: h264dec: Set picture to a small poc when mem_mgmt_5. When current frame memory_management_control_operation equal to 5, that means we need to drain the dpb and the current picture act as an IDR frame. So it should have smaller poc than the later pictures to ensure the output order. Part-of: --- gst-libs/gst/codecs/gsth264picture.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gst-libs/gst/codecs/gsth264picture.c b/gst-libs/gst/codecs/gsth264picture.c index 90fa1c3469..b5a1de5f1b 100644 --- a/gst-libs/gst/codecs/gsth264picture.c +++ b/gst-libs/gst/codecs/gsth264picture.c @@ -991,6 +991,22 @@ gst_h264_dpb_perform_memory_management_control_operation (GstH264Dpb * dpb, } picture->mem_mgmt_5 = TRUE; picture->frame_num = 0; + /* When the current picture includes a memory management control operation + equal to 5, after the decoding of the current picture, tempPicOrderCnt + is set equal to PicOrderCnt( CurrPic ), TopFieldOrderCnt of the current + picture (if any) is set equal to TopFieldOrderCnt - tempPicOrderCnt, + and BottomFieldOrderCnt of the current picture (if any) is set equal to + BottomFieldOrderCnt - tempPicOrderCnt. */ + if (picture->field == GST_H264_PICTURE_FIELD_TOP_FIELD) { + picture->top_field_order_cnt = picture->pic_order_cnt = 0; + } else if (picture->field == GST_H264_PICTURE_FIELD_BOTTOM_FIELD) { + picture->bottom_field_order_cnt = picture->pic_order_cnt = 0; + } else { + picture->top_field_order_cnt -= picture->pic_order_cnt; + picture->bottom_field_order_cnt -= picture->pic_order_cnt; + picture->pic_order_cnt = MIN (picture->top_field_order_cnt, + picture->bottom_field_order_cnt); + } break; case 6: /* 8.2.5.4.6 Replace long term reference pictures with current picture.