142 {
"android/media/MediaFormat",
"getByteBuffer",
"(Ljava/lang/String;)Ljava/nio/ByteBuffer;",
FF_JNI_METHOD, offsetof(
struct JNIAMediaFormatFields, get_bytebuffer_id), 1 },
148 {
"android/media/MediaFormat",
"setByteBuffer",
"(Ljava/lang/String;Ljava/nio/ByteBuffer;)V",
FF_JNI_METHOD, offsetof(
struct JNIAMediaFormatFields, set_bytebuffer_id), 1 },
238 {
"android/media/MediaCodec",
"configure",
"(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V",
FF_JNI_METHOD, offsetof(
struct JNIAMediaCodecFields, configure_id), 1 },
244 {
"android/media/MediaCodec",
"getOutputFormat",
"()Landroid/media/MediaFormat;",
FF_JNI_METHOD, offsetof(
struct JNIAMediaCodecFields, get_output_format_id), 1 },
251 {
"android/media/MediaCodec",
"dequeueOutputBuffer",
"(Landroid/media/MediaCodec$BufferInfo;J)I",
FF_JNI_METHOD, offsetof(
struct JNIAMediaCodecFields, dequeue_output_buffer_id), 1 },
299 #define JNI_GET_ENV_OR_RETURN(env, log_ctx, ret) do { \ 300 (env) = ff_jni_get_env(log_ctx); \ 306 #define JNI_GET_ENV_OR_RETURN_VOID(env, log_ctx) do { \ 307 (env) = ff_jni_get_env(log_ctx); \ 319 jfieldID field_id = 0;
389 char *supported_type =
NULL;
395 jobject codec_name =
NULL;
399 jobjectArray types =
NULL;
401 jobject capabilities =
NULL;
402 jobject profile_level =
NULL;
403 jobjectArray profile_levels =
NULL;
407 if ((ret =
ff_jni_init_jfields(env, &jfields, jni_amediacodeclist_mapping, 0, log_ctx)) < 0) {
411 if ((ret =
ff_jni_init_jfields(env, &mediaformat_jfields, jni_amediaformat_mapping, 0, log_ctx)) < 0) {
420 for(i = 0; i < codec_count; i++) {
435 is_encoder = (*env)->CallBooleanMethod(env, info, jfields.
is_encoder_id);
440 if (is_encoder != encoder) {
444 type_count = (*env)->GetArrayLength(env, types);
445 for (j = 0; j < type_count; j++) {
449 type = (*env)->GetObjectArrayElement(env, types, j);
455 if (!supported_type) {
460 codec_name = (*env)->CallObjectMethod(env, info, jfields.
get_name_id);
471 (*env)->DeleteLocalRef(env, codec_name);
477 strstr(name,
"OMX.google") ||
478 strstr(name,
"OMX.ffmpeg") ||
479 (strstr(name,
"OMX.SEC") && strstr(name,
".sw.")) ||
480 !strcmp(name,
"OMX.qcom.video.decoder.hevcswvdec")) {
490 profile_levels = (*env)->GetObjectField(env, capabilities, jfields.
profile_levels_id);
495 profile_count = (*env)->GetArrayLength(env, profile_levels);
496 if (!profile_count) {
499 for (k = 0; k < profile_count; k++) {
500 int supported_profile = 0;
507 profile_level = (*env)->GetObjectArrayElement(env, profile_levels, k);
512 supported_profile = (*env)->GetIntField(env, profile_level, jfields.
profile_id);
517 found_codec = profile == supported_profile;
520 (*env)->DeleteLocalRef(env, profile_level);
521 profile_level =
NULL;
531 if (profile_levels) {
532 (*env)->DeleteLocalRef(env, profile_levels);
533 profile_levels =
NULL;
537 (*env)->DeleteLocalRef(env, capabilities);
542 (*env)->DeleteLocalRef(env, type);
557 (*env)->DeleteLocalRef(env, info);
562 (*env)->DeleteLocalRef(env, types);
573 (*env)->DeleteLocalRef(env, codec_name);
577 (*env)->DeleteLocalRef(env, info);
581 (*env)->DeleteLocalRef(env, type);
585 (*env)->DeleteLocalRef(env, types);
589 (*env)->DeleteLocalRef(env, capabilities);
593 (*env)->DeleteLocalRef(env, profile_level);
596 if (profile_levels) {
597 (*env)->DeleteLocalRef(env, profile_levels);
616 jobject
object =
NULL;
639 format->
object = (*env)->NewGlobalRef(env,
object);
646 (*env)->DeleteLocalRef(env,
object);
678 format->
object = (*env)->NewGlobalRef(env,
object);
704 (*env)->DeleteGlobalRef(env, format->
object);
719 jstring description =
NULL;
733 (*env)->DeleteLocalRef(env, description);
745 jboolean contains_key;
772 (*env)->DeleteLocalRef(env, key);
784 jboolean contains_key;
811 (*env)->DeleteLocalRef(env, key);
823 jboolean contains_key;
850 (*env)->DeleteLocalRef(env, key);
862 jboolean contains_key;
863 jobject result =
NULL;
887 *data = (*env)->GetDirectBufferAddress(env, result);
888 *size = (*env)->GetDirectBufferCapacity(env, result);
890 if (*data && *size) {
898 memcpy(*data, src, *size);
904 (*env)->DeleteLocalRef(env, key);
908 (*env)->DeleteLocalRef(env, result);
920 jboolean contains_key;
921 jstring result =
NULL;
954 (*env)->DeleteLocalRef(env, key);
958 (*env)->DeleteLocalRef(env, result);
985 (*env)->DeleteLocalRef(env, key);
1010 (*env)->DeleteLocalRef(env, key);
1035 (*env)->DeleteLocalRef(env, key);
1043 jstring
string =
NULL;
1066 (*env)->DeleteLocalRef(env, key);
1070 (*env)->DeleteLocalRef(env,
string);
1090 if (!data || !size) {
1099 memcpy(buffer_data, data, size);
1101 buffer = (*env)->NewDirectByteBuffer(env, buffer_data, size);
1113 (*env)->DeleteLocalRef(env, key);
1117 (*env)->DeleteLocalRef(env, buffer);
1175 #define CREATE_CODEC_BY_NAME 0 1176 #define CREATE_DECODER_BY_TYPE 1 1177 #define CREATE_ENCODER_BY_TYPE 2 1184 jstring jarg =
NULL;
1185 jobject
object =
NULL;
1186 jobject buffer_info =
NULL;
1187 jmethodID create_id =
NULL;
1218 object = (*env)->CallStaticObjectMethod(env,
1226 codec->
object = (*env)->NewGlobalRef(env,
object);
1244 codec->
buffer_info = (*env)->NewGlobalRef(env, buffer_info);
1252 (*env)->DeleteLocalRef(env, jarg);
1256 (*env)->DeleteLocalRef(env,
object);
1260 (*env)->DeleteLocalRef(env, buffer_info);
1265 (*env)->DeleteGlobalRef(env, codec->
object);
1279 #define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \ 1280 FFAMediaCodec *ff_AMediaCodec_##name(const char *arg) \ 1282 return codec_create(method, arg); \ 1301 (*env)->CallVoidMethod(env, codec->object, codec->jfields.release_id);
1306 (*env)->DeleteGlobalRef(env, codec->input_buffers);
1307 codec->input_buffers =
NULL;
1309 (*env)->DeleteGlobalRef(env, codec->output_buffers);
1310 codec->output_buffers =
NULL;
1312 (*env)->DeleteGlobalRef(env, codec->object);
1313 codec->object =
NULL;
1315 (*env)->DeleteGlobalRef(env, codec->buffer_info);
1316 codec->buffer_info =
NULL;
1342 (*env)->DeleteLocalRef(env, name);
1525 jobject input_buffers =
NULL;
1541 codec->
input_buffers = (*env)->NewGlobalRef(env, input_buffers);
1547 buffer = (*env)->GetObjectArrayElement(env, codec->
input_buffers, idx);
1553 ret = (*env)->GetDirectBufferAddress(env, buffer);
1554 *out_size = (*env)->GetDirectBufferCapacity(env, buffer);
1557 (*env)->DeleteLocalRef(env, buffer);
1560 if (input_buffers) {
1561 (*env)->DeleteLocalRef(env, input_buffers);
1573 jobject output_buffers =
NULL;
1589 codec->
output_buffers = (*env)->NewGlobalRef(env, output_buffers);
1595 buffer = (*env)->GetObjectArrayElement(env, codec->
output_buffers, idx);
1601 ret = (*env)->GetDirectBufferAddress(env, buffer);
1602 *out_size = (*env)->GetDirectBufferCapacity(env, buffer);
1605 (*env)->DeleteLocalRef(env, buffer);
1608 if (output_buffers) {
1609 (*env)->DeleteLocalRef(env, output_buffers);
1620 jobject mediaformat =
NULL;
1632 (*env)->DeleteLocalRef(env, mediaformat);
1700 jclass versionClass;
1701 jfieldID sdkIntFieldID;
1704 versionClass = (*env)->FindClass(env,
"android/os/Build$VERSION");
1705 sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass,
"SDK_INT",
"I");
1706 ret = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID);
1707 (*env)->DeleteLocalRef(env, versionClass);
#define FF_PROFILE_H264_MAIN
static const char * format[]
int ff_jni_reset_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
#define LIBAVUTIL_VERSION_INT
Memory handling functions.
const char * av_default_item_name(void *ptr)
Return the context name.
jstring ff_jni_utf_chars_to_jstring(JNIEnv *env, const char *utf_chars, void *log_ctx)
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define FF_PROFILE_H264_BASELINE
#define FF_PROFILE_HEVC_MAIN
#define FF_PROFILE_H264_EXTENDED
#define FF_PROFILE_HEVC_MAIN_10
Libavcodec version macros.
#define i(width, name, range_min, range_max)
#define FF_PROFILE_H264_HIGH_422
#define FF_PROFILE_H264_HIGH
simple assert() macros that are a bit more flexible than ISO C assert().
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static const uint8_t offset[127][2]
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
char * ff_jni_jstring_to_utf_chars(JNIEnv *env, jstring string, void *log_ctx)
#define FF_PROFILE_HEVC_MAIN_STILL_PICTURE
int ff_jni_init_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
int ff_jni_exception_check(JNIEnv *env, int log, void *log_ctx)
Libavcodec external API header.
#define FF_PROFILE_H264_HIGH_422_INTRA
main external API structure.
#define FF_PROFILE_H264_HIGH_10_INTRA
Describe the class of an AVClass context structure.
#define FF_PROFILE_H264_HIGH_444
#define flags(name, subs,...)
JNIEnv * ff_jni_get_env(void *log_ctx)
#define FF_PROFILE_H264_HIGH_444_INTRA
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
#define FF_PROFILE_H264_HIGH_10
#define AVERROR_EXTERNAL
Generic error in an external library.