FFmpeg  4.0
mediacodec.c
Go to the documentation of this file.
1 /*
2  * Android MediaCodec public API functions
3  *
4  * Copyright (c) 2016 Matthieu Bouron <matthieu.bouron stupeflix.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "config.h"
24 
25 #include "libavutil/error.h"
26 
27 #include "mediacodec.h"
28 
29 #if CONFIG_MEDIACODEC
30 
31 #include <jni.h>
32 
33 #include "libavcodec/avcodec.h"
34 #include "libavutil/mem.h"
35 
36 #include "ffjni.h"
37 #include "mediacodecdec_common.h"
38 #include "version.h"
39 
41 {
42  return av_mallocz(sizeof(AVMediaCodecContext));
43 }
44 
46 {
47  int ret = 0;
48  JNIEnv *env = NULL;
49 
50  env = ff_jni_get_env(avctx);
51  if (!env) {
52  return AVERROR_EXTERNAL;
53  }
54 
55  ctx->surface = (*env)->NewGlobalRef(env, surface);
56  if (ctx->surface) {
57  avctx->hwaccel_context = ctx;
58  } else {
59  av_log(avctx, AV_LOG_ERROR, "Could not create new global reference\n");
60  ret = AVERROR_EXTERNAL;
61  }
62 
63  return ret;
64 }
65 
67 {
68  JNIEnv *env = NULL;
69 
71 
72  if (!ctx) {
73  return;
74  }
75 
76  env = ff_jni_get_env(avctx);
77  if (!env) {
78  return;
79  }
80 
81  if (ctx->surface) {
82  (*env)->DeleteGlobalRef(env, ctx->surface);
83  ctx->surface = NULL;
84  }
85 
86  av_freep(&avctx->hwaccel_context);
87 }
88 
89 int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
90 {
91  MediaCodecDecContext *ctx = buffer->ctx;
92  int released = atomic_fetch_add(&buffer->released, 1);
93 
94  if (!released && (ctx->delay_flush || buffer->serial == atomic_load(&ctx->serial))) {
97  "Releasing output buffer %zd (%p) ts=%"PRId64" with render=%d [%d pending]\n",
98  buffer->index, buffer, buffer->pts, render, atomic_load(&ctx->hw_buffer_count));
99  return ff_AMediaCodec_releaseOutputBuffer(ctx->codec, buffer->index, render);
100  }
101 
102  return 0;
103 }
104 
105 #else
106 
107 #include <stdlib.h>
108 
110 {
111  return NULL;
112 }
113 
115 {
116  return AVERROR(ENOSYS);
117 }
118 
120 {
121 }
122 
123 int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
124 {
125  return AVERROR(ENOSYS);
126 }
127 
128 #endif
This structure holds a reference to a android/view/Surface object that will be used as output by the ...
Definition: mediacodec.h:33
#define NULL
Definition: coverity.c:32
Memory handling functions.
int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface)
Convenience function that sets up the MediaCodec context.
Definition: mediacodec.c:114
int ff_AMediaCodec_releaseOutputBuffer(FFAMediaCodec *codec, size_t idx, int render)
static char buffer[20]
Definition: seek.c:32
void * hwaccel_context
Hardware accelerator context.
Definition: avcodec.h:2686
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
error code definitions
#define atomic_load(object)
Definition: stdatomic.h:93
#define AVERROR(e)
Definition: error.h:43
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:236
#define atomic_fetch_sub(object, operand)
Definition: stdatomic.h:137
AVMediaCodecContext * av_mediacodec_alloc_context(void)
Allocate and initialize a MediaCodec context.
Definition: mediacodec.c:109
AVFormatContext * ctx
Definition: movenc.c:48
int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
Release a MediaCodec buffer and render it to the surface that is associated with the decoder...
Definition: mediacodec.c:123
#define atomic_fetch_add(object, operand)
Definition: stdatomic.h:131
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1518
void av_mediacodec_default_free(AVCodecContext *avctx)
This function must be called to free the MediaCodec context initialized with av_mediacodec_default_in...
Definition: mediacodec.c:119
JNIEnv * ff_jni_get_env(void *log_ctx)
Definition: ffjni.c:51
void * surface
android/view/Surface object reference.
Definition: mediacodec.h:38
#define av_freep(p)
#define AVERROR_EXTERNAL
Generic error in an external library.
Definition: error.h:57