mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 13:06:23 +00:00
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:
parent
be223ad316
commit
573d3f5ba5
3 changed files with 35 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue