Skip to content

Commit 722434a

Browse files
committed
CI to verify fragment metadata
1 parent 8c94413 commit 722434a

File tree

2 files changed

+57
-26
lines changed

2 files changed

+57
-26
lines changed

.github/workflows/samples.yml

+44-12
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ jobs:
4141
AWS_KVS_LOG_LEVEL: 2
4242
KVS_DEBUG_DUMP_DATA_FILE_DIR: ./debug_output
4343
DEBIAN_FRONTEND: noninteractive
44+
KVS_STREAM_NAME: demo-stream-producer-c-${{ matrix.runner.id }}-ci-${{ matrix.sample-executable }}
4445

4546
permissions:
4647
id-token: write
@@ -58,7 +59,7 @@ jobs:
5859
if: runner.os == 'Linux'
5960
run: |
6061
apt-get update
61-
apt-get install -y git cmake build-essential pkg-config libssl-dev libcurl4-openssl-dev mkvtoolnix
62+
apt-get install -y git cmake build-essential pkg-config libssl-dev libcurl4-openssl-dev mkvtoolnix curl unzip
6263
6364
- name: Build repository
6465
run: |
@@ -78,30 +79,61 @@ jobs:
7879
working-directory: ./build
7980
run: |
8081
mkdir -p $KVS_DEBUG_DUMP_DATA_FILE_DIR
81-
./${{ matrix.sample-executable }} demo-stream-producer-c-${{ matrix.runner.id }}-ci-${{ matrix.sample-executable }}
82+
83+
set -o pipefail
84+
./${{ matrix.sample-executable }} "$KVS_STREAM_NAME" | tee output.log
85+
exit_code=${PIPESTATUS[0]}
86+
if [ "$exit_code" -ne 0 ]; then
87+
echo "${{ matrix.sample-executable }} exited with code: $exit_code"
88+
exit 1
89+
fi
90+
shell: bash
8291

