d3d11decoder: Negotiate again on the first output buffer

... unconditionally. There may be updated field in sinkpad caps
after the new_sequence() call (HDR related ones for example),
then we should signal the information to downstream.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1474>
This commit is contained in:
Seungha Yang 2021-12-27 03:15:10 +09:00
parent 43856a0735
commit 5fefc689a0

View file

@ -1305,21 +1305,13 @@ gst_d3d11_decoder_get_output_view_buffer (GstD3D11Decoder * decoder,
g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE);
if (!decoder->internal_pool) {
gboolean reconfigured;
/* Replicate gst_video_decoder_allocate_output_buffer().
* In case of zero-copy playback, this is the last chance for querying
* required min-buffer size by downstream and take account of
* the min-buffer size into our internel pool size */
GST_VIDEO_DECODER_STREAM_LOCK (videodec);
reconfigured =
gst_pad_check_reconfigure (GST_VIDEO_DECODER_SRC_PAD (videodec));
GST_DEBUG_OBJECT (videodec,
"Downstream was reconfigured, negotiating again");
GST_VIDEO_DECODER_STREAM_UNLOCK (videodec);
if (reconfigured)
gst_video_decoder_negotiate (videodec);
/* Try negotiate again whatever the previous negotiation result was.
* There could be updated field(s) in sinkpad caps after we negotiated with
* downstream on new_sequence() call. For example, h264/h265 parse
* will be able to update HDR10 related caps field after parsing
* corresponding SEI messages which are usually placed after the essential
* headers */
gst_video_decoder_negotiate (videodec);
if (!gst_d3d11_decoder_prepare_output_view_pool (decoder)) {
GST_ERROR_OBJECT (videodec, "Failed to setup internal pool");