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

Commit 1dfd7ba8 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "hdr10+: profile level report"

parents 097f1f05 a8d5b4f6
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -496,6 +496,23 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) {
                        asString(err), asString(profileQuery[0].status));
                if (err == C2_OK && profileQuery[0].status == C2_OK) {
                    if (profileQuery[0].values.type == C2FieldSupportedValues::VALUES) {
                        std::vector<std::shared_ptr<C2ParamDescriptor>> paramDescs;
                        c2_status_t err1 = intf->querySupportedParams(&paramDescs);
                        bool isHdr = false, isHdr10Plus = false;
                        if (err1 == C2_OK) {
                            for (const std::shared_ptr<C2ParamDescriptor> &desc : paramDescs) {
                                if ((uint32_t)desc->index() ==
                                        C2StreamHdr10PlusInfo::output::PARAM_TYPE) {
                                    isHdr10Plus = true;
                                } else if ((uint32_t)desc->index() ==
                                        C2StreamHdrStaticInfo::output::PARAM_TYPE) {
                                    isHdr = true;
                                }
                            }
                        }
                        // For VP9, the static info is always propagated by framework.
                        isHdr |= (mediaType == MIMETYPE_VIDEO_VP9);

                        for (C2Value::Primitive profile : profileQuery[0].values.values) {
                            pl.profile = (C2Config::profile_t)profile.ref<uint32_t>();
                            std::vector<std::unique_ptr<C2SettingResult>> failures;
@@ -519,6 +536,26 @@ status_t Codec2InfoBuilder::buildMediaCodecList(MediaCodecListWriter* writer) {
                                        caps->addProfileLevel(
                                                (uint32_t)sdkProfile, (uint32_t)sdkLevel);
                                        gotProfileLevels = true;
                                        if (isHdr) {
                                            auto hdrMapper = C2Mapper::GetHdrProfileLevelMapper(
                                                    trait.mediaType);
                                            if (hdrMapper && hdrMapper->mapProfile(
                                                    pl.profile, &sdkProfile)) {
                                                caps->addProfileLevel(
                                                        (uint32_t)sdkProfile,
                                                        (uint32_t)sdkLevel);
                                            }
                                            if (isHdr10Plus) {
                                                hdrMapper = C2Mapper::GetHdrProfileLevelMapper(
                                                        trait.mediaType, true /*isHdr10Plus*/);
                                                if (hdrMapper && hdrMapper->mapProfile(
                                                        pl.profile, &sdkProfile)) {
                                                    caps->addProfileLevel(
                                                            (uint32_t)sdkProfile,
                                                            (uint32_t)sdkLevel);
                                                }
                                            }
                                        }
                                    } else if (!mapper) {
                                        caps->addProfileLevel(pl.profile, pl.level);
                                        gotProfileLevels = true;
+62 −4
Original line number Diff line number Diff line
@@ -253,6 +253,14 @@ ALookup<C2Config::profile_t, int32_t> sHevcProfiles = {
    { C2Config::PROFILE_HEVC_MAIN_10_INTRA, HEVCProfileMain10 },
};

ALookup<C2Config::profile_t, int32_t> sHevcHdrProfiles = {
    { C2Config::PROFILE_HEVC_MAIN_10, HEVCProfileMain10HDR10 },
};

ALookup<C2Config::profile_t, int32_t> sHevcHdr10PlusProfiles = {
    { C2Config::PROFILE_HEVC_MAIN_10, HEVCProfileMain10HDR10Plus },
};

ALookup<C2Config::level_t, int32_t> sMpeg2Levels = {
    { C2Config::LEVEL_MP2V_LOW,         MPEG2LevelLL },
    { C2Config::LEVEL_MP2V_MAIN,        MPEG2LevelML },
@@ -324,6 +332,20 @@ ALookup<C2Config::profile_t, int32_t> sVp9Profiles = {
    { C2Config::PROFILE_VP9_1, VP9Profile1 },
    { C2Config::PROFILE_VP9_2, VP9Profile2 },
    { C2Config::PROFILE_VP9_3, VP9Profile3 },
    { C2Config::PROFILE_VP9_2, VP9Profile2HDR },
    { C2Config::PROFILE_VP9_3, VP9Profile3HDR },
    { C2Config::PROFILE_VP9_2, VP9Profile2HDR10Plus },
    { C2Config::PROFILE_VP9_3, VP9Profile3HDR10Plus },
};

ALookup<C2Config::profile_t, int32_t> sVp9HdrProfiles = {
    { C2Config::PROFILE_VP9_2, VP9Profile2HDR },
    { C2Config::PROFILE_VP9_3, VP9Profile3HDR },
};

ALookup<C2Config::profile_t, int32_t> sVp9Hdr10PlusProfiles = {
    { C2Config::PROFILE_VP9_2, VP9Profile2HDR10Plus },
    { C2Config::PROFILE_VP9_3, VP9Profile3HDR10Plus },
};

ALookup<C2Config::level_t, int32_t> sAv1Levels = {
@@ -461,6 +483,10 @@ struct H263ProfileLevelMapper : ProfileLevelMapperHelper {
};

struct HevcProfileLevelMapper : ProfileLevelMapperHelper {
    HevcProfileLevelMapper(bool isHdr = false, bool isHdr10Plus = false) :
        ProfileLevelMapperHelper(),
        mIsHdr(isHdr), mIsHdr10Plus(isHdr10Plus) {}

    virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
        return sHevcLevels.map(from, to);
    }
@@ -468,11 +494,19 @@ struct HevcProfileLevelMapper : ProfileLevelMapperHelper {
        return sHevcLevels.map(from, to);
    }
    virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
        return sHevcProfiles.map(from, to);
        return mIsHdr10Plus ? sHevcHdr10PlusProfiles.map(from, to) :
                     mIsHdr ? sHevcHdrProfiles.map(from, to) :
                              sHevcProfiles.map(from, to);
    }
    virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
        return sHevcProfiles.map(from, to);
        return mIsHdr10Plus ? sHevcHdr10PlusProfiles.map(from, to) :
                     mIsHdr ? sHevcHdrProfiles.map(from, to) :
                              sHevcProfiles.map(from, to);
    }

private:
    bool mIsHdr;
    bool mIsHdr10Plus;
};

struct Mpeg2ProfileLevelMapper : ProfileLevelMapperHelper {
@@ -527,6 +561,10 @@ struct Vp8ProfileLevelMapper : ProfileLevelMapperHelper {
};

struct Vp9ProfileLevelMapper : ProfileLevelMapperHelper {
    Vp9ProfileLevelMapper(bool isHdr = false, bool isHdr10Plus = false) :
        ProfileLevelMapperHelper(),
        mIsHdr(isHdr), mIsHdr10Plus(isHdr10Plus) {}

    virtual bool simpleMap(C2Config::level_t from, int32_t *to) {
        return sVp9Levels.map(from, to);
    }
@@ -534,11 +572,19 @@ struct Vp9ProfileLevelMapper : ProfileLevelMapperHelper {
        return sVp9Levels.map(from, to);
    }
    virtual bool simpleMap(C2Config::profile_t from, int32_t *to) {
        return sVp9Profiles.map(from, to);
        return mIsHdr10Plus ? sVp9Hdr10PlusProfiles.map(from, to) :
                     mIsHdr ? sVp9HdrProfiles.map(from, to) :
                              sVp9Profiles.map(from, to);
    }
    virtual bool simpleMap(int32_t from, C2Config::profile_t *to) {
        return sVp9Profiles.map(from, to);
        return mIsHdr10Plus ? sVp9Hdr10PlusProfiles.map(from, to) :
                     mIsHdr ? sVp9HdrProfiles.map(from, to) :
                              sVp9Profiles.map(from, to);
    }

private:
    bool mIsHdr;
    bool mIsHdr10Plus;
};

} // namespace
@@ -569,6 +615,18 @@ C2Mapper::GetProfileLevelMapper(std::string mediaType) {
    return nullptr;
}

// static
std::shared_ptr<C2Mapper::ProfileLevelMapper>
C2Mapper::GetHdrProfileLevelMapper(std::string mediaType, bool isHdr10Plus) {
    std::transform(mediaType.begin(), mediaType.begin(), mediaType.end(), ::tolower);
    if (mediaType == MIMETYPE_VIDEO_HEVC) {
        return std::make_shared<HevcProfileLevelMapper>(true, isHdr10Plus);
    } else if (mediaType == MIMETYPE_VIDEO_VP9) {
        return std::make_shared<Vp9ProfileLevelMapper>(true, isHdr10Plus);
    }
    return nullptr;
}

// static
bool C2Mapper::map(C2Config::bitrate_mode_t from, int32_t *to) {
    return sBitrateModes.map(from, to);
+3 −0
Original line number Diff line number Diff line
@@ -40,6 +40,9 @@ namespace android {
        static std::shared_ptr<ProfileLevelMapper>
        GetProfileLevelMapper(std::string mediaType);

        static std::shared_ptr<ProfileLevelMapper>
        GetHdrProfileLevelMapper(std::string mediaType, bool isHdr10Plus = false);

        // convert between bitrates
        static bool map(C2Config::bitrate_mode_t, int32_t*);
        static bool map(int32_t, C2Config::bitrate_mode_t*);