From 6eb9856f5965a11b15f547ff8cd1da89196c950c Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Mon, 29 Mar 2021 02:11:22 +0900 Subject: [PATCH] codecs: vp9decoder: Pass GstVideoCodecFrame to duplicate_picture() ... and fix picture duplication logic for vavp9dec Part-of: --- gst-libs/gst/codecs/gstvp9decoder.c | 6 +++--- gst-libs/gst/codecs/gstvp9decoder.h | 1 + sys/d3d11/gstd3d11vp9dec.cpp | 4 ++-- sys/nvcodec/gstnvvp9dec.c | 12 ++++++------ sys/va/gstvavp9dec.c | 4 +++- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gst-libs/gst/codecs/gstvp9decoder.c b/gst-libs/gst/codecs/gstvp9decoder.c index 3e02672c90..e5e3959f91 100644 --- a/gst-libs/gst/codecs/gstvp9decoder.c +++ b/gst-libs/gst/codecs/gstvp9decoder.c @@ -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"); diff --git a/gst-libs/gst/codecs/gstvp9decoder.h b/gst-libs/gst/codecs/gstvp9decoder.h index f75085bf89..677ffbd116 100644 --- a/gst-libs/gst/codecs/gstvp9decoder.h +++ b/gst-libs/gst/codecs/gstvp9decoder.h @@ -100,6 +100,7 @@ struct _GstVp9DecoderClass GstVp9Picture * picture); GstVp9Picture * (*duplicate_picture) (GstVp9Decoder * decoder, + GstVideoCodecFrame * frame, GstVp9Picture * picture); gboolean (*start_picture) (GstVp9Decoder * decoder, diff --git a/sys/d3d11/gstd3d11vp9dec.cpp b/sys/d3d11/gstd3d11vp9dec.cpp index a1ae106e13..a293bb75f8 100644 --- a/sys/d3d11/gstd3d11vp9dec.cpp +++ b/sys/d3d11/gstd3d11vp9dec.cpp @@ -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; diff --git a/sys/nvcodec/gstnvvp9dec.c b/sys/nvcodec/gstnvvp9dec.c index fb269e9f4f..9b85730eb6 100644 --- a/sys/nvcodec/gstnvvp9dec.c +++ b/sys/nvcodec/gstnvvp9dec.c @@ -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; diff --git a/sys/va/gstvavp9dec.c b/sys/va/gstvavp9dec.c index 7a88f877f3..df9bda7db6 100644 --- a/sys/va/gstvavp9dec.c +++ b/sys/va/gstvavp9dec.c @@ -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);