Skip to content

Commit e3b3726

Browse files
committed
stability and bug fixes
1 parent 680de1e commit e3b3726

File tree

11 files changed

+315
-140
lines changed

11 files changed

+315
-140
lines changed

kinesis-video-native-build/min-install-script

-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ cmake CMakeLists.txt
8989
make producer
9090
make start
9191
make kinesis_video_gstreamer_sample_app
92-
make kinesis_video_gstreamer_sample_rtsp_app
9392
# copy the kvssink plugin into the library folder
9493
cp libproducer* "$LIB_DESTINATION_FOLDER_PATH"
9594

kinesis-video-native-build/windows-install.bat

-2
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,6 @@ msbuild start.vcxproj /p:Configuration=Release /p:Platform=%BUILD_BITNESS_TYPE%
163163
if ERRORLEVEL 1 goto :showerror
164164
msbuild kinesis_video_gstreamer_sample_app.vcxproj /p:Configuration=Release /p:Platform=%BUILD_BITNESS_TYPE% /m
165165
if ERRORLEVEL 1 goto :showerror
166-
msbuild kinesis_video_gstreamer_sample_rtsp_app.vcxproj /p:Configuration=Release /p:Platform=%BUILD_BITNESS_TYPE% /m
167-
if ERRORLEVEL 1 goto :showerror
168166
msbuild gstkvssink.vcxproj /p:Configuration=Release /p:Platform=%BUILD_BITNESS_TYPE% /m
169167
if ERRORLEVEL 1 goto :showerror
170168
msbuild kvs_producer_plugin_demo.vcxproj /p:Configuration=Release /p:Platform=%BUILD_BITNESS_TYPE% /m

kinesis-video-pic/src/client/src/Stream.cpp

