Implement alias
Bug: 111605816
Test: adb shell stagefright -p
Change-Id: Ie4aa9d347d55a06e9840c8ae4a643e9bc189a22b
diff --git a/codec2/vndk/C2Store.cpp b/codec2/vndk/C2Store.cpp
index 5582483..33019ed 100644
--- a/codec2/vndk/C2Store.cpp
+++ b/codec2/vndk/C2Store.cpp
@@ -517,7 +517,8 @@
*
* \note Only used by ComponentLoader.
*
- * \param libPath[in] library path (or name)
+ * \param alias[in] module alias
+ * \param libPath[in] library path
*
* \retval C2_OK the component module has been successfully loaded
* \retval C2_NO_MEMORY not enough memory to loading the component module
@@ -526,7 +527,7 @@
* \retval C2_REFUSED permission denied to load the component module (unexpected)
* \retval C2_TIMED_OUT could not load the module within the time limit (unexpected)
*/
- c2_status_t init(std::string libPath);
+ c2_status_t init(std::string alias, std::string libPath);
virtual ~ComponentModule() override;
@@ -569,7 +570,7 @@
std::shared_ptr<ComponentModule> localModule = mModule.lock();
if (localModule == nullptr) {
localModule = std::make_shared<ComponentModule>();
- res = localModule->init(mLibPath);
+ res = localModule->init(mAlias, mLibPath);
if (res == C2_OK) {
mModule = localModule;
}
@@ -581,13 +582,14 @@
/**
* Creates a component loader for a specific library path (or name).
*/
- ComponentLoader(std::string libPath)
- : mLibPath(libPath) {}
+ ComponentLoader(std::string alias, std::string libPath)
+ : mAlias(alias), mLibPath(libPath) {}
private:
std::mutex mMutex; ///< mutex guarding the module
std::weak_ptr<ComponentModule> mModule; ///< weak reference to the loaded module
- std::string mLibPath; ///< library path (or name)
+ std::string mAlias; ///< component alias
+ std::string mLibPath; ///< library path
};
struct Interface : public C2InterfaceHelper {
@@ -640,12 +642,14 @@
*/
c2_status_t findComponent(C2String name, ComponentLoader **loader);
- std::map<C2String, ComponentLoader> mComponents; ///< list of components
+ std::map<C2String, ComponentLoader> mComponents; ///< map of name -> components
+ std::vector<C2String> mComponentsList; ///< list of components
std::shared_ptr<C2ReflectorHelper> mReflector;
Interface mInterface;
};
-c2_status_t C2PlatformComponentStore::ComponentModule::init(std::string libPath) {
+c2_status_t C2PlatformComponentStore::ComponentModule::init(
+ std::string alias, std::string libPath) {
ALOGV("in %s", __func__);
ALOGV("loading dll");
mLibHandle = dlopen(libPath.c_str(), RTLD_NOW|RTLD_NODELETE);
@@ -667,6 +671,64 @@
mInit = C2_OK;
}
}
+ if (mInit != C2_OK) {
+ return mInit;
+ }
+
+ std::shared_ptr<C2ComponentInterface> intf;
+ c2_status_t res = createInterface(0, &intf);
+ if (res != C2_OK) {
+ ALOGD("failed to create interface: %d", res);
+ return mInit;
+ }
+
+ std::shared_ptr<C2Component::Traits> traits(new (std::nothrow) C2Component::Traits);
+ if (traits) {
+ if (alias != intf->getName()) {
+ ALOGV("%s is alias to %s", alias.c_str(), intf->getName().c_str());
+ }
+ traits->name = alias;
+ // TODO: get this from interface properly.
+ bool encoder = (traits->name.find("encoder") != std::string::npos);
+ uint32_t mediaTypeIndex = encoder ? C2PortMimeConfig::output::PARAM_TYPE
+ : C2PortMimeConfig::input::PARAM_TYPE;
+ std::vector<std::unique_ptr<C2Param>> params;
+ res = intf->query_vb({}, { mediaTypeIndex }, C2_MAY_BLOCK, ¶ms);
+ if (res != C2_OK) {
+ ALOGD("failed to query interface: %d", res);
+ return mInit;
+ }
+ if (params.size() != 1u) {
+ ALOGD("failed to query interface: unexpected vector size: %zu", params.size());
+ return mInit;
+ }
+ C2PortMimeConfig *mediaTypeConfig = (C2PortMimeConfig *)(params[0].get());
+ if (mediaTypeConfig == nullptr) {
+ ALOGD("failed to query media type");
+ return mInit;
+ }
+ traits->mediaType = mediaTypeConfig->m.value;
+ // TODO: get this properly.
+ traits->rank = 0x200;
+
+ // TODO: define these values properly
+ bool decoder = (traits->name.find("decoder") != std::string::npos);
+ traits->kind =
+ decoder ? C2Component::KIND_DECODER :
+ encoder ? C2Component::KIND_ENCODER :
+ C2Component::KIND_OTHER;
+ if (strncmp(traits->mediaType.c_str(), "audio/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_AUDIO;
+ } else if (strncmp(traits->mediaType.c_str(), "video/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_VIDEO;
+ } else if (strncmp(traits->mediaType.c_str(), "image/", 6) == 0) {
+ traits->domain = C2Component::DOMAIN_IMAGE;
+ } else {
+ traits->domain = C2Component::DOMAIN_OTHER;
+ }
+ }
+ mTraits = traits;
+
return mInit;
}
@@ -717,94 +779,84 @@
std::shared_ptr<const C2Component::Traits> C2PlatformComponentStore::ComponentModule::getTraits() {
std::unique_lock<std::recursive_mutex> lock(mLock);
- if (!mTraits) {
- std::shared_ptr<C2ComponentInterface> intf;
- c2_status_t res = createInterface(0, &intf);
- if (res != C2_OK) {
- ALOGD("failed to create interface: %d", res);
- return nullptr;
- }
-
- std::shared_ptr<C2Component::Traits> traits(new (std::nothrow) C2Component::Traits);
- if (traits) {
- traits->name = intf->getName();
- // TODO: get this from interface properly.
- bool encoder = (traits->name.find("encoder") != std::string::npos);
- uint32_t mediaTypeIndex = encoder ? C2PortMimeConfig::output::PARAM_TYPE
- : C2PortMimeConfig::input::PARAM_TYPE;
- std::vector<std::unique_ptr<C2Param>> params;
- res = intf->query_vb({}, { mediaTypeIndex }, C2_MAY_BLOCK, ¶ms);
- if (res != C2_OK) {
- ALOGD("failed to query interface: %d", res);
- return nullptr;
- }
- if (params.size() != 1u) {
- ALOGD("failed to query interface: unexpected vector size: %zu", params.size());
- return nullptr;
- }
- C2PortMimeConfig *mediaTypeConfig = (C2PortMimeConfig *)(params[0].get());
- if (mediaTypeConfig == nullptr) {
- ALOGD("failed to query media type");
- return nullptr;
- }
- traits->mediaType = mediaTypeConfig->m.value;
- // TODO: get this properly.
- traits->rank = 0x200;
-
- // TODO: define these values properly
- bool decoder = (traits->name.find("decoder") != std::string::npos);
- traits->kind =
- decoder ? C2Component::KIND_DECODER :
- encoder ? C2Component::KIND_ENCODER :
- C2Component::KIND_OTHER;
- if (strncmp(traits->mediaType.c_str(), "audio/", 6) == 0) {
- traits->domain = C2Component::DOMAIN_AUDIO;
- } else if (strncmp(traits->mediaType.c_str(), "video/", 6) == 0) {
- traits->domain = C2Component::DOMAIN_VIDEO;
- } else if (strncmp(traits->mediaType.c_str(), "image/", 6) == 0) {
- traits->domain = C2Component::DOMAIN_IMAGE;
- } else {
- traits->domain = C2Component::DOMAIN_OTHER;
- }
- }
-
- mTraits = traits;
- }
return mTraits;
}
C2PlatformComponentStore::C2PlatformComponentStore()
: mReflector(std::make_shared<C2ReflectorHelper>()),
mInterface(mReflector) {
+
+ auto emplace = [this](const char *alias, const char *libPath) {
+ // ComponentLoader is neither copiable nor movable, so it must be
+ // constructed in-place. Now ComponentLoader takes two arguments in
+ // constructor, so we need to use piecewise_construct to achieve this
+ // behavior.
+ mComponents.emplace(
+ std::piecewise_construct,
+ std::forward_as_tuple(alias),
+ std::forward_as_tuple(alias, libPath));
+ mComponentsList.emplace_back(alias);
+ };
// TODO: move this also into a .so so it can be updated
- mComponents.emplace("c2.android.avc.decoder", "libstagefright_soft_c2avcdec.so");
- mComponents.emplace("c2.android.avc.encoder", "libstagefright_soft_c2avcenc.so");
- mComponents.emplace("c2.android.aac.decoder", "libstagefright_soft_c2aacdec.so");
- mComponents.emplace("c2.android.aac.encoder", "libstagefright_soft_c2aacenc.so");
- mComponents.emplace("c2.android.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
- mComponents.emplace("c2.android.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
- mComponents.emplace("c2.android.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
- mComponents.emplace("c2.android.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
- mComponents.emplace("c2.android.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
- mComponents.emplace("c2.android.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
- mComponents.emplace("c2.android.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
- mComponents.emplace("c2.android.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
- mComponents.emplace("c2.android.h263.decoder", "libstagefright_soft_c2h263dec.so");
- mComponents.emplace("c2.android.h263.encoder", "libstagefright_soft_c2h263enc.so");
- mComponents.emplace("c2.android.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
- mComponents.emplace("c2.android.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
- mComponents.emplace("c2.android.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
- mComponents.emplace("c2.android.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
- mComponents.emplace("c2.android.opus.decoder", "libstagefright_soft_c2opusdec.so");
- mComponents.emplace("c2.android.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
- mComponents.emplace("c2.android.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
- mComponents.emplace("c2.android.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
- mComponents.emplace("c2.android.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
- mComponents.emplace("c2.android.raw.decoder", "libstagefright_soft_c2rawdec.so");
- mComponents.emplace("c2.android.flac.decoder", "libstagefright_soft_c2flacdec.so");
- mComponents.emplace("c2.android.flac.encoder", "libstagefright_soft_c2flacenc.so");
- mComponents.emplace("c2.android.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
- mComponents.emplace("c2.android.xaac.decoder", "libstagefright_soft_c2xaacdec.so");
+ emplace("c2.android.avc.decoder", "libstagefright_soft_c2avcdec.so");
+ emplace("c2.android.avc.encoder", "libstagefright_soft_c2avcenc.so");
+ emplace("c2.android.aac.decoder", "libstagefright_soft_c2aacdec.so");
+ emplace("c2.android.aac.encoder", "libstagefright_soft_c2aacenc.so");
+ emplace("c2.android.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
+ emplace("c2.android.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
+ emplace("c2.android.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
+ emplace("c2.android.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
+ emplace("c2.android.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
+ emplace("c2.android.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
+ emplace("c2.android.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
+ emplace("c2.android.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
+ emplace("c2.android.h263.decoder", "libstagefright_soft_c2h263dec.so");
+ emplace("c2.android.h263.encoder", "libstagefright_soft_c2h263enc.so");
+ emplace("c2.android.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
+ emplace("c2.android.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
+ emplace("c2.android.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
+ emplace("c2.android.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
+ emplace("c2.android.opus.decoder", "libstagefright_soft_c2opusdec.so");
+ emplace("c2.android.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
+ emplace("c2.android.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
+ emplace("c2.android.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
+ emplace("c2.android.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
+ emplace("c2.android.raw.decoder", "libstagefright_soft_c2rawdec.so");
+ emplace("c2.android.flac.decoder", "libstagefright_soft_c2flacdec.so");
+ emplace("c2.android.flac.encoder", "libstagefright_soft_c2flacenc.so");
+ emplace("c2.android.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
+ emplace("c2.android.xaac.decoder", "libstagefright_soft_c2xaacdec.so");
+
+ // "Aliases"
+ // TODO: use aliases proper from C2Component::Traits
+ emplace("OMX.google.h264.decoder", "libstagefright_soft_c2avcdec.so");
+ emplace("OMX.google.h264.encoder", "libstagefright_soft_c2avcenc.so");
+ emplace("OMX.google.aac.decoder", "libstagefright_soft_c2aacdec.so");
+ emplace("OMX.google.aac.encoder", "libstagefright_soft_c2aacenc.so");
+ emplace("OMX.google.amrnb.decoder", "libstagefright_soft_c2amrnbdec.so");
+ emplace("OMX.google.amrnb.encoder", "libstagefright_soft_c2amrnbenc.so");
+ emplace("OMX.google.amrwb.decoder", "libstagefright_soft_c2amrwbdec.so");
+ emplace("OMX.google.amrwb.encoder", "libstagefright_soft_c2amrwbenc.so");
+ emplace("OMX.google.hevc.decoder", "libstagefright_soft_c2hevcdec.so");
+ emplace("OMX.google.g711.alaw.decoder", "libstagefright_soft_c2g711alawdec.so");
+ emplace("OMX.google.g711.mlaw.decoder", "libstagefright_soft_c2g711mlawdec.so");
+ emplace("OMX.google.mpeg2.decoder", "libstagefright_soft_c2mpeg2dec.so");
+ emplace("OMX.google.h263.decoder", "libstagefright_soft_c2h263dec.so");
+ emplace("OMX.google.h263.encoder", "libstagefright_soft_c2h263enc.so");
+ emplace("OMX.google.mpeg4.decoder", "libstagefright_soft_c2mpeg4dec.so");
+ emplace("OMX.google.mpeg4.encoder", "libstagefright_soft_c2mpeg4enc.so");
+ emplace("OMX.google.mp3.decoder", "libstagefright_soft_c2mp3dec.so");
+ emplace("OMX.google.vorbis.decoder", "libstagefright_soft_c2vorbisdec.so");
+ emplace("OMX.google.opus.decoder", "libstagefright_soft_c2opusdec.so");
+ emplace("OMX.google.vp8.decoder", "libstagefright_soft_c2vp8dec.so");
+ emplace("OMX.google.vp9.decoder", "libstagefright_soft_c2vp9dec.so");
+ emplace("OMX.google.vp8.encoder", "libstagefright_soft_c2vp8enc.so");
+ emplace("OMX.google.vp9.encoder", "libstagefright_soft_c2vp9enc.so");
+ emplace("OMX.google.raw.decoder", "libstagefright_soft_c2rawdec.so");
+ emplace("OMX.google.flac.decoder", "libstagefright_soft_c2flacdec.so");
+ emplace("OMX.google.flac.encoder", "libstagefright_soft_c2flacenc.so");
+ emplace("OMX.google.gsm.decoder", "libstagefright_soft_c2gsmdec.so");
+ emplace("OMX.google.xaac.decoder", "libstagefright_soft_c2xaacdec.so");
}
c2_status_t C2PlatformComponentStore::copyBuffer(
@@ -830,8 +882,8 @@
std::vector<std::shared_ptr<const C2Component::Traits>> C2PlatformComponentStore::listComponents() {
// This method SHALL return within 500ms.
std::vector<std::shared_ptr<const C2Component::Traits>> list;
- for (auto &it : mComponents) {
- ComponentLoader &loader = it.second;
+ for (const C2String &alias : mComponentsList) {
+ ComponentLoader &loader = mComponents.at(alias);
std::shared_ptr<ComponentModule> module;
c2_status_t res = loader.fetchModule(&module);
if (res == C2_OK) {
diff --git a/media/sfplugin/CCodec.cpp b/media/sfplugin/CCodec.cpp
index 066e4f1..3e22e41 100644
--- a/media/sfplugin/CCodec.cpp
+++ b/media/sfplugin/CCodec.cpp
@@ -610,7 +610,7 @@
}
config->queryConfiguration(comp);
- mCallback->onComponentAllocated(comp->getName().c_str());
+ mCallback->onComponentAllocated(componentName.c_str());
}
void CCodec::initiateConfigureComponent(const sp<AMessage> &format) {
diff --git a/media/sfplugin/Codec2InfoBuilder.cpp b/media/sfplugin/Codec2InfoBuilder.cpp
index 93f5b91..bf6ee9c 100644
--- a/media/sfplugin/Codec2InfoBuilder.cpp
+++ b/media/sfplugin/Codec2InfoBuilder.cpp
@@ -357,60 +357,65 @@
for (const Traits& trait : traits) {
C2Component::rank_t rank = trait.rank;
- if (parser.getCodecMap().count(trait.name.c_str()) == 0) {
+ std::shared_ptr<Codec2Client::Interface> intf =
+ Codec2Client::CreateInterfaceByName(trait.name.c_str());
+ if (!intf || parser.getCodecMap().count(intf->getName()) == 0) {
ALOGD("%s not found in xml", trait.name.c_str());
continue;
}
+ std::string canonName = intf->getName();
// TODO: Remove this block once all codecs are enabled by default.
switch (option) {
case 0:
continue;
case 1:
- if (hasPrefix(trait.name, "c2.vda.")) {
+ if (hasPrefix(canonName, "c2.vda.")) {
break;
}
- if (hasPrefix(trait.name, "c2.android.")) {
+ if (hasPrefix(canonName, "c2.android.")) {
if (trait.domain == C2Component::DOMAIN_AUDIO) {
rank = 1;
break;
}
break;
}
- if (hasSuffix(trait.name, ".avc.decoder") ||
- hasSuffix(trait.name, ".avc.encoder")) {
+ if (hasSuffix(canonName, ".avc.decoder") ||
+ hasSuffix(canonName, ".avc.encoder")) {
rank = std::numeric_limits<decltype(rank)>::max();
break;
}
continue;
case 2:
- if (hasPrefix(trait.name, "c2.vda.")) {
+ if (hasPrefix(canonName, "c2.vda.")) {
break;
}
- if (hasPrefix(trait.name, "c2.android.")) {
+ if (hasPrefix(canonName, "c2.android.")) {
rank = 1;
break;
}
- if (hasSuffix(trait.name, ".avc.decoder") ||
- hasSuffix(trait.name, ".avc.encoder")) {
+ if (hasSuffix(canonName, ".avc.decoder") ||
+ hasSuffix(canonName, ".avc.encoder")) {
rank = std::numeric_limits<decltype(rank)>::max();
break;
}
continue;
case 3:
- if (hasPrefix(trait.name, "c2.android.")) {
+ if (hasPrefix(canonName, "c2.android.")) {
rank = 1;
}
break;
}
- const MediaCodecsXmlParser::CodecProperties &codec = parser.getCodecMap().at(trait.name);
std::unique_ptr<MediaCodecInfoWriter> codecInfo = writer->addMediaCodecInfo();
codecInfo->setName(trait.name.c_str());
- codecInfo->setOwner("dummy");
+ codecInfo->setOwner("codec2");
bool encoder = trait.kind == C2Component::KIND_ENCODER;
codecInfo->setEncoder(encoder);
codecInfo->setRank(rank);
+ const MediaCodecsXmlParser::CodecProperties &codec =
+ parser.getCodecMap().at(canonName);
+
for (auto typeIt = codec.typeMap.begin(); typeIt != codec.typeMap.end(); ++typeIt) {
const std::string &mediaType = typeIt->first;
const MediaCodecsXmlParser::AttributeMap &attrMap = typeIt->second;
@@ -427,8 +432,6 @@
}
bool gotProfileLevels = false;
- std::shared_ptr<Codec2Client::Interface> intf =
- Codec2Client::CreateInterfaceByName(trait.name.c_str());
if (intf) {
std::shared_ptr<C2Mapper::ProfileLevelMapper> mapper =
C2Mapper::GetProfileLevelMapper(trait.mediaType);