mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 01:32:42 +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_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue