mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-04 22:48:54 +00:00
codecs: h264decoder: Fix for MMCO type 2
As per 8.2.5.4.2, we should mark a picture which has LongTermPicNum == long_term_pic_num as "unused for reference", not pic_num. Passing conformance bitstream test with MR2_MW_A Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1768>
This commit is contained in:
parent
0e53668a9b
commit
e78dc91f9e
3 changed files with 14 additions and 10 deletions
|
@ -2207,7 +2207,7 @@ modify_ref_pic_list (GstH264Decoder * self, int list)
|
|||
case 2:
|
||||
/* (8-28) */
|
||||
g_assert (num_ref_idx_lX_active_minus1 + 1 < 32);
|
||||
pic = gst_h264_dpb_get_long_ref_by_pic_num (priv->dpb,
|
||||
pic = gst_h264_dpb_get_long_ref_by_long_term_pic_num (priv->dpb,
|
||||
list_mod->value.long_term_pic_num);
|
||||
if (!pic) {
|
||||
GST_WARNING_OBJECT (self, "Malformed stream, no pic num %d",
|
||||
|
|
|
@ -333,16 +333,19 @@ gst_h264_dpb_get_short_ref_by_pic_num (GstH264Dpb * dpb, gint pic_num)
|
|||
}
|
||||
|
||||
/**
|
||||
* gst_h264_dpb_get_long_ref_by_pic_num:
|
||||
* gst_h264_dpb_get_long_ref_by_long_term_pic_num:
|
||||
* @dpb: a #GstH264Dpb
|
||||
* @pic_num: a picture number
|
||||
* @pic_num: a long term picture number
|
||||
*
|
||||
* Find a long term reference picture which has matching picture number
|
||||
* Find a long term reference picture which has matching long term picture number
|
||||
*
|
||||
* Returns: (nullable) (transfer none): a #GstH264Picture
|
||||
*
|
||||
* Since: 1.20
|
||||
*/
|
||||
GstH264Picture *
|
||||
gst_h264_dpb_get_long_ref_by_pic_num (GstH264Dpb * dpb, gint pic_num)
|
||||
gst_h264_dpb_get_long_ref_by_long_term_pic_num (GstH264Dpb * dpb,
|
||||
gint long_term_pic_num)
|
||||
{
|
||||
gint i;
|
||||
|
||||
|
@ -352,11 +355,12 @@ gst_h264_dpb_get_long_ref_by_pic_num (GstH264Dpb * dpb, gint pic_num)
|
|||
GstH264Picture *picture =
|
||||
g_array_index (dpb->pic_list, GstH264Picture *, i);
|
||||
|
||||
if (picture->ref && picture->long_term && picture->pic_num == pic_num)
|
||||
if (picture->ref && picture->long_term &&
|
||||
picture->long_term_pic_num == long_term_pic_num)
|
||||
return picture;
|
||||
}
|
||||
|
||||
GST_WARNING ("No long term reference picture for %d", pic_num);
|
||||
GST_WARNING ("No long term reference picture for %d", long_term_pic_num);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -736,7 +740,7 @@ gst_h264_dpb_perform_memory_management_control_operation (GstH264Dpb * dpb,
|
|||
case 2:
|
||||
/* 8.2.5.4.2 Mark a long term reference picture as unused so it can be
|
||||
* removed if outputted */
|
||||
other = gst_h264_dpb_get_long_ref_by_pic_num (dpb,
|
||||
other = gst_h264_dpb_get_long_ref_by_long_term_pic_num (dpb,
|
||||
ref_pic_marking->long_term_pic_num);
|
||||
if (other) {
|
||||
other->ref = FALSE;
|
||||
|
|
|
@ -180,8 +180,8 @@ GstH264Picture * gst_h264_dpb_get_short_ref_by_pic_num (GstH264Dpb * dpb,
|
|||
gint pic_num);
|
||||
|
||||
GST_CODECS_API
|
||||
GstH264Picture * gst_h264_dpb_get_long_ref_by_pic_num (GstH264Dpb * dpb,
|
||||
gint pic_num);
|
||||
GstH264Picture * gst_h264_dpb_get_long_ref_by_long_term_pic_num (GstH264Dpb * dpb,
|
||||
gint long_term_pic_num);
|
||||
|
||||
GST_CODECS_API
|
||||
GstH264Picture * gst_h264_dpb_get_lowest_frame_num_short_ref (GstH264Dpb * dpb);
|
||||
|
|
Loading…
Reference in a new issue