You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
avcodec/mediacodec_wrapper: use hardcoded value of profiles from MediaCodecInfo
Those are static const values and documented at https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel No runtime query is needed. Now the method can be used without JVM. Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
This commit is contained in:
@@ -57,19 +57,6 @@ struct JNIAMediaCodecListFields {
|
|||||||
jclass codec_profile_level_class;
|
jclass codec_profile_level_class;
|
||||||
jfieldID profile_id;
|
jfieldID profile_id;
|
||||||
jfieldID level_id;
|
jfieldID level_id;
|
||||||
|
|
||||||
jfieldID avc_profile_baseline_id;
|
|
||||||
jfieldID avc_profile_main_id;
|
|
||||||
jfieldID avc_profile_extended_id;
|
|
||||||
jfieldID avc_profile_high_id;
|
|
||||||
jfieldID avc_profile_high10_id;
|
|
||||||
jfieldID avc_profile_high422_id;
|
|
||||||
jfieldID avc_profile_high444_id;
|
|
||||||
|
|
||||||
jfieldID hevc_profile_main_id;
|
|
||||||
jfieldID hevc_profile_main10_id;
|
|
||||||
jfieldID hevc_profile_main10_hdr10_id;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct FFJniField jni_amediacodeclist_mapping[] = {
|
static const struct FFJniField jni_amediacodeclist_mapping[] = {
|
||||||
@@ -95,18 +82,6 @@ static const struct FFJniField jni_amediacodeclist_mapping[] = {
|
|||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "profile", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, profile_id), 1 },
|
{ "android/media/MediaCodecInfo$CodecProfileLevel", "profile", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, profile_id), 1 },
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "level", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, level_id), 1 },
|
{ "android/media/MediaCodecInfo$CodecProfileLevel", "level", "I", FF_JNI_FIELD, offsetof(struct JNIAMediaCodecListFields, level_id), 1 },
|
||||||
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileBaseline", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_baseline_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileMain", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_main_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileExtended", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_extended_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high10_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh422", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high422_id), 1 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "AVCProfileHigh444", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, avc_profile_high444_id), 1 },
|
|
||||||
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main_id), 0 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main10_id), 0 },
|
|
||||||
{ "android/media/MediaCodecInfo$CodecProfileLevel", "HEVCProfileMain10HDR10", "I", FF_JNI_STATIC_FIELD, offsetof(struct JNIAMediaCodecListFields, hevc_profile_main10_hdr10_id), 0 },
|
|
||||||
|
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -326,71 +301,64 @@ static const FFAMediaCodec media_codec_jni;
|
|||||||
|
|
||||||
int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx)
|
int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
// Copy and modified from MediaCodecInfo.java
|
||||||
|
static const int AVCProfileBaseline = 0x01;
|
||||||
|
static const int AVCProfileMain = 0x02;
|
||||||
|
static const int AVCProfileExtended = 0x04;
|
||||||
|
static const int AVCProfileHigh = 0x08;
|
||||||
|
static const int AVCProfileHigh10 = 0x10;
|
||||||
|
static const int AVCProfileHigh422 = 0x20;
|
||||||
|
static const int AVCProfileHigh444 = 0x40;
|
||||||
|
static const int AVCProfileConstrainedBaseline = 0x10000;
|
||||||
|
static const int AVCProfileConstrainedHigh = 0x80000;
|
||||||
|
|
||||||
JNIEnv *env = NULL;
|
static const int HEVCProfileMain = 0x01;
|
||||||
struct JNIAMediaCodecListFields jfields = { 0 };
|
static const int HEVCProfileMain10 = 0x02;
|
||||||
jfieldID field_id = 0;
|
static const int HEVCProfileMainStill = 0x04;
|
||||||
|
static const int HEVCProfileMain10HDR10 = 0x1000;
|
||||||
|
static const int HEVCProfileMain10HDR10Plus = 0x2000;
|
||||||
|
|
||||||
JNI_GET_ENV_OR_RETURN(env, avctx, -1);
|
// Unused yet.
|
||||||
|
(void)AVCProfileConstrainedHigh;
|
||||||
if (ff_jni_init_jfields(env, &jfields, jni_amediacodeclist_mapping, 0, avctx) < 0) {
|
(void)HEVCProfileMain10HDR10;
|
||||||
goto done;
|
(void)HEVCProfileMain10HDR10Plus;
|
||||||
}
|
|
||||||
|
|
||||||
if (avctx->codec_id == AV_CODEC_ID_H264) {
|
if (avctx->codec_id == AV_CODEC_ID_H264) {
|
||||||
switch(avctx->profile) {
|
switch(avctx->profile) {
|
||||||
case FF_PROFILE_H264_BASELINE:
|
case FF_PROFILE_H264_BASELINE:
|
||||||
|
return AVCProfileBaseline;
|
||||||
case FF_PROFILE_H264_CONSTRAINED_BASELINE:
|
case FF_PROFILE_H264_CONSTRAINED_BASELINE:
|
||||||
field_id = jfields.avc_profile_baseline_id;
|
return AVCProfileConstrainedBaseline;
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_MAIN:
|
case FF_PROFILE_H264_MAIN:
|
||||||
field_id = jfields.avc_profile_main_id;
|
return AVCProfileMain;
|
||||||
break;
|
break;
|
||||||
case FF_PROFILE_H264_EXTENDED:
|
case FF_PROFILE_H264_EXTENDED:
|
||||||
field_id = jfields.avc_profile_extended_id;
|
return AVCProfileExtended;
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_HIGH:
|
case FF_PROFILE_H264_HIGH:
|
||||||
field_id = jfields.avc_profile_high_id;
|
return AVCProfileHigh;
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_HIGH_10:
|
case FF_PROFILE_H264_HIGH_10:
|
||||||
case FF_PROFILE_H264_HIGH_10_INTRA:
|
case FF_PROFILE_H264_HIGH_10_INTRA:
|
||||||
field_id = jfields.avc_profile_high10_id;
|
return AVCProfileHigh10;
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_HIGH_422:
|
case FF_PROFILE_H264_HIGH_422:
|
||||||
case FF_PROFILE_H264_HIGH_422_INTRA:
|
case FF_PROFILE_H264_HIGH_422_INTRA:
|
||||||
field_id = jfields.avc_profile_high422_id;
|
return AVCProfileHigh422;
|
||||||
break;
|
|
||||||
case FF_PROFILE_H264_HIGH_444:
|
case FF_PROFILE_H264_HIGH_444:
|
||||||
case FF_PROFILE_H264_HIGH_444_INTRA:
|
case FF_PROFILE_H264_HIGH_444_INTRA:
|
||||||
case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
|
case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
|
||||||
field_id = jfields.avc_profile_high444_id;
|
return AVCProfileHigh444;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else if (avctx->codec_id == AV_CODEC_ID_HEVC) {
|
} else if (avctx->codec_id == AV_CODEC_ID_HEVC) {
|
||||||
switch (avctx->profile) {
|
switch (avctx->profile) {
|
||||||
case FF_PROFILE_HEVC_MAIN:
|
case FF_PROFILE_HEVC_MAIN:
|
||||||
|
return HEVCProfileMain;
|
||||||
case FF_PROFILE_HEVC_MAIN_STILL_PICTURE:
|
case FF_PROFILE_HEVC_MAIN_STILL_PICTURE:
|
||||||
field_id = jfields.hevc_profile_main_id;
|
return HEVCProfileMainStill;
|
||||||
break;
|
|
||||||
case FF_PROFILE_HEVC_MAIN_10:
|
case FF_PROFILE_HEVC_MAIN_10:
|
||||||
field_id = jfields.hevc_profile_main10_id;
|
return HEVCProfileMain10;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field_id) {
|
return -1;
|
||||||
ret = (*env)->GetStaticIntField(env, jfields.codec_profile_level_class, field_id);
|
|
||||||
if (ff_jni_exception_check(env, 1, avctx) < 0) {
|
|
||||||
ret = -1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
ff_jni_reset_jfields(env, &jfields, jni_amediacodeclist_mapping, 0, avctx);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int encoder, void *log_ctx)
|
char *ff_AMediaCodecList_getCodecNameByType(const char *mime, int profile, int encoder, void *log_ctx)
|
||||||
|
Reference in New Issue
Block a user