nvdecoder: Handle input caps change
authorSeungha Yang <seungha@centricular.com>
Sat, 5 Nov 2022 12:06:39 +0000 (21:06 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 16 Nov 2022 13:12:38 +0000 (13:12 +0000)
Update output caps if it's notified by baseclass

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3328>

subprojects/gst-plugins-bad/sys/nvcodec/gstnvav1dec.c
subprojects/gst-plugins-bad/sys/nvcodec/gstnvdecoder.c
subprojects/gst-plugins-bad/sys/nvcodec/gstnvdecoder.h
subprojects/gst-plugins-bad/sys/nvcodec/gstnvh264dec.c
subprojects/gst-plugins-bad/sys/nvcodec/gstnvh265dec.c
subprojects/gst-plugins-bad/sys/nvcodec/gstnvvp8dec.c
subprojects/gst-plugins-bad/sys/nvcodec/gstnvvp9dec.c

index d200cfe..31e23eb 100644 (file)
@@ -863,8 +863,8 @@ gst_nv_av1_dec_output_picture (GstAV1Decoder * decoder,
     goto error;
   }
 
-  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame,
-          &frame->output_buffer)) {
+  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state,
+          decoder_frame, &frame->output_buffer)) {
     GST_ERROR_OBJECT (self, "Failed to handle output picture");
     goto error;
   }
index 6284e2a..d39938c 100644 (file)
@@ -819,7 +819,8 @@ done:
 
 gboolean
 gst_nv_decoder_finish_frame (GstNvDecoder * decoder, GstVideoDecoder * videodec,
-    GstNvDecoderFrame * frame, GstBuffer ** buffer)
+    GstVideoCodecState * input_state, GstNvDecoderFrame * frame,
+    GstBuffer ** buffer)
 {
   GstBuffer *outbuf = NULL;
   gboolean ret = FALSE;
@@ -829,6 +830,13 @@ gst_nv_decoder_finish_frame (GstNvDecoder * decoder, GstVideoDecoder * videodec,
   g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR);
   g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
 
+  if (input_state) {
+    if (!gst_nv_decoder_negotiate (decoder, videodec, input_state)) {
+      GST_ERROR_OBJECT (videodec, "Couldn't re-negotiate with updated state");
+      return FALSE;
+    }
+  }
+
   outbuf = gst_video_decoder_allocate_output_buffer (videodec);
   if (!outbuf) {
     GST_ERROR_OBJECT (videodec, "Couldn't allocate output buffer");
index 64758af..b30ceaf 100644 (file)
@@ -80,6 +80,7 @@ gboolean gst_nv_decoder_decode_picture (GstNvDecoder * decoder,
 
 gboolean gst_nv_decoder_finish_frame   (GstNvDecoder * decoder,
                                         GstVideoDecoder * videodec,
+                                        GstVideoCodecState * input_state,
                                         GstNvDecoderFrame *frame,
                                         GstBuffer ** buffer);
 
index 4e92702..f34da14 100644 (file)
@@ -578,8 +578,8 @@ gst_nv_h264_dec_output_picture (GstH264Decoder * decoder,
     goto error;
   }
 
-  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame,
-          &frame->output_buffer)) {
+  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state,
+          decoder_frame, &frame->output_buffer)) {
     GST_ERROR_OBJECT (self, "Failed to handle output picture");
     goto error;
   }
index 9e5f2d4..918f13c 100644 (file)
@@ -508,8 +508,8 @@ gst_nv_h265_dec_output_picture (GstH265Decoder * decoder,
     goto error;
   }
 
-  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame,
-          &frame->output_buffer)) {
+  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state,
+          decoder_frame, &frame->output_buffer)) {
     GST_ERROR_OBJECT (self, "Failed to handle output picture");
     goto error;
   }
index 9db15bb..f4a8ed4 100644 (file)
@@ -478,8 +478,8 @@ gst_nv_vp8_dec_output_picture (GstVp8Decoder * decoder,
     goto error;
   }
 
-  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame,
-          &frame->output_buffer)) {
+  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state,
+          decoder_frame, &frame->output_buffer)) {
     GST_ERROR_OBJECT (self, "Failed to handle output picture");
     goto error;
   }
index 009adac..75bb956 100644 (file)
@@ -573,8 +573,8 @@ gst_nv_vp9_dec_output_picture (GstVp9Decoder * decoder,
     goto error;
   }
 
-  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, decoder_frame,
-          &frame->output_buffer)) {
+  if (!gst_nv_decoder_finish_frame (self->decoder, vdec, picture->discont_state,
+          decoder_frame, &frame->output_buffer)) {
     GST_ERROR_OBJECT (self, "Failed to handle output picture");
     goto error;
   }