d3d11h264dec: Reconfigure decoder object on DPB size change
authorSeungha Yang <seungha@centricular.com>
Wed, 25 Nov 2020 20:55:29 +0000 (05:55 +0900)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 26 Nov 2020 08:52:49 +0000 (08:52 +0000)
Even if resolution and/or bitdepth is not updated, required
DPB size can be changed per SPS update and it could be even
larger than previously configured size of DPB. If so, we need
to reconfigure DPB d3d11 texture pool again.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1839>

sys/d3d11/gstd3d11h264dec.c

index d5370c5..2792aa8 100644 (file)
@@ -99,6 +99,7 @@ typedef struct _GstD3D11H264Dec
   guint chroma_format_idc;
   GstVideoFormat out_format;
   gboolean interlaced;
+  gint max_dpb_size;
 
   /* Array of DXVA_Slice_H264_Short */
   GArray *slice_list;
@@ -295,6 +296,21 @@ gst_d3d11_h264_dec_set_context (GstElement * element, GstContext * context)
   GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
+/* Clear all codec specific (e.g., SPS) data */
+static void
+gst_d3d11_h264_dec_reset (GstD3D11H264Dec * self)
+{
+  self->width = 0;
+  self->height = 0;
+  self->coded_width = 0;
+  self->coded_height = 0;
+  self->bitdepth = 0;
+  self->chroma_format_idc = 0;
+  self->out_format = GST_VIDEO_FORMAT_UNKNOWN;
+  self->interlaced = FALSE;
+  self->max_dpb_size = 0;
+}
+
 static gboolean
 gst_d3d11_h264_dec_open (GstVideoDecoder * decoder)
 {
@@ -315,6 +331,8 @@ gst_d3d11_h264_dec_open (GstVideoDecoder * decoder)
     return FALSE;
   }
 
+  gst_d3d11_h264_dec_reset (self);
+
   return TRUE;
 }
 
@@ -436,6 +454,13 @@ gst_d3d11_h264_dec_new_sequence (GstH264Decoder * decoder,
     modified = TRUE;
   }
 
+  if (self->max_dpb_size < max_dpb_size) {
+    GST_INFO_OBJECT (self, "Requires larger DPB size (%d -> %d)",
+        self->max_dpb_size, max_dpb_size);
+    self->max_dpb_size = max_dpb_size;
+    modified = TRUE;
+  }
+
   if (modified || !self->d3d11_decoder->opened) {
     GstVideoInfo info;