summaryrefslogtreecommitdiffstats
path: root/video/decode
diff options
context:
space:
mode:
authorAman Gupta <aman@tmm1.net>2017-07-06 10:54:40 -0700
committerwm4 <wm4@nowhere>2017-10-09 18:36:54 +0200
commit61a1612de9c18d497c3be01f10b0fabc2066d76f (patch)
treeb7956550a0583226e26d76748734d8d19848a1a0 /video/decode
parent6f0fdac6f16880ef46cbcfb399fd6beec5afe735 (diff)
downloadmpv-61a1612de9c18d497c3be01f10b0fabc2066d76f.tar.bz2
mpv-61a1612de9c18d497c3be01f10b0fabc2066d76f.tar.xz
hwdec: add mediacodec hardware decoder for IMGFMT_MEDIACODEC frames
Diffstat (limited to 'video/decode')
-rw-r--r--video/decode/hw_mediacodec.c47
-rw-r--r--video/decode/vd_lavc.c2
2 files changed, 49 insertions, 0 deletions
diff --git a/video/decode/hw_mediacodec.c b/video/decode/hw_mediacodec.c
index 9d3ef44f8b..b1a06c19ed 100644
--- a/video/decode/hw_mediacodec.c
+++ b/video/decode/hw_mediacodec.c
@@ -15,8 +15,55 @@
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdbool.h>
+
+#include <libavcodec/mediacodec.h>
+
+#include "options/options.h"
#include "video/decode/lavc.h"
+static int probe(struct lavc_ctx *ctx, struct vd_lavc_hwdec *hwdec,
+ const char *codec)
+{
+ if (ctx->opts->vo->WinID == 0)
+ return HWDEC_ERR_NO_CTX;
+
+ return 0;
+}
+
+static int init(struct lavc_ctx *ctx)
+{
+ return 0;
+}
+
+static int init_decoder(struct lavc_ctx *ctx, int w, int h)
+{
+ av_mediacodec_default_free(ctx->avctx);
+
+ AVMediaCodecContext *mcctx = av_mediacodec_alloc_context();
+ if (!mcctx)
+ return -1;
+
+ void *surface = (void *)(intptr_t)(ctx->opts->vo->WinID);
+ return av_mediacodec_default_init(ctx->avctx, mcctx, surface);
+}
+
+static void uninit(struct lavc_ctx *ctx)
+{
+ if (ctx->avctx)
+ av_mediacodec_default_free(ctx->avctx);
+}
+
+const struct vd_lavc_hwdec mp_vd_lavc_mediacodec = {
+ .type = HWDEC_MEDIACODEC,
+ .image_format = IMGFMT_MEDIACODEC,
+ .lavc_suffix = "_mediacodec",
+ .probe = probe,
+ .init = init,
+ .init_decoder = init_decoder,
+ .uninit = uninit,
+};
+
const struct vd_lavc_hwdec mp_vd_lavc_mediacodec_copy = {
.type = HWDEC_MEDIACODEC_COPY,
.lavc_suffix = "_mediacodec",
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index ec22b42571..fe0de0e43f 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -129,6 +129,7 @@ const struct m_sub_options vd_lavc_conf = {
},
};
+extern const struct vd_lavc_hwdec mp_vd_lavc_mediacodec;
extern const struct vd_lavc_hwdec mp_vd_lavc_mediacodec_copy;
extern const struct vd_lavc_hwdec mp_vd_lavc_videotoolbox;
extern const struct vd_lavc_hwdec mp_vd_lavc_videotoolbox_copy;
@@ -261,6 +262,7 @@ static const struct vd_lavc_hwdec *const hwdec_list[] = {
&mp_vd_lavc_d3d11va_copy,
#endif
#if HAVE_ANDROID
+ &mp_vd_lavc_mediacodec,
&mp_vd_lavc_mediacodec_copy,
#endif
#if HAVE_CUDA_HWACCEL