From f92b5614dbcf14b9ba6aae5f0888cd875edb1e51 Mon Sep 17 00:00:00 2001 From: Yan Wang Date: Wed, 21 Aug 2019 16:44:39 +0800 Subject: [PATCH] msdkdec: Fix buffer allocation based on frame. gst_msdkdec_finish_task() may release all frames in GstVideoDecoder object. In this case, allocate_output_buffer() cannot get the oldest frame to allocate buffer. So gst_msdkdec_handle_frame() should return GST_FLOW_OK for letting gst_video_decoder_decode_frame() to send a new frame for decoding. Fixes #664. Fixes #665. --- sys/msdk/gstmsdkdec.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sys/msdk/gstmsdkdec.c b/sys/msdk/gstmsdkdec.c index 74c73ffea3..bfe305a473 100644 --- a/sys/msdk/gstmsdkdec.c +++ b/sys/msdk/gstmsdkdec.c @@ -137,7 +137,7 @@ allocate_output_buffer (GstMsdkDec * thiz, GstBuffer ** buffer) if (GST_PAD_IS_FLUSHING (decoder->srcpad)) return GST_FLOW_FLUSHING; else - return GST_FLOW_ERROR; + return GST_FLOW_CUSTOM_SUCCESS; } if (!frame->output_buffer) { @@ -994,7 +994,10 @@ gst_msdkdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame) goto error; if (!surface) { flow = allocate_output_buffer (thiz, &buffer); - if (flow != GST_FLOW_OK) + if (flow == GST_FLOW_CUSTOM_SUCCESS) { + flow = GST_FLOW_OK; + break; + } else if (flow != GST_FLOW_OK) goto error; surface = get_surface (thiz, buffer); if (!surface) {