Skip to content

Commit

Permalink
Profiling canary (#308)
Browse files Browse the repository at this point in the history
* New profiling canary

* New mode, signaling metrics and jenkins job script changes

* Set up metrics on a thread
  • Loading branch information
disa6302 authored Aug 10, 2023
1 parent 304aa28 commit 2ddc2d3
Show file tree
Hide file tree
Showing 15 changed files with 296 additions and 45 deletions.
3 changes: 2 additions & 1 deletion canary/webrtc-c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ include(FetchContent)
set(CUSTOM_MEMORY_MANAGEMENT OFF CACHE BOOL "Tell AWS SDK to not use custom memory management" FORCE)
set(ENABLE_TESTING OFF CACHE BOOL "Disable building tests for AWS SDK" FORCE)
set(BUILD_ONLY "monitoring;logs" CACHE STRING "Tell AWS SDK to only build monitoring and logs" FORCE)
set(BUILD_SAMPLE OFF CACHE BOOL "Disable sample building for WebRTC library" FORCE)

FetchContent_Declare(
webrtc
GIT_REPOSITORY https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c
GIT_TAG 565854cc111c6e75ed125877fb3c7379b9955825
GIT_TAG 19bd8b6d030de8f9417714b5db1c90ca7ee135b5
)

FetchContent_Declare(
Expand Down
64 changes: 46 additions & 18 deletions canary/webrtc-c/README.md

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions canary/webrtc-c/jobs/orchestrator.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import jenkins.model.*

RUNNER_JOB_NAME_PREFIX = "webrtc-canary-runner"
PERIODIC_DURATION_IN_SECONDS = 30
PERIODIC_PROFILING_DURATION_IN_SECONDS = 90
LONG_RUNNING_DURATION_IN_SECONDS = 0
MIN_RETRY_DELAY_IN_SECONDS = 60
COLD_STARTUP_DELAY_IN_SECONDS = 60 * 60
Expand Down Expand Up @@ -209,6 +210,24 @@ pipeline {
],
wait: false
)

build(
job: NEXT_AVAILABLE_RUNNER,
parameters: COMMON_PARAMS + [
booleanParam(name: 'USE_TURN', value: true),
booleanParam(name: 'TRICKLE_ICE', value: true),
booleanParam(name: 'USE_IOT', value: false),
booleanParam(name: 'USE_MBEDTLS', value: false),
booleanParam(name: 'IS_PROFILING', value: true),
string(name: 'DURATION_IN_SECONDS', value: PERIODIC_PROFILING_DURATION_IN_SECONDS.toString()),
string(name: 'MASTER_NODE_LABEL', value: "ec2-profiling"),
string(name: 'VIEWER_NODE_LABEL', value: "ec2-profiling"),
string(name: 'RUNNER_LABEL', value: "WebrtcPeriodicProfiling"),
string(name: 'SCENARIO_LABEL', value: "WebrtcProfiling"),
],
wait: false
)

}
}

