26#include <media/NdkMediaFormat.h>
27#include <media/NdkMediaCodec.h>
28#include <android/native_window_jni.h>
63#define OFFSET(x) offsetof(struct JNIAMediaCodecListFields, x)
67 {
"android/media/MediaCodecList",
"findDecoderForFormat",
"(Landroid/media/MediaFormat;)Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(find_decoder_for_format_id), 0 },
70 {
"android/media/MediaCodecList",
"getCodecInfoAt",
"(I)Landroid/media/MediaCodecInfo;",
FF_JNI_STATIC_METHOD,
OFFSET(get_codec_info_at_id), 1 },
73 {
"android/media/MediaCodecInfo",
"getName",
"()Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(get_name_id), 1 },
74 {
"android/media/MediaCodecInfo",
"getCapabilitiesForType",
"(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;",
FF_JNI_METHOD,
OFFSET(get_codec_capabilities_id), 1 },
75 {
"android/media/MediaCodecInfo",
"getSupportedTypes",
"()[Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(get_supported_types_id), 1 },
76 {
"android/media/MediaCodecInfo",
"isEncoder",
"()Z",
FF_JNI_METHOD,
OFFSET(is_encoder_id), 1 },
77 {
"android/media/MediaCodecInfo",
"isSoftwareOnly",
"()Z",
FF_JNI_METHOD,
OFFSET(is_software_only_id), 0 },
80 {
"android/media/MediaCodecInfo$CodecCapabilities",
"colorFormats",
"[I",
FF_JNI_FIELD,
OFFSET(color_formats_id), 1 },
81 {
"android/media/MediaCodecInfo$CodecCapabilities",
"profileLevels",
"[Landroid/media/MediaCodecInfo$CodecProfileLevel;",
FF_JNI_FIELD,
OFFSET(profile_levels_id), 1 },
84 {
"android/media/MediaCodecInfo$CodecProfileLevel",
"profile",
"I",
FF_JNI_FIELD,
OFFSET(profile_id), 1 },
85 {
"android/media/MediaCodecInfo$CodecProfileLevel",
"level",
"I",
FF_JNI_FIELD,
OFFSET(level_id), 1 },
115#define OFFSET(x) offsetof(struct JNIAMediaFormatFields, x)
121 {
"android/media/MediaFormat",
"containsKey",
"(Ljava/lang/String;)Z",
FF_JNI_METHOD,
OFFSET(contains_key_id), 1 },
123 {
"android/media/MediaFormat",
"getInteger",
"(Ljava/lang/String;)I",
FF_JNI_METHOD,
OFFSET(get_integer_id), 1 },
124 {
"android/media/MediaFormat",
"getLong",
"(Ljava/lang/String;)J",
FF_JNI_METHOD,
OFFSET(get_long_id), 1 },
125 {
"android/media/MediaFormat",
"getFloat",
"(Ljava/lang/String;)F",
FF_JNI_METHOD,
OFFSET(get_float_id), 1 },
126 {
"android/media/MediaFormat",
"getByteBuffer",
"(Ljava/lang/String;)Ljava/nio/ByteBuffer;",
FF_JNI_METHOD,
OFFSET(get_bytebuffer_id), 1 },
127 {
"android/media/MediaFormat",
"getString",
"(Ljava/lang/String;)Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(get_string_id), 1 },
129 {
"android/media/MediaFormat",
"setInteger",
"(Ljava/lang/String;I)V",
FF_JNI_METHOD,
OFFSET(set_integer_id), 1 },
130 {
"android/media/MediaFormat",
"setLong",
"(Ljava/lang/String;J)V",
FF_JNI_METHOD,
OFFSET(set_long_id), 1 },
131 {
"android/media/MediaFormat",
"setFloat",
"(Ljava/lang/String;F)V",
FF_JNI_METHOD,
OFFSET(set_float_id), 1 },
132 {
"android/media/MediaFormat",
"setByteBuffer",
"(Ljava/lang/String;Ljava/nio/ByteBuffer;)V",
FF_JNI_METHOD,
OFFSET(set_bytebuffer_id), 1 },
133 {
"android/media/MediaFormat",
"setString",
"(Ljava/lang/String;Ljava/lang/String;)V",
FF_JNI_METHOD,
OFFSET(set_string_id), 1 },
135 {
"android/media/MediaFormat",
"toString",
"()Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(to_string_id), 1 },
142 .class_name =
"amediaformat",
209#define OFFSET(x) offsetof(struct JNIAMediaCodecFields, x)
214 {
"android/media/MediaCodec",
"INFO_OUTPUT_BUFFERS_CHANGED",
"I",
FF_JNI_STATIC_FIELD,
OFFSET(info_output_buffers_changed_id), 1 },
215 {
"android/media/MediaCodec",
"INFO_OUTPUT_FORMAT_CHANGED",
"I",
FF_JNI_STATIC_FIELD,
OFFSET(info_output_format_changed_id), 1 },
217 {
"android/media/MediaCodec",
"BUFFER_FLAG_CODEC_CONFIG",
"I",
FF_JNI_STATIC_FIELD,
OFFSET(buffer_flag_codec_config_id), 1 },
218 {
"android/media/MediaCodec",
"BUFFER_FLAG_END_OF_STREAM",
"I",
FF_JNI_STATIC_FIELD,
OFFSET(buffer_flag_end_of_stream_id), 1 },
223 {
"android/media/MediaCodec",
"createByCodecName",
"(Ljava/lang/String;)Landroid/media/MediaCodec;",
FF_JNI_STATIC_METHOD,
OFFSET(create_by_codec_name_id), 1 },
224 {
"android/media/MediaCodec",
"createDecoderByType",
"(Ljava/lang/String;)Landroid/media/MediaCodec;",
FF_JNI_STATIC_METHOD,
OFFSET(create_decoder_by_type_id), 1 },
225 {
"android/media/MediaCodec",
"createEncoderByType",
"(Ljava/lang/String;)Landroid/media/MediaCodec;",
FF_JNI_STATIC_METHOD,
OFFSET(create_encoder_by_type_id), 1 },
227 {
"android/media/MediaCodec",
"getName",
"()Ljava/lang/String;",
FF_JNI_METHOD,
OFFSET(get_name_id), 1 },
229 {
"android/media/MediaCodec",
"configure",
"(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V",
FF_JNI_METHOD,
OFFSET(configure_id), 1 },
235 {
"android/media/MediaCodec",
"getOutputFormat",
"()Landroid/media/MediaFormat;",
FF_JNI_METHOD,
OFFSET(get_output_format_id), 1 },
237 {
"android/media/MediaCodec",
"dequeueInputBuffer",
"(J)I",
FF_JNI_METHOD,
OFFSET(dequeue_input_buffer_id), 1 },
238 {
"android/media/MediaCodec",
"queueInputBuffer",
"(IIIJI)V",
FF_JNI_METHOD,
OFFSET(queue_input_buffer_id), 1 },
239 {
"android/media/MediaCodec",
"getInputBuffer",
"(I)Ljava/nio/ByteBuffer;",
FF_JNI_METHOD,
OFFSET(get_input_buffer_id), 0 },
240 {
"android/media/MediaCodec",
"getInputBuffers",
"()[Ljava/nio/ByteBuffer;",
FF_JNI_METHOD,
OFFSET(get_input_buffers_id), 1 },
242 {
"android/media/MediaCodec",
"dequeueOutputBuffer",
"(Landroid/media/MediaCodec$BufferInfo;J)I",
FF_JNI_METHOD,
OFFSET(dequeue_output_buffer_id), 1 },
243 {
"android/media/MediaCodec",
"getOutputBuffer",
"(I)Ljava/nio/ByteBuffer;",
FF_JNI_METHOD,
OFFSET(get_output_buffer_id), 0 },
244 {
"android/media/MediaCodec",
"getOutputBuffers",
"()[Ljava/nio/ByteBuffer;",
FF_JNI_METHOD,
OFFSET(get_output_buffers_id), 1 },
245 {
"android/media/MediaCodec",
"releaseOutputBuffer",
"(IZ)V",
FF_JNI_METHOD,
OFFSET(release_output_buffer_id), 1 },
246 {
"android/media/MediaCodec",
"releaseOutputBuffer",
"(IJ)V",
FF_JNI_METHOD,
OFFSET(release_output_buffer_at_time_id), 0 },
248 {
"android/media/MediaCodec",
"setInputSurface",
"(Landroid/view/Surface;)V",
FF_JNI_METHOD,
OFFSET(set_input_surface_id), 0 },
249 {
"android/media/MediaCodec",
"signalEndOfInputStream",
"()V",
FF_JNI_METHOD,
OFFSET(signal_end_of_input_stream_id), 0 },
253 {
"android/media/MediaCodec.BufferInfo",
"<init>",
"()V",
FF_JNI_METHOD,
OFFSET(init_id), 1 },
254 {
"android/media/MediaCodec.BufferInfo",
"flags",
"I",
FF_JNI_FIELD,
OFFSET(flags_id), 1 },
255 {
"android/media/MediaCodec.BufferInfo",
"offset",
"I",
FF_JNI_FIELD,
OFFSET(offset_id), 1 },
256 {
"android/media/MediaCodec.BufferInfo",
"presentationTimeUs",
"J",
FF_JNI_FIELD,
OFFSET(presentation_time_us_id), 1 },
257 {
"android/media/MediaCodec.BufferInfo",
"size",
"I",
FF_JNI_FIELD,
OFFSET(size_id), 1 },
264 .class_name =
"amediacodec",
295#define JNI_GET_ENV_OR_RETURN(env, log_ctx, ret) do { \
296 (env) = ff_jni_get_env(log_ctx); \
302#define JNI_GET_ENV_OR_RETURN_VOID(env, log_ctx) do { \
303 (env) = ff_jni_get_env(log_ctx); \
312 static const int AVCProfileBaseline = 0x01;
313 static const int AVCProfileMain = 0x02;
314 static const int AVCProfileExtended = 0x04;
315 static const int AVCProfileHigh = 0x08;
316 static const int AVCProfileHigh10 = 0x10;
317 static const int AVCProfileHigh422 = 0x20;
318 static const int AVCProfileHigh444 = 0x40;
319 static const int AVCProfileConstrainedBaseline = 0x10000;
320 static const int AVCProfileConstrainedHigh = 0x80000;
322 static const int HEVCProfileMain = 0x01;
323 static const int HEVCProfileMain10 = 0x02;
324 static const int HEVCProfileMainStill = 0x04;
325 static const int HEVCProfileMain10HDR10 = 0x1000;
326 static const int HEVCProfileMain10HDR10Plus = 0x2000;
328 static const int VP9Profile0 = 0x01;
329 static const int VP9Profile1 = 0x02;
330 static const int VP9Profile2 = 0x04;
331 static const int VP9Profile3 = 0x08;
332 static const int VP9Profile2HDR = 0x1000;
333 static const int VP9Profile3HDR = 0x2000;
334 static const int VP9Profile2HDR10Plus = 0x4000;
335 static const int VP9Profile3HDR10Plus = 0x8000;
337 static const int MPEG4ProfileSimple = 0x01;
338 static const int MPEG4ProfileSimpleScalable = 0x02;
339 static const int MPEG4ProfileCore = 0x04;
340 static const int MPEG4ProfileMain = 0x08;
341 static const int MPEG4ProfileNbit = 0x10;
342 static const int MPEG4ProfileScalableTexture = 0x20;
343 static const int MPEG4ProfileSimpleFBA = 0x80;
344 static const int MPEG4ProfileSimpleFace = 0x40;
345 static const int MPEG4ProfileBasicAnimated = 0x100;
346 static const int MPEG4ProfileHybrid = 0x200;
347 static const int MPEG4ProfileAdvancedRealTime = 0x400;
348 static const int MPEG4ProfileCoreScalable = 0x800;
349 static const int MPEG4ProfileAdvancedCoding = 0x1000;
350 static const int MPEG4ProfileAdvancedCore = 0x2000;
351 static const int MPEG4ProfileAdvancedScalable = 0x4000;
352 static const int MPEG4ProfileAdvancedSimple = 0x8000;
355 static const int AV1ProfileMain8 = 0x1;
356 static const int AV1ProfileMain10 = 0x2;
357 static const int AV1ProfileMain10HDR10 = 0x1000;
358 static const int AV1ProfileMain10HDR10Plus = 0x2000;
361 (void)AVCProfileConstrainedHigh;
362 (void)HEVCProfileMain10HDR10;
363 (void)HEVCProfileMain10HDR10Plus;
364 (void)VP9Profile2HDR;
365 (void)VP9Profile3HDR;
366 (void)VP9Profile2HDR10Plus;
367 (void)VP9Profile3HDR10Plus;
368 (void)MPEG4ProfileSimpleFace;
369 (void)AV1ProfileMain10;
370 (void)AV1ProfileMain10HDR10;
371 (void)AV1ProfileMain10HDR10Plus;
376 return AVCProfileBaseline;
378 return AVCProfileConstrainedBaseline;
380 return AVCProfileMain;
383 return AVCProfileExtended;
385 return AVCProfileHigh;
388 return AVCProfileHigh10;
391 return AVCProfileHigh422;
395 return AVCProfileHigh444;
400 return HEVCProfileMain;
402 return HEVCProfileMainStill;
404 return HEVCProfileMain10;
421 return MPEG4ProfileSimple;
423 return MPEG4ProfileSimpleScalable;
425 return MPEG4ProfileCore;
427 return MPEG4ProfileMain;
429 return MPEG4ProfileNbit;
431 return MPEG4ProfileScalableTexture;
433 return MPEG4ProfileSimpleFBA;
435 return MPEG4ProfileBasicAnimated;
437 return MPEG4ProfileHybrid;
439 return MPEG4ProfileAdvancedRealTime;
441 return MPEG4ProfileCoreScalable;
443 return MPEG4ProfileAdvancedCoding;
445 return MPEG4ProfileAdvancedCore;
447 return MPEG4ProfileAdvancedScalable;
449 return MPEG4ProfileAdvancedSimple;
459 return AV1ProfileMain8;
477 char *supported_type =
NULL;
483 jobject codec_name =
NULL;
487 jobjectArray types =
NULL;
489 jobject capabilities =
NULL;
490 jobject profile_level =
NULL;
491 jobjectArray profile_levels =
NULL;
508 for(
i = 0;
i < codec_count;
i++) {
523 is_encoder = (*env)->CallBooleanMethod(env, info, jfields.
is_encoder_id);
528 if (is_encoder != encoder) {
538 if (is_software_only) {
543 codec_name = (*env)->CallObjectMethod(env, info, jfields.
get_name_id);
553 (*env)->DeleteLocalRef(env, codec_name);
558 strstr(
name,
"OMX.google") ||
559 strstr(
name,
"OMX.ffmpeg") ||
560 (strstr(
name,
"OMX.SEC") && strstr(
name,
".sw.")) ||
561 !strcmp(
name,
"OMX.qcom.video.decoder.hevcswvdec")) {
565 type_count = (*env)->GetArrayLength(env, types);
566 for (j = 0; j < type_count; j++) {
570 type = (*env)->GetObjectArrayElement(env, types, j);
576 if (!supported_type) {
589 profile_levels = (*env)->GetObjectField(env, capabilities, jfields.
profile_levels_id);
594 profile_count = (*env)->GetArrayLength(env, profile_levels);
595 if (!profile_count) {
598 for (k = 0; k < profile_count; k++) {
599 int supported_profile = 0;
606 profile_level = (*env)->GetObjectArrayElement(env, profile_levels, k);
611 supported_profile = (*env)->GetIntField(env, profile_level, jfields.
profile_id);
616 found_codec =
profile == supported_profile;
618 (*env)->DeleteLocalRef(env, profile_level);
619 profile_level =
NULL;
627 (*env)->DeleteLocalRef(env, profile_levels);
628 profile_levels =
NULL;
630 (*env)->DeleteLocalRef(env, capabilities);
633 (*env)->DeleteLocalRef(env,
type);
644 (*env)->DeleteLocalRef(env, info);
647 (*env)->DeleteLocalRef(env, types);
658 (*env)->DeleteLocalRef(env, codec_name);
659 (*env)->DeleteLocalRef(env, info);
660 (*env)->DeleteLocalRef(env,
type);
661 (*env)->DeleteLocalRef(env, types);
662 (*env)->DeleteLocalRef(env, capabilities);
663 (*env)->DeleteLocalRef(env, profile_level);
664 (*env)->DeleteLocalRef(env, profile_levels);
682 jobject
object =
NULL;
700 object = (*env)->NewObject(env,
format->jfields.mediaformat_class,
format->jfields.init_id);
705 format->object = (*env)->NewGlobalRef(env,
object);
711 (*env)->DeleteLocalRef(env,
object);
742 format->object = (*env)->NewGlobalRef(env,
object);
768 (*env)->DeleteGlobalRef(env,
format->object);
783 jstring description =
NULL;
789 description = (*env)->CallObjectMethod(env,
format->object,
format->jfields.to_string_id);
796 (*env)->DeleteLocalRef(env, description);
807 jboolean contains_key;
819 contains_key = (*env)->CallBooleanMethod(env,
format->object,
format->jfields.contains_key_id,
key);
825 *
out = (*env)->CallIntMethod(env,
format->object,
format->jfields.get_integer_id,
key);
833 (*env)->DeleteLocalRef(env,
key);
844 jboolean contains_key;
856 contains_key = (*env)->CallBooleanMethod(env,
format->object,
format->jfields.contains_key_id,
key);
870 (*env)->DeleteLocalRef(env,
key);
881 jboolean contains_key;
893 contains_key = (*env)->CallBooleanMethod(env,
format->object,
format->jfields.contains_key_id,
key);
899 *
out = (*env)->CallFloatMethod(env,
format->object,
format->jfields.get_float_id,
key);
907 (*env)->DeleteLocalRef(env,
key);
918 jboolean contains_key;
919 jobject result =
NULL;
931 contains_key = (*env)->CallBooleanMethod(env,
format->object,
format->jfields.contains_key_id,
key);
937 result = (*env)->CallObjectMethod(env,
format->object,
format->jfields.get_bytebuffer_id,
key);
943 *
data = (*env)->GetDirectBufferAddress(env, result);
944 *
size = (*env)->GetDirectBufferCapacity(env, result);
959 (*env)->DeleteLocalRef(env,
key);
960 (*env)->DeleteLocalRef(env, result);
971 jboolean contains_key;
972 jstring result =
NULL;
984 contains_key = (*env)->CallBooleanMethod(env,
format->object,
format->jfields.contains_key_id,
key);
990 result = (*env)->CallObjectMethod(env,
format->object,
format->jfields.get_string_id,
key);
1004 (*env)->DeleteLocalRef(env,
key);
1005 (*env)->DeleteLocalRef(env, result);
1031 (*env)->DeleteLocalRef(env,
key);
1055 (*env)->DeleteLocalRef(env,
key);
1079 (*env)->DeleteLocalRef(env,
key);
1086 jstring
string =
NULL;
1103 (*env)->CallVoidMethod(env,
format->object,
format->jfields.set_string_id,
key,
string);
1109 (*env)->DeleteLocalRef(env,
key);
1110 (*env)->DeleteLocalRef(env,
string);
1152 (*env)->DeleteLocalRef(env,
key);
1153 (*env)->DeleteLocalRef(env,
buffer);
1210#define CREATE_CODEC_BY_NAME 0
1211#define CREATE_DECODER_BY_TYPE 1
1212#define CREATE_ENCODER_BY_TYPE 2
1219 jstring jarg =
NULL;
1220 jobject
object =
NULL;
1221 jobject buffer_info =
NULL;
1222 jmethodID create_id =
NULL;
1253 object = (*env)->CallStaticObjectMethod(env,
1261 codec->
object = (*env)->NewGlobalRef(env,
object);
1279 codec->
buffer_info = (*env)->NewGlobalRef(env, buffer_info);
1286 (*env)->DeleteLocalRef(env, jarg);
1287 (*env)->DeleteLocalRef(env,
object);
1288 (*env)->DeleteLocalRef(env, buffer_info);
1291 (*env)->DeleteGlobalRef(env, codec->
object);
1301#define DECLARE_FF_AMEDIACODEC_CREATE_FUNC(name, method) \
1302static FFAMediaCodec *mediacodec_jni_##name(const char *arg) \
1304 return codec_create(method, arg); \
1334 (*env)->DeleteGlobalRef(env, codec->
object);
1365 (*env)->DeleteLocalRef(env,
name);
1578 uint8_t *ret =
NULL;
1582 jobject input_buffers =
NULL;
1598 codec->
input_buffers = (*env)->NewGlobalRef(env, input_buffers);
1610 ret = (*env)->GetDirectBufferAddress(env,
buffer);
1613 (*env)->DeleteLocalRef(env,
buffer);
1614 (*env)->DeleteLocalRef(env, input_buffers);
1621 uint8_t *ret =
NULL;
1625 jobject output_buffers =
NULL;
1641 codec->
output_buffers = (*env)->NewGlobalRef(env, output_buffers);
1653 ret = (*env)->GetDirectBufferAddress(env,
buffer);
1656 (*env)->DeleteLocalRef(env,
buffer);
1657 (*env)->DeleteLocalRef(env, output_buffers);
1668 jobject mediaformat =
NULL;
1679 (*env)->DeleteLocalRef(env, mediaformat);
1769 av_log(codec,
AV_LOG_ERROR,
"Doesn't support aync mode with JNI, please try ndk_codec=1\n");
1799 .createCodecByName = mediacodec_jni_createCodecByName,
1800 .createDecoderByType = mediacodec_jni_createDecoderByType,
1801 .createEncoderByType = mediacodec_jni_createEncoderByType,
1858 media_status_t (*
getName)(AMediaCodec*,
char** out_name);
1865 struct AMediaCodecOnAsyncNotifyCallback
callback, void *userdata);
1872 .class_name =
"amediaformat_ndk",
1878 .class_name =
"amediacodec_ndk",
1888 case AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE:
1890 case AMEDIA_ERROR_MALFORMED:
1892 case AMEDIA_ERROR_UNSUPPORTED:
1894 case AMEDIA_ERROR_INVALID_PARAMETER:
1896 case AMEDIA_ERROR_INVALID_OPERATION:
1898 case AMEDIA_ERROR_END_OF_STREAM:
1900 case AMEDIA_ERROR_IO:
1902 case AMEDIA_ERROR_WOULD_BLOCK:
1917 format->libmedia = dlopen(
"libmediandk.so", RTLD_NOW);
1921#define GET_OPTIONAL_SYMBOL(sym) \
1922 format->sym = dlsym(format->libmedia, "AMediaFormat_" #sym);
1927#undef GET_OPTIONAL_SYMBOL
1932 format->impl = AMediaFormat_new();
1941 dlclose(
format->libmedia);
1960 if (
format->impl && (AMediaFormat_delete(
format->impl) != AMEDIA_OK))
1963 dlclose(
format->libmedia);
1972 const char *str = AMediaFormat_toString(
format->impl);
2083 const char *lib_name =
"libmediandk.so";
2089 codec->
libmedia = dlopen(lib_name, RTLD_NOW);
2093#define GET_SYMBOL(sym) \
2094 codec->sym = dlsym(codec->libmedia, "AMediaCodec_" #sym); \
2096 av_log(codec, AV_LOG_INFO, #sym "() unavailable from %s\n", lib_name);
2109 codec->
impl = AMediaCodec_createCodecByName(
arg);
2112 codec->
impl = AMediaCodec_createDecoderByType(
arg);
2115 codec->
impl = AMediaCodec_createEncoderByType(
arg);
2132#define DECLARE_NDK_AMEDIACODEC_CREATE_FUNC(name, method) \
2133static FFAMediaCodec *mediacodec_ndk_##name(const char *arg) \
2135 return ndk_codec_create(method, arg); \
2152 if (codec->
impl && (AMediaCodec_delete(codec->
impl) != AMEDIA_OK))
2155 ANativeWindow_release(codec->
window);
2171 media_status_t status;
2172 ANativeWindow *native_window =
NULL;
2178 native_window = ANativeWindow_fromSurface(env,
window->surface);
2180 codec->
window = native_window;
2181 }
else if (
window->native_window) {
2182 native_window =
window->native_window;
2191 if (
flags & AMEDIACODEC_CONFIGURE_FLAG_ENCODE) {
2198 if (status != AMEDIA_OK) {
2207 if (status != AMEDIA_OK) {
2213 if (status != AMEDIA_OK) {
2222#define MEDIACODEC_NDK_WRAPPER(method) \
2223static int mediacodec_ndk_ ## method(FFAMediaCodec* ctx) \
2225 FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx; \
2226 media_status_t status = AMediaCodec_ ## method (codec->impl); \
2228 if (status != AMEDIA_OK) { \
2229 av_log(codec, AV_LOG_ERROR, #method " failed, %d\n", status); \
2230 return AVERROR_EXTERNAL; \
2243 return AMediaCodec_getInputBuffer(codec->
impl, idx,
out_size);
2249 return AMediaCodec_getOutputBuffer(codec->
impl, idx,
out_size);
2255 return AMediaCodec_dequeueInputBuffer(codec->
impl, timeoutUs);
2260 uint64_t time, uint32_t
flags)
2269 AMediaCodecBufferInfo buf_info = {0};
2272 ret = AMediaCodec_dequeueOutputBuffer(codec->
impl, &buf_info, timeoutUs);
2273 info->
offset = buf_info.offset;
2274 info->
size = buf_info.size;
2276 info->
flags = buf_info.flags;
2284 AMediaFormat *
format = AMediaCodec_getOutputFormat(codec->
impl);
2294 media_status_t status;
2296 status = AMediaCodec_releaseOutputBuffer(codec->
impl, idx, render);
2297 if (status != AMEDIA_OK) {
2308 media_status_t status;
2310 status = AMediaCodec_releaseOutputBufferAtTime(codec->
impl, idx, timestampNs);
2311 if (status != AMEDIA_OK) {
2321 return idx == AMEDIACODEC_INFO_TRY_AGAIN_LATER;
2326 return idx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED;
2331 return idx == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED;
2336 return AMEDIACODEC_BUFFER_FLAG_CODEC_CONFIG;
2341 return AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM;
2351 return AMEDIACODEC_CONFIGURE_FLAG_ENCODE;
2362 media_status_t status;
2370 if (status != AMEDIA_OK) {
2390 AMediaCodecBufferInfo *buffer_info)
2394 .offset = buffer_info->offset,
2395 .size = buffer_info->size,
2396 .presentationTimeUs = buffer_info->presentationTimeUs,
2397 .flags = buffer_info->flags,
2418 media_status_t status,
2434 struct AMediaCodecOnAsyncNotifyCallback
cb = {
2440 media_status_t status;
2448 !
callback->onAsyncInputAvailable ||
2449 !
callback->onAsyncOutputAvailable ||
2458 if (status != AMEDIA_OK) {
2495 .createCodecByName = mediacodec_ndk_createCodecByName,
2496 .createDecoderByType = mediacodec_ndk_createDecoderByType,
2497 .createEncoderByType = mediacodec_ndk_createEncoderByType,
2501 .start = mediacodec_ndk_start,
2502 .stop = mediacodec_ndk_stop,
2503 .flush = mediacodec_ndk_flush,
2563#if __ANDROID_API__ >= 24
2575 ret = android_get_device_api_level();
2578 jclass versionClass;
2579 jfieldID sdkIntFieldID;
2582 versionClass = (*env)->FindClass(env,
"android/os/Build$VERSION");
2583 sdkIntFieldID = (*env)->GetStaticFieldID(env, versionClass,
"SDK_INT",
"I");
2584 ret = (*env)->GetStaticIntField(env, versionClass, sdkIntFieldID);
2585 (*env)->DeleteLocalRef(env, versionClass);
static const char *const format[]
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE
#define AV_PROFILE_AV1_HIGH
#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE
#define AV_PROFILE_MPEG4_CORE
#define AV_PROFILE_H264_MAIN
#define AV_PROFILE_H264_EXTENDED
#define AV_PROFILE_MPEG4_HYBRID
#define AV_PROFILE_H264_HIGH_444_PREDICTIVE
#define AV_PROFILE_MPEG4_SIMPLE_STUDIO
#define AV_PROFILE_MPEG4_MAIN
#define AV_PROFILE_H264_HIGH_444
#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE
#define AV_PROFILE_H264_HIGH_422_INTRA
#define AV_PROFILE_MPEG4_ADVANCED_CORE
#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION
#define AV_PROFILE_MPEG4_SIMPLE
#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME
#define AV_PROFILE_HEVC_MAIN
#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE
#define AV_PROFILE_HEVC_MAIN_10
#define AV_PROFILE_H264_HIGH_444_INTRA
#define AV_PROFILE_H264_HIGH
#define AV_PROFILE_H264_CONSTRAINED_BASELINE
#define AV_PROFILE_MPEG4_N_BIT
#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE
#define AV_PROFILE_MPEG4_ADVANCED_CODING
#define AV_PROFILE_H264_HIGH_10
#define AV_PROFILE_AV1_MAIN
#define AV_PROFILE_AV1_PROFESSIONAL
#define AV_PROFILE_H264_HIGH_422
#define AV_PROFILE_H264_HIGH_10_INTRA
#define AV_PROFILE_MPEG4_CORE_SCALABLE
#define AV_PROFILE_H264_BASELINE
#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE
static void callback(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time, enum dshowDeviceType devtype)
void(* flush)(AVBSFContext *ctx)
static SDL_Window * window
#define AVERROR_EXTERNAL
Generic error in an external library.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_EOF
End of file.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
#define LIBAVUTIL_VERSION_INT
int ff_jni_init_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
jstring ff_jni_utf_chars_to_jstring(JNIEnv *env, const char *utf_chars, void *log_ctx)
int ff_jni_reset_jfields(JNIEnv *env, void *jfields, const struct FFJniField *jfields_mapping, int global, void *log_ctx)
char * ff_jni_jstring_to_utf_chars(JNIEnv *env, jstring string, void *log_ctx)
int ff_jni_exception_check(JNIEnv *env, int log, void *log_ctx)
JNIEnv * ff_jni_get_env(void *log_ctx)
Memory handling functions.
AVColorRange
Visual content value range.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_JPEG
Full range content.
AVColorPrimaries
Chromaticity coordinates of the source primaries.
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
@ AVCOL_PRI_BT2020
ITU-R BT2020.
AVColorTransferCharacteristic
Color Transfer Characteristic.
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
AVColorSpace
YUV colorspace type.
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
#define FF_ARRAY_ELEMS(a)
Describe the class of an AVClass context structure.
main external API structure.
static void error(const char *err)
static AVFormatContext * ctx
static double cb(void *priv, double x, double y)