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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373>
This commit is contained in:
He Junyan 2021-07-05 23:53:25 +08:00 committed by GStreamer Marge Bot
parent 7a6bc987a5
commit 23b15aa5d0

View file

@ -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.