Beispiel #1
0
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;
}
Beispiel #2
0
OsStatus MpCodecFactory::loadDynCodec(const char* name)
{
   OsSysLog::add(FAC_MP, PRI_INFO, "MpCodecFactory::loadDynCodec(\"%s\")", name);

   OsStatus res;
   OsSharedLibMgrBase* pShrMgr = OsSharedLibMgr::getOsSharedLibMgr();

   res = pShrMgr->loadSharedLib(name);
   if (res != OS_SUCCESS)
   {
      return OS_FAILED;
   }
 
   void* address;   
   res = pShrMgr->getSharedLibSymbol(name, MSK_GET_CODEC_NAME_V1, address);
   if (res != OS_SUCCESS)
   {
      pShrMgr->unloadSharedLib(name);
      return OS_FAILED;
   }

   dlGetCodecsV1 getCodecsV1 = (dlGetCodecsV1)address;
   const char* codecName;
   int i, r, count = 0;
   UtlString codecTokens;

   // 100 is a watchdog value, should be enough for everyone.
   for (i = 0; (i < 100); i++) 
   {
      r = getCodecsV1(i, &codecName);
      if ((r != RPLG_SUCCESS) || (codecName == NULL)) 
      {
         if (count == 0)
         {
            pShrMgr->unloadSharedLib(name);
            return OS_FAILED;
         }
         return OS_SUCCESS;
      }

      OsSysLog::add(FAC_MP, PRI_INFO, "found codec: %s", codecName);

      if(i > 0)
      {
         codecTokens.append(' ');
      }
      codecTokens.append(codecName);

      // Obtaining codecs functions
      UtlBoolean st;
      UtlBoolean stGetPacketSamples;
      UtlBoolean stSignaling;

      UtlString strCodecName = codecName;
      UtlString dlNameInit = strCodecName + MSK_INIT_V1_2;
      UtlString dlNameGetInfo = strCodecName + MSK_GET_INFO_V1_1;
      UtlString dlNameGetPacketSamples = strCodecName + MSK_GET_PACKET_SAMPLES_V1_2;
      UtlString dlNameDecode = strCodecName + MSK_DECODE_V1;
      UtlString dlNameEncdoe = strCodecName + MSK_ENCODE_V1;
      UtlString dlNameFree = strCodecName + MSK_FREE_V1;
      UtlString dlNameSignaling = strCodecName + MSK_SIGNALING_V1;
      
      dlPlgInitV1_2 plgInitAddr;
      dlPlgGetInfoV1_1 plgGetInfoAddr;
      dlPlgGetPacketSamplesV1_2 plgGetPacketSamples;
      dlPlgDecodeV1 plgDecodeAddr;
      dlPlgEncodeV1 plgEncodeAddr;
      dlPlgFreeV1 plgFreeAddr;
      dlPlgGetSignalingDataV1 plgSignaling;

      st = TRUE 
         && (pShrMgr->getSharedLibSymbol(name, dlNameInit,
                                         (void*&)plgInitAddr) == OS_SUCCESS)
         && (plgInitAddr != NULL)
         && (pShrMgr->getSharedLibSymbol(name, dlNameGetInfo,
                                         (void*&)plgGetInfoAddr) == OS_SUCCESS)
         && (plgGetInfoAddr != NULL)
         && (pShrMgr->getSharedLibSymbol(name, dlNameDecode,
                                         (void*&)plgDecodeAddr) == OS_SUCCESS)
         && (plgDecodeAddr != NULL)
         && (pShrMgr->getSharedLibSymbol(name, dlNameEncdoe,
                                         (void*&)plgEncodeAddr) == OS_SUCCESS)
         && (plgEncodeAddr != NULL)
         && (pShrMgr->getSharedLibSymbol(name, dlNameFree,
                                         (void*&)plgFreeAddr) == OS_SUCCESS)
         && (plgFreeAddr != NULL);

      if (st)
      {
         stGetPacketSamples = TRUE
            && (pShrMgr->getSharedLibSymbol(name, dlNameGetPacketSamples,
                                            (void*&)plgGetPacketSamples) == OS_SUCCESS)
            && (plgGetPacketSamples != NULL);

         stSignaling = TRUE
            && (pShrMgr->getSharedLibSymbol(name, dlNameSignaling,
                                            (void*&)plgSignaling) == OS_SUCCESS)
            && (plgSignaling != NULL);

         // Add codec to list if all basic (non-signaling) symbols are present.

         MpCodecCallInfoV1* pCallInfo = new MpCodecCallInfoV1(name, codecName, 
                                                              plgInitAddr,
                                                              plgGetInfoAddr,
                                                              plgGetPacketSamples,
                                                              plgDecodeAddr,
                                                              plgEncodeAddr,
                                                              plgFreeAddr,
                                                              plgSignaling,
                                                              FALSE);

         if (!pCallInfo)
            continue;         

         if (addCodecWrapperV1(pCallInfo) != OS_SUCCESS)
         {
            delete pCallInfo;
            continue;
         }

         //Plugin has been added successfully, need to rebuild cache list
         mCodecInfoCacheValid = FALSE;
         count ++;
      }
   }
   if (count == 0) {
      pShrMgr->unloadSharedLib(name);
      return OS_FAILED;
   }
   OsSysLog::add(FAC_MP, PRI_INFO, "Loaded %d codecs (%s) from %s", count, codecTokens.data(), name);

   return OS_SUCCESS;
}