FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time)
106 {
107  MediaCodecDecContext *ctx = buffer->ctx;
108  int released = atomic_fetch_add(&buffer->released, 1);
109 
110  if (!released && (ctx->delay_flush || buffer->serial == atomic_load(&ctx->serial))) {
112  av_log(ctx->avctx, AV_LOG_DEBUG,
113  "Rendering output buffer %zd (%p) ts=%"PRId64" with time=%"PRId64" [%d pending]\n",
114  buffer->index, buffer, buffer->pts, time, atomic_load(&ctx->hw_buffer_count));
115  return ff_AMediaCodec_releaseOutputBufferAtTime(ctx->codec, buffer->index, time);
116  }
117 
118  return 0;
119 }
120 
121 #else
122 
123 #include <stdlib.h>
124 
126 {
127  return NULL;
128 }
129 
131 {
132  return AVERROR(ENOSYS);
133 }
134 
136 {
137 }
138 
139 int av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render)
140 {
141  return AVERROR(ENOSYS);
142 }
143 
144 int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time)
145 {
146  return AVERROR(ENOSYS);
147 }
148 
149 #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.
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
int av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface)
Convenience function that sets up the MediaCodec context.
Definition: mediacodec.c:130
int ff_AMediaCodec_releaseOutputBuffer(FFAMediaCodec *codec, size_t idx, int render)
void * hwaccel_context
Hardware accelerator context.
Definition: avcodec.h:2702
#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
#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:125
int av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time)
Release a MediaCodec buffer and render it at the given time to the surface that is associated with th...
Definition: mediacodec.c:144
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:139
#define atomic_fetch_add(object, operand)
Definition: stdatomic.h:131
Libavcodec external API header.
main external API structure.
Definition: avcodec.h:1533
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:135
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
int ff_AMediaCodec_releaseOutputBufferAtTime(FFAMediaCodec *codec, size_t idx, int64_t timestampNs)
GLuint buffer
Definition: opengl_enc.c:102