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

Commit 9ba21b94 authored by Ronghua Wu's avatar Ronghua Wu
Browse files

libstagefright: config resource manager with secure codec co-existing policy.

Bug: 19620911
Change-Id: I0d729782c1622f23e9c37b7a9231e58e3f807470
parent ba21a9ac
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ extern const char kPolicySupportsSecureWithNonSecureCodec[];
class MediaResourcePolicy {
public:
    MediaResourcePolicy();
    MediaResourcePolicy(String8 type, uint64_t value);
    MediaResourcePolicy(String8 type, String8 value);

    void readFromParcel(const Parcel &parcel);
    void writeToParcel(Parcel *parcel) const;
@@ -37,7 +37,7 @@ public:
    String8 toString() const;

    String8 mType;
    uint64_t mValue;
    String8 mValue;
};

}; // namespace android
+5 −5
Original line number Diff line number Diff line
@@ -24,25 +24,25 @@ namespace android {
const char kPolicySupportsMultipleSecureCodecs[] = "supports-multiple-secure-codecs";
const char kPolicySupportsSecureWithNonSecureCodec[] = "supports-secure-with-non-secure-codec";

MediaResourcePolicy::MediaResourcePolicy() : mValue(0) {}
MediaResourcePolicy::MediaResourcePolicy() {}

MediaResourcePolicy::MediaResourcePolicy(String8 type, uint64_t value)
MediaResourcePolicy::MediaResourcePolicy(String8 type, String8 value)
        : mType(type),
          mValue(value) {}

void MediaResourcePolicy::readFromParcel(const Parcel &parcel) {
    mType = parcel.readString8();
    mValue = parcel.readUint64();
    mValue = parcel.readString8();
}

void MediaResourcePolicy::writeToParcel(Parcel *parcel) const {
    parcel->writeString8(mType);
    parcel->writeUint64(mValue);
    parcel->writeString8(mValue);
}

String8 MediaResourcePolicy::toString() const {
    String8 str;
    str.appendFormat("%s:%llu", mType.string(), (unsigned long long)mValue);
    str.appendFormat("%s:%s", mType.string(), mValue.string());
    return str;
}

+21 −0
Original line number Diff line number Diff line
@@ -24,7 +24,9 @@

#include <media/IMediaCodecList.h>
#include <media/IMediaPlayerService.h>
#include <media/IResourceManagerService.h>
#include <media/MediaCodecInfo.h>
#include <media/MediaResourcePolicy.h>

#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -171,6 +173,25 @@ void MediaCodecList::parseTopLevelXMLFile(const char *codecs_xml, bool ignore_er
        return;
    }

    Vector<MediaResourcePolicy> policies;
    AString value;
    if (mGlobalSettings->findString(kPolicySupportsMultipleSecureCodecs, &value)) {
        policies.push_back(
                MediaResourcePolicy(
                        String8(kPolicySupportsMultipleSecureCodecs),
                        String8(value.c_str())));
    }
    if (policies.size() > 0) {
        sp<IServiceManager> sm = defaultServiceManager();
        sp<IBinder> binder = sm->getService(String16("media.resource_manager"));
        sp<IResourceManagerService> service = interface_cast<IResourceManagerService>(binder);
        if (service == NULL) {
            ALOGE("MediaCodecList: failed to get ResourceManagerService");
        } else {
            service->config(policies);
        }
    }

    for (size_t i = mCodecInfos.size(); i-- > 0;) {
        const MediaCodecInfo &info = *mCodecInfos.itemAt(i).get();
        if (info.mCaps.size() == 0) {
+12 −3
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@
#include <media/ICrypto.h>
#include <media/IMediaCodecList.h>
#include <media/MediaCodecInfo.h>

#include <media/MediaResourcePolicy.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaCodec.h>

@@ -196,19 +196,21 @@ bool splitString(
}

void profileCodecs(const Vector<sp<MediaCodecInfo>> &infos) {
    CodecSettings global_results;  // TODO: add global results.
    CodecSettings global_results;
    KeyedVector<AString, CodecSettings> encoder_results;
    KeyedVector<AString, CodecSettings> decoder_results;
    profileCodecs(infos, &encoder_results, &decoder_results);
    profileCodecs(infos, &global_results, &encoder_results, &decoder_results);
    exportResultsToXML(kProfilingResults, global_results, encoder_results, decoder_results);
}

void profileCodecs(
        const Vector<sp<MediaCodecInfo>> &infos,
        CodecSettings *global_results,
        KeyedVector<AString, CodecSettings> *encoder_results,
        KeyedVector<AString, CodecSettings> *decoder_results,
        bool forceToMeasure) {
    KeyedVector<AString, sp<MediaCodecInfo::Capabilities>> codecsNeedMeasure;
    AString supportMultipleSecureCodecs = "true";
    for (size_t i = 0; i < infos.size(); ++i) {
        const sp<MediaCodecInfo> info = infos[i];
        AString name = info->getCodecName();
@@ -243,9 +245,16 @@ void profileCodecs(
                } else {
                    decoder_results->add(key, settings);
                }

                if (name.endsWith(".secure")) {
                    if (max <= 1) {
                        supportMultipleSecureCodecs = "false";
                    }
                }
            }
        }
    }
    global_results->add(kPolicySupportsMultipleSecureCodecs, supportMultipleSecureCodecs);
}

static AString globalResultsToXml(const CodecSettings& results) {
+2 −1
Original line number Diff line number Diff line
@@ -35,9 +35,10 @@ bool splitString(const AString &s, const AString &delimiter, AString *s1, AStrin
// profile codecs and save the result to xml file named kProfilingResults.
void profileCodecs(const Vector<sp<MediaCodecInfo>> &infos);

// profile codecs and save the result to encoder_results and decoder_results.
// profile codecs and save the result to global_results, encoder_results and decoder_results.
void profileCodecs(
        const Vector<sp<MediaCodecInfo>> &infos,
        CodecSettings *global_results,
        KeyedVector<AString, CodecSettings> *encoder_results,
        KeyedVector<AString, CodecSettings> *decoder_results,
        bool forceToMeasure = false);
Loading