Skip to content

Commit c7cc850

Browse files
committed
Add release note for v1.5.1
Rename end of session tag Adding limits for the number of metadata
1 parent 009c367 commit c7cc850

File tree

13 files changed

+199
-44
lines changed

13 files changed

+199
-44
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ This library is licensed under the Amazon Software License.
4444

4545
----
4646
### Release notes
47+
#### Release 1.5.1 (24th Aug 2018)
48+
* Fragment Metadata Support for Producer SDK
49+
* Add fallback frame rate to avoid negotiation issue on certain machines like macbook air
50+
4751
#### Release 1.5.0 (24th Aug 2018)
4852
* Windows Support for Producer SDK
4953
* Intermittent producer support

kinesis-video-gst-demo/kinesis_video_gstreamer_sample_app.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ int gstreamer_init(int argc, char* argv[]) {
386386

387387
/* init stream format */
388388
char stream_name[MAX_STREAM_NAME_LEN];
389-
int width = 0, height = 0, framerate = 30, bitrateInKBPS = 512;
389+
int width = 0, height = 0, framerate = 25, bitrateInKBPS = 512;
390390
for (int i = 1; i < argc; i++) {
391391
if (i < argc - 1) {
392392
if ((0 == STRCMPI(argv[i], "-w")) ||
@@ -521,12 +521,19 @@ int gstreamer_init(int argc, char* argv[]) {
521521
} else {
522522
vector<int> res_width = {640, 1280, 1920};
523523
vector<int> res_height = {480, 720, 1080};
524+
vector<int> fps = {30, 25, 20};
524525
bool found_resolution = false;
525526
for (int i = 0; i < res_width.size(); i++) {
526527
width = res_width[i];
527528
height = res_height[i];
528-
if (resolution_supported(src_caps, query_caps_raw, query_caps_h264, data, width, height, framerate)) {
529-
found_resolution = true;
529+
for (int j = 0; j < fps.size(); j++) {
530+
framerate = fps[j];
531+
if (resolution_supported(src_caps, query_caps_raw, query_caps_h264, data, width, height, framerate)) {
532+
found_resolution = true;
533+
break;
534+
}
535+
}
536+
if (found_resolution) {
530537
break;
531538
}
532539
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ extern "C" {
166166
#define STATUS_INVALID_ACK_SEGMENT_LEN STATUS_CLIENT_BASE + 0x00000071
167167
#define STATUS_AWAITING_PERSISTED_ACK STATUS_CLIENT_BASE + 0x00000072
168168
#define STATUS_PERSISTED_ACK_TIMEOUT STATUS_CLIENT_BASE + 0x00000073
169+
#define STATUS_MAX_FRAGMENT_METADATA_COUNT STATUS_CLIENT_BASE + 0x00000074
170+
#define STATUS_ACK_ERR_FRAGMENT_METADATA_LIMIT_REACHED STATUS_CLIENT_BASE + 0x00000075
171+
#define STATUS_BLOCKING_PUT_INTERRUPTED_STREAM_TERMINATED STATUS_CLIENT_BASE + 0x00000076
172+
#define STATUS_INVALID_METADATA_NAME STATUS_CLIENT_BASE + 0x00000077
169173

170174
////////////////////////////////////////////////////
171175
// Main defines
@@ -240,6 +244,11 @@ extern "C" {
240244
*/
241245
#define MIN_RETENTION_PERIOD (1 * HUNDREDS_OF_NANOS_IN_AN_HOUR)
242246

247+
/**
248+
* Maximal size of the metadata queue for a fragment
249+
*/
250+
#define MAX_FRAGMENT_METADATA_COUNT 10
251+
243252
/**
244253
* Max length of the fragment sequence number
245254
*/
@@ -600,6 +609,9 @@ typedef enum {
600609
// Inactive stream
601610
SERVICE_CALL_RESULT_STREAM_NOT_ACTIVE = 4008,
602611

612+
// Fragment metadata name/value/count limit reached
613+
SERVICE_CALL_RESULT_FRAGMENT_METADATA_LIMIT_REACHED = 4009,
614+
603615
// KMS specific error - KMS access denied while encrypting data
604616
SERVICE_CALL_RESULT_KMS_KEY_ACCESS_DENIED = 4500,
605617

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

+1
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ SERVICE_CALL_RESULT getAckErrorTypeFromErrorId(UINT64 errorId) {
410410
case SERVICE_CALL_RESULT_INVALID_MKV_DATA:
411411
case SERVICE_CALL_RESULT_INVALID_PRODUCER_TIMESTAMP:
412412
case SERVICE_CALL_RESULT_STREAM_NOT_ACTIVE:
413+
case SERVICE_CALL_RESULT_FRAGMENT_METADATA_LIMIT_REACHED:
413414
case SERVICE_CALL_RESULT_KMS_KEY_ACCESS_DENIED:
414415
case SERVICE_CALL_RESULT_KMS_KEY_DISABLED:
415416
case SERVICE_CALL_RESULT_KMS_KEY_VALIDATION_ERROR:

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,7 @@ STATUS putFragmentMetadata(PKinesisVideoStream pKinesisVideoStream, PCHAR name,
11191119
STATUS retStatus = STATUS_SUCCESS;
11201120
PKinesisVideoClient pKinesisVideoClient = NULL;
11211121
BOOL streamLocked = FALSE;
1122-
UINT32 packagedSize = 0, metadataNameSize, metadataValueSize;
1122+
UINT32 packagedSize = 0, metadataNameSize, metadataValueSize, metadataQueueSize;
11231123
PSerializedMetadata pSerializedMetadata = NULL, pExistingSerializedMetadata;
11241124
StackQueueIterator iterator;
11251125
UINT64 data;
@@ -1147,6 +1147,10 @@ STATUS putFragmentMetadata(PKinesisVideoStream pKinesisVideoStream, PCHAR name,
11471147
STREAM_STATE_STOPPED));
11481148
}
11491149

1150+
// Validate if the customer is not attempting to add an internal metadata
1151+
CHK(0 != STRNCMP(AWS_INTERNAL_METADATA_PREFIX, name, (SIZEOF(AWS_INTERNAL_METADATA_PREFIX) - 1) / SIZEOF(CHAR)),
1152+
STATUS_INVALID_METADATA_NAME);
1153+
11501154
// Check whether we are OK to package the metadata but do not package.
11511155
CHK_STATUS(mkvgenGenerateTag(pKinesisVideoStream->pMkvGenerator,
11521156
NULL,
@@ -1160,7 +1164,7 @@ STATUS putFragmentMetadata(PKinesisVideoStream pKinesisVideoStream, PCHAR name,
11601164

11611165
// Check if the metadata exists in case of persistent metadata
11621166
if (persistent) {
1163-
// Iterate linearly and find the first ready state handle
1167+
// Iterate linearly and see if we have a match with the name
11641168
CHK_STATUS(stackQueueGetIterator(pKinesisVideoStream->pMetadataQueue, &iterator));
11651169
while (IS_VALID_ITERATOR(iterator)) {
11661170
CHK_STATUS(stackQueueIteratorGetItem(iterator, &data));
@@ -1188,6 +1192,10 @@ STATUS putFragmentMetadata(PKinesisVideoStream pKinesisVideoStream, PCHAR name,
11881192
}
11891193
}
11901194

1195+
// Ensure we don't have more than MAX size of the metadata queue
1196+
CHK_STATUS(stackQueueGetCount(pKinesisVideoStream->pMetadataQueue, &metadataQueueSize));
1197+
CHK(metadataQueueSize < MAX_FRAGMENT_METADATA_COUNT, STATUS_MAX_FRAGMENT_METADATA_COUNT);
1198+
11911199
// Allocate and store the data in sized allocation.
11921200
// NOTE: We add NULL terminator for both name and value
11931201
pSerializedMetadata = (PSerializedMetadata) MEMALLOC((metadataNameSize + 1 + metadataValueSize + 1) * SIZEOF(CHAR) + SIZEOF(SerializedMetadata));

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ typedef __FragmentAckParser* PFragmentAckParser;
7171
/**
7272
* End-of-stream metadata name
7373
*/
74-
#define EOS_METADATA_NAME "aws:KVS_END_OF_SESSION"
74+
#define EOS_METADATA_NAME "AWS_KINESISVIDEO_END_OF_SESSION"
75+
76+
/**
77+
* Internal AWS metadata prefix
78+
*/
79+
#define AWS_INTERNAL_METADATA_PREFIX "AWS"
7580

7681
/**
7782
* Max packaged size for the EOS metadata including EOS metadata name len, max stream name + delta for packaging

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

+2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ STATUS serviceCallResultCheck(SERVICE_CALL_RESULT callResult)
8686
return STATUS_ACK_ERR_INVALID_PRODUCER_TIMESTAMP;
8787
case SERVICE_CALL_RESULT_STREAM_NOT_ACTIVE:
8888
return STATUS_ACK_ERR_STREAM_NOT_ACTIVE;
89+
case SERVICE_CALL_RESULT_FRAGMENT_METADATA_LIMIT_REACHED:
90+
return STATUS_ACK_ERR_FRAGMENT_METADATA_LIMIT_REACHED;
8991
case SERVICE_CALL_RESULT_KMS_KEY_ACCESS_DENIED:
9092
return STATUS_ACK_ERR_KMS_KEY_ACCESS_DENIED;
9193
case SERVICE_CALL_RESULT_KMS_KEY_DISABLED:

kinesis-video-pic/src/client/tst/ClientTestFixture.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
#define TEST_DEVICE_NAME "Test device name"
1212
#define MAX_TEST_STREAM_COUNT 10
13-
#define TEST_DEVICE_STORAGE_SIZE MIN_STORAGE_ALLOCATION_SIZE
13+
#define TEST_DEVICE_STORAGE_SIZE ((UINT64) 10 * 1024 * 1024)
1414

1515
#define TEST_CLIENT_MAGIC_NUMBER 0x1234567890ULL
1616

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

+89
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,95 @@ TEST_F(StreamApiTest, insertKinesisVideoTag_NULL_Invalid)
238238
EXPECT_NE(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", tagValue, FALSE));
239239
EXPECT_NE(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, tagName, tagValue, TRUE));
240240
EXPECT_NE(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, tagName, tagValue, FALSE));
241+
242+
// Validate the negative case with state
243+
EXPECT_EQ(STATUS_INVALID_STREAM_STATE, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", TRUE));
244+
EXPECT_EQ(STATUS_INVALID_STREAM_STATE, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", FALSE));
245+
}
246+
247+
248+
TEST_F(StreamApiTest, insertKinesisVideoTag_Invalid_Name)
249+
{
250+
// Create and ready stream
251+
ReadyStream();
252+
253+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS", "Tag Value", FALSE));
254+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS", "Tag Value", TRUE));
255+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS ", "Tag Value", FALSE));
256+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS ", "Tag Value", TRUE));
257+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWSTag", "Tag Value", FALSE));
258+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWSTag", "Tag Value", TRUE));
259+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS:", "Tag Value", FALSE));
260+
EXPECT_EQ(STATUS_INVALID_METADATA_NAME, putKinesisVideoFragmentMetadata(mStreamHandle, "AWS:", "Tag Value", TRUE));
261+
262+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, "aWS", "Tag Value", FALSE));
263+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, "aWS", "Tag Value", TRUE));
264+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, "aws", "Tag Value", FALSE));
265+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, "aws", "Tag Value", TRUE));
266+
}
267+
268+
TEST_F(StreamApiTest, insertKinesisVideoTag_Stream_State_Error) {
269+
// Create the stream which is not yet in ready state
270+
CreateStream();
271+
272+
// Should throw stream state error
273+
EXPECT_EQ(STATUS_INVALID_STREAM_STATE, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", TRUE));
274+
EXPECT_EQ(STATUS_INVALID_STREAM_STATE, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", FALSE));
275+
}
276+
277+
TEST_F(StreamApiTest, insertKinesisVideoTag_Non_Persistent_Count) {
278+
UINT32 i;
279+
CHAR tagName[MKV_MAX_TAG_NAME_LEN + 1];
280+
CHAR tagValue[MKV_MAX_TAG_VALUE_LEN + 1];
281+
282+
// Create and ready a stream
283+
ReadyStream();
284+
285+
for (i = 0; i < MAX_FRAGMENT_METADATA_COUNT; i++) {
286+
SPRINTF(tagName, "tagName_%d", i);
287+
SPRINTF(tagValue, "tagValue_%d", i);
288+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, tagName, tagValue, FALSE));
289+
}
290+
291+
// Adding one more will cause a limit error
292+
EXPECT_EQ(STATUS_MAX_FRAGMENT_METADATA_COUNT, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", FALSE));
293+
}
294+
295+
TEST_F(StreamApiTest, insertKinesisVideoTag_Persistent_Count) {
296+
UINT32 i;
297+
CHAR tagName[MKV_MAX_TAG_NAME_LEN + 1];
298+
CHAR tagValue[MKV_MAX_TAG_VALUE_LEN + 1];
299+
300+
// Create and ready a stream
301+
ReadyStream();
302+
303+
for (i = 0; i < MAX_FRAGMENT_METADATA_COUNT; i++) {
304+
SPRINTF(tagName, "tagName_%d", i);
305+
SPRINTF(tagValue, "tagValue_%d", i);
306+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, tagName, tagValue, TRUE));
307+
}
308+
309+
// Adding one more will cause a limit error
310+
EXPECT_EQ(STATUS_MAX_FRAGMENT_METADATA_COUNT, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", TRUE));
311+
}
312+
313+
TEST_F(StreamApiTest, insertKinesisVideoTag_Mixed_Count) {
314+
UINT32 i;
315+
CHAR tagName[MKV_MAX_TAG_NAME_LEN + 1];
316+
CHAR tagValue[MKV_MAX_TAG_VALUE_LEN + 1];
317+
318+
// Create and ready a stream
319+
ReadyStream();
320+
321+
for (i = 0; i < MAX_FRAGMENT_METADATA_COUNT; i++) {
322+
SPRINTF(tagName, "tagName_%d", i);
323+
SPRINTF(tagValue, "tagValue_%d", i);
324+
EXPECT_EQ(STATUS_SUCCESS, putKinesisVideoFragmentMetadata(mStreamHandle, tagName, tagValue, i % 2 == 0));
325+
}
326+
327+
// Adding one more will cause a limit error
328+
EXPECT_EQ(STATUS_MAX_FRAGMENT_METADATA_COUNT, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", TRUE));
329+
EXPECT_EQ(STATUS_MAX_FRAGMENT_METADATA_COUNT, putKinesisVideoFragmentMetadata(mStreamHandle, "tagName", "tagValue", FALSE));
241330
}
242331

243332
TEST_F(StreamApiTest, kinesisVideoGetData_NULL_Invalid)

0 commit comments

Comments
 (0)