Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7142fd77 authored by Songyue Han's avatar Songyue Han Committed by Automerger Merge Worker
Browse files

Merge changes I34c10bf7,I39ba5949,I40b8ac00,Ie0864e21,Ie96de170 into main am: cec4bfe6

parents a865b4de cec4bfe6
Loading
Loading
Loading
Loading
+3720 −2890

File changed.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ cc_library_shared {
    min_sdk_version: "",

    srcs: [
        "android_media_CodecCapabilities.cpp",
        "android_media_ImageWriter.cpp",
        "android_media_ImageReader.cpp",
        "android_media_JetPlayer.cpp",
@@ -64,6 +65,7 @@ cc_library_shared {
        "libbinder",
        "libmedia",
        "libmedia_codeclist",
        "libmedia_codeclist_capabilities",
        "libmedia_jni_utils",
        "libmedia_omx",
        "libmediametrics",
+1015 −0

File added.

Preview size limit exceeded, changes collapsed.

+47 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _ANDROID_MEDIA_CODECCAPABILITIES_H_
#define _ANDROID_MEDIA_CODECCAPABILITIES_H_

#include "jni.h"

#include <media/CodecCapabilities.h>

namespace android {

struct JCodecCapabilities : public RefBase {
    JCodecCapabilities(std::shared_ptr<CodecCapabilities> codecCaps);

    std::shared_ptr<CodecCapabilities> getCodecCaps() const;

    int32_t getMaxSupportedInstances() const;
    std::string getMediaType() const;
    bool isFeatureRequired(const std::string& name) const;
    bool isFeatureSupported(const std::string& name) const;
    bool isFormatSupported(const sp<AMessage> &format) const;
    bool isRegular() const;

private:
    std::shared_ptr<CodecCapabilities> mCodecCaps;
};

jobject convertToJavaCodecCapabiliites(
        JNIEnv *env, std::shared_ptr<CodecCapabilities> codecCaps);

}

#endif  // _ANDROID_MEDIA_CODECCAPABILITIES_H_
 No newline at end of file
+31 −8
Original line number Diff line number Diff line
@@ -16,12 +16,14 @@

//#define LOG_NDEBUG 0
#define LOG_TAG "MediaCodec-JNI"
#include <android_media_codec.h>
#include <utils/Log.h>

#include <type_traits>

#include "android_media_MediaCodec.h"

#include "android_media_CodecCapabilities.h"
#include "android_media_MediaCodecLinearBlock.h"
#include "android_media_MediaCrypto.h"
#include "android_media_MediaDescrambler.h"
@@ -138,6 +140,8 @@ static struct {
static struct {
    jclass capsClazz;
    jmethodID capsCtorId;
    jclass cpasImplClazz;
    jmethodID capsImplCtorId;
    jclass profileLevelClazz;
    jfieldID profileField;
    jfieldID levelField;
@@ -996,10 +1000,12 @@ static jobject getCodecCapabilitiesObject(
        env->SetIntArrayRegion(colorFormatsArray.get(), i, 1, &val);
    }

    return env->NewObject(
            gCodecInfo.capsClazz, gCodecInfo.capsCtorId,
    jobject javaCodecCapsImpl = env->NewObject(
            gCodecInfo.cpasImplClazz, gCodecInfo.capsImplCtorId,
            profileLevelArray.get(), colorFormatsArray.get(), isEncoder,
            defaultFormatRef.get(), detailsRef.get());

    return env->NewObject(gCodecInfo.capsClazz, gCodecInfo.capsCtorId, javaCodecCapsImpl);
}

status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const {
@@ -1027,11 +1033,18 @@ status_t JMediaCodec::getCodecInfo(JNIEnv *env, jobject *codecInfoObject) const
        env->NewObjectArray(mediaTypes.size(), gCodecInfo.capsClazz, NULL));

    for (size_t i = 0; i < mediaTypes.size(); i++) {
        jobject jCodecCaps = NULL;
        if (android::media::codec::provider_->native_capabilites()) {
            const std::shared_ptr<CodecCapabilities> codecCaps
                    = codecInfo->getCodecCapsFor(mediaTypes[i].c_str());
            jCodecCaps = convertToJavaCodecCapabiliites(env, codecCaps);
        } else {
            const sp<MediaCodecInfo::Capabilities> caps =
                    codecInfo->getCapabilitiesFor(mediaTypes[i].c_str());

        ScopedLocalRef<jobject> capsObj(env, getCodecCapabilitiesObject(
                env, mediaTypes[i].c_str(), isEncoder, caps));
            jCodecCaps = getCodecCapabilitiesObject(
                    env, mediaTypes[i].c_str(), isEncoder, caps);
        }
        ScopedLocalRef<jobject> capsObj(env, jCodecCaps);

        env->SetObjectArrayElement(capsArrayObj.get(), i, capsObj.get());
    }
@@ -3876,11 +3889,21 @@ static void android_media_MediaCodec_native_init(JNIEnv *env, jclass) {
    CHECK(clazz.get() != NULL);
    gCodecInfo.capsClazz = (jclass)env->NewGlobalRef(clazz.get());

    method = env->GetMethodID(clazz.get(), "<init>",
            "(Landroid/media/MediaCodecInfo$CodecCapabilities$CodecCapsIntf;)V");
    CHECK(method != NULL);
    gCodecInfo.capsCtorId = method;

    clazz.reset(env->FindClass(
            "android/media/MediaCodecInfo$CodecCapabilities$CodecCapsLegacyImpl"));
    CHECK(clazz.get() != NULL);
    gCodecInfo.cpasImplClazz = (jclass)env->NewGlobalRef(clazz.get());

    method = env->GetMethodID(clazz.get(), "<init>",
            "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
            "Ljava/util/Map;Ljava/util/Map;)V");
    CHECK(method != NULL);
    gCodecInfo.capsCtorId = method;
    gCodecInfo.capsImplCtorId = method;

    clazz.reset(env->FindClass("android/media/MediaCodecInfo$CodecProfileLevel"));
    CHECK(clazz.get() != NULL);
Loading