summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2020-09-14 14:30:35 +0300
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-09-30 00:44:33 +0000
commit981e5e665c5defcca9aaa5b864c3b709428d511e (patch)
treeafb31e166ebd89f6a5e6a58592df4e1075a45c25
parent2761e58578186d2885850db7536e81eb7f4c079b (diff)
downloadgst-libav-981e5e665c5defcca9aaa5b864c3b709428d511e.tar.gz
avauddec: Forward flow returns from draining instead of assuming OK
It might be useful for upstream to know that draining/finishing didn't succeed, and why. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/96>
-rw-r--r--ext/libav/gstavauddec.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/ext/libav/gstavauddec.c b/ext/libav/gstavauddec.c
index f43bfad..60d0c44 100644
--- a/ext/libav/gstavauddec.c
+++ b/ext/libav/gstavauddec.c
@@ -57,7 +57,7 @@ static GstFlowReturn gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder,
static gboolean gst_ffmpegauddec_negotiate (GstFFMpegAudDec * ffmpegdec,
AVCodecContext * context, AVFrame * frame, gboolean force);
-static void gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec);
+static GstFlowReturn gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec);
#define GST_FFDEC_PARAMS_QDATA g_quark_from_static_string("avdec-params")
@@ -594,9 +594,10 @@ no_codec:
}
}
-static void
+static GstFlowReturn
gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec)
{
+ GstFlowReturn ret = GST_FLOW_OK;
gboolean got_any_frames = FALSE;
gboolean got_frame;
@@ -604,21 +605,22 @@ gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec)
goto send_packet_failed;
do {
- GstFlowReturn ret;
-
got_frame = gst_ffmpegauddec_frame (ffmpegdec, &ret);
if (got_frame)
got_any_frames = TRUE;
} while (got_frame);
avcodec_flush_buffers (ffmpegdec->context);
- if (got_any_frames)
- gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1);
+ if (got_any_frames && ret == GST_FLOW_OK)
+ ret =
+ gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1);
- return;
+done:
+ return ret;
send_packet_failed:
GST_WARNING_OBJECT (ffmpegdec, "send packet failed, could not drain decoder");
+ goto done;
}
static void
@@ -651,8 +653,7 @@ gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
goto not_negotiated;
if (inbuf == NULL) {
- gst_ffmpegauddec_drain (ffmpegdec);
- return GST_FLOW_OK;
+ return gst_ffmpegauddec_drain (ffmpegdec);
}
inbuf = gst_buffer_ref (inbuf);