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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1839>
This commit is contained in:
Seungha Yang 2020-11-26 05:55:29 +09:00 committed by GStreamer Merge Bot
parent dc90a3d3cf
commit 3e35a6f03f

View file

@ -99,6 +99,7 @@ typedef struct _GstD3D11H264Dec
guint chroma_format_idc; guint chroma_format_idc;
GstVideoFormat out_format; GstVideoFormat out_format;
gboolean interlaced; gboolean interlaced;
gint max_dpb_size;
/* Array of DXVA_Slice_H264_Short */ /* Array of DXVA_Slice_H264_Short */
GArray *slice_list; 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); 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 static gboolean
gst_d3d11_h264_dec_open (GstVideoDecoder * decoder) gst_d3d11_h264_dec_open (GstVideoDecoder * decoder)
{ {
@ -315,6 +331,8 @@ gst_d3d11_h264_dec_open (GstVideoDecoder * decoder)
return FALSE; return FALSE;
} }
gst_d3d11_h264_dec_reset (self);
return TRUE; return TRUE;
} }
@ -436,6 +454,13 @@ gst_d3d11_h264_dec_new_sequence (GstH264Decoder * decoder,
modified = TRUE; 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) { if (modified || !self->d3d11_decoder->opened) {
GstVideoInfo info; GstVideoInfo info;