Expand Down
3 changes: 3 additions & 0 deletions canary/webrtc-c/jobs/runner.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ def buildPeer(isMaster, params) {
def envs = [
'AWS_KVS_LOG_LEVEL': params.AWS_KVS_LOG_LEVEL,
'CANARY_USE_TURN': params.USE_TURN,
'CANARY_IS_PROFILING_MODE': params.IS_PROFILING,
'CANARY_TRICKLE_ICE': params.TRICKLE_ICE,
'CANARY_USE_IOT_PROVIDER': params.USE_IOT,
'CANARY_LOG_GROUP_NAME': params.LOG_GROUP_NAME,
Expand Down Expand Up @@ -148,6 +149,7 @@ pipeline {
choice(name: 'AWS_KVS_LOG_LEVEL', choices: ["1", "2", "3", "4", "5"])
booleanParam(name: 'IS_SIGNALING')
booleanParam(name: 'USE_TURN')
booleanParam(name: 'IS_PROFILING')
booleanParam(name: 'TRICKLE_ICE')
booleanParam(name: 'USE_MBEDTLS', defaultValue: false)
string(name: 'LOG_GROUP_NAME')
Expand Down Expand Up @@ -232,6 +234,7 @@ pipeline {
booleanParam(name: 'IS_SIGNALING', value: params.IS_SIGNALING),
booleanParam(name: 'USE_TURN', value: params.USE_TURN),
booleanParam(name: 'USE_IOT', value: params.USE_IOT),
booleanParam(name: 'IS_PROFILING', value: params.IS_PROFILING),
booleanParam(name: 'TRICKLE_ICE', value: params.TRICKLE_ICE),
booleanParam(name: 'USE_MBEDTLS', value: params.USE_MBEDTLS),
string(name: 'LOG_GROUP_NAME', value: params.LOG_GROUP_NAME),
Expand Down
18 changes: 10 additions & 8 deletions canary/webrtc-c/scripts/init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ prefix=$1
export CANARY_CHANNEL_NAME=test_channel
export CANARY_CLIENT_ID=test
export CANARY_IS_MASTER=TRUE # if you are running the app as master
export CANARY_TRICKLE_ICE=FALSE # If you would like to enable trickle ICE
export CANARY_TRICKLE_ICE=TRUE # If you would like to enable trickle ICE
export CANARY_USE_TURN=TRUE # This means turn urls are are also selected as an alternate path
export CANARY_DURATION_IN_SECONDS=0 # How long you want to run this in seconds.
export CANARY_DURATION_IN_SECONDS=90 # How long you want to run this in seconds.
export CANARY_FORCE_TURN=FALSE #This will enforce TURN, which is your use case
export CANARY_USE_IOT_PROVIDER=TRUE #This will enforce use of IoT credential provider
export AWS_IOT_CORE_CREDENTIAL_ENDPOINT=$(PWD)/iot-credential-provider.txt
export AWS_IOT_CORE_CERT=$(PWD)/${prefix}_certificate.pem
export AWS_IOT_CORE_PRIVATE_KEY=$(PWD)/${prefix}_private.key
export AWS_IOT_CORE_ROLE_ALIAS="${prefix}_role_alias"
export AWS_IOT_CORE_THING_NAME="${prefix}_thing"
export CANARY_USE_IOT_PROVIDER=FALSE #This will enforce use of IoT credential provider
export CANARY_LABEL=Profiling
export CANARY_IS_PROFILING_MODE=TRUE
#export AWS_IOT_CORE_CREDENTIAL_ENDPOINT=$(PWD)/iot-credential-provider.txt
#export AWS_IOT_CORE_CERT=$(PWD)/${prefix}_certificate.pem
#export AWS_IOT_CORE_PRIVATE_KEY=$(PWD)/${prefix}_private.key
#export AWS_IOT_CORE_ROLE_ALIAS="${prefix}_role_alias"
#export AWS_IOT_CORE_THING_NAME="${prefix}_thing"
18 changes: 10 additions & 8 deletions canary/webrtc-c/scripts/v_init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ prefix=$1
export CANARY_CHANNEL_NAME=test_channel
export CANARY_CLIENT_ID=test
export CANARY_IS_MASTER=FALSE # if you are running the app as master
export CANARY_TRICKLE_ICE=FALSE # If you would like to enable trickle ICE
export CANARY_TRICKLE_ICE=TRUE # If you would like to enable trickle ICE
export CANARY_USE_TURN=TRUE # This means turn urls are are also selected as an alternate path
export CANARY_DURATION_IN_SECONDS=0 # How long you want to run this in seconds.
export CANARY_DURATION_IN_SECONDS=90 # How long you want to run this in seconds.
export CANARY_FORCE_TURN=FALSE #This will enforce TURN, which is your use case
export CANARY_USE_IOT_PROVIDER=TRUE #This will enforce use of IoT credential provider
export AWS_IOT_CORE_CREDENTIAL_ENDPOINT=$(PWD)/iot-credential-provider.txt
export AWS_IOT_CORE_CERT=$(PWD)/${prefix}_certificate.pem
export AWS_IOT_CORE_PRIVATE_KEY=$(PWD)/${prefix}_private.key
export AWS_IOT_CORE_ROLE_ALIAS="${prefix}_role_alias"
export AWS_IOT_CORE_THING_NAME="${prefix}_thing"
export CANARY_USE_IOT_PROVIDER=FALSE #This will enforce use of IoT credential provider
export CANARY_LABEL=Profiling
export CANARY_IS_PROFILING_MODE=TRUE
#export AWS_IOT_CORE_CREDENTIAL_ENDPOINT=$(PWD)/iot-credential-provider.txt
#export AWS_IOT_CORE_CERT=$(PWD)/${prefix}_certificate.pem
#export AWS_IOT_CORE_PRIVATE_KEY=$(PWD)/${prefix}_private.key
#export AWS_IOT_CORE_ROLE_ALIAS="${prefix}_role_alias"
#export AWS_IOT_CORE_THING_NAME="${prefix}_thing"
10 changes: 8 additions & 2 deletions canary/webrtc-c/src/CanarySignaling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,14 @@ STATUS run(Canary::PConfig pConfig)
&pCredentialProvider));
}
else {
CHK_STATUS(createStaticCredentialProvider((PCHAR) pConfig->accessKey.value.c_str(), 0, (PCHAR) pConfig->secretKey.value.c_str(), 0,
(PCHAR) pConfig->sessionToken.value.c_str(), 0, MAX_UINT64, &pCredentialProvider));
if(IS_EMPTY_STRING(pConfig->sessionToken.value.c_str())) {
CHK_STATUS(createStaticCredentialProvider((PCHAR) pConfig->accessKey.value.c_str(), 0, (PCHAR) pConfig->secretKey.value.c_str(), 0,
NULL, 0, MAX_UINT64, &pCredentialProvider));
} else {
CHK_STATUS(createStaticCredentialProvider((PCHAR) pConfig->accessKey.value.c_str(), 0, (PCHAR) pConfig->secretKey.value.c_str(), 0,
(PCHAR) pConfig->sessionToken.value.c_str(), 0, MAX_UINT64, &pCredentialProvider));

}
}

// Generate a random channel name if not specified in the config.
Expand Down
28 changes: 27 additions & 1 deletion canary/webrtc-c/src/CanaryWebrtc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ STATUS run(Canary::PConfig);
VOID runPeer(Canary::PConfig, TIMER_QUEUE_HANDLE, STATUS*);
VOID sendLocalFrames(Canary::PPeer, MEDIA_STREAM_TRACK_KIND, const std::string&, UINT64, UINT32);
VOID sendCustomFrames(Canary::PPeer, MEDIA_STREAM_TRACK_KIND, UINT64, UINT64);
VOID sendProfilingMetrics(Canary::PPeer);
STATUS canaryRtpOutboundStats(UINT32, UINT64, UINT64);
STATUS canaryRtpInboundStats(UINT32, UINT64, UINT64);
STATUS canaryEndToEndStats(UINT32, UINT64, UINT64);
Expand Down Expand Up @@ -167,6 +168,27 @@ STATUS run(Canary::PConfig pConfig)
return retStatus;
}

