CCodec: handle unrecognized names in LinearBlock methods
Fixes: 154073598
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
Change-Id: I76424fa90d2bf8d26c9be4ba6b7ee6c54676fc65
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index cc132de..01d106f 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -1948,6 +1948,13 @@
inputSurface->getHalInterface()));
}
+static void MaybeLogUnrecognizedName(const char *func, const std::string &name) {
+ thread_local std::set<std::string> sLogged{};
+ if (sLogged.insert(name).second) {
+ ALOGW("%s: Unrecognized interface name: %s", func, name.c_str());
+ }
+}
+
static status_t GetCommonAllocatorIds(
const std::vector<std::string> &names,
C2Allocator::type_t type,
@@ -1961,26 +1968,33 @@
if (names.empty()) {
return OK;
}
- std::shared_ptr<Codec2Client::Interface> intf{
- Codec2Client::CreateInterfaceByName(names[0].c_str())};
- std::vector<std::unique_ptr<C2Param>> params;
- c2_status_t err = intf->query(
- {}, {C2PortAllocatorsTuning::input::PARAM_TYPE}, C2_MAY_BLOCK, ¶ms);
- if (err == C2_OK && params.size() == 1u) {
- C2PortAllocatorsTuning::input *allocators =
- C2PortAllocatorsTuning::input::From(params[0].get());
- if (allocators && allocators->flexCount() > 0) {
- ids->insert(allocators->m.values, allocators->m.values + allocators->flexCount());
+ bool firstIteration = true;
+ for (const std::string &name : names) {
+ std::shared_ptr<Codec2Client::Interface> intf{
+ Codec2Client::CreateInterfaceByName(name.c_str())};
+ if (!intf) {
+ MaybeLogUnrecognizedName(__FUNCTION__, name);
+ continue;
}
- }
- if (ids->empty()) {
- // The component does not advertise allocators. Use default.
- ids->insert(defaultAllocatorId);
- }
- for (size_t i = 1; i < names.size(); ++i) {
- intf = Codec2Client::CreateInterfaceByName(names[i].c_str());
- err = intf->query(
+ std::vector<std::unique_ptr<C2Param>> params;
+ c2_status_t err = intf->query(
{}, {C2PortAllocatorsTuning::input::PARAM_TYPE}, C2_MAY_BLOCK, ¶ms);
+ if (firstIteration) {
+ firstIteration = false;
+ if (err == C2_OK && params.size() == 1u) {
+ C2PortAllocatorsTuning::input *allocators =
+ C2PortAllocatorsTuning::input::From(params[0].get());
+ if (allocators && allocators->flexCount() > 0) {
+ ids->insert(allocators->m.values,
+ allocators->m.values + allocators->flexCount());
+ }
+ }
+ if (ids->empty()) {
+ // The component does not advertise allocators. Use default.
+ ids->insert(defaultAllocatorId);
+ }
+ continue;
+ }
bool filtered = false;
if (err == C2_OK && params.size() == 1u) {
C2PortAllocatorsTuning::input *allocators =
@@ -2033,6 +2047,10 @@
for (const std::string &name : names) {
std::shared_ptr<Codec2Client::Interface> intf{
Codec2Client::CreateInterfaceByName(name.c_str())};
+ if (!intf) {
+ MaybeLogUnrecognizedName(__FUNCTION__, name);
+ continue;
+ }
std::vector<C2FieldSupportedValuesQuery> fields;
fields.push_back(C2FieldSupportedValuesQuery::Possible(
C2ParamField{&sUsage, &sUsage.value}));