FFmpeg
Data Structures | Macros | Functions | Variables
mediacodec_wrapper.c File Reference
#include <jni.h>
#include "libavutil/avassert.h"
#include "libavutil/mem.h"
#include "libavutil/avstring.h"
#include "avcodec.h"
#include "ffjni.h"
#include "version.h"
#include "mediacodec_wrapper.h"

Go to the source code of this file.

Data Structures

struct  JNIAMediaCodecListFields
 
struct  JNIAMediaFormatFields
 
struct  FFAMediaFormat
 
struct  JNIAMediaCodecFields
 
struct  FFAMediaCodec
 

Macros

#define JNI_GET_ENV_OR_RETURN(env, log_ctx, ret)
 
#define JNI_GET_ENV_OR_RETURN_VOID(env, log_ctx)
 
#define CREATE_CODEC_BY_NAME   0
 
#define CREATE_DECODER_BY_TYPE   1
 
#define CREATE_ENCODER_BY_TYPE   2
 
#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method)
 

Functions

int ff_AMediaCodecProfile_getProfileFromAVCodecContext (AVCodecContext *avctx)
 The following API around MediaCodec and MediaFormat is based on the NDK one provided by Google since Android 5.0. More...
 
char * ff_AMediaCodecList_getCodecNameByType (const char *mime, int profile, int encoder, void *log_ctx)
 
FFAMediaFormatff_AMediaFormat_new (void)
 
static FFAMediaFormatff_AMediaFormat_newFromObject (void *object)
 
int ff_AMediaFormat_delete (FFAMediaFormat *format)
 
char * ff_AMediaFormat_toString (FFAMediaFormat *format)
 
int ff_AMediaFormat_getInt32 (FFAMediaFormat *format, const char *name, int32_t *out)
 
int ff_AMediaFormat_getInt64 (FFAMediaFormat *format, const char *name, int64_t *out)
 
int ff_AMediaFormat_getFloat (FFAMediaFormat *format, const char *name, float *out)
 
int ff_AMediaFormat_getBuffer (FFAMediaFormat *format, const char *name, void **data, size_t *size)
 
int ff_AMediaFormat_getString (FFAMediaFormat *format, const char *name, const char **out)
 
void ff_AMediaFormat_setInt32 (FFAMediaFormat *format, const char *name, int32_t value)
 
void ff_AMediaFormat_setInt64 (FFAMediaFormat *format, const char *name, int64_t value)
 
void ff_AMediaFormat_setFloat (FFAMediaFormat *format, const char *name, float value)
 
void ff_AMediaFormat_setString (FFAMediaFormat *format, const char *name, const char *value)
 
void ff_AMediaFormat_setBuffer (FFAMediaFormat *format, const char *name, void *data, size_t size)
 
static int codec_init_static_fields (FFAMediaCodec *codec)
 
static FFAMediaCodeccodec_create (int method, const char *arg)
 
int ff_AMediaCodec_delete (FFAMediaCodec *codec)
 
char * ff_AMediaCodec_getName (FFAMediaCodec *codec)
 
int ff_AMediaCodec_configure (FFAMediaCodec *codec, const FFAMediaFormat *format, void *surface, void *crypto, uint32_t flags)
 
int ff_AMediaCodec_start (FFAMediaCodec *codec)
 
int ff_AMediaCodec_stop (FFAMediaCodec *codec)
 
int ff_AMediaCodec_flush (FFAMediaCodec *codec)
 
int ff_AMediaCodec_releaseOutputBuffer (FFAMediaCodec *codec, size_t idx, int render)
 
int ff_AMediaCodec_releaseOutputBufferAtTime (FFAMediaCodec *codec, size_t idx, int64_t timestampNs)
 
ssize_t ff_AMediaCodec_dequeueInputBuffer (FFAMediaCodec *codec, int64_t timeoutUs)
 
int ff_AMediaCodec_queueInputBuffer (FFAMediaCodec *codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags)
 
