From 3e35a6f03fbd49c1a8c3b214a6c39ca650fbbee2 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 26 Nov 2020 05:55:29 +0900 Subject: [PATCH] d3d11h264dec: Reconfigure decoder object on DPB size change 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: --- sys/d3d11/gstd3d11h264dec.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/sys/d3d11/gstd3d11h264dec.c b/sys/d3d11/gstd3d11h264dec.c index d5370c5..2792aa8 100644 --- a/sys/d3d11/gstd3d11h264dec.c +++ b/sys/d3d11/gstd3d11h264dec.c @@ -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; -- 2.7.4