8392
- name: Save MKV file list
8493
working-directory: ./build
8594
run: |
86-
FILE_LIST=$(ls -A $KVS_DEBUG_DUMP_DATA_FILE_DIR/*.mkv 2>/dev/null || true)
95+
FILE_LIST=$(find "$KVS_DEBUG_DUMP_DATA_FILE_DIR" -type f -name "*.mkv" -size +0c 2>/dev/null)
8796
if [ -z "$FILE_LIST" ]; then
8897
echo "No MKV files found in $KVS_DEBUG_DUMP_DATA_FILE_DIR"
8998
exit 1
9099
fi
91-
echo "MKV_FILES=$FILE_LIST" >> $GITHUB_ENV
100+
echo "$FILE_LIST" >> mkv_files.txt
92101
93102
- name: Print MKV dump (non-verbose)
94103
working-directory: ./build
95104
run: |
96-
for file in $MKV_FILES; do
97-
echo "Verifying $file with mkvinfo:"
98-
mkvinfo -v "$file"
99-
done
105+
while read -r mkvFile; do
106+
echo "Verifying $mkvFile with mkvinfo:"
107+
mkvinfo -v "$mkvFile"
108+
done < mkv_files.txt
100109
101110
- name: Print MKV dump (verbose)
102111
working-directory: ./build
103112
run: |
104-
for file in $MKV_FILES; do
105-
echo "Verifying $file with mkvinfo (hexdump):"
106-
mkvinfo -v -X "$file"
107-
done
113+
while read -r mkvFile; do
114+
echo "Verifying $mkvFile with mkvinfo:"
115+
mkvinfo -v -X "$mkvFile"
116+
done < mkv_files.txt
117+
118+
- name: Install AWS CLI (Linux)
119+
if: runner.os == 'Linux'
120+
run: |
121+
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
122+
unzip awscliv2.zip
123+
./aws/install
124+
125+
- name: Check persisted fragments
126+
working-directory: ./build
127+
run: |
128+
sleep 20 # To let the fragments settle (worst-case scenario)
129+
130+
# Extract fragments from the log
131+
grep '"EventType":"PERSISTED"' output.log | awk -F'"FragmentNumber":"' '{print $2}' | awk -F'"' '{print $1}' >> fragments.txt
132+
133+
data_endpoint=$(aws kinesisvideo get-data-endpoint --api-name GET_MEDIA_FOR_FRAGMENT_LIST --stream-name "$KVS_STREAM_NAME" --output text --no-cli-pager)
134+
135+
while read -r fragment; do
136+
echo "Downloading fragment: $fragment"
137+
aws kinesis-video-archived-media get-media-for-fragment-list "$fragment".webm --stream-name "$KVS_STREAM_NAME" --endpoint-url "$data_endpoint" --fragments "[\"$fragment\"]" --no-cli-pager
138+
mkvinfo -v "$fragment".webm
139+
done < fragments.txt

samples/KvsVideoOnlyRealtimeStreamingSample.c

+13-14
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ INT32 main(INT32 argc, CHAR* argv[])
6363
CHAR frameFilePath[MAX_PATH_LEN + 1], metadataKey[METADATA_MAX_KEY_LENGTH + 1], metadataValue[METADATA_MAX_VALUE_LENGTH + 1];
6464
Frame frame;
6565
BYTE frameBuffer[200000]; // Assuming this is enough
66-
UINT32 frameSize = SIZEOF(frameBuffer), frameIndex = 0, fileIndex = 0, n = 0, numMetadata = 10;
66+
UINT32 frameSize = SIZEOF(frameBuffer), frameIndex = 0, fileIndex = 0, n = 0, numMetadata = 9;
6767
UINT64 streamStopTime, streamingDuration = DEFAULT_STREAM_DURATION;
6868
DOUBLE startUpLatency;
6969
BOOL firstFrame = TRUE;
@@ -84,7 +84,7 @@ INT32 main(INT32 argc, CHAR* argv[])
8484
#else
8585
if (argc < 2) {
8686
DLOGE("Usage: AWS_ACCESS_KEY_ID=SAMPLEKEY AWS_SECRET_ACCESS_KEY=SAMPLESECRET %s <stream_name>"
87-
"<codec> <duration_in_seconds> <frame_files_path> [num_metadata = 10]\n",
87+
"<codec> <duration_in_seconds> <frame_files_path> [num_metadata = 9]\n",
8888
argv[0]);
8989
CHK(FALSE, STATUS_INVALID_ARG);
9090
}
@@ -128,7 +128,7 @@ INT32 main(INT32 argc, CHAR* argv[])
128128
if (argc >= 6 && !IS_EMPTY_STRING(argv[5])) {
129129
numMetadata = STRTOUL(argv[5], NULL, 10);
130130
DLOGD("numMetadata: %d\n", numMetadata);
131-
CHK(numMetadata <= MAX_METADATA_PER_FRAGMENT, STATUS_INVALID_ARG);
131+
CHK(numMetadata <= MAX_METADATA_PER_FRAGMENT - 1, STATUS_INVALID_ARG);
132132
}
133133

134134
streamStopTime = GETTIME() + streamingDuration;
@@ -183,17 +183,6 @@ INT32 main(INT32 argc, CHAR* argv[])
183183

184184
CHK_STATUS(readFrameData(&frame, frameFilePath, videoCodec));
185185

186-
// Add the fragment metadata key-value pairs
187-
// For limits, refer to https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/limits.html#limits-streaming-metadata
188-
if (numMetadata > 0 && frame.flags == FRAME_FLAG_KEY_FRAME) {
189-
DLOGD("Adding metadata! frameIndex: %d", frame.index);
190-
for (n = 1; n <= numMetadata; n++) {
191-
SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "TEST_KEY_%d", n);
192-
SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "TEST_VALUE_%d", frame.index + n);
193-
CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, TRUE));
194-
}
195-
}
196-
197186
CHK_STATUS(putKinesisVideoFrame(streamHandle, &frame));
198187
if (firstFrame) {
199188
startUpLatency = (DOUBLE) (GETTIME() - startTime) / (DOUBLE) HUNDREDS_OF_NANOS_IN_A_MILLISECOND;
@@ -202,6 +191,16 @@ INT32 main(INT32 argc, CHAR* argv[])
202191
}
203192
defaultThreadSleep(frame.duration);
204193

194+
// Add the fragment metadata key-value pairs
195+
// For limits, refer to https://docs.aws.amazon.com/kinesisvideostreams/latest/dg/limits.html#limits-streaming-metadata
196+
if (frame.flags == FRAME_FLAG_KEY_FRAME) {
197+
for (n = 1; n <= numMetadata; n++) {
198+
SNPRINTF(metadataKey, METADATA_MAX_KEY_LENGTH, "TEST_KEY_%d", n);
199+
SNPRINTF(metadataValue, METADATA_MAX_VALUE_LENGTH, "TEST_VALUE_%d", frame.index + n);
200+
CHK_STATUS(putKinesisVideoFragmentMetadata(streamHandle, metadataKey, metadataValue, FALSE));
201+
}
202+
}
203+
205204
frame.decodingTs += frame.duration;
206205
frame.presentationTs = frame.decodingTs;
207206
frameIndex++;

0 commit comments

Comments
 (0)