|  | /* | 
|  | * Copyright (C) 2021 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | //#define LOG_NDEBUG 0 | 
|  | #define LOG_TAG "ManageShapingCodecs" | 
|  | #include <utils/Log.h> | 
|  |  | 
|  | #include <mutex> | 
|  | #include <string> | 
|  | #include <inttypes.h> | 
|  |  | 
|  | #include <media/NdkMediaFormat.h> | 
|  | #include <media/formatshaper/CodecProperties.h> | 
|  |  | 
|  | namespace android { | 
|  | namespace mediaformatshaper { | 
|  |  | 
|  | // manage the list of codec information. | 
|  | // | 
|  | // XXX: the mutex here is too heavy; rework that. | 
|  | // | 
|  |  | 
|  | static std::mutex sCodecMutex; | 
|  | static std::map<std::string, CodecProperties*> sCodecTraits; | 
|  |  | 
|  | CodecProperties *findCodec(const char *codecName, const char *mediaType) { | 
|  | CodecProperties *codec = nullptr; | 
|  |  | 
|  | // synthesize a name from both codecName + mediaType | 
|  | // some codecs support multiple media types and may have different capabilities | 
|  | // for each media type | 
|  | // | 
|  | std::string codecKey = codecName; | 
|  | codecKey += "-"; | 
|  | codecKey += mediaType; | 
|  |  | 
|  | std::lock_guard  _l(sCodecMutex); | 
|  |  | 
|  | auto it = sCodecTraits.find(codecKey); | 
|  | if (it != sCodecTraits.end()) { | 
|  | codec = it->second; | 
|  | } | 
|  |  | 
|  | return codec; | 
|  | } | 
|  |  | 
|  | CodecProperties *registerCodec(CodecProperties *codec, const char *codecName, | 
|  | const char *mediaType) { | 
|  |  | 
|  | CodecProperties *registeredCodec = nullptr; | 
|  |  | 
|  | if (codec->isRegistered()) { | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | // synthesize a name from both codecName + mediaType | 
|  | // some codecs support multiple media types and may have different capabilities | 
|  | // for each media type | 
|  | // | 
|  | std::string codecKey = codecName; | 
|  | codecKey += "-"; | 
|  | codecKey += mediaType; | 
|  |  | 
|  | std::lock_guard  _l(sCodecMutex); | 
|  |  | 
|  | auto it = sCodecTraits.find(codecKey); | 
|  | if (it != sCodecTraits.end()) { | 
|  | registeredCodec = it->second; | 
|  | } | 
|  |  | 
|  | if (registeredCodec == nullptr) { | 
|  | // register the one that was passed to us | 
|  | ALOGV("Creating entry for codec %s, mediaType %s, key %s", codecName, mediaType, | 
|  | codecKey.c_str()); | 
|  | sCodecTraits.insert({codecKey, codec}); | 
|  | registeredCodec = codec; | 
|  | codec->setRegistered(true); | 
|  | } else { | 
|  | // one has already been registered, use that | 
|  | // and discard the candidate | 
|  | delete codec; | 
|  | codec = nullptr; | 
|  | } | 
|  |  | 
|  | return registeredCodec; | 
|  | } | 
|  |  | 
|  | }  // namespace mediaformatshaper | 
|  | }  // namespace android | 
|  |  |