mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
va: Delay decoders downstream negotiation.
Delay decoders downstream negotiation just before an output frame needs to be allocated. This is required, are least for H.264 and H.265 decoders, since codec_data might trigger a new sequence before finishing upstream negotiation, and sink pad caps need to set before setting source pad caps, particularly to forward HDR fields. The other decoders are changed too in order to keep the same structure among them. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1257>
This commit is contained in:
parent
5494ec38d0
commit
4a4823b972
5 changed files with 40 additions and 35 deletions
|
@ -495,6 +495,13 @@ gst_va_h264_dec_new_picture (GstH264Decoder * decoder,
|
|||
GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder);
|
||||
GstVaBaseDec *base = GST_VA_BASE_DEC (decoder);
|
||||
|
||||
if (base->need_negotiation) {
|
||||
if (!gst_video_decoder_negotiate (vdec)) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
self->last_ret = gst_video_decoder_allocate_output_frame (vdec, frame);
|
||||
if (self->last_ret != GST_FLOW_OK)
|
||||
goto error;
|
||||
|
@ -746,13 +753,7 @@ gst_va_h264_dec_new_sequence (GstH264Decoder * decoder, const GstH264SPS * sps,
|
|||
|
||||
base->min_buffers = self->dpb_size + 4; /* dpb size + scratch surfaces */
|
||||
|
||||
if (negotiation_needed) {
|
||||
base->need_negotiation = TRUE;
|
||||
if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
base->need_negotiation = negotiation_needed;
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
|
|
@ -855,6 +855,13 @@ gst_va_h265_dec_new_picture (GstH265Decoder * decoder,
|
|||
GstBuffer *output_buffer;
|
||||
GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder);
|
||||
|
||||
if (base->need_negotiation) {
|
||||
if (!gst_video_decoder_negotiate (vdec)) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
output_buffer = gst_video_decoder_allocate_output_buffer (vdec);
|
||||
if (!output_buffer) {
|
||||
self->last_ret = GST_FLOW_ERROR;
|
||||
|
@ -1118,13 +1125,7 @@ gst_va_h265_dec_new_sequence (GstH265Decoder * decoder, const GstH265SPS * sps,
|
|||
|
||||
base->min_buffers = self->dpb_size + 4; /* dpb size + scratch surfaces */
|
||||
|
||||
if (negotiation_needed) {
|
||||
base->need_negotiation = TRUE;
|
||||
if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
base->need_negotiation = negotiation_needed;
|
||||
|
||||
{
|
||||
/* FIXME: We don't have parser API for sps_range_extension, so
|
||||
|
|
|
@ -278,13 +278,7 @@ gst_va_mpeg2_dec_new_sequence (GstMpeg2Decoder * decoder,
|
|||
|
||||
base->min_buffers = 2 + 4; /* max num pic references + scratch surfaces */
|
||||
|
||||
if (negotiation_needed) {
|
||||
base->need_negotiation = TRUE;
|
||||
if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
base->need_negotiation = negotiation_needed;
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
@ -299,6 +293,13 @@ gst_va_mpeg2_dec_new_picture (GstMpeg2Decoder * decoder,
|
|||
GstVaBaseDec *base = GST_VA_BASE_DEC (decoder);
|
||||
GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder);
|
||||
|
||||
if (base->need_negotiation) {
|
||||
if (!gst_video_decoder_negotiate (vdec)) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
ret = gst_video_decoder_allocate_output_frame (vdec, frame);
|
||||
if (ret != GST_FLOW_OK)
|
||||
goto error;
|
||||
|
|
|
@ -177,13 +177,7 @@ gst_va_vp8_dec_new_sequence (GstVp8Decoder * decoder,
|
|||
|
||||
base->min_buffers = 3 + 4; /* max num pic references + scratch surfaces */
|
||||
|
||||
if (negotiation_needed) {
|
||||
base->need_negotiation = TRUE;
|
||||
if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
base->need_negotiation = negotiation_needed;
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
@ -197,6 +191,13 @@ gst_va_vp8_dec_new_picture (GstVp8Decoder * decoder,
|
|||
GstVideoDecoder *vdec = GST_VIDEO_DECODER (decoder);
|
||||
GstVaBaseDec *base = GST_VA_BASE_DEC (decoder);
|
||||
|
||||
if (base->need_negotiation) {
|
||||
if (!gst_video_decoder_negotiate (vdec)) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
self->last_ret = gst_video_decoder_allocate_output_frame (vdec, frame);
|
||||
if (self->last_ret != GST_FLOW_OK)
|
||||
goto error;
|
||||
|
|
|
@ -179,13 +179,7 @@ gst_va_vp9_new_sequence (GstVp9Decoder * decoder,
|
|||
|
||||
base->min_buffers = GST_VP9_REF_FRAMES;
|
||||
|
||||
if (negotiation_needed) {
|
||||
base->need_negotiation = TRUE;
|
||||
if (!gst_video_decoder_negotiate (GST_VIDEO_DECODER (self))) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
base->need_negotiation = negotiation_needed;
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
@ -229,6 +223,13 @@ gst_va_vp9_dec_new_picture (GstVp9Decoder * decoder,
|
|||
if (ret != GST_FLOW_OK)
|
||||
return ret;
|
||||
|
||||
if (base->need_negotiation) {
|
||||
if (!gst_video_decoder_negotiate (vdec)) {
|
||||
GST_ERROR_OBJECT (self, "Failed to negotiate with downstream");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
ret = gst_video_decoder_allocate_output_frame (vdec, frame);
|
||||
if (ret != GST_FLOW_OK)
|
||||
goto error;
|
||||
|
|
Loading…
Reference in a new issue