diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp index cc132de577..01d106fa8f 100644 --- a/media/codec2/sfplugin/CCodec.cpp +++ b/media/codec2/sfplugin/CCodec.cpp @@ -1948,6 +1948,13 @@ PersistentSurface *CCodec::CreateInputSurface() { inputSurface->getHalInterface())); } +static void MaybeLogUnrecognizedName(const char *func, const std::string &name) { + thread_local std::set sLogged{}; + if (sLogged.insert(name).second) { + ALOGW("%s: Unrecognized interface name: %s", func, name.c_str()); + } +} + static status_t GetCommonAllocatorIds( const std::vector &names, C2Allocator::type_t type, @@ -1961,26 +1968,33 @@ static status_t GetCommonAllocatorIds( if (names.empty()) { return OK; } - std::shared_ptr intf{ - Codec2Client::CreateInterfaceByName(names[0].c_str())}; - std::vector> 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()); - } - } - 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( + bool firstIteration = true; + for (const std::string &name : names) { + std::shared_ptr intf{ + Codec2Client::CreateInterfaceByName(name.c_str())}; + if (!intf) { + MaybeLogUnrecognizedName(__FUNCTION__, name); + continue; + } + std::vector> 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 @@ static status_t CalculateMinMaxUsage( for (const std::string &name : names) { std::shared_ptr intf{ Codec2Client::CreateInterfaceByName(name.c_str())}; + if (!intf) { + MaybeLogUnrecognizedName(__FUNCTION__, name); + continue; + } std::vector fields; fields.push_back(C2FieldSupportedValuesQuery::Possible( C2ParamField{&sUsage, &sUsage.value}));