From 305eacbe953fcc91032d2f16d12fccc304899fa5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 14 Oct 2026 01:20:00 +0200 Subject: [PATCH] Verify all media codec IDs and key configuration bounds --- tests/test_stream_media.c | 21 ++++++++++++++++++++- tools/chatgui/tests/test_stream_view.cpp | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/test_stream_media.c b/tests/test_stream_media.c index 6e804d35..9e0860fe 100644 --- a/tests/test_stream_media.c +++ b/tests/test_stream_media.c @@ -205,13 +205,32 @@ static void test_stereo(void) { stream_media_receiver_destroy(receiver); } +static void test_codecs(void) { + uint8_t wire[256], key[] = {0, 0, 0, 2, 11, 12, 13}; size_t length = 0; + struct stream_media_block b = {.format = {64, 64, 0, STREAM_MEDIA_H264, 0, 1}, .video_count = 1}; + b.video[0] = (struct stream_media_video){1, 0, sizeof(key), 0, sizeof(key), STREAM_MEDIA_KEY, key}; + struct stream_media_block parsed; + for (unsigned codec = STREAM_MEDIA_H264; codec <= STREAM_MEDIA_H266; codec++) { + b.format.video_codec = codec; + CHECK(stream_media_encode(&b, wire, sizeof(wire), &length) == STREAM_OK && !memcmp(wire, "uAV2", 4)); + CHECK(stream_media_parse(wire, length, &parsed) == STREAM_OK && parsed.format.video_codec == codec); + } + wire[3] = '1'; CHECK(stream_media_parse(wire, length, &parsed) == STREAM_ERR_FORMAT); + const uint8_t *config, *frame; size_t config_size, frame_size; + CHECK(stream_media_key_parse(key, sizeof(key), &config, &config_size, &frame, &frame_size) == STREAM_OK); + CHECK(config_size == 2 && frame_size == 1 && config[0] == 11 && frame[0] == 13); + for (size_t n = 0; n < sizeof(key); n++) CHECK(stream_media_key_parse(key, n, &config, &config_size, &frame, &frame_size) < 0); + key[0] = 1; CHECK(stream_media_key_parse(key, sizeof(key), &config, &config_size, &frame, &frame_size) < 0); + memset(key, 0, 4); CHECK(stream_media_key_parse(key, sizeof(key), &config, &config_size, &frame, &frame_size) == STREAM_OK); +} + int main(void) { debug_config_init(); debug_set_level(DEBUG_LEVEL_INFO); /* Усечения проверяются массово; ожидаемые отказы не загромождают диагностический лог. */ debug_set_category_level(DEBUG_CATEGORY_STREAM, DEBUG_LEVEL_DISABLED); size_t before = u_get_allocated_count(); for (unsigned i = 0; i < sizeof(expected_video); i++) expected_video[i] = (uint8_t)(i * 31 + 7); - test_media(); test_batches(); test_revisions(); test_stereo(); + test_media(); test_batches(); test_revisions(); test_stereo(); test_codecs(); CHECK(u_get_allocated_count() == before); debug_set_category_level(DEBUG_CATEGORY_STREAM, DEBUG_LEVEL_INFO); DEBUG_INFO(DEBUG_CATEGORY_STREAM, "PASS stream_media: protocol, FEC, frame recovery, boundaries, no leaks"); diff --git a/tools/chatgui/tests/test_stream_view.cpp b/tools/chatgui/tests/test_stream_view.cpp index 90cdde19..addfa5b2 100644 --- a/tools/chatgui/tests/test_stream_view.cpp +++ b/tools/chatgui/tests/test_stream_view.cpp @@ -184,7 +184,7 @@ private slots: memset(frame->data[plane] + y * frame->linesize[plane], plane ? 128 : 80, plane ? 80 : 160); frame->pts = 0; QCOMPARE(avcodec_send_frame(context, frame), 0); AVPacket* packet = av_packet_alloc(); QVERIFY(packet); QCOMPARE(avcodec_receive_packet(context, packet), 0); - QByteArray video(reinterpret_cast(packet->data), packet->size); + QByteArray video(4, '\0'); video.append(reinterpret_cast(packet->data), packet->size); av_packet_free(&packet); av_frame_free(&frame); avcodec_free_context(&context); std::unique_ptr opus(nullptr, opus_codec_encoder_destroy); uint64_t sampleFrame = 0;