// This is not a time sensitive thread. It is ok if pushing the metrics gets delayed by 100 ms because of the
// thread sleep
VOID sendProfilingMetrics(Canary::PPeer pPeer)
{
STATUS retStatus = STATUS_SUCCESS;
BOOL done = FALSE;
while (!terminated.load()) {
retStatus = pPeer->sendProfilingMetrics();
if (retStatus == STATUS_WAITING_ON_FIRST_FRAME) {
THREAD_SLEEP(HUNDREDS_OF_NANOS_IN_A_MILLISECOND * 100); // to prevent busy waiting
} else if (retStatus == STATUS_SUCCESS) {
DLOGI("First frame sent out, pushed profiling metrics");
done = TRUE;
break;
}
}
if(!done) {
DLOGE("First frame never got sent out...no profiling metrics pushed to cloudwatch..error code: 0x%08x", retStatus);
}
}

VOID runPeer(Canary::PConfig pConfig, TIMER_QUEUE_HANDLE timerQueueHandle, STATUS* pRetStatus)
{
STATUS retStatus = STATUS_SUCCESS;
Expand Down Expand Up @@ -197,6 +219,10 @@ VOID runPeer(Canary::PConfig pConfig, TIMER_QUEUE_HANDLE timerQueueHandle, STATU
&timeoutTimerId));
CHK_STATUS(timerQueueAddTimer(timerQueueHandle, END_TO_END_METRICS_INVOCATION_PERIOD, END_TO_END_METRICS_INVOCATION_PERIOD,
canaryEndToEndStats, (UINT64) &peer, &timeoutTimerId));
if(pConfig->isProfilingMode.value && pConfig->isMaster.value) {
std::thread pushProfilingThread(sendProfilingMetrics, &peer);
pushProfilingThread.join();
}
videoThread.join();
}