ssize_t ff_AMediaCodec_dequeueOutputBuffer (FFAMediaCodec *codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
 
uint8_tff_AMediaCodec_getInputBuffer (FFAMediaCodec *codec, size_t idx, size_t *out_size)
 
uint8_tff_AMediaCodec_getOutputBuffer (FFAMediaCodec *codec, size_t idx, size_t *out_size)
 
FFAMediaFormatff_AMediaCodec_getOutputFormat (FFAMediaCodec *codec)
 
int ff_AMediaCodec_infoTryAgainLater (FFAMediaCodec *codec, ssize_t idx)
 
int ff_AMediaCodec_infoOutputBuffersChanged (FFAMediaCodec *codec, ssize_t idx)
 
int ff_AMediaCodec_infoOutputFormatChanged (FFAMediaCodec *codec, ssize_t idx)
 
int ff_AMediaCodec_getBufferFlagCodecConfig (FFAMediaCodec *codec)
 
int ff_AMediaCodec_getBufferFlagEndOfStream (FFAMediaCodec *codec)
 
int ff_AMediaCodec_getBufferFlagKeyFrame (FFAMediaCodec *codec)
 
int ff_AMediaCodec_getConfigureFlagEncode (FFAMediaCodec *codec)
 
int ff_AMediaCodec_cleanOutputBuffers (FFAMediaCodec *codec)
 
int ff_Build_SDK_INT (AVCodecContext *avctx)
 

Variables

static const struct FFJniField jni_amediacodeclist_mapping []
 
static const struct FFJniField jni_amediaformat_mapping []
 
static const AVClass amediaformat_class
 
static const struct FFJniField jni_amediacodec_mapping []
 
static const AVClass amediacodec_class
 

Macro Definition Documentation

#define JNI_GET_ENV_OR_RETURN (   env,
  log_ctx,
  ret 
)
Value:
do { \
(env) = ff_jni_get_env(log_ctx); \
if (!(env)) { \
} \
} while (0)
if(ret)
JNIEnv * ff_jni_get_env(void *log_ctx)
Definition: ffjni.c:51
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return

Definition at line 299 of file mediacodec_wrapper.c.

Referenced by codec_init_static_fields(), ff_AMediaCodec_configure(), ff_AMediaCodec_delete(), ff_AMediaCodec_dequeueInputBuffer(), ff_AMediaCodec_dequeueOutputBuffer(), ff_AMediaCodec_flush(), ff_AMediaCodec_getInputBuffer(), ff_AMediaCodec_getName(), ff_AMediaCodec_getOutputBuffer(), ff_AMediaCodec_getOutputFormat(), ff_AMediaCodec_queueInputBuffer(), ff_AMediaCodec_releaseOutputBuffer(), ff_AMediaCodec_releaseOutputBufferAtTime(), ff_AMediaCodec_start(), ff_AMediaCodec_stop(), ff_AMediaCodecList_getCodecNameByType(), ff_AMediaCodecProfile_getProfileFromAVCodecContext(), ff_AMediaFormat_delete(), ff_AMediaFormat_getBuffer(), ff_AMediaFormat_getFloat(), ff_AMediaFormat_getInt32(), ff_AMediaFormat_getInt64(), ff_AMediaFormat_getString(), ff_AMediaFormat_toString(), and ff_Build_SDK_INT().

#define JNI_GET_ENV_OR_RETURN_VOID (   env,
  log_ctx 
)
Value:
do { \
(env) = ff_jni_get_env(log_ctx); \
if (!(env)) { \
} \
} while (0)
if(ret)
JNIEnv * ff_jni_get_env(void *log_ctx)
Definition: ffjni.c:51
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return

Definition at line 306 of file mediacodec_wrapper.c.

Referenced by ff_AMediaFormat_setBuffer(), ff_AMediaFormat_setFloat(), ff_AMediaFormat_setInt32(), ff_AMediaFormat_setInt64(), and ff_AMediaFormat_setString().

#define CREATE_CODEC_BY_NAME   0

Definition at line 1175 of file mediacodec_wrapper.c.

Referenced by codec_create().

#define CREATE_DECODER_BY_TYPE   1

Definition at line 1176 of file mediacodec_wrapper.c.

Referenced by codec_create().

#define CREATE_ENCODER_BY_TYPE   2

Definition at line 1177 of file mediacodec_wrapper.c.

Referenced by codec_create().

#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC (   name,
  method 
)
Value:
FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \
{ \
} \
const char * arg
Definition: jacosubdec.c:66
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return
static FFAMediaCodec * codec_create(int method, const char *arg)
const char * name
Definition: opengl_enc.c:102

Definition at line 1279 of file mediacodec_wrapper.c.

Function Documentation

int ff_AMediaCodecProfile_getProfileFromAVCodecContext ( AVCodecContext avctx)

The following API around MediaCodec and MediaFormat is based on the NDK one provided by Google since Android 5.0.

Differences from the NDK API:

Buffers returned by ff_AMediaFormat_toString and ff_AMediaFormat_getString are newly allocated buffer and must be freed by the user after use.

The MediaCrypto API is not implemented.

ff_AMediaCodec_infoTryAgainLater, ff_AMediaCodec_infoOutputBuffersChanged, ff_AMediaCodec_infoOutputFormatChanged, ff_AMediaCodec_cleanOutputBuffers ff_AMediaCodec_getName and ff_AMediaCodec_getBufferFlagEndOfStream are not part of the original NDK API and are convenience functions to hide JNI implementation.

