avcodec/mediacodecdec: call MediaCodec.stop on close

Usually the MediaCodec context will be released immediately, or it needs to stay
alive due to existing hardware buffers.

However we can free resources early in the case of
hw_buffer_count == 0 && refcount > 1, which can be reproduced by keeping frames
referenced after flushing and closing. mpv currently behaves like this.

Signed-off-by: sfan5 <sfan5@live.de>
Signed-off-by: Matthieu Bouron <matthieu.bouron@gmail.com>
release/7.1
sfan5 7 months ago committed by Matthieu Bouron
parent 817c6a6762
commit c779766b5c
  1. 12
      libavcodec/mediacodecdec_common.c

@ -841,6 +841,18 @@ int ff_mediacodec_dec_flush(AVCodecContext *avctx, MediaCodecDecContext *s)
int ff_mediacodec_dec_close(AVCodecContext *avctx, MediaCodecDecContext *s)
{
if (!s)
return 0;
if (s->codec) {
if (atomic_load(&s->hw_buffer_count) == 0) {
ff_AMediaCodec_stop(s->codec);
av_log(avctx, AV_LOG_DEBUG, "MediaCodec %p stopped\n", s->codec);
} else {
av_log(avctx, AV_LOG_DEBUG, "Not stopping MediaCodec (there are buffers pending)\n");
}
}
ff_mediacodec_dec_unref(s);
return 0;

Loading…
Cancel
Save