From 40f7001bef1b83e69ea3e9d2a6aa923967d99b27 Mon Sep 17 00:00:00 2001 From: Aaron Boxer Date: Fri, 26 Jul 2019 07:45:46 -0600 Subject: [PATCH] msdkdec: no need to cache allocation_caps --- sys/msdk/gstmsdkdec.c | 35 ++++++++++++++++++++--------------- sys/msdk/gstmsdkdec.h | 1 - 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/sys/msdk/gstmsdkdec.c b/sys/msdk/gstmsdkdec.c index 746ce025c9..6fd5724c13 100644 --- a/sys/msdk/gstmsdkdec.c +++ b/sys/msdk/gstmsdkdec.c @@ -542,20 +542,16 @@ gst_msdkdec_set_src_caps (GstMsdkDec * thiz, gboolean need_allocation) G_TYPE_INT, height, "format", G_TYPE_STRING, format_str, NULL); GST_INFO_OBJECT (thiz, "new alloc caps = %" GST_PTR_FORMAT, allocation_caps); - gst_caps_replace (&thiz->allocation_caps, allocation_caps); + gst_caps_replace (&output_state->allocation_caps, allocation_caps); + gst_caps_unref (allocation_caps); } else { /* We keep the allocation parameters as it is to avoid pool re-negotiation. * For codecs like VP9, dynamic resolution change doesn't require allocation * reset if the new video frame resolution is lower than the * already configured one */ - allocation_caps = gst_caps_copy (thiz->allocation_caps); } - - gst_caps_replace (&output_state->allocation_caps, allocation_caps); - if (allocation_caps) - gst_caps_unref (allocation_caps); - gst_video_codec_state_unref (output_state); + return TRUE; } @@ -947,14 +943,23 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) if (!thiz->initialized) hard_reset = TRUE; - else if (thiz->allocation_caps) { - gst_video_info_from_caps (&alloc_info, thiz->allocation_caps); - - /* Check whether we need complete reset for dynamic resolution change */ - if (thiz->param.mfx.FrameInfo.Width > GST_VIDEO_INFO_WIDTH (&alloc_info) - || thiz->param.mfx.FrameInfo.Height > - GST_VIDEO_INFO_HEIGHT (&alloc_info)) - hard_reset = TRUE; + else { + GstVideoCodecState *output_state = + gst_video_decoder_get_output_state (GST_VIDEO_DECODER (thiz)); + + if (output_state) { + if (output_state->allocation_caps) { + gst_video_info_from_caps (&alloc_info, output_state->allocation_caps); + + /* Check whether we need complete reset for dynamic resolution change */ + if (thiz->param.mfx.FrameInfo.Width > + GST_VIDEO_INFO_WIDTH (&alloc_info) + || thiz->param.mfx.FrameInfo.Height > + GST_VIDEO_INFO_HEIGHT (&alloc_info)) + hard_reset = TRUE; + } + gst_video_codec_state_unref (output_state); + } } /* if subclass requested for the force reset */ diff --git a/sys/msdk/gstmsdkdec.h b/sys/msdk/gstmsdkdec.h index c55eb7c9e8..88924e20bb 100644 --- a/sys/msdk/gstmsdkdec.h +++ b/sys/msdk/gstmsdkdec.h @@ -67,7 +67,6 @@ struct _GstMsdkDec /* aligned msdk pool info */ GstVideoInfo output_info; GstBufferPool *pool; - GstCaps *allocation_caps; /* downstream pool info based on allocation query */ GstVideoInfo non_msdk_pool_info; mfxFrameAllocResponse alloc_resp; -- 2.34.1