The API around MediaCodecList is not part of the NDK (and is lacking as we still need to retrieve the codec name to work around faulty decoders and encoders).

For documentation, please refers to NdkMediaCodec.h NdkMediaFormat.h and http://developer.android.com/reference/android/media/MediaCodec.html.

Definition at line 313 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_init().

char* ff_AMediaCodecList_getCodecNameByType ( const char *  mime,
int  profile,
int  encoder,
void log_ctx 
)

Definition at line 382 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_init().

FFAMediaFormat* ff_AMediaFormat_new ( void  )

Definition at line 612 of file mediacodec_wrapper.c.

Referenced by mediacodec_decode_init().

static FFAMediaFormat* ff_AMediaFormat_newFromObject ( void object)
static

Definition at line 657 of file mediacodec_wrapper.c.

Referenced by ff_AMediaCodec_getOutputFormat().

int ff_AMediaFormat_delete ( FFAMediaFormat format)
char* ff_AMediaFormat_toString ( FFAMediaFormat format)
int ff_AMediaFormat_getInt32 ( FFAMediaFormat format,
const char *  name,
int32_t out 
)

Definition at line 739 of file mediacodec_wrapper.c.

int ff_AMediaFormat_getInt64 ( FFAMediaFormat format,
const char *  name,
int64_t *  out 
)

Definition at line 778 of file mediacodec_wrapper.c.

int ff_AMediaFormat_getFloat ( FFAMediaFormat format,
const char *  name,
float *  out 
)

Definition at line 817 of file mediacodec_wrapper.c.

int ff_AMediaFormat_getBuffer ( FFAMediaFormat format,
const char *  name,
void **  data,
size_t *  size 
)

Definition at line 856 of file mediacodec_wrapper.c.

int ff_AMediaFormat_getString ( FFAMediaFormat format,
const char *  name,
const char **  out 
)

Definition at line 914 of file mediacodec_wrapper.c.

void ff_AMediaFormat_setInt32 ( FFAMediaFormat format,
const char *  name,
int32_t  value 
)

Definition at line 964 of file mediacodec_wrapper.c.

Referenced by mediacodec_decode_init().

void ff_AMediaFormat_setInt64 ( FFAMediaFormat format,
const char *  name,
int64_t  value 
)

Definition at line 989 of file mediacodec_wrapper.c.

void ff_AMediaFormat_setFloat ( FFAMediaFormat format,
const char *  name,
float  value 
)

Definition at line 1014 of file mediacodec_wrapper.c.

void ff_AMediaFormat_setString ( FFAMediaFormat format,
const char *  name,
const char *  value 
)

Definition at line 1039 of file mediacodec_wrapper.c.

Referenced by mediacodec_decode_init().

void ff_AMediaFormat_setBuffer ( FFAMediaFormat format,
const char *  name,
void data,
size_t  size 
)

Definition at line 1074 of file mediacodec_wrapper.c.

Referenced by mediacodec_decode_close().

static int codec_init_static_fields ( FFAMediaCodec codec)
static

Definition at line 1121 of file mediacodec_wrapper.c.

Referenced by codec_create().

static FFAMediaCodec* codec_create ( int  method,
const char *  arg 
)
inlinestatic

Definition at line 1179 of file mediacodec_wrapper.c.

int ff_AMediaCodec_delete ( FFAMediaCodec codec)

Definition at line 1289 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_unref().

char* ff_AMediaCodec_getName ( FFAMediaCodec codec)

Definition at line 1319 of file mediacodec_wrapper.c.

int ff_AMediaCodec_configure ( FFAMediaCodec codec,
const FFAMediaFormat format,
void surface,
void crypto,
uint32_t  flags 
)

Definition at line 1342 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_init().

int ff_AMediaCodec_start ( FFAMediaCodec codec)

Definition at line 1359 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_init().

int ff_AMediaCodec_stop ( FFAMediaCodec codec)

Definition at line 1376 of file mediacodec_wrapper.c.

int ff_AMediaCodec_flush ( FFAMediaCodec codec)

Definition at line 1393 of file mediacodec_wrapper.c.

Referenced by mediacodec_dec_flush_codec().

int ff_AMediaCodec_releaseOutputBuffer ( FFAMediaCodec codec,
size_t  idx,
int  render 
)
int ff_AMediaCodec_releaseOutputBufferAtTime ( FFAMediaCodec codec,
size_t  idx,
int64_t  timestampNs 
)

Definition at line 1427 of file mediacodec_wrapper.c.

ssize_t ff_AMediaCodec_dequeueInputBuffer ( FFAMediaCodec codec,
int64_t  timeoutUs 
)

Definition at line 1444 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_send(), and mediacodec_receive_frame().

