codecs: h264dec: Add help function of dpb_set_max_num_reorder_frames.
authorHe Junyan <junyan.he@intel.com>
Tue, 20 Jul 2021 15:49:12 +0000 (23:49 +0800)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 21 Jul 2021 15:23:17 +0000 (15:23 +0000)
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>

gst-libs/gst/codecs/gsth264decoder.c
gst-libs/gst/codecs/gsth264picture.c
gst-libs/gst/codecs/gsth264picture.h

index da70095..1442498 100644 (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;
 }
 
index 417986c..a824b78 100644 (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;
@@ -240,6 +241,24 @@ gst_h264_dpb_clear (GstH264Dpb * 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
  * @picture: (transfer full): a #GstH264Picture
index 962ed5e..3ac505c 100644 (file)
@@ -230,6 +230,10 @@ 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);
 
 GST_CODECS_API