diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c41b24067..0e222b5b3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added - This Changelog +- New MediaCodec helper function: `sxplayer_release_frame_mediacodec()` ### Changed - Switch build system from GNU/Make to [Meson](https://mesonbuild.com/) diff --git a/sxplayer.c b/sxplayer.c index 5284856e30..edce18bcb7 100644 --- a/sxplayer.c +++ b/sxplayer.c @@ -36,6 +36,10 @@ #include "log.h" #include "internal.h" +#if HAVE_MEDIACODEC_HWACCEL +#include +#endif + struct sxplayer_ctx { const AVClass *class; // necessary for the AVOption mechanism struct log_ctx *log_ctx; @@ -547,6 +551,25 @@ void sxplayer_release_frame(struct sxplayer_frame *frame) } } +int sxplayer_release_frame_mediacodec(struct sxplayer_frame **framep) +{ +#if HAVE_MEDIACODEC_HWACCEL + struct sxplayer_frame *frame = *framep; + if (!frame) + return 0; + av_assert0(frame->pix_fmt == SXPLAYER_PIXFMT_MEDIACODEC); + AVMediaCodecBuffer *buffer = (AVMediaCodecBuffer *)frame->data; + int ret = av_mediacodec_release_buffer(buffer, 1); + sxplayer_release_frame(frame); + *framep = NULL; + if (ret < 0) + return -1; + return 0; +#else + av_assert0(0); +#endif +} + int sxplayer_set_drop_ref(struct sxplayer_ctx *s, int drop) { return -1; // TODO diff --git a/sxplayer.h.in b/sxplayer.h.in index 90aceed86e..77f8e79661 100644 --- a/sxplayer.h.in +++ b/sxplayer.h.in @@ -336,6 +336,20 @@ int sxplayer_set_drop_ref(struct sxplayer_ctx *s, int drop); /* Release a frame obtained with sxplayer_get_frame() */ void sxplayer_release_frame(struct sxplayer_frame *frame); +/** + * Render to surface and release a MediaCodec frame obtained with + * sxplayer_get_frame(). + * + * @param framep the address of a sxplayer_frame pointer to be rendered + * and released + * + * Note: the sxplayer_frame is released even if the underlying MediaCodec + * buffer failed to be rendered. + * + * Return 0 on success, a negative value on error + */ +int sxplayer_release_frame_mediacodec(struct sxplayer_frame **framep); + /* Close and free everything */ void sxplayer_free(struct sxplayer_ctx **ss);