in source/src/AppCommon.c [721:820]
STATUS initApp(BOOL trickleIce, BOOL useTurn, PAppConfiguration* ppAppConfiguration)
{
STATUS retStatus = STATUS_SUCCESS;
PAppConfiguration pAppConfiguration = NULL;
PAppSignaling pAppSignaling = NULL;
PCHAR pChannel = NULL;
SET_LOGGER_LOG_LEVEL(getLogLevel());
signal(SIGINT, sigIntHandler);
CHK(ppAppConfiguration != NULL, STATUS_APP_COMMON_NULL_ARG);
CHK((pChannel = GETENV(APP_WEBRTC_CHANNEL)) != NULL, STATUS_APP_COMMON_CHANNEL_NAME);
CHK(NULL != (pAppConfiguration = (PAppConfiguration) MEMCALLOC(1, SIZEOF(AppConfiguration))), STATUS_APP_COMMON_NOT_ENOUGH_MEMORY);
pAppSignaling = &pAppConfiguration->appSignaling;
pAppSignaling->signalingClientHandle = INVALID_SIGNALING_CLIENT_HANDLE_VALUE;
pAppConfiguration->mediaSenderTid = INVALID_TID_VALUE;
pAppConfiguration->timerQueueHandle = INVALID_TIMER_QUEUE_HANDLE_VALUE;
pAppConfiguration->iceCandidatePairStatsTimerId = MAX_UINT32;
pAppConfiguration->pregenerateCertTimerId = MAX_UINT32;
DLOGD("initializing the app with channel(%s)", pChannel);
setupFileLogging(&pAppConfiguration->enableFileLogging);
CHK_STATUS((createCredential(&pAppConfiguration->appCredential)));
pAppConfiguration->appConfigurationObjLock = MUTEX_CREATE(TRUE);
CHK(IS_VALID_MUTEX_VALUE(pAppConfiguration->appConfigurationObjLock), STATUS_APP_COMMON_INVALID_MUTEX);
pAppConfiguration->cvar = CVAR_CREATE();
pAppConfiguration->streamingSessionListReadLock = MUTEX_CREATE(FALSE);
CHK(IS_VALID_MUTEX_VALUE(pAppConfiguration->streamingSessionListReadLock), STATUS_APP_COMMON_INVALID_MUTEX);
CHK(appTimerQueueCreate(&pAppConfiguration->timerQueueHandle) == STATUS_SUCCESS, STATUS_APP_COMMON_TIMER);
pAppConfiguration->trickleIce = trickleIce;
pAppSignaling->pAppCredential = &pAppConfiguration->appCredential;
pAppSignaling->channelInfo.pRegion = GETENV(DEFAULT_REGION_ENV_VAR) == NULL ? DEFAULT_AWS_REGION : GETENV(DEFAULT_REGION_ENV_VAR);
pAppSignaling->channelInfo.version = CHANNEL_INFO_CURRENT_VERSION;
pAppSignaling->channelInfo.pChannelName = pChannel;
pAppSignaling->channelInfo.pKmsKeyId = NULL;
pAppSignaling->channelInfo.tagCount = 0;
pAppSignaling->channelInfo.pTags = NULL;
pAppSignaling->channelInfo.channelType = SIGNALING_CHANNEL_TYPE_SINGLE_MASTER;
pAppSignaling->channelInfo.channelRoleType = SIGNALING_CHANNEL_ROLE_TYPE_MASTER;
pAppSignaling->channelInfo.cachingPolicy = SIGNALING_API_CALL_CACHE_TYPE_FILE;
pAppSignaling->channelInfo.cachingPeriod = SIGNALING_API_CALL_CACHE_TTL_SENTINEL_VALUE;
pAppSignaling->channelInfo.asyncIceServerConfig = TRUE;
pAppSignaling->channelInfo.retry = TRUE;
pAppSignaling->channelInfo.reconnect = TRUE;
pAppSignaling->channelInfo.pCertPath = pAppConfiguration->appCredential.pCaCertPath;
pAppSignaling->channelInfo.messageTtl = 0; // Default is 60 seconds
pAppSignaling->clientInfo.version = SIGNALING_CLIENT_INFO_CURRENT_VERSION;
pAppSignaling->clientInfo.loggingLevel = getLogLevel();
pAppSignaling->clientInfo.cacheFilePath = NULL; // Use the default path
STRCPY(pAppSignaling->clientInfo.clientId, APP_MASTER_CLIENT_ID);
CHK_STATUS((initAppSignaling(pAppSignaling, onSignalingMessageReceived, onSignalingClientStateChanged, onSignalingClientError,
(UINT64) pAppConfiguration, useTurn)));
ATOMIC_STORE_BOOL(&pAppConfiguration->sigInt, FALSE);
ATOMIC_STORE_BOOL(&pAppConfiguration->mediaThreadStarted, FALSE);
ATOMIC_STORE_BOOL(&pAppConfiguration->terminateApp, FALSE);
ATOMIC_STORE_BOOL(&pAppConfiguration->restartSignalingClient, FALSE);
ATOMIC_STORE_BOOL(&pAppConfiguration->peerConnectionConnected, FALSE);
pAppConfiguration->iceUriCount = 0;
CHK_STATUS((createConnectionMsqQ(&pAppConfiguration->pRemotePeerPendingSignalingMessages)));
CHK_STATUS(
(appHashTableCreateWithParams(APP_HASH_TABLE_BUCKET_COUNT, APP_HASH_TABLE_BUCKET_LENGTH, &pAppConfiguration->pRemoteRtcPeerConnections)));
// the initialization of media source.
CHK_STATUS((initMediaSource(&pAppConfiguration->pMediaContext)));
CHK_STATUS((linkMeidaSinkHook(pAppConfiguration->pMediaContext, onMediaSinkHook, pAppConfiguration)));
CHK_STATUS((linkMeidaEosHook(pAppConfiguration->pMediaContext, onMediaEosHook, pAppConfiguration)));
pAppConfiguration->mediaSource = runMediaSource;
DLOGD("The intialization of the media source is completed successfully");
// Initalize KVS WebRTC. This must be done before anything else, and must only be done once.
CHK_STATUS((initWebRtc(pAppConfiguration)));
DLOGD("The initialization of WebRTC is completed successfully");
gAppConfiguration = pAppConfiguration;
// Start the cert pre-gen timer callback
if (APP_PRE_GENERATE_CERT) {
CHK_LOG_ERR((retStatus = appTimeQueueAdd(pAppConfiguration->timerQueueHandle, 0, APP_PRE_GENERATE_CERT_PERIOD, pregenerateCertTimerCallback,
(UINT64) pAppConfiguration, &pAppConfiguration->pregenerateCertTimerId)));
}
CleanUp:
if (STATUS_FAILED(retStatus) && pAppConfiguration != NULL) {
freeApp(&pAppConfiguration);
}
if (ppAppConfiguration != NULL) {
*ppAppConfiguration = pAppConfiguration;
}
return retStatus;
}