codecs: vp9decoder: Pass GstVideoCodecFrame to duplicate_picture()
authorSeungha Yang <seungha@centricular.com>
Sun, 28 Mar 2021 17:11:22 +0000 (02:11 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 7 Apr 2021 19:32:29 +0000 (19:32 +0000)
... and fix picture duplication logic for vavp9dec

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2112>

gst-libs/gst/codecs/gstvp9decoder.c
gst-libs/gst/codecs/gstvp9decoder.h
sys/d3d11/gstd3d11vp9dec.cpp
sys/nvcodec/gstnvvp9dec.c
sys/va/gstvavp9dec.c

index 3e02672..e5e3959 100644 (file)
@@ -95,7 +95,7 @@ static GstFlowReturn gst_vp9_decoder_handle_frame (GstVideoDecoder * decoder,
     GstVideoCodecFrame * frame);
 
 static GstVp9Picture *gst_vp9_decoder_duplicate_picture_default (GstVp9Decoder *
-    decoder, GstVp9Picture * picture);
+    decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture);
 
 static void
 gst_vp9_decoder_class_init (GstVp9DecoderClass * klass)
@@ -247,7 +247,7 @@ gst_vp9_decoder_drain (GstVideoDecoder * decoder)
 
 static GstVp9Picture *
 gst_vp9_decoder_duplicate_picture_default (GstVp9Decoder * decoder,
-    GstVp9Picture * picture)
+    GstVideoCodecFrame * frame, GstVp9Picture * picture)
 {
   GstVp9Picture *new_picture;
 
@@ -322,7 +322,7 @@ gst_vp9_decoder_handle_frame (GstVideoDecoder * decoder,
 
     g_assert (klass->duplicate_picture);
     pic_to_dup = priv->dpb->pic_list[frame_hdr.frame_to_show_map_idx];
-    picture = klass->duplicate_picture (self, pic_to_dup);
+    picture = klass->duplicate_picture (self, frame, pic_to_dup);
 
     if (!picture) {
       GST_ERROR_OBJECT (self, "subclass didn't provide duplicated picture");
index f75085b..677ffbd 100644 (file)
@@ -100,6 +100,7 @@ struct _GstVp9DecoderClass
                                         GstVp9Picture * picture);
 
   GstVp9Picture * (*duplicate_picture) (GstVp9Decoder * decoder,
+                                        GstVideoCodecFrame * frame,
                                         GstVp9Picture * picture);
 
   gboolean        (*start_picture)     (GstVp9Decoder * decoder,
index a1ae106..a293bb7 100644 (file)
@@ -141,7 +141,7 @@ static gboolean gst_d3d11_vp9_dec_new_sequence (GstVp9Decoder * decoder,
 static gboolean gst_d3d11_vp9_dec_new_picture (GstVp9Decoder * decoder,
     GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static GstVp9Picture *gst_d3d11_vp9_dec_duplicate_picture (GstVp9Decoder *
-    decoder, GstVp9Picture * picture);
+    decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static GstFlowReturn gst_d3d11_vp9_dec_output_picture (GstVp9Decoder *
     decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static gboolean gst_d3d11_vp9_dec_start_picture (GstVp9Decoder * decoder,
@@ -418,7 +418,7 @@ gst_d3d11_vp9_dec_new_picture (GstVp9Decoder * decoder,
 
 static GstVp9Picture *
 gst_d3d11_vp9_dec_duplicate_picture (GstVp9Decoder * decoder,
-    GstVp9Picture * picture)
+    GstVideoCodecFrame * frame, GstVp9Picture * picture)
 {
   GstD3D11Vp9Dec *self = GST_D3D11_VP9_DEC (decoder);
   GstBuffer *view_buffer;
index fb269e9..9b85730 100644 (file)
@@ -78,7 +78,7 @@ static gboolean gst_nv_vp9_dec_new_sequence (GstVp9Decoder * decoder,
 static gboolean gst_nv_vp9_dec_new_picture (GstVp9Decoder * decoder,
     GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static GstVp9Picture *gst_nv_vp9_dec_duplicate_picture (GstVp9Decoder *
-    decoder, GstVp9Picture * picture);
+    decoder, GstVideoCodecFrame * frame, GstVp9Picture * picture);
 static gboolean gst_nv_vp9_dec_decode_picture (GstVp9Decoder * decoder,
     GstVp9Picture * picture, GstVp9Dpb * dpb);
 static GstFlowReturn gst_nv_vp9_dec_output_picture (GstVp9Decoder *
@@ -315,15 +315,15 @@ gst_nv_vp9_dec_get_decoder_frame_from_picture (GstNvVp9Dec * self,
 
 static GstVp9Picture *
 gst_nv_vp9_dec_duplicate_picture (GstVp9Decoder * decoder,
-    GstVp9Picture * picture)
+    GstVideoCodecFrame * frame, GstVp9Picture * picture)
 {
   GstNvVp9Dec *self = GST_NV_VP9_DEC (decoder);
-  GstNvDecoderFrame *frame;
+  GstNvDecoderFrame *nv_frame;
   GstVp9Picture *new_picture;
 
-  frame = gst_nv_vp9_dec_get_decoder_frame_from_picture (self, picture);
+  nv_frame = gst_nv_vp9_dec_get_decoder_frame_from_picture (self, picture);
 
-  if (!frame) {
+  if (!nv_frame) {
     GST_ERROR_OBJECT (self, "Parent picture does not have decoder frame");
     return NULL;
   }
@@ -332,7 +332,7 @@ gst_nv_vp9_dec_duplicate_picture (GstVp9Decoder * decoder,
   new_picture->frame_hdr = picture->frame_hdr;
 
   gst_vp9_picture_set_user_data (new_picture,
-      gst_nv_decoder_frame_ref (frame),
+      gst_nv_decoder_frame_ref (nv_frame),
       (GDestroyNotify) gst_nv_decoder_frame_unref);
 
   return new_picture;
index 7a88f87..df9bda7 100644 (file)
@@ -458,7 +458,7 @@ gst_va_vp9_dec_output_picture (GstVp9Decoder * decoder,
 
 static GstVp9Picture *
 gst_va_vp9_dec_duplicate_picture (GstVp9Decoder * decoder,
-    GstVp9Picture * picture)
+    GstVideoCodecFrame * frame, GstVp9Picture * picture)
 {
   GstVaDecodePicture *va_pic, *va_dup;
   GstVp9Picture *new_picture;
@@ -469,6 +469,8 @@ gst_va_vp9_dec_duplicate_picture (GstVp9Decoder * decoder,
   new_picture = gst_vp9_picture_new ();
   new_picture->frame_hdr = picture->frame_hdr;
 
+  frame->output_buffer = gst_buffer_ref (va_dup->gstbuffer);
+
   gst_vp9_picture_set_user_data (picture, va_dup,
       (GDestroyNotify) gst_va_decode_picture_free);