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

Commit 0979a07a authored by Songyue Han's avatar Songyue Han
Browse files

Revert^2 "Java and JNI support for native CodecCapabilities."

Revert submission 3439586-revert-3434737-DMCCDOROHG

Reason for revert: The previous issue b/388337603 has been resolved by aosp/3439586

Reverted changes: /q/submissionid:3439586-revert-3434737-DMCCDOROHG

Bug: 306023029
Bug: 388337603

Test: atest MediaCodecCapabilitiesTest
Test: atp v2/android-virtual-infra/test_mapping/presubmit-avd

Flag: android.media.codec.native_capabilites

Change-Id: Ie37e8d352693e869a36cc7bdb5c809f26ac94738
parent 6b71dbd8
Loading
Loading
Loading
Loading
+695 −436

File changed.

Preview size limit exceeded, changes collapsed.

+644 −0

File changed.

Preview size limit exceeded, changes collapsed.

+48 −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;
    std::vector<std::string> validFeatures() 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
@@ -17,6 +17,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "MediaCodec-JNI"
#define ATRACE_TAG  ATRACE_TAG_VIDEO
#include <android_media_codec.h>
#include <utils/Log.h>
#include <utils/Trace.h>

@@ -24,6 +25,7 @@

#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"
@@ -140,6 +142,8 @@ static struct {
static struct {
    jclass capsClazz;
    jmethodID capsCtorId;
    jclass cpasImplClazz;
    jmethodID capsImplCtorId;
    jclass profileLevelClazz;
    jfieldID profileField;
    jfieldID levelField;
@@ -998,10 +1002,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 {
@@ -1029,11 +1035,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());
    }
@@ -3899,11 +3912,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);
+88 −66
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

//#define LOG_NDEBUG 0
#define LOG_TAG "MediaCodec-JNI"

#include <android_media_codec.h>

#include <utils/Log.h>

#include <media/stagefright/foundation/ADebug.h>
@@ -32,6 +35,7 @@
#include "android_runtime/AndroidRuntime.h"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "android_media_CodecCapabilities.h"
#include "android_media_Streams.h"

using namespace android;
@@ -245,6 +249,11 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
        return NULL;
    }

    jobject caps;
    if (android::media::codec::provider_->native_capabilites()) {
        std::shared_ptr<CodecCapabilities> codecCaps = info.info->getCodecCapsFor(typeStr);
        caps = android::convertToJavaCodecCapabiliites(env, codecCaps);
    } else {
        Vector<MediaCodecInfo::ProfileLevel> profileLevels;
        Vector<uint32_t> colorFormats;

@@ -277,9 +286,9 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
            return NULL;
        }

    jclass capsClazz =
        env->FindClass("android/media/MediaCodecInfo$CodecCapabilities");
    CHECK(capsClazz != NULL);
        jclass capsImplClazz = env->FindClass(
                "android/media/MediaCodecInfo$CodecCapabilities$CodecCapsLegacyImpl");
        CHECK(capsImplClazz != NULL);

        jclass profileLevelClazz =
            env->FindClass("android/media/MediaCodecInfo$CodecProfileLevel");
@@ -315,14 +324,23 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
            env->SetIntArrayRegion(colorFormatsArray, i, 1, &val);
        }

    jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>",
        jmethodID capsImplConstructID = env->GetMethodID(capsImplClazz, "<init>",
                "([Landroid/media/MediaCodecInfo$CodecProfileLevel;[IZ"
                "Ljava/util/Map;Ljava/util/Map;)V");

    jobject caps = env->NewObject(capsClazz, capsConstructID,
        jobject capsImpl = env->NewObject(capsImplClazz, capsImplConstructID,
                profileLevelArray, colorFormatsArray, isEncoder,
                defaultFormatObj, infoObj);

        jclass capsClazz = env->FindClass(
                "android/media/MediaCodecInfo$CodecCapabilities");
        CHECK(capsClazz != NULL);

        jmethodID capsConstructID = env->GetMethodID(capsClazz, "<init>",
                "(Landroid/media/MediaCodecInfo$CodecCapabilities$CodecCapsIntf;)V");

        caps = env->NewObject(capsClazz, capsConstructID, capsImpl);

        env->DeleteLocalRef(profileLevelArray);
        profileLevelArray = NULL;

@@ -335,6 +353,10 @@ static jobject android_media_MediaCodecList_getCodecCapabilities(
        env->DeleteLocalRef(infoObj);
        infoObj = NULL;

        env->DeleteLocalRef(capsImpl);
        capsImpl = NULL;
    }

    return caps;
}