void MpCodecFactory::freeAllLoadedLibsAndCodec() { OsSharedLibMgrBase* pShrMgr = OsSharedLibMgr::getOsSharedLibMgr(); UtlHashBagIterator iter(mCodecsInfo); MpCodecSubInfo* pinfo; UtlHashBag libLoaded; UtlString* libName; while ((pinfo = (MpCodecSubInfo*)iter())) { if ((!pinfo->getCodecCall()->isStatic()) && (!libLoaded.find(&pinfo->getCodecCall()->getModuleName()))) { libLoaded.insert(const_cast<UtlString*>(&pinfo->getCodecCall()->getModuleName())); } } UtlHashBagIterator iter2(libLoaded); while ((libName = (UtlString*)iter2())) { pShrMgr->unloadSharedLib(libName->data()); } iter.reset(); while ((pinfo = (MpCodecSubInfo*)iter())) { if (!pinfo->getCodecCall()->isStatic()) { mCodecsInfo.remove(pinfo); delete pinfo; } } mCodecInfoCacheValid = FALSE; }
OsStatus MpCodecFactory::createEncoder(const UtlString &mime, const UtlString &fmtp, int sampleRate, int numChannels, int payloadType, MpEncoderBase*& rpEncoder) const { MpCodecSubInfo* codec = searchByMIME(mime, sampleRate, numChannels); if (codec) { rpEncoder = new MpEncoderBase(payloadType, *codec->getCodecCall(), *codec->getCodecInfo(), fmtp); } else { OsSysLog::add(FAC_MP, PRI_ERR, "MpCodecFactory::createEncoder unknown codec type " "%s, fmtp=%s" "payloadType = %d", mime.data(), fmtp.data(), payloadType); rpEncoder=NULL; } if (NULL != rpEncoder) { return OS_SUCCESS; } return OS_INVALID_ARGUMENT; }
MpCodecFactory::~MpCodecFactory() { freeAllLoadedLibsAndCodec(); MpCodecSubInfo* pinfo; UtlHashBagIterator iter(mCodecsInfo); while ((pinfo = (MpCodecSubInfo*)iter())) { if (!pinfo->getCodecCall()->isStatic()) { assert(!"Dynamically loaded codecs must be unloaded already"); } delete pinfo; } mCodecsInfo.removeAll(); delete[] mpCodecInfoCache; }