msdkdec: Fix buffer allocation based on frame.
authorYan Wang <yan.wang@linux.intel.com>
Wed, 21 Aug 2019 08:44:39 +0000 (16:44 +0800)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Mon, 26 Aug 2019 13:59:16 +0000 (13:59 +0000)
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

index 74c73ff..bfe305a 100644 (file)
@@ -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) {