Merge "hdr10+: profile level report"

gugelfrei
TreeHugger Robot 6 years ago committed by Android (Google) Code Review
commit 1dfd7ba8c0

@ -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;

@ -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);

@ -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*);

Loading…
Cancel
Save