|
|
|
@ -160,12 +160,14 @@ static const AVClass amediaformat_class = { |
|
|
|
|
.version = LIBAVUTIL_VERSION_INT, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct FFAMediaFormat { |
|
|
|
|
typedef struct FFAMediaFormatJni { |
|
|
|
|
FFAMediaFormat api; |
|
|
|
|
|
|
|
|
|
const AVClass *class; |
|
|
|
|
struct JNIAMediaFormatFields jfields; |
|
|
|
|
jobject object; |
|
|
|
|
}; |
|
|
|
|
} FFAMediaFormatJni; |
|
|
|
|
|
|
|
|
|
static const FFAMediaFormat media_format_jni; |
|
|
|
|
|
|
|
|
|
struct JNIAMediaCodecFields { |
|
|
|
|
|
|
|
|
@ -272,9 +274,8 @@ static const AVClass amediacodec_class = { |
|
|
|
|
.version = LIBAVUTIL_VERSION_INT, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct FFAMediaCodec { |
|
|
|
|
|
|
|
|
|
const AVClass *class; |
|
|
|
|
typedef struct FFAMediaCodecJni { |
|
|
|
|
FFAMediaCodec api; |
|
|
|
|
|
|
|
|
|
struct JNIAMediaCodecFields jfields; |
|
|
|
|
|
|
|
|
@ -295,7 +296,9 @@ struct FFAMediaCodec { |
|
|
|
|
int CONFIGURE_FLAG_ENCODE; |
|
|
|
|
|
|
|
|
|
int has_get_i_o_buffer; |
|
|
|
|
}; |
|
|
|
|
} FFAMediaCodecJni; |
|
|
|
|
|
|
|
|
|
static const FFAMediaCodec media_codec_jni; |
|
|
|
|
|
|
|
|
|
#define JNI_GET_ENV_OR_RETURN(env, log_ctx, ret) do { \ |
|
|
|
|
(env) = ff_jni_get_env(log_ctx); \
|
|
|
|
@ -622,17 +625,17 @@ done: |
|
|
|
|
return name; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FFAMediaFormat *ff_AMediaFormat_new(void) |
|
|
|
|
static FFAMediaFormat *mediaformat_jni_new(void) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaFormat *format = NULL; |
|
|
|
|
FFAMediaFormatJni *format = NULL; |
|
|
|
|
jobject object = NULL; |
|
|
|
|
|
|
|
|
|
format = av_mallocz(sizeof(FFAMediaFormat)); |
|
|
|
|
format = av_mallocz(sizeof(*format)); |
|
|
|
|
if (!format) { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
format->class = &amediaformat_class; |
|
|
|
|
format->api = media_format_jni; |
|
|
|
|
|
|
|
|
|
env = ff_jni_get_env(format); |
|
|
|
|
if (!env) { |
|
|
|
@ -664,19 +667,19 @@ fail: |
|
|
|
|
av_freep(&format); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return format; |
|
|
|
|
return (FFAMediaFormat *)format; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static FFAMediaFormat *ff_AMediaFormat_newFromObject(void *object) |
|
|
|
|
static FFAMediaFormat *mediaformat_jni_newFromObject(void *object) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaFormat *format = NULL; |
|
|
|
|
FFAMediaFormatJni *format = NULL; |
|
|
|
|
|
|
|
|
|
format = av_mallocz(sizeof(FFAMediaFormat)); |
|
|
|
|
format = av_mallocz(sizeof(*format)); |
|
|
|
|
if (!format) { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
format->class = &amediaformat_class; |
|
|
|
|
format->api = media_format_jni; |
|
|
|
|
|
|
|
|
|
env = ff_jni_get_env(format); |
|
|
|
|
if (!env) { |
|
|
|
@ -693,7 +696,7 @@ static FFAMediaFormat *ff_AMediaFormat_newFromObject(void *object) |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return format; |
|
|
|
|
return (FFAMediaFormat *)format; |
|
|
|
|
fail: |
|
|
|
|
ff_jni_reset_jfields(env, &format->jfields, jni_amediaformat_mapping, 1, format); |
|
|
|
|
|
|
|
|
@ -702,10 +705,10 @@ fail: |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_delete(FFAMediaFormat* format) |
|
|
|
|
static int mediaformat_jni_delete(FFAMediaFormat* ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
|
|
|
|
|
if (!format) { |
|
|
|
@ -724,10 +727,10 @@ int ff_AMediaFormat_delete(FFAMediaFormat* format) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char* ff_AMediaFormat_toString(FFAMediaFormat* format) |
|
|
|
|
static char* mediaformat_jni_toString(FFAMediaFormat* ctx) |
|
|
|
|
{ |
|
|
|
|
char *ret = NULL; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring description = NULL; |
|
|
|
|
|
|
|
|
@ -749,10 +752,10 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_getInt32(FFAMediaFormat* format, const char *name, int32_t *out) |
|
|
|
|
static int mediaformat_jni_getInt32(FFAMediaFormat* ctx, const char *name, int32_t *out) |
|
|
|
|
{ |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jboolean contains_key; |
|
|
|
@ -788,10 +791,10 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_getInt64(FFAMediaFormat* format, const char *name, int64_t *out) |
|
|
|
|
static int mediaformat_jni_getInt64(FFAMediaFormat* ctx, const char *name, int64_t *out) |
|
|
|
|
{ |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jboolean contains_key; |
|
|
|
@ -827,10 +830,10 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_getFloat(FFAMediaFormat* format, const char *name, float *out) |
|
|
|
|
static int mediaformat_jni_getFloat(FFAMediaFormat* ctx, const char *name, float *out) |
|
|
|
|
{ |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jboolean contains_key; |
|
|
|
@ -866,10 +869,10 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_getBuffer(FFAMediaFormat* format, const char *name, void** data, size_t *size) |
|
|
|
|
static int mediaformat_jni_getBuffer(FFAMediaFormat* ctx, const char *name, void** data, size_t *size) |
|
|
|
|
{ |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jboolean contains_key; |
|
|
|
@ -924,10 +927,10 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaFormat_getString(FFAMediaFormat* format, const char *name, const char **out) |
|
|
|
|
static int mediaformat_jni_getString(FFAMediaFormat* ctx, const char *name, const char **out) |
|
|
|
|
{ |
|
|
|
|
int ret = 1; |
|
|
|
|
|
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jboolean contains_key; |
|
|
|
@ -974,10 +977,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_AMediaFormat_setInt32(FFAMediaFormat* format, const char* name, int32_t value) |
|
|
|
|
static void mediaformat_jni_setInt32(FFAMediaFormat* ctx, const char* name, int32_t value) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
|
|
|
|
|
av_assert0(format != NULL); |
|
|
|
|
|
|
|
|
@ -999,10 +1003,11 @@ fail: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_AMediaFormat_setInt64(FFAMediaFormat* format, const char* name, int64_t value) |
|
|
|
|
static void mediaformat_jni_setInt64(FFAMediaFormat* ctx, const char* name, int64_t value) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
|
|
|
|
|
av_assert0(format != NULL); |
|
|
|
|
|
|
|
|
@ -1024,10 +1029,11 @@ fail: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_AMediaFormat_setFloat(FFAMediaFormat* format, const char* name, float value) |
|
|
|
|
static void mediaformat_jni_setFloat(FFAMediaFormat* ctx, const char* name, float value) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
|
|
|
|
|
av_assert0(format != NULL); |
|
|
|
|
|
|
|
|
@ -1049,11 +1055,12 @@ fail: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_AMediaFormat_setString(FFAMediaFormat* format, const char* name, const char* value) |
|
|
|
|
static void mediaformat_jni_setString(FFAMediaFormat* ctx, const char* name, const char* value) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jstring string = NULL; |
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
|
|
|
|
|
av_assert0(format != NULL); |
|
|
|
|
|
|
|
|
@ -1084,12 +1091,13 @@ fail: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ff_AMediaFormat_setBuffer(FFAMediaFormat* format, const char* name, void* data, size_t size) |
|
|
|
|
static void mediaformat_jni_setBuffer(FFAMediaFormat* ctx, const char* name, void* data, size_t size) |
|
|
|
|
{ |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jstring key = NULL; |
|
|
|
|
jobject buffer = NULL; |
|
|
|
|
void *buffer_data = NULL; |
|
|
|
|
FFAMediaFormatJni *format = (FFAMediaFormatJni *)ctx; |
|
|
|
|
|
|
|
|
|
av_assert0(format != NULL); |
|
|
|
|
|
|
|
|
@ -1131,7 +1139,7 @@ fail: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int codec_init_static_fields(FFAMediaCodec *codec) |
|
|
|
|
static int codec_init_static_fields(FFAMediaCodecJni *codec) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
@ -1193,17 +1201,17 @@ static inline FFAMediaCodec *codec_create(int method, const char *arg) |
|
|
|
|
{ |
|
|
|
|
int ret = -1; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodec *codec = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = NULL; |
|
|
|
|
jstring jarg = NULL; |
|
|
|
|
jobject object = NULL; |
|
|
|
|
jobject buffer_info = NULL; |
|
|
|
|
jmethodID create_id = NULL; |
|
|
|
|
|
|
|
|
|
codec = av_mallocz(sizeof(FFAMediaCodec)); |
|
|
|
|
codec = av_mallocz(sizeof(*codec)); |
|
|
|
|
if (!codec) { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
codec->class = &amediacodec_class; |
|
|
|
|
codec->api = media_codec_jni; |
|
|
|
|
|
|
|
|
|
env = ff_jni_get_env(codec); |
|
|
|
|
if (!env) { |
|
|
|
@ -1286,11 +1294,11 @@ fail: |
|
|
|
|
av_freep(&codec); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return codec; |
|
|
|
|
return (FFAMediaCodec *)codec; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \ |
|
|
|
|
FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \
|
|
|
|
|
static FFAMediaCodec *mediacodec_jni_##name(const char *arg) \
|
|
|
|
|
{ \
|
|
|
|
|
return codec_create(method, arg); \
|
|
|
|
|
} \
|
|
|
|
@ -1299,10 +1307,10 @@ DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createCodecByName, CREATE_CODEC_BY_NAME) |
|
|
|
|
DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createDecoderByType, CREATE_DECODER_BY_TYPE) |
|
|
|
|
DECLARE_FF_AMEDIACODEC_CREATE_FUNC(createEncoderByType, CREATE_ENCODER_BY_TYPE) |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_delete(FFAMediaCodec* codec) |
|
|
|
|
static int mediacodec_jni_delete(FFAMediaCodec* ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
|
|
|
|
|
if (!codec) { |
|
|
|
@ -1335,11 +1343,12 @@ int ff_AMediaCodec_delete(FFAMediaCodec* codec) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char *ff_AMediaCodec_getName(FFAMediaCodec *codec) |
|
|
|
|
static char *mediacodec_jni_getName(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
char *ret = NULL; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
jobject *name = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, NULL); |
|
|
|
|
|
|
|
|
@ -1358,10 +1367,12 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_configure(FFAMediaCodec* codec, const FFAMediaFormat* format, void* surface, void *crypto, uint32_t flags) |
|
|
|
|
static int mediacodec_jni_configure(FFAMediaCodec* ctx, const FFAMediaFormat* format_ctx, void* surface, void *crypto, uint32_t flags) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
const FFAMediaFormatJni *format = (FFAMediaFormatJni *)format_ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1375,10 +1386,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_start(FFAMediaCodec* codec) |
|
|
|
|
static int mediacodec_jni_start(FFAMediaCodec* ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1392,10 +1404,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_stop(FFAMediaCodec* codec) |
|
|
|
|
static int mediacodec_jni_stop(FFAMediaCodec* ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1409,10 +1422,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_flush(FFAMediaCodec* codec) |
|
|
|
|
static int mediacodec_jni_flush(FFAMediaCodec* ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1426,10 +1440,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_releaseOutputBuffer(FFAMediaCodec* codec, size_t idx, int render) |
|
|
|
|
static int mediacodec_jni_releaseOutputBuffer(FFAMediaCodec* ctx, size_t idx, int render) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1443,10 +1458,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_releaseOutputBufferAtTime(FFAMediaCodec *codec, size_t idx, int64_t timestampNs) |
|
|
|
|
static int mediacodec_jni_releaseOutputBufferAtTime(FFAMediaCodec *ctx, size_t idx, int64_t timestampNs) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1460,10 +1476,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ssize_t ff_AMediaCodec_dequeueInputBuffer(FFAMediaCodec* codec, int64_t timeoutUs) |
|
|
|
|
static ssize_t mediacodec_jni_dequeueInputBuffer(FFAMediaCodec* ctx, int64_t timeoutUs) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1477,10 +1494,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_queueInputBuffer(FFAMediaCodec* codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags) |
|
|
|
|
static int mediacodec_jni_queueInputBuffer(FFAMediaCodec* ctx, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1494,10 +1512,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec* codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs) |
|
|
|
|
static ssize_t mediacodec_jni_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCodecBufferInfo *info, int64_t timeoutUs) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
JNI_GET_ENV_OR_RETURN(env, codec, AVERROR_EXTERNAL); |
|
|
|
|
|
|
|
|
@ -1529,11 +1548,11 @@ ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec* codec, FFAMediaCodecBu |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t* ff_AMediaCodec_getInputBuffer(FFAMediaCodec* codec, size_t idx, size_t *out_size) |
|
|
|
|
static uint8_t* mediacodec_jni_getInputBuffer(FFAMediaCodec* ctx, size_t idx, size_t *out_size) |
|
|
|
|
{ |
|
|
|
|
uint8_t *ret = NULL; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
|
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
jobject buffer = NULL; |
|
|
|
|
jobject input_buffers = NULL; |
|
|
|
|
|
|
|
|
@ -1577,11 +1596,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t* ff_AMediaCodec_getOutputBuffer(FFAMediaCodec* codec, size_t idx, size_t *out_size) |
|
|
|
|
static uint8_t* mediacodec_jni_getOutputBuffer(FFAMediaCodec* ctx, size_t idx, size_t *out_size) |
|
|
|
|
{ |
|
|
|
|
uint8_t *ret = NULL; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
|
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
jobject buffer = NULL; |
|
|
|
|
jobject output_buffers = NULL; |
|
|
|
|
|
|
|
|
@ -1625,10 +1644,11 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FFAMediaFormat* ff_AMediaCodec_getOutputFormat(FFAMediaCodec* codec) |
|
|
|
|
static FFAMediaFormat* mediacodec_jni_getOutputFormat(FFAMediaCodec* ctx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaFormat *ret = NULL; |
|
|
|
|
JNIEnv *env = NULL; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
jobject mediaformat = NULL; |
|
|
|
|
|
|
|
|
@ -1639,7 +1659,7 @@ FFAMediaFormat* ff_AMediaCodec_getOutputFormat(FFAMediaCodec* codec) |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ret = ff_AMediaFormat_newFromObject(mediaformat); |
|
|
|
|
ret = mediaformat_jni_newFromObject(mediaformat); |
|
|
|
|
fail: |
|
|
|
|
if (mediaformat) { |
|
|
|
|
(*env)->DeleteLocalRef(env, mediaformat); |
|
|
|
@ -1648,44 +1668,52 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_infoTryAgainLater(FFAMediaCodec *codec, ssize_t idx) |
|
|
|
|
static int mediacodec_jni_infoTryAgainLater(FFAMediaCodec *ctx, ssize_t idx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return idx == codec->INFO_TRY_AGAIN_LATER; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_infoOutputBuffersChanged(FFAMediaCodec *codec, ssize_t idx) |
|
|
|
|
static int mediacodec_jni_infoOutputBuffersChanged(FFAMediaCodec *ctx, ssize_t idx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return idx == codec->INFO_OUTPUT_BUFFERS_CHANGED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_infoOutputFormatChanged(FFAMediaCodec *codec, ssize_t idx) |
|
|
|
|
static int mediacodec_jni_infoOutputFormatChanged(FFAMediaCodec *ctx, ssize_t idx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return idx == codec->INFO_OUTPUT_FORMAT_CHANGED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_getBufferFlagCodecConfig(FFAMediaCodec *codec) |
|
|
|
|
static int mediacodec_jni_getBufferFlagCodecConfig(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return codec->BUFFER_FLAG_CODEC_CONFIG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_getBufferFlagEndOfStream(FFAMediaCodec *codec) |
|
|
|
|
static int mediacodec_jni_getBufferFlagEndOfStream(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return codec->BUFFER_FLAG_END_OF_STREAM; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_getBufferFlagKeyFrame(FFAMediaCodec *codec) |
|
|
|
|
static int mediacodec_jni_getBufferFlagKeyFrame(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return codec->BUFFER_FLAG_KEY_FRAME; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_getConfigureFlagEncode(FFAMediaCodec *codec) |
|
|
|
|
static int mediacodec_jni_getConfigureFlagEncode(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
return codec->CONFIGURE_FLAG_ENCODE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_AMediaCodec_cleanOutputBuffers(FFAMediaCodec *codec) |
|
|
|
|
static int mediacodec_jni_cleanOutputBuffers(FFAMediaCodec *ctx) |
|
|
|
|
{ |
|
|
|
|
int ret = 0; |
|
|
|
|
FFAMediaCodecJni *codec = (FFAMediaCodecJni *)ctx; |
|
|
|
|
|
|
|
|
|
if (!codec->has_get_i_o_buffer) { |
|
|
|
|
if (codec->output_buffers) { |
|
|
|
@ -1706,6 +1734,86 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const FFAMediaFormat media_format_jni = { |
|
|
|
|
.class = &amediaformat_class, |
|
|
|
|
|
|
|
|
|
.create = mediaformat_jni_new, |
|
|
|
|
.delete = mediaformat_jni_delete, |
|
|
|
|
|
|
|
|
|
.toString = mediaformat_jni_toString, |
|
|
|
|
|
|
|
|
|
.getInt32 = mediaformat_jni_getInt32, |
|
|
|
|
.getInt64 = mediaformat_jni_getInt64, |
|
|
|
|
.getFloat = mediaformat_jni_getFloat, |
|
|
|
|
.getBuffer = mediaformat_jni_getBuffer, |
|
|
|
|
.getString = mediaformat_jni_getString, |
|
|
|
|
|
|
|
|
|
.setInt32 = mediaformat_jni_setInt32, |
|
|
|
|
.setInt64 = mediaformat_jni_setInt64, |
|
|
|
|
.setFloat = mediaformat_jni_setFloat, |
|
|
|
|
.setString = mediaformat_jni_setString, |
|
|
|
|
.setBuffer = mediaformat_jni_setBuffer, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const FFAMediaCodec media_codec_jni = { |
|
|
|
|
.class = &amediacodec_class, |
|
|
|
|
|
|
|
|
|
.getName = mediacodec_jni_getName, |
|
|
|
|
|
|
|
|
|
.createCodecByName = mediacodec_jni_createCodecByName, |
|
|
|
|
.createDecoderByType = mediacodec_jni_createDecoderByType, |
|
|
|
|
.createEncoderByType = mediacodec_jni_createEncoderByType, |
|
|
|
|
.delete = mediacodec_jni_delete, |
|
|
|
|
|
|
|
|
|
.configure = mediacodec_jni_configure, |
|
|
|
|
.start = mediacodec_jni_start, |
|
|
|
|
.stop = mediacodec_jni_stop, |
|
|
|
|
.flush = mediacodec_jni_flush, |
|
|
|
|
|
|
|
|
|
.getInputBuffer = mediacodec_jni_getInputBuffer, |
|
|
|
|
.getOutputBuffer = mediacodec_jni_getOutputBuffer, |
|
|
|
|
|
|
|
|
|
.dequeueInputBuffer = mediacodec_jni_dequeueInputBuffer, |
|
|
|
|
.queueInputBuffer = mediacodec_jni_queueInputBuffer, |
|
|
|
|
|
|
|
|
|
.dequeueOutputBuffer = mediacodec_jni_dequeueOutputBuffer, |
|
|
|
|
.getOutputFormat = mediacodec_jni_getOutputFormat, |
|
|
|
|
|
|
|
|
|
.releaseOutputBuffer = mediacodec_jni_releaseOutputBuffer, |
|
|
|
|
.releaseOutputBufferAtTime = mediacodec_jni_releaseOutputBufferAtTime, |
|
|
|
|
|
|
|
|
|
.infoTryAgainLater = mediacodec_jni_infoTryAgainLater, |
|
|
|
|
.infoOutputBuffersChanged = mediacodec_jni_infoOutputBuffersChanged, |
|
|
|
|
.infoOutputFormatChanged = mediacodec_jni_infoOutputFormatChanged, |
|
|
|
|
|
|
|
|
|
.getBufferFlagCodecConfig = mediacodec_jni_getBufferFlagCodecConfig, |
|
|
|
|
.getBufferFlagEndOfStream = mediacodec_jni_getBufferFlagEndOfStream, |
|
|
|
|
.getBufferFlagKeyFrame = mediacodec_jni_getBufferFlagKeyFrame, |
|
|
|
|
|
|
|
|
|
.getConfigureFlagEncode = mediacodec_jni_getConfigureFlagEncode, |
|
|
|
|
.cleanOutputBuffers = mediacodec_jni_cleanOutputBuffers, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
FFAMediaFormat *ff_AMediaFormat_new(void) |
|
|
|
|
{ |
|
|
|
|
return media_format_jni.create(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FFAMediaCodec* ff_AMediaCodec_createCodecByName(const char *name) |
|
|
|
|
{ |
|
|
|
|
return media_codec_jni.createCodecByName(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FFAMediaCodec* ff_AMediaCodec_createDecoderByType(const char *mime_type) |
|
|
|
|
{ |
|
|
|
|
return media_codec_jni.createDecoderByType(mime_type); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FFAMediaCodec* ff_AMediaCodec_createEncoderByType(const char *mime_type) |
|
|
|
|
{ |
|
|
|
|
return media_codec_jni.createEncoderByType(mime_type); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_Build_SDK_INT(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
int ret = -1; |
|
|
|
|