diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2020-09-14 14:30:35 +0300 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-09-30 00:44:33 +0000 |
commit | 981e5e665c5defcca9aaa5b864c3b709428d511e (patch) | |
tree | afb31e166ebd89f6a5e6a58592df4e1075a45c25 | |
parent | 2761e58578186d2885850db7536e81eb7f4c079b (diff) |
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.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/ext/libav/gstavauddec.c b/ext/libav/gstavauddec.c index f43bfad0e6..60d0c44074 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); |