diff --git a/sys/d3d11/gstd3d11h264dec.c b/sys/d3d11/gstd3d11h264dec.c index d5370c588b..2792aa8ddc 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;