codecs: h264dec: Add help function of dpb_set_max_num_reorder_frames.

The max_num_reorder_frames can be useful for bump check. We store it
in the DPB and no need for the decoder now.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2373>
This commit is contained in:
He Junyan 2021-07-20 23:49:12 +08:00 committed by GStreamer Marge Bot
parent be223ad316
commit 573d3f5ba5
3 changed files with 35 additions and 10 deletions

View file

@ -109,7 +109,6 @@ struct _GstH264DecoderPrivate
gint max_frame_num;
gint max_pic_num;
gint max_long_term_frame_idx;
gsize max_num_reorder_frames;
gint prev_frame_num;
gint prev_ref_frame_num;
@ -1915,21 +1914,23 @@ gst_h264_decoder_update_max_num_reorder_frames (GstH264Decoder * self,
GstH264SPS * sps)
{
GstH264DecoderPrivate *priv = self->priv;
gsize max_num_reorder_frames = 0;
if (sps->vui_parameters_present_flag
&& sps->vui_parameters.bitstream_restriction_flag) {
priv->max_num_reorder_frames = sps->vui_parameters.num_reorder_frames;
if (priv->max_num_reorder_frames >
gst_h264_dpb_get_max_num_frames (priv->dpb)) {
max_num_reorder_frames = sps->vui_parameters.num_reorder_frames;
if (max_num_reorder_frames > gst_h264_dpb_get_max_num_frames (priv->dpb)) {
GST_WARNING
("max_num_reorder_frames present, but larger than MaxDpbFrames (%d > %d)",
(gint) priv->max_num_reorder_frames,
(gint) max_num_reorder_frames,
gst_h264_dpb_get_max_num_frames (priv->dpb));
priv->max_num_reorder_frames = 0;
max_num_reorder_frames = 0;
return FALSE;
}
gst_h264_dpb_set_max_num_reorder_frames (priv->dpb, max_num_reorder_frames);
return TRUE;
}
@ -1943,17 +1944,18 @@ gst_h264_decoder_update_max_num_reorder_frames (GstH264Decoder * self,
case 110:
case 122:
case 244:
priv->max_num_reorder_frames = 0;
max_num_reorder_frames = 0;
break;
default:
priv->max_num_reorder_frames =
gst_h264_dpb_get_max_num_frames (priv->dpb);
max_num_reorder_frames = gst_h264_dpb_get_max_num_frames (priv->dpb);
break;
}
} else {
priv->max_num_reorder_frames = gst_h264_dpb_get_max_num_frames (priv->dpb);
max_num_reorder_frames = gst_h264_dpb_get_max_num_frames (priv->dpb);
}
gst_h264_dpb_set_max_num_reorder_frames (priv->dpb, max_num_reorder_frames);
return TRUE;
}

View file

@ -108,6 +108,7 @@ struct _GstH264Dpb
GArray *pic_list;
gint max_num_frames;
gint num_output_needed;
guint32 max_num_reorder_frames;
gint32 last_output_poc;
gboolean interlaced;
@ -239,6 +240,24 @@ gst_h264_dpb_clear (GstH264Dpb * dpb)
gst_h264_dpb_init (dpb);
}
/**
* gst_h264_dpb_set_max_num_reorder_frames:
* @dpb: a #GstH264Dpb
* @max_num_reorder_frames: the max number of reorder frames, which
* should not exceed the max size of DPB.
*
* Since: 1.20
*/
void
gst_h264_dpb_set_max_num_reorder_frames (GstH264Dpb * dpb,
guint32 max_num_reorder_frames)
{
g_return_if_fail (dpb != NULL);
g_return_if_fail (max_num_reorder_frames <= dpb->max_num_frames);
dpb->max_num_reorder_frames = max_num_reorder_frames;
}
/**
* gst_h264_dpb_add:
* @dpb: a #GstH264Dpb

View file

@ -229,6 +229,10 @@ void gst_h264_dpb_set_interlaced (GstH264Dpb * dpb,
GST_CODECS_API
gboolean gst_h264_dpb_get_interlaced (GstH264Dpb * dpb);
GST_CODECS_API
void gst_h264_dpb_set_max_num_reorder_frames (GstH264Dpb * dpb,
guint32 max_num_reorder_frames);
GST_CODECS_API
void gst_h264_dpb_free (GstH264Dpb * dpb);