From 354d1b5d16adba1180e1ebdd5a893998c0b80a56 Mon Sep 17 00:00:00 2001 From: Arun Johnson Date: Tue, 20 Sep 2022 00:09:46 +0000 Subject: [PATCH] Returning camcoder profiles for advanced codecs - Advanced codecs are returned only upon "advance" request, which is gated by the Target SDK version. if "advanced" codecs are requested, the return will contain both advanced and non-advanced codecs. If "advanced" codecs are not requested, the return will contain only non-advanced codecs. Bug: 223439995 Change-Id: Ib85dc0e5ebb29e9dba7b7efb69c38429a2c9fa9f --- media/jni/android_media_MediaProfiles.cpp | 31 ++++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index ecb1d510f807f..9868a148d998e 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -255,21 +255,21 @@ android_media_MediaProfiles_native_get_camcorder_profiles(JNIEnv *env, jobject / jmethodID audioProfileConstructorMethodID = env->GetMethodID(audioProfileClazz, "", "(IIIII)V"); - jobjectArray videoCodecs = (jobjectArray)env->NewObjectArray( - cp->getVideoCodecs().size(), videoProfileClazz, nullptr); + jobjectArray videoCodecs = nullptr; { - int i = 0; + auto isAdvancedCodec = [](const MediaProfiles::VideoCodec *vc) -> bool { + return ((vc->getBitDepth() != 8 + || vc->getChromaSubsampling() != CHROMA_SUBSAMPLING_YUV_420 + || vc->getHdrFormat() != HDR_FORMAT_NONE)); + }; + std::vector codecVector; for (const MediaProfiles::VideoCodec *vc : cp->getVideoCodecs()) { + if (isAdvancedCodec(vc) && !static_cast(advanced)) { + continue; + } chroma_subsampling cs = vc->getChromaSubsampling(); int bitDepth = vc->getBitDepth(); hdr_format hdr = vc->getHdrFormat(); - - bool isAdvanced = - (bitDepth != 8 || cs != CHROMA_SUBSAMPLING_YUV_420 || hdr != HDR_FORMAT_NONE); - if (static_cast(advanced) && !isAdvanced) { - continue; - } - jobject videoCodec = env->NewObject(videoProfileClazz, videoProfileConstructorMethodID, vc->getCodec(), @@ -281,10 +281,17 @@ android_media_MediaProfiles_native_get_camcorder_profiles(JNIEnv *env, jobject / static_cast(cs), bitDepth, static_cast(hdr)); - env->SetObjectArrayElement(videoCodecs, i++, videoCodec); + + codecVector.push_back(videoCodec); + } + videoCodecs = (jobjectArray)env->NewObjectArray(codecVector.size(), + videoProfileClazz, nullptr); + + int i = 0; + for (jobject codecObj : codecVector) { + env->SetObjectArrayElement(videoCodecs, i++, codecObj); } } - jobjectArray audioCodecs; if (quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START && quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END) {