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);
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;
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;
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
ptrdiff_t const GLvoid * data
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)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
#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
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
GLsizei GLboolean const GLfloat * value
#define FF_PROFILE_HEVC_MAIN
#define FF_PROFILE_H264_EXTENDED
#define FF_PROFILE_HEVC_MAIN_10
Libavcodec version macros.
#define FF_PROFILE_H264_HIGH_422
#define FF_PROFILE_H264_HIGH
simple assert() macros that are a bit more flexible than ISO C assert().
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
and forward the result(frame or status change) to the corresponding input.If nothing is possible
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
#define FF_PROFILE_H264_HIGH_10
#define AVERROR_EXTERNAL
Generic error in an external library.