+7-31
Original file line numberDiff line numberDiff line change
@@ -1469,13 +1469,13 @@ STATUS streamFormatChanged(PKinesisVideoStream pKinesisVideoStream, UINT32 codec
14691469
STATUS retStatus = STATUS_SUCCESS;
14701470
PKinesisVideoClient pKinesisVideoClient = NULL;
14711471
BOOL streamLocked = FALSE;
1472-
PTrackInfo pTrackInfo = NULL;
1473-
UINT32 i;
14741472

1475-
CHK(pKinesisVideoStream != NULL, STATUS_NULL_ARG);
1476-
// These checks are borrowed from MKV. TODO: Consolidate these at some stage.
1477-
CHK(codecPrivateDataSize <= MKV_MAX_CODEC_PRIVATE_LEN, STATUS_MKV_INVALID_CODEC_PRIVATE_LENGTH);
1478-
CHK(codecPrivateDataSize == 0 || codecPrivateData != NULL, STATUS_MKV_CODEC_PRIVATE_NULL);
1473+
CHK(pKinesisVideoStream != NULL && pKinesisVideoStream->pKinesisVideoClient != NULL, STATUS_NULL_ARG);
1474+
pKinesisVideoClient = pKinesisVideoStream->pKinesisVideoClient;
1475+
1476+
// Lock the stream
1477+
pKinesisVideoClient->clientCallbacks.lockMutexFn(pKinesisVideoClient->clientCallbacks.customData, pKinesisVideoStream->base.lock);
1478+
streamLocked = TRUE;
14791479

14801480
// Ensure we are not in a streaming state
14811481
CHK_STATUS(acceptStateMachineState(pKinesisVideoStream->base.pStateMachine,
@@ -1487,31 +1487,7 @@ STATUS streamFormatChanged(PKinesisVideoStream pKinesisVideoStream, UINT32 codec
14871487
STREAM_STATE_GET_TOKEN |
14881488
STREAM_STATE_STOPPED));
14891489

1490-
pKinesisVideoClient = pKinesisVideoStream->pKinesisVideoClient;
1491-
1492-
// Lock the stream
1493-
pKinesisVideoClient->clientCallbacks.lockMutexFn(pKinesisVideoClient->clientCallbacks.customData, pKinesisVideoStream->base.lock);
1494-
streamLocked = TRUE;
1495-
1496-
// Free the existing allocation if any.
1497-
for(i = 0; i < pKinesisVideoStream->streamInfo.streamCaps.trackInfoCount; ++i) {
1498-
if (pKinesisVideoStream->streamInfo.streamCaps.trackInfoList[i].trackId == trackId) {
1499-
pTrackInfo = &pKinesisVideoStream->streamInfo.streamCaps.trackInfoList[i];
1500-
break;
1501-
}
1502-
}
1503-
1504-
CHK(pTrackInfo != NULL, STATUS_MKV_TRACK_INFO_NOT_FOUND);
1505-
1506-
pTrackInfo->codecPrivateDataSize = codecPrivateDataSize;
1507-
pTrackInfo->codecPrivateData = codecPrivateData;
1508-
1509-
// Need to free and re-create the packager
1510-
if (pKinesisVideoStream->pMkvGenerator != NULL) {
1511-
freeMkvGenerator(pKinesisVideoStream->pMkvGenerator);
1512-
}
1513-
1514-
CHK_STATUS(createPackager(pKinesisVideoStream, &pKinesisVideoStream->pMkvGenerator));
1490+
CHK_STATUS(mkvgenSetCodecPrivateData(pKinesisVideoStream->pMkvGenerator, trackId, codecPrivateDataSize, codecPrivateData));
15151491

15161492
// Unlock the stream (even though it will be unlocked in the cleanup
15171493
pKinesisVideoClient->clientCallbacks.unlockMutexFn(pKinesisVideoClient->clientCallbacks.customData, pKinesisVideoStream->base.lock);

kinesis-video-pic/src/client/tst/StreamApiFunctionalityTest.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1111,8 +1111,7 @@ TEST_F(StreamApiFunctionalityTest, putFrame_StreamDataAvailable)
11111111

11121112
TEST_F(StreamApiFunctionalityTest, putFrame_SubmitAckWithTimecodeZero)
11131113
{
1114-
UINT32 i, remaining;
1115-
UINT32 frameSize = 100000;
1114+
UINT32 i, frameSize = 100000;
11161115
PBYTE pData = (PBYTE) MEMALLOC(frameSize);
11171116
UINT64 timestamp;
11181117
Frame frame;
@@ -1165,7 +1164,7 @@ TEST_F(StreamApiFunctionalityTest, putFrame_SubmitAckWithTimecodeZero)
11651164
*/
11661165
TEST_F(StreamApiFunctionalityTest, submitAck_shouldBeInWindowPutStreamResultAfterAllPutFrame)
11671166
{
1168-
UINT32 i, remaining, filledSize;
1167+
UINT32 i, filledSize;
11691168
UINT32 frameSize = 100000;
11701169
PBYTE getDataBuffer = (PBYTE) MEMALLOC(frameSize * 4);
11711170
PBYTE pData = (PBYTE) MEMALLOC(frameSize);

kinesis-video-pic/src/client/tst/StreamApiTest.cpp

+81
Original file line numberDiff line numberDiff line change
@@ -460,3 +460,84 @@ TEST_F(StreamApiTest, kinesisVideoStreamFormatChanged_Valid)
460460

461461
MEMFREE(pBuffer);
462462
}
463+
464+
TEST_F(StreamApiTest, kinesisVideoStreamFormatChanged_Multitrack_free)
465+
{
466+
UINT32 cpdSize = 1;
467+
PBYTE pCpd = (PBYTE) MEMALLOC(cpdSize);
468+
UINT32 cpd2Size = MKV_MAX_CODEC_PRIVATE_LEN;
469+
PBYTE pCpd2 = (PBYTE) MEMALLOC(cpd2Size);
470+
471+
PTrackInfo trackInfos = (PTrackInfo) MEMALLOC(2 * SIZEOF(TrackInfo));
472+
473+
// Set the on-the-stack CPD to some values
474+
MEMSET(pCpd, 0xab, cpdSize);
475+
MEMSET(pCpd2, 0x55, cpd2Size);
476+
477+
trackInfos[0].trackId = TEST_TRACKID;
478+
trackInfos[0].trackType = MKV_TRACK_INFO_TYPE_VIDEO;
479+
trackInfos[0].codecPrivateDataSize = cpdSize;
480+
trackInfos[0].codecPrivateData = pCpd;
481+
STRCPY(trackInfos[0].codecId, (PCHAR) "TestCodec1");
482+
STRCPY(trackInfos[0].trackName, (PCHAR) "TestTrack1");
483+
trackInfos[0].trackCustomData.trackVideoConfig.videoWidth = 1280;
484+
trackInfos[0].trackCustomData.trackVideoConfig.videoHeight = 720;
485+
486+
trackInfos[1].trackId = TEST_TRACKID + 1;
487+
trackInfos[1].trackType = MKV_TRACK_INFO_TYPE_AUDIO;
488+
trackInfos[1].codecPrivateDataSize = cpd2Size;
489+
trackInfos[1].codecPrivateData = pCpd2;
490+
STRCPY(trackInfos[1].codecId, (PCHAR) "TestCodec2");
491+
STRCPY(trackInfos[1].trackName, (PCHAR) "TestTrack2");
492+
trackInfos[1].trackCustomData.trackAudioConfig.channelConfig = 5;
493+
trackInfos[1].trackCustomData.trackAudioConfig.samplingFrequency = 44000;
494+
495+
mStreamInfo.streamCaps.trackInfoCount = 2;
496+
mStreamInfo.streamCaps.trackInfoList = trackInfos;
497+
498+
mStreamInfo.streamCaps.nalAdaptationFlags = NAL_ADAPTATION_ANNEXB_CPD_NALS;
499+
500+
// Create a stream
501+
CreateStream();
502+
503+
// Free the codecs which were used in the stream creation track infos
504+
MEMFREE(pCpd);
505+
MEMFREE(pCpd2);
506+
MEMFREE(trackInfos);
507+
508+
// Set the CPD for track 1
509+
cpdSize = 3000;
510+
pCpd = (PBYTE) MEMALLOC(cpdSize);
511+
MEMSET(pCpd, 1, cpdSize);
512+
EXPECT_EQ(STATUS_SUCCESS, kinesisVideoStreamFormatChanged(mStreamHandle, cpdSize, pCpd, TEST_TRACKID));
513+
514+
// Free the CPD
515+
MEMFREE(pCpd);
516+
517+
// Set the CPD for track 2
518+
cpdSize = 5000;
519+
pCpd = (PBYTE) MEMALLOC(cpdSize);
520+
MEMSET(pCpd, 2, cpdSize);
521+
EXPECT_EQ(STATUS_SUCCESS, kinesisVideoStreamFormatChanged(mStreamHandle, cpdSize, pCpd, TEST_TRACKID + 1));
522+
523+
// Free the cpd
524+
MEMFREE(pCpd);
525+
526+
// Set the CPD for track 1
527+
cpdSize = 300;
528+
pCpd = (PBYTE) MEMALLOC(cpdSize);
529+
MEMSET(pCpd, 3, cpdSize);
530+
EXPECT_EQ(STATUS_SUCCESS, kinesisVideoStreamFormatChanged(mStreamHandle, cpdSize, pCpd, TEST_TRACKID));
531+
532+
// Free the CPD
533+
MEMFREE(pCpd);
534+
535+
// Set the CPD for track 2
536+
cpdSize = 50;
537+
pCpd = (PBYTE) MEMALLOC(cpdSize);
538+
MEMSET(pCpd, 4, cpdSize);
539+
EXPECT_EQ(STATUS_SUCCESS, kinesisVideoStreamFormatChanged(mStreamHandle, cpdSize, pCpd, TEST_TRACKID + 1));
540+
541+
// Free the cpd
542+
MEMFREE(pCpd);
543+
}

kinesis-video-pic/src/mkvgen/include/com/amazonaws/kinesis/video/mkvgen/Include.h

+12
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,18 @@ PUBLIC_API STATUS mkvgenGetMkvOverheadSize(PMkvGenerator, MKV_STREAM_STATE, PUIN
475475
*/
476476
PUBLIC_API STATUS mkvgenGetCurrentTimestamps(PMkvGenerator, PUINT64, PUINT64, PUINT64);
477477

478+
/**
479+
* Sets the Codec Private Data for a particular track
480+
*
481+
* @PMkvGenerator - The generator object
482+
* UINT64 - IN - Track ID to set the Codec Private Data for
483+
* UINT32 - IN - Codec Private Data size
484+
* PBYTE - IN - Codec private Data bytes
485+
*
486+
* @return - STATUS code of the execution
487+
*/
488+
PUBLIC_API STATUS mkvgenSetCodecPrivateData(PMkvGenerator, UINT64, UINT32, PBYTE);
489+
478490
#pragma pack(pop, include)
479491

480492
#ifdef __cplusplus

kinesis-video-pic/src/mkvgen/src/Include_i.h

+16
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,22 @@ UINT64 getTimeAdapter(UINT64);
548548
*/
549549
STATUS getSamplingFreqAndChannelFromAacCpd(PBYTE, UINT32, PDOUBLE, PUINT16);
550550

551+
/**
552+
* Adapt Codec Private Data for the given track
553+
*
554+
* @PStreamMkvGenerator - IN - The MKV generator
555+
* @MKV_TRACK_INFO_TYPE - IN - The track info type
556+
* @PCHAR - IN - Codec ID string
557+
* @UINT32 - IN - Input CPD size
558+
* @PBYTE - IN - Input CPD bytes
559+
* @PUINT32 - OUT - Output adapted CPD size
560+
* @PBYTE* - OUT - Output adapted CPD bytes
561+
* @PTrackCustomData - OUT - Track custom data to fill in
562+
*
563+
* @return Status of the operation
564+
*/
565+
STATUS mkvgenAdaptCodecPrivateData(PStreamMkvGenerator, MKV_TRACK_INFO_TYPE, PCHAR, UINT32, PBYTE, PUINT32, PBYTE*, PTrackCustomData);
566+
551567
#pragma pack(pop, include_i)
552568

553569
#ifdef __cplusplus

0 commit comments

Comments
 (0)