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

View file

@ -108,6 +108,7 @@ struct _GstH264Dpb
GArray *pic_list; GArray *pic_list;
gint max_num_frames; gint max_num_frames;
gint num_output_needed; gint num_output_needed;
guint32 max_num_reorder_frames;
gint32 last_output_poc; gint32 last_output_poc;
gboolean interlaced; gboolean interlaced;
@ -239,6 +240,24 @@ gst_h264_dpb_clear (GstH264Dpb * dpb)
gst_h264_dpb_init (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: * gst_h264_dpb_add:
* @dpb: a #GstH264Dpb * @dpb: a #GstH264Dpb

View file

@ -229,6 +229,10 @@ void gst_h264_dpb_set_interlaced (GstH264Dpb * dpb,
GST_CODECS_API GST_CODECS_API
gboolean gst_h264_dpb_get_interlaced (GstH264Dpb * dpb); 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 GST_CODECS_API
void gst_h264_dpb_free (GstH264Dpb * dpb); void gst_h264_dpb_free (GstH264Dpb * dpb);