Expand Down Expand Up @@ -278,7 +304,7 @@ VOID sendCustomFrames(Canary::PPeer pPeer, MEDIA_STREAM_TRACK_KIND kind, UINT64

// We must update the size to reflect the original data with hex encoded data
frame.size = hexStrLen + ANNEX_B_NALU_SIZE;
pPeer->writeFrame(&frame, kind);
pPeer->writeFrame(&frame, kind);
THREAD_SLEEP(HUNDREDS_OF_NANOS_IN_A_SECOND / frameRate);
frame.presentationTs = GETTIME();
}
Expand Down
123 changes: 123 additions & 0 deletions canary/webrtc-c/src/CloudwatchMonitoring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,129 @@ VOID CloudwatchMonitoring::pushOutboundRtpStats(Canary::POutgoingRTPMetricsConte
this->push(retransmissionPercentDatum);
}

VOID CloudwatchMonitoring::pushPeerConnectionMetrics(PPeerConnectionMetrics pPeerConnectionMetrics)
{
MetricDatum pcCreationDatum, dtlsSetupDatum, iceHolePunchingDatum;

pcCreationDatum.SetMetricName("PcCreationTime");
pcCreationDatum.SetValue(pPeerConnectionMetrics->peerConnectionStats.peerConnectionCreationTime);
pcCreationDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(pcCreationDatum);

dtlsSetupDatum.SetMetricName("DtlsSetupTime");
dtlsSetupDatum.SetValue(pPeerConnectionMetrics->peerConnectionStats.dtlsSessionSetupTime);
dtlsSetupDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(dtlsSetupDatum);

iceHolePunchingDatum.SetMetricName("ICEHolePunchingDelay");
iceHolePunchingDatum.SetValue(pPeerConnectionMetrics->peerConnectionStats.iceHolePunchingTime);
iceHolePunchingDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceHolePunchingDatum);
}

VOID CloudwatchMonitoring::pushKvsIceAgentMetrics(PKvsIceAgentMetrics pKvsIceAgentMetrics)
{
MetricDatum localCandidateGatheringDatum, hostCandidateSetupDatum, srflxCandidateSetUpDatum,
iceAgentSetupDatum, relayCandidateSetUpDatum, iceServerParseDatum,
iceCandidatePairNominationDatum, iceCandidateGatheringDatum;

localCandidateGatheringDatum.SetMetricName("LocalCandidateGatheringTime");
localCandidateGatheringDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.localCandidateGatheringTime);
localCandidateGatheringDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(localCandidateGatheringDatum);

hostCandidateSetupDatum.SetMetricName("HostCandidateSetUpTime");
hostCandidateSetupDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.hostCandidateSetUpTime);
hostCandidateSetupDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(hostCandidateSetupDatum);

srflxCandidateSetUpDatum.SetMetricName("SrflxCandidateSetUpTime");
srflxCandidateSetUpDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.srflxCandidateSetUpTime);
srflxCandidateSetUpDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(srflxCandidateSetUpDatum);

relayCandidateSetUpDatum.SetMetricName("RelayCandidateSetUpTime");
relayCandidateSetUpDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.relayCandidateSetUpTime);
relayCandidateSetUpDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(relayCandidateSetUpDatum);

iceServerParseDatum.SetMetricName("IceServerResolutionTime");
iceServerParseDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.iceServerParsingTime);
iceServerParseDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceServerParseDatum);

iceCandidatePairNominationDatum.SetMetricName("IceCandidatePairNominationTime");
iceCandidatePairNominationDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.iceCandidatePairNominationTime);
iceCandidatePairNominationDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceCandidatePairNominationDatum);

iceCandidateGatheringDatum.SetMetricName("IcecandidateGatheringTime");
iceCandidateGatheringDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.candidateGatheringTime);
iceCandidateGatheringDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceCandidateGatheringDatum);

iceAgentSetupDatum.SetMetricName("IceAgentSetUpTime");
iceAgentSetupDatum.SetValue(pKvsIceAgentMetrics->kvsIceAgentStats.iceAgentSetUpTime);
iceAgentSetupDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceAgentSetupDatum);
}

VOID CloudwatchMonitoring::pushSignalingClientMetrics(PSignalingClientMetrics pSignalingClientMetrics)
{
MetricDatum offerToAnswerDatum, getTokenDatum, describeDatum, createDatum, endpointDatum,
iceConfigDatum, connectDatum ,createClientDatum, fetchDatum, connectClientDatum;

offerToAnswerDatum.SetMetricName("OfferToAnswerTime");
offerToAnswerDatum.SetValue(pSignalingClientMetrics->signalingClientStats.offerToAnswerTime);
offerToAnswerDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(offerToAnswerDatum);

getTokenDatum.SetMetricName("GetTokenTime");
getTokenDatum.SetValue(pSignalingClientMetrics->signalingClientStats.getTokenCallTime);
getTokenDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(getTokenDatum);

describeDatum.SetMetricName("DescribeCallTime");
describeDatum.SetValue(pSignalingClientMetrics->signalingClientStats.describeCallTime);
describeDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(describeDatum);

createDatum.SetMetricName("CreateCallTime");
createDatum.SetValue(pSignalingClientMetrics->signalingClientStats.createCallTime);
createDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(createDatum);

endpointDatum.SetMetricName("GetEndpointCallTime");
endpointDatum.SetValue(pSignalingClientMetrics->signalingClientStats.getEndpointCallTime);
endpointDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(endpointDatum);

iceConfigDatum.SetMetricName("GetIceConfigCallTime");
iceConfigDatum.SetValue(pSignalingClientMetrics->signalingClientStats.getIceConfigCallTime);
iceConfigDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(iceConfigDatum);

connectDatum.SetMetricName("ConnectCallTime");
connectDatum.SetValue(pSignalingClientMetrics->signalingClientStats.connectCallTime);
connectDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(connectDatum);

createClientDatum.SetMetricName("CreateClientTotalTime");
createClientDatum.SetValue(pSignalingClientMetrics->signalingClientStats.createClientTime);
createClientDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(createClientDatum);

fetchDatum.SetMetricName("FetchClientTotalTime");
fetchDatum.SetValue(pSignalingClientMetrics->signalingClientStats.fetchClientTime);
fetchDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(fetchDatum);

connectClientDatum.SetMetricName("ConnectClientTotalTime");
connectClientDatum.SetValue(pSignalingClientMetrics->signalingClientStats.connectClientTime);
connectClientDatum.SetUnit(Aws::CloudWatch::Model::StandardUnit::Milliseconds);
this->push(connectClientDatum);
}

VOID CloudwatchMonitoring::pushInboundRtpStats(Canary::PIncomingRTPMetricsContext pIncomingRtpStats)
{
MetricDatum incomingBitrateDatum, incomingPacketRate, incomingFrameDropRateDatum;
Expand Down
3 changes: 3 additions & 0 deletions canary/webrtc-c/src/CloudwatchMonitoring.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ class CloudwatchMonitoring {
VOID pushOutboundRtpStats(Canary::POutgoingRTPMetricsContext);
VOID pushInboundRtpStats(Canary::PIncomingRTPMetricsContext);
VOID pushEndToEndMetrics(Canary::EndToEndMetricsContext);
VOID pushPeerConnectionMetrics(PPeerConnectionMetrics);
VOID pushKvsIceAgentMetrics(PKvsIceAgentMetrics);
VOID pushSignalingClientMetrics(PSignalingClientMetrics);
VOID pushRetryCount(UINT32);

private:
Expand Down
1 change: 1 addition & 0 deletions canary/webrtc-c/src/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ STATUS Config::initWithEnvVars()
CHK_STATUS(optenvBool(CANARY_USE_TURN_ENV_VAR, &useTurn, TRUE));
CHK_STATUS(optenvBool(CANARY_FORCE_TURN_ENV_VAR, &forceTurn, FALSE));
CHK_STATUS(optenvBool(CANARY_USE_IOT_CREDENTIALS_ENV_VAR, &useIotCredentialProvider, FALSE));
CHK_STATUS(optenvBool(CANARY_RUN_IN_PROFILING_MODE_ENV_VAR, &isProfilingMode, FALSE));

CHK_STATUS(optenv(CACERT_PATH_ENV_VAR, &caCertPath, KVS_CA_CERT_PATH));

Expand Down
1 change: 1 addition & 0 deletions canary/webrtc-c/src/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class Config {
Value<BOOL> useTurn;
Value<BOOL> forceTurn;
Value<BOOL> useIotCredentialProvider;
Value<BOOL> isProfilingMode;

// credentials
Value<std::string> accessKey;
Expand Down
2 changes: 2 additions & 0 deletions canary/webrtc-c/src/Include.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
#define CANARY_FRAME_RATE_ENV_VAR "CANARY_FRAME_RATE"
#define CANARY_RUN_BOTH_PEERS_ENV_VAR "CANARY_RUN_BOTH_PEERS"
#define CANARY_USE_IOT_CREDENTIALS_ENV_VAR "CANARY_USE_IOT_PROVIDER"
#define CANARY_RUN_IN_PROFILING_MODE_ENV_VAR "CANARY_IS_PROFILING_MODE"
#define IOT_CORE_CREDENTIAL_ENDPOINT_ENV_VAR "AWS_IOT_CORE_CREDENTIAL_ENDPOINT"
#define IOT_CORE_CERT_ENV_VAR "AWS_IOT_CORE_CERT"
#define IOT_CORE_PRIVATE_KEY_ENV_VAR "AWS_IOT_CORE_PRIVATE_KEY"
Expand All @@ -86,6 +87,7 @@

#define STATUS_WEBRTC_CANARY_BASE 0x74000000
#define STATUS_WEBRTC_EMPTY_IOT_CRED_FILE STATUS_WEBRTC_CANARY_BASE + 0x00000001
#define STATUS_WAITING_ON_FIRST_FRAME STATUS_WEBRTC_CANARY_BASE + 0x00000002

#define CANARY_VIDEO_FRAMES_PATH (PCHAR) "./assets/h264SampleFrames/frame-%04d.h264"
#define CANARY_AUDIO_FRAMES_PATH (PCHAR) "./assets/opusSampleFrames/sample-%03d.opus"
Expand Down
Loading

0 comments on commit 2ddc2d3

Please sign in to comment.