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

Commit cec4bfe6 authored by Songyue Han's avatar Songyue Han Committed by Gerrit Code Review
Browse files

Merge changes I34c10bf7,I39ba5949,I40b8ac00,Ie0864e21,Ie96de170 into main

* changes:
  Java and JNI support for native CodecCapabilities.
  Java and JNI support for native EncoderCapabilities.
  Java and JNI support for native VideoCapabilities.
  Java and JNI support for native PerformancePoint.
  Java and JNI support for native AudioCapabilities.
parents 1fff2593 736e038e
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