/**
* Implementation of a data stream
*/
#define LOG_CLASS "Stream"
#include "Include_i.h"
/**
* Static definitions of the states
*/
extern StateMachineState STREAM_STATE_MACHINE_STATES[];
extern UINT32 STREAM_STATE_MACHINE_STATE_COUNT;
/**
* Creates a new Kinesis Video stream
*/
STATUS createStream(PKinesisVideoClient pKinesisVideoClient, PStreamInfo pStreamInfo, PKinesisVideoStream* ppKinesisVideoStream)
{
ENTERS();
STATUS retStatus = STATUS_SUCCESS;
PKinesisVideoStream pKinesisVideoStream = NULL;
PContentView pView = NULL;
PStackQueue pStackQueue = NULL;
PMkvGenerator pMkvGenerator = NULL;
PStateMachine pStateMachine = NULL;
UINT32 allocationSize, maxViewItems, i;
PBYTE pCurPnt = NULL;
BOOL locked = FALSE;
BOOL tearDownOnError = TRUE;
CHAR tempStreamName[MAX_STREAM_NAME_LEN];
UINT32 trackInfoSize, tagsSize;
CHK(pKinesisVideoClient != NULL && ppKinesisVideoStream != NULL, STATUS_NULL_ARG);
// Set the return stream pointer first
*ppKinesisVideoStream = NULL;
// Validate the input structs
CHK_STATUS(validateStreamInfo(pStreamInfo, &pKinesisVideoClient->clientCallbacks));
logStreamInfo(pStreamInfo);
// Lock the client
pKinesisVideoClient->clientCallbacks.lockMutexFn(pKinesisVideoClient->clientCallbacks.customData, pKinesisVideoClient->base.lock);
locked = TRUE;
// Check for the stream count
CHK(pKinesisVideoClient->streamCount < pKinesisVideoClient->deviceInfo.streamCount, STATUS_MAX_STREAM_COUNT);
// Fix-up the stream name if not specified
if (pStreamInfo->name[0] == '\0') {
createRandomName(tempStreamName,
DEFAULT_STREAM_NAME_LEN,
pKinesisVideoClient->clientCallbacks.getRandomNumberFn,
pKinesisVideoClient->clientCallbacks.customData);
}
else {
// Copy the stream name otherwise
// NOTE: Stream name length has already been validated
STRCPY(tempStreamName, pStreamInfo->name);
}
// Check if a stream by that name already exists
for (i = 0; i < pKinesisVideoClient->deviceInfo.streamCount; i++) {
if (NULL != pKinesisVideoClient->streams[i]) {
CHK(0 != STRCMP(pKinesisVideoClient->streams[i]->streamInfo.name, tempStreamName), STATUS_DUPLICATE_STREAM_NAME);
}
}
// Space for track info bits
trackInfoSize = SIZEOF(TrackInfo) * pStreamInfo->streamCaps.trackInfoCount;
// Get the max tags structure size
CHK_STATUS(packageTags(pStreamInfo->tagCount, pStreamInfo->tags, 0, NULL, &tagsSize));
// Allocate the main struct
// NOTE: The calloc will Zero the fields
// We are allocating more than the structure size to accommodate for
// the variable size buffers which will come at the end and for the tags
allocationSize = SIZEOF(KinesisVideoStream) + tagsSize + trackInfoSize + MKV_SEGMENT_UUID_LEN;
pKinesisVideoStream = (PKinesisVideoStream) MEMCALLOC(1, allocationSize);
CHK(pKinesisVideoStream != NULL, STATUS_NOT_ENOUGH_MEMORY);
// Set the stream id first available slot so during the teardown it will clean it up.
for (i = 0; i < pKinesisVideoClient->deviceInfo.streamCount; i++) {
if (NULL == pKinesisVideoClient->streams[i]) {
// Found an empty slot
pKinesisVideoStream->streamId = i;
break;
}
}
// set the maximum frame size observed to 0
pKinesisVideoStream->maxFrameSizeSeen = 0;
// Set the back reference
pKinesisVideoStream->pKinesisVideoClient = pKinesisVideoClient;
// Set the basic info
pKinesisVideoStream->base.identifier = KINESIS_VIDEO_OBJECT_IDENTIFIER_STREAM;
pKinesisVideoStream->base.version = STREAM_CURRENT_VERSION;
// Set the initial state and the stream status
pKinesisVideoStream->streamState = STREAM_STATE_NONE;
pKinesisVideoStream->streamStatus = STREAM_STATUS_CREATING;
// Stream is not ready, not stopped and not closed
pKinesisVideoStream->streamStopped = FALSE;
pKinesisVideoStream->streamReady = FALSE;
pKinesisVideoStream->streamClosed = FALSE;
// Set the stream start timestamps and index
pKinesisVideoStream->newSessionTimestamp = INVALID_TIMESTAMP_VALUE;
pKinesisVideoStream->newSessionIndex = INVALID_VIEW_INDEX_VALUE;
// Not in a grace period
pKinesisVideoStream->gracePeriod = FALSE;
// Shouldn't reset the generator on next key frame
pKinesisVideoStream->resetGeneratorOnKeyFrame = FALSE;
// Skip non-key frames at start
pKinesisVideoStream->skipNonKeyFrames = TRUE;
// Shouldn't reset the generator so set invalid time
pKinesisVideoStream->resetGeneratorTime = INVALID_TIMESTAMP_VALUE;
// No connections have been dropped as this is a new stream
pKinesisVideoStream->connectionState = UPLOAD_CONNECTION_STATE_OK;
// Set the last frame EoFr indicator
pKinesisVideoStream->eofrFrame = FALSE;
// Set the initial diagnostics information from the defaults
pKinesisVideoStream->diagnostics.currentFrameRate = pStreamInfo->streamCaps.frameRate;
pKinesisVideoStream->diagnostics.currentTransferRate = pStreamInfo->streamCaps.avgBandwidthBps;
pKinesisVideoStream->diagnostics.accumulatedByteCount = 0;
pKinesisVideoStream->diagnostics.lastFrameRateTimestamp = pKinesisVideoStream->diagnostics.lastTransferRateTimestamp = 0;
// Set the trackers
pKinesisVideoStream->eosTracker.size = 0;
pKinesisVideoStream->eosTracker.offset = 0;
pKinesisVideoStream->eosTracker.send = FALSE;
pKinesisVideoStream->eosTracker.data = NULL;
pKinesisVideoStream->metadataTracker.size = 0;
pKinesisVideoStream->metadataTracker.offset = 0;
pKinesisVideoStream->metadataTracker.send = FALSE;
pKinesisVideoStream->metadataTracker.data = NULL;
// initialize streamingAuthInfo expiration
pKinesisVideoStream->streamingAuthInfo.expiration = INVALID_TIMESTAMP_VALUE;
// Reset the current view item
MEMSET(&pKinesisVideoStream->curViewItem, 0x00, SIZEOF(CurrentViewItem));
pKinesisVideoStream->curViewItem.viewItem.handle = INVALID_ALLOCATION_HANDLE_VALUE;
// Copy the structures in their entirety
MEMCPY(&pKinesisVideoStream->streamInfo, pStreamInfo, SIZEOF(StreamInfo));
fixupStreamInfo(&pKinesisVideoStream->streamInfo);
// Fix-up the stream name if not specified
if (pKinesisVideoStream->streamInfo.name[0] == '\0') {
STRCPY(pKinesisVideoStream->streamInfo.name, tempStreamName);
}
// Create the stream lock
pKinesisVideoStream->base.lock = pKinesisVideoClient->clientCallbacks.createMutexFn(pKinesisVideoClient->clientCallbacks.customData, TRUE);
// Create the Ready state condition variable
pKinesisVideoStream->base.ready = pKinesisVideoClient->clientCallbacks.createConditionVariableFn(pKinesisVideoClient->clientCallbacks.customData);
// Create the Stream Closed notifier condition variable
pKinesisVideoStream->streamClosedCondition = pKinesisVideoClient->clientCallbacks.createConditionVariableFn(pKinesisVideoClient->clientCallbacks.customData);
// Create the buffer availability condition variable
pKinesisVideoStream->bufferAvailabilityCondition = pKinesisVideoClient->clientCallbacks.createConditionVariableFn(pKinesisVideoClient->clientCallbacks.customData);
// Fix-up the buffer duration and replay duration first
if (pKinesisVideoStream->streamInfo.streamCaps.bufferDuration <= MIN_CONTENT_VIEW_BUFFER_DURATION) {
pKinesisVideoStream->streamInfo.streamCaps.bufferDuration = MIN_VIEW_BUFFER_DURATION;
}
pKinesisVideoStream->streamInfo.streamCaps.replayDuration = MIN(pStreamInfo->streamCaps.bufferDuration, pStreamInfo->streamCaps.replayDuration);
// Set the tags pointer to point after the KinesisVideoStream
没有合适的资源?快使用搜索试试~ 我知道了~
AWS KVS(Kinesis Video Streams)之WebRTC的C库
共7563个文件
h264:3403个
opus:1238个
h:845个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 22 下载量 26 浏览量
2022-04-01
09:14:24
上传
评论 2
收藏 48.27MB RAR 举报
温馨提示
AWS KVS(Kinesis Video Streams)之WebRTC的C库去除kvs的信令服务器代码,实现自己的mqtt信令控制,解压完放E盘就可以编译通过。 文章地址:https://blog.csdn.net/yegaofei549039398/article/details/123881899
资源推荐
资源详情
资源评论
收起资源包目录
AWS KVS(Kinesis Video Streams)之WebRTC的C库 (7563个子文件)
sample-018.aac 843B
sample-017.aac 525B
sample-011.aac 523B
sample-043.aac 486B
sample-543.aac 483B
sample-016.aac 477B
sample-406.aac 475B
sample-069.aac 466B
sample-332.aac 463B
sample-020.aac 463B
sample-420.aac 460B
sample-493.aac 460B
sample-481.aac 459B
sample-320.aac 458B
sample-293.aac 457B
sample-019.aac 455B
sample-411.aac 454B
sample-132.aac 452B
sample-457.aac 452B
sample-307.aac 450B
sample-042.aac 447B
sample-194.aac 445B
sample-294.aac 445B
sample-344.aac 444B
sample-494.aac 444B
sample-106.aac 443B
sample-407.aac 442B
sample-369.aac 441B
sample-144.aac 439B
sample-269.aac 437B
sample-055.aac 435B
sample-009.aac 435B
sample-143.aac 434B
sample-015.aac 433B
sample-131.aac 432B
sample-506.aac 431B
sample-220.aac 430B
sample-281.aac 430B
sample-412.aac 429B
sample-505.aac 429B
sample-331.aac 428B
sample-419.aac 427B
sample-518.aac 427B
sample-395.aac 427B
sample-257.aac 427B
sample-170.aac 425B
sample-529.aac 425B
sample-282.aac 425B
sample-105.aac 425B
sample-431.aac 424B
sample-093.aac 423B
sample-068.aac 422B
sample-368.aac 422B
sample-256.aac 422B
sample-517.aac 418B
sample-357.aac 417B
sample-444.aac 417B
sample-169.aac 416B
sample-469.aac 415B
sample-306.aac 413B
sample-568.aac 413B
sample-155.aac 413B
sample-345.aac 411B
sample-030.aac 410B
sample-013.aac 409B
sample-554.aac 409B
sample-530.aac 408B
sample-233.aac 408B
sample-321.aac 407B
sample-029.aac 407B
sample-567.aac 407B
sample-181.aac 406B
sample-207.aac 405B
sample-070.aac 405B
sample-456.aac 405B
sample-156.aac 405B
sample-080.aac 405B
sample-171.aac 404B
sample-381.aac 403B
sample-021.aac 402B
sample-243.aac 401B
sample-056.aac 401B
sample-468.aac 401B
sample-158.aac 400B
sample-556.aac 400B
sample-432.aac 400B
sample-182.aac 399B
sample-022.aac 399B
sample-482.aac 399B
sample-413.aac 399B
sample-382.aac 399B
sample-172.aac 398B
sample-231.aac 398B
sample-555.aac 398B
sample-245.aac 398B
sample-519.aac 398B
sample-012.aac 397B
sample-206.aac 396B
sample-219.aac 396B
sample-255.aac 395B
共 7563 条
- 1
- 2
- 3
- 4
- 5
- 6
- 76
coffee549039398
- 粉丝: 3
- 资源: 5
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页