avauddec: Ensure finish_subframe() and finish_frame() are paired

audiodecoder baseclass implementation is expecting that
finish_subframe() is followed by finish_frame() in order clear
its internal state related to subframe.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-libav/-/merge_requests/90>
This commit is contained in:
Seungha Yang 2020-09-15 02:12:23 +09:00
parent 6ea6f1545b
commit 7388b14423

View file

@ -611,10 +611,14 @@ gst_ffmpegauddec_drain (GstFFMpegAudDec * ffmpegdec)
} while (got_frame); } while (got_frame);
avcodec_flush_buffers (ffmpegdec->context); avcodec_flush_buffers (ffmpegdec->context);
if (got_any_frames && ret == GST_FLOW_OK) if (got_any_frames) {
ret = GstFlowReturn new_ret =
gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1); gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1);
if (ret == GST_FLOW_OK)
ret = new_ret;
}
done: done:
return ret; return ret;
@ -723,12 +727,19 @@ gst_ffmpegauddec_handle_frame (GstAudioDecoder * decoder, GstBuffer * inbuf)
} }
} while (got_frame); } while (got_frame);
/* Only override the flow return value if previously did have a GST_FLOW_OK. if (is_header || got_any_frames) {
* Failure to do this would result in skipping downstream issues caught in /* Even if previous return wasn't GST_FLOW_OK, we need to call
* earlier steps. */ * _finish_frame() since baseclass is expecting that _finish_frame()
if (ret == GST_FLOW_OK && (is_header || got_any_frames)) { * is followed by _finish_subframe()
ret = */
GstFlowReturn new_ret =
gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1); gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (ffmpegdec), NULL, 1);
/* Only override the flow return value if previously did have a GST_FLOW_OK.
* Failure to do this would result in skipping downstream issues caught in
* earlier steps. */
if (ret == GST_FLOW_OK)
ret = new_ret;
} }
unmap: unmap: