11
11
#define VIDEO_CODEC_NAME_H264 "h264"
12
12
#define VIDEO_CODEC_NAME_H265 "h265"
13
13
#define VIDEO_CODEC_NAME_MAX_LENGTH 5
14
+ #define METADATA_MAX_KEY_LENGTH 128
15
+ #define METADATA_MAX_VALUE_LENGTH 256
16
+ #define MAX_METADATA_PER_FRAGMENT 10
14
17
15
18
#define NUMBER_OF_FRAME_FILES 403
16
19
@@ -57,10 +60,10 @@ INT32 main(INT32 argc, CHAR* argv[])
57
60
STREAM_HANDLE streamHandle = INVALID_STREAM_HANDLE_VALUE ;
58
61
STATUS retStatus = STATUS_SUCCESS ;
59
62
PCHAR accessKey = NULL , secretKey = NULL , sessionToken = NULL , streamName = NULL , region = NULL , cacertPath = NULL ;
60
- CHAR frameFilePath [MAX_PATH_LEN + 1 ];
63
+ CHAR frameFilePath [MAX_PATH_LEN + 1 ], metadataKey [ METADATA_MAX_KEY_LENGTH + 1 ], metadataValue [ METADATA_MAX_VALUE_LENGTH + 1 ] ;
61
64
Frame frame ;
62
65
BYTE frameBuffer [200000 ]; // Assuming this is enough
63
- UINT32 frameSize = SIZEOF (frameBuffer ), frameIndex = 0 , fileIndex = 0 ;
66
+ UINT32 frameSize = SIZEOF (frameBuffer ), frameIndex = 0 , fileIndex = 0 , n = 0 , numMetadata = 10 ;
64
67
UINT64 streamStopTime , streamingDuration = DEFAULT_STREAM_DURATION ;
65
68
DOUBLE startUpLatency ;
66
69
BOOL firstFrame = TRUE;
@@ -70,8 +73,8 @@ INT32 main(INT32 argc, CHAR* argv[])
70
73
VIDEO_CODEC_ID videoCodecID = VIDEO_CODEC_ID_H264 ;
71
74
72
75
if (argc < 2 ) {
73
- DLOGE ("Usage: AWS_ACCESS_KEY_ID=SAMPLEKEY AWS_SECRET_ACCESS_KEY=SAMPLESECRET %s <stream_name> <codec> <duration_in_seconds> "
74
- "<frame_files_path>\n" ,
76
+ DLOGE ("Usage: AWS_ACCESS_KEY_ID=SAMPLEKEY AWS_SECRET_ACCESS_KEY=SAMPLESECRET %s <stream_name>"
77
+ "<codec> <duration_in_seconds> < frame_files_path> [num_metadata = 10] \n" ,
75
78
argv [0 ]);
76
79
CHK (FALSE, STATUS_INVALID_ARG );
77
80
}
@@ -81,33 +84,39 @@ INT32 main(INT32 argc, CHAR* argv[])
81
84
CHK (FALSE, STATUS_INVALID_ARG );
82
85
}
83
86
84
- MEMSET (frameFilePath , 0x00 , MAX_PATH_LEN + 1 );
85
- if (argc < 5 ) {
86
- STRCPY (frameFilePath , (PCHAR ) "../samples/" );
87
- } else {
88
- STRNCPY (frameFilePath , argv [4 ], MAX_PATH_LEN );
89
- }
90
-
91
87
cacertPath = getenv (CACERT_PATH_ENV_VAR );
92
88
sessionToken = getenv (SESSION_TOKEN_ENV_VAR );
93
89
streamName = argv [1 ];
94
90
if ((region = getenv (DEFAULT_REGION_ENV_VAR )) == NULL ) {
95
91
region = (PCHAR ) DEFAULT_AWS_REGION ;
96
92
}
97
93
98
- if (argc >= 3 ) {
94
+ if (argc >= 3 && ! IS_EMPTY_STRING ( argv [ 2 ]) ) {
99
95
if (!STRCMP (argv [2 ], VIDEO_CODEC_NAME_H265 )) {
100
96
STRNCPY (videoCodec , VIDEO_CODEC_NAME_H265 , STRLEN (VIDEO_CODEC_NAME_H265 ));
101
97
videoCodecID = VIDEO_CODEC_ID_H265 ;
102
98
}
103
99
}
104
100
105
- if (argc >= 4 ) {
101
+ if (argc >= 4 && ! IS_EMPTY_STRING ( argv [ 3 ]) ) {
106
102
// Get the duration and convert to an integer
107
103
CHK_STATUS (STRTOUI64 (argv [3 ], NULL , 10 , & streamingDuration ));
108
104
streamingDuration *= HUNDREDS_OF_NANOS_IN_A_SECOND ;
109
105
}
110
106
107
+ MEMSET (frameFilePath , 0x00 , MAX_PATH_LEN + 1 );
108
+ if (argc >= 5 && !IS_EMPTY_STRING (argv [4 ])) {
109
+ STRNCPY (frameFilePath , argv [4 ], MAX_PATH_LEN );
110
+ } else {
111
+ STRCPY (frameFilePath , (PCHAR ) "../samples/" );
112
+ }
113
+
114
+ if (argc >= 6 && !IS_EMPTY_STRING (argv [5 ])) {
115
+ numMetadata = STRTOUL (argv [5 ], NULL , 10 );
116
+ DLOGD ("numMetadata: %d\n" , numMetadata );
117
+ CHK (numMetadata <= MAX_METADATA_PER_FRAGMENT , STATUS_INVALID_ARG );
118
+ }
119
+
111
120
streamStopTime = GETTIME () + streamingDuration ;
112
121
113
122
// default storage size is 128MB. Use setDeviceInfoStorageSize after create to change storage size.
@@ -154,6 +163,17 @@ INT32 main(INT32 argc, CHAR* argv[])
154
163
155
164
CHK_STATUS (readFrameData (& frame , frameFilePath , videoCodec ));
156
165
166
+ // Add the fragment metadata key-value pairs
167
+ // For limits, refer to https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/limits.html#limits-streaming-metadata
168
+ if (numMetadata > 0 && frame .flags == FRAME_FLAG_KEY_FRAME ) {
169
+ DLOGD ("Adding metadata! frameIndex: %d" , frame .index );
170
+ for (n = 1 ; n <= numMetadata ; n ++ ) {
171
+ SNPRINTF (metadataKey , METADATA_MAX_KEY_LENGTH , "TEST_KEY_%d" , n );
172
+ SNPRINTF (metadataValue , METADATA_MAX_VALUE_LENGTH , "TEST_VALUE_%d" , frame .index + n );
173
+ CHK_STATUS (putKinesisVideoFragmentMetadata (streamHandle , metadataKey , metadataValue , TRUE));
174
+ }
175
+ }
176
+
157
177
CHK_STATUS (putKinesisVideoFrame (streamHandle , & frame ));
158
178
if (firstFrame ) {
159
179
startUpLatency = (DOUBLE ) (GETTIME () - startTime ) / (DOUBLE ) HUNDREDS_OF_NANOS_IN_A_MILLISECOND ;
0 commit comments