From: Seungha Yang Date: Wed, 25 Nov 2020 20:55:29 +0000 (+0900) Subject: d3d11h264dec: Reconfigure decoder object on DPB size change X-Git-Tag: 1.19.3~507^2~1004 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3e35a6f03fbd49c1a8c3b214a6c39ca650fbbee2;p=platform%2Fupstream%2Fgstreamer.git 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: --- 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;