int ff_AMediaCodec_queueInputBuffer ( FFAMediaCodec codec,
size_t  idx,
off_t  offset,
size_t  size,
uint64_t  time,
uint32_t  flags 
)

Definition at line 1461 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_send().

ssize_t ff_AMediaCodec_dequeueOutputBuffer ( FFAMediaCodec codec,
FFAMediaCodecBufferInfo info,
int64_t  timeoutUs 
)

Definition at line 1478 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive().

uint8_t* ff_AMediaCodec_getInputBuffer ( FFAMediaCodec codec,
size_t  idx,
size_t *  out_size 
)

Definition at line 1513 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_send().

uint8_t* ff_AMediaCodec_getOutputBuffer ( FFAMediaCodec codec,
size_t  idx,
size_t *  out_size 
)

Definition at line 1561 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive().

FFAMediaFormat* ff_AMediaCodec_getOutputFormat ( FFAMediaCodec codec)

Definition at line 1609 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_init(), and ff_mediacodec_dec_receive().

int ff_AMediaCodec_infoTryAgainLater ( FFAMediaCodec codec,
ssize_t  idx 
)

Definition at line 1632 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive(), and ff_mediacodec_dec_send().

int ff_AMediaCodec_infoOutputBuffersChanged ( FFAMediaCodec codec,
ssize_t  idx 
)

Definition at line 1637 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive().

int ff_AMediaCodec_infoOutputFormatChanged ( FFAMediaCodec codec,
ssize_t  idx 
)

Definition at line 1642 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive().

int ff_AMediaCodec_getBufferFlagCodecConfig ( FFAMediaCodec codec)

Definition at line 1647 of file mediacodec_wrapper.c.

int ff_AMediaCodec_getBufferFlagEndOfStream ( FFAMediaCodec codec)

Definition at line 1652 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive(), and ff_mediacodec_dec_send().

int ff_AMediaCodec_getBufferFlagKeyFrame ( FFAMediaCodec codec)

Definition at line 1657 of file mediacodec_wrapper.c.

int ff_AMediaCodec_getConfigureFlagEncode ( FFAMediaCodec codec)

Definition at line 1662 of file mediacodec_wrapper.c.

int ff_AMediaCodec_cleanOutputBuffers ( FFAMediaCodec codec)

Definition at line 1667 of file mediacodec_wrapper.c.

Referenced by ff_mediacodec_dec_receive().

int ff_Build_SDK_INT ( AVCodecContext avctx)

Definition at line 1690 of file mediacodec_wrapper.c.

Referenced by mediacodec_decode_init().

Variable Documentation

const struct FFJniField jni_amediacodeclist_mapping[]
static

Definition at line 71 of file mediacodec_wrapper.c.

const struct FFJniField jni_amediaformat_mapping[]
static
Initial value:
= {
{ "android/media/MediaFormat", NULL, NULL, FF_JNI_CLASS, 0x42, 1 },
{ "android/media/MediaFormat", "<init>", "()V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "containsKey", "(Ljava/lang/String;)Z", FF_JNI_METHOD,0x42, 1 },
{ "android/media/MediaFormat", "getInteger", "(Ljava/lang/String;)I", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "getLong", "(Ljava/lang/String;)J", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "getFloat", "(Ljava/lang/String;)F", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "getByteBuffer", "(Ljava/lang/String;)Ljava/nio/ByteBuffer;", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "getString", "(Ljava/lang/String;)Ljava/lang/String;", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "setInteger", "(Ljava/lang/String;I)V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "setLong", "(Ljava/lang/String;J)V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "setFloat", "(Ljava/lang/String;F)V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "setByteBuffer", "(Ljava/lang/String;Ljava/nio/ByteBuffer;)V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "setString", "(Ljava/lang/String;Ljava/lang/String;)V", FF_JNI_METHOD, 0x42, 1 },
{ "android/media/MediaFormat", "toString", "()Ljava/lang/String;", FF_JNI_METHOD, 0x42, 1 },
{ NULL }
}
#define NULL
Definition: coverity.c:32

Definition at line 132 of file mediacodec_wrapper.c.

const AVClass amediaformat_class
static
Initial value:
= {
.class_name = "amediaformat",
.item_name = av_default_item_name,
}
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191

Definition at line 156 of file mediacodec_wrapper.c.

Referenced by ff_AMediaFormat_new(), and ff_AMediaFormat_newFromObject().

const struct FFJniField jni_amediacodec_mapping[]
static

Definition at line 219 of file mediacodec_wrapper.c.

const AVClass amediacodec_class
static
Initial value:
= {
.class_name = "amediacodec",
.item_name = av_default_item_name,
}
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191

Definition at line 268 of file mediacodec_wrapper.c.

Referenced by codec_create().