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>
This commit is contained in:
parent
817c6a6762
commit
c779766b5c
1 changed files with 12 additions and 0 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue