From 26d62c65c1b529db10c2c2f0f086f8c43421487f Mon Sep 17 00:00:00 2001 From: bjornvolcker Date: Fri, 13 Dec 2024 13:08:04 +0100 Subject: [PATCH] Adds AV1 to list of codecs In addition, adds AV1 to list of tests, but disables almost all AV1 tests since it has not yet been implemented. --- lib/src/includes/signed_video_common.h | 7 ++++- tests/check/check_signed_video_auth.c | 42 ++++++++++++++++++++++++++ tests/check/check_signed_video_sign.c | 11 +++++++ tests/check/test_helpers.c | 3 ++ tests/check/test_helpers.h | 2 +- 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lib/src/includes/signed_video_common.h b/lib/src/includes/signed_video_common.h index fe6ae64b..9084d1ea 100644 --- a/lib/src/includes/signed_video_common.h +++ b/lib/src/includes/signed_video_common.h @@ -59,7 +59,12 @@ typedef enum { * * The following codecs are supported. The codec in use when creating the signed video session. */ -typedef enum { SV_CODEC_H264 = 0, SV_CODEC_H265 = 1, SV_CODEC_NUM } SignedVideoCodec; +typedef enum { + SV_CODEC_H264 = 0, + SV_CODEC_H265 = 1, + SV_CODEC_AV1 = 2, + SV_CODEC_NUM +} SignedVideoCodec; /** * @brief Creates a new signed video session. diff --git a/tests/check/check_signed_video_auth.c b/tests/check/check_signed_video_auth.c index 9fb48603..2086a20f 100644 --- a/tests/check/check_signed_video_auth.c +++ b/tests/check/check_signed_video_auth.c @@ -277,6 +277,7 @@ END_TEST */ START_TEST(intact_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a list of NAL Units given the input string. test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISPPISP"); @@ -295,6 +296,7 @@ END_TEST START_TEST(intact_multislice_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IiPpPpIiPpPpIiPp", settings[_i]); test_stream_check_types(list, "IiPpPpIiSPpPpIiSPp"); @@ -312,6 +314,7 @@ END_TEST START_TEST(intact_stream_with_splitted_nalus) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a list of NAL Units given the input string. test_stream_t *list = create_signed_splitted_nalus("IPPIPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISPPISP"); @@ -334,6 +337,7 @@ END_TEST * SEI(s) before the PPS. */ START_TEST(intact_stream_with_pps_nalu_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("VIPPIPPIP", settings[_i]); test_stream_check_types(list, "VIPPISPPISP"); @@ -352,6 +356,7 @@ END_TEST START_TEST(intact_ms_stream_with_pps_nalu_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("VIiPpPpIiPpPpIiPp", settings[_i]); test_stream_check_types(list, "VIiPpPpIiSPpPpIiSPp"); @@ -378,6 +383,7 @@ END_TEST */ START_TEST(intact_with_undefined_nalu_in_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPXPIPPIP", settings[_i]); test_stream_check_types(list, "IPXPISPPISP"); @@ -395,6 +401,7 @@ END_TEST START_TEST(intact_with_undefined_multislice_nalu_in_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IiPpXPpIiPpPpIiPp", settings[_i]); test_stream_check_types(list, "IiPpXPpIiSPpPpIiSPp"); @@ -418,6 +425,7 @@ END_TEST */ START_TEST(remove_one_p_nalu) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISP"); @@ -463,6 +471,7 @@ END_TEST */ START_TEST(interchange_two_p_nalus) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISP"); @@ -501,6 +510,7 @@ END_TEST */ START_TEST(modify_one_p_nalu) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISP"); @@ -529,6 +539,7 @@ END_TEST START_TEST(modify_one_i_nalu) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISPPISP"); @@ -565,6 +576,7 @@ END_TEST START_TEST(modify_one_sei) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISP"); @@ -604,6 +616,7 @@ END_TEST * 3. Check the authentication result */ START_TEST(remove_the_g_nalu) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISP"); @@ -634,6 +647,7 @@ END_TEST START_TEST(remove_the_i_nalu) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISPPISP"); @@ -667,6 +681,7 @@ END_TEST START_TEST(remove_the_gi_nalus) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISP"); @@ -709,6 +724,7 @@ END_TEST START_TEST(two_lost_seis) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISPPISP"); @@ -746,6 +762,7 @@ END_TEST */ START_TEST(sei_arrives_late) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPPIPPPIPPPIP", settings[_i]); test_stream_check_types(list, "IPPPISPPPISPPPISP"); @@ -814,6 +831,7 @@ generate_delayed_sei_list(struct sv_setting setting, bool extra_delay) */ START_TEST(all_seis_arrive_late) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = generate_delayed_sei_list(settings[_i], true); // IPPPPIPPPIPPSPIPPSPIPPSSPISPISP @@ -841,6 +859,7 @@ END_TEST START_TEST(all_seis_arrive_late_first_gop_scrapped) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = generate_delayed_sei_list(settings[_i], true); // Remove the first GOP: IPPPP IPPPIPPSPIPPSPIPPSSPISPISP @@ -872,6 +891,7 @@ END_TEST START_TEST(all_seis_arrive_late_two_gops_scrapped) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = generate_delayed_sei_list(settings[_i], true); // Remove the first two GOPs: IPPPPIPPP IPPSPIPPSPIPPSSPISPISP @@ -905,6 +925,7 @@ END_TEST */ START_TEST(lost_g_before_late_sei_arrival) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPPIPPPIPPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPPISPPPISPPPISPPISPPISP"); @@ -946,6 +967,7 @@ END_TEST */ START_TEST(lost_g_and_gop_with_late_sei_arrival) { + if (settings[_i].codec == SV_CODEC_AV1) return; if (TMP_FIX_TO_ALLOW_TWO_INVALID_SEIS_AT_STARTUP) return; // TODO: This test is not up-to-date, since it is currently not used. @@ -1002,6 +1024,7 @@ END_TEST * Verify that we can validate authenticity correctly if we lose all NAL Units between two SEIs. */ START_TEST(lost_all_nalus_between_two_seis) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPPIPPPIPPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPPISPPPISPPPISPPISPPISP"); @@ -1045,6 +1068,7 @@ END_TEST */ START_TEST(add_one_sei_nalu_after_signing) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPPISPPISP"); @@ -1074,6 +1098,7 @@ END_TEST */ START_TEST(remove_two_gop_in_start_of_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a list of NAL Units given the input string. test_stream_t *list = create_signed_nalus("IPIPIPPPIPPPPIPPIP", settings[_i]); test_stream_check_types(list, "IPISPISPPPISPPPPISPPISP"); @@ -1128,6 +1153,7 @@ END_TEST */ START_TEST(camera_reset_on_signing_side) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Generate 2 GOPs test_stream_t *list = create_signed_nalus("IPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISP"); @@ -1178,6 +1204,7 @@ END_TEST */ START_TEST(detect_change_of_public_key) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Generate 2 GOPs test_stream_t *list = create_signed_nalus("IPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISP"); @@ -1291,6 +1318,7 @@ mimic_au_fast_forward_and_get_list(signed_video_t *sv, struct sv_setting setting START_TEST(fast_forward_stream_with_reset) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a session. signed_video_t *sv = get_initialized_signed_video(settings[_i], false); ck_assert(sv); @@ -1319,6 +1347,7 @@ END_TEST START_TEST(fast_forward_stream_without_reset) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a session. signed_video_t *sv = get_initialized_signed_video(settings[_i], false); ck_assert(sv); @@ -1387,6 +1416,7 @@ mimic_au_fast_forward_on_late_seis_and_get_list(signed_video_t *sv, struct sv_se START_TEST(fast_forward_stream_with_delayed_seis) { + if (settings[_i].codec == SV_CODEC_AV1) return; // Create a new session. signed_video_t *sv = get_initialized_signed_video(settings[_i], false); ck_assert(sv); @@ -1480,6 +1510,7 @@ mimic_file_export(struct sv_setting setting, bool delayed_seis) START_TEST(file_export_with_dangling_end) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = mimic_file_export(settings[_i], false); // VISPPISPPISPPISPP @@ -1503,6 +1534,7 @@ END_TEST START_TEST(file_export_with_two_useless_seis) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = generate_delayed_sei_list(settings[_i], true); // Remove the first three GOPs. // IPPPPIPPPIPPSP IPPSPIPPSSPISPISP @@ -1535,6 +1567,7 @@ END_TEST */ START_TEST(no_signature) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = test_stream_create("IPPIPPIPPIPPI", settings[_i].codec); test_stream_check_types(list, "IPPIPPIPPIPPI"); @@ -1562,6 +1595,7 @@ END_TEST START_TEST(multislice_no_signature) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = test_stream_create("IiPpPpIiPpPpIiPpPpIiPpPpIi", settings[_i].codec); test_stream_check_types(list, "IiPpPpIiPpPpIiPpPpIiPpPpIi"); @@ -1599,6 +1633,7 @@ END_TEST */ START_TEST(fallback_to_gop_level) { + if (settings[_i].codec == SV_CODEC_AV1) return; const size_t kFallbackSize = 10; signed_video_t *sv = get_initialized_signed_video(settings[_i], false); ck_assert(sv); @@ -1627,6 +1662,7 @@ END_TEST * APIs in vendors/axis-communications are used and tests both signing and validation parts. */ START_TEST(vendor_axis_communications_operation) { + if (settings[_i].codec == SV_CODEC_AV1) return; SignedVideoReturnCode sv_rc; struct sv_setting setting = settings[_i]; SignedVideoCodec codec = settings[_i].codec; @@ -1836,6 +1872,7 @@ validate_public_key_scenario(signed_video_t *sv, */ START_TEST(test_public_key_scenarios) { + if (settings[_i].codec == SV_CODEC_AV1) return; struct pk_setting { bool pk_in_sei; bool use_wrong_pk; @@ -1916,6 +1953,7 @@ END_TEST /* Test description */ START_TEST(no_public_key_in_sei_and_bad_public_key_on_validation_side) { + if (settings[_i].codec == SV_CODEC_AV1) return; SignedVideoReturnCode sv_rc; SignedVideoCodec codec = settings[_i].codec; test_stream_item_t *i_nalu = test_stream_item_create_from_type('I', 0, codec); @@ -1985,6 +2023,7 @@ END_TEST * the other case is the default and executed for all other tests. */ START_TEST(no_emulation_prevention_bytes) { + if (settings[_i].codec == SV_CODEC_AV1) return; struct sv_setting setting = settings[_i]; SignedVideoCodec codec = settings[_i].codec; SignedVideoReturnCode sv_rc; @@ -2115,6 +2154,7 @@ END_TEST */ START_TEST(with_blocked_signing) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISP"); test_stream_item_t *sei = test_stream_item_remove(list, 17); @@ -2158,6 +2198,7 @@ END_TEST */ START_TEST(golden_sei_principle) { + if (settings[_i].codec == SV_CODEC_AV1) return; struct sv_setting setting = settings[_i]; setting.with_golden_sei = true; @@ -2193,6 +2234,7 @@ END_TEST */ START_TEST(legacy_stream) { + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = get_legacy_stream(_i, settings[_i].codec); if (!list) return; diff --git a/tests/check/check_signed_video_sign.c b/tests/check/check_signed_video_sign.c index 4bde4529..1422d099 100644 --- a/tests/check/check_signed_video_sign.c +++ b/tests/check/check_signed_video_sign.c @@ -422,6 +422,7 @@ START_TEST(vendor_axis_communications_operation) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; SignedVideoReturnCode sv_rc; struct sv_setting setting = settings[_i]; @@ -500,6 +501,7 @@ START_TEST(correct_nalu_sequence_without_eos) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPPIPPIPPIPPIPPIPP", settings[_i]); test_stream_check_types(list, "IPPISPPISPPISPPISPPISPP"); @@ -541,6 +543,7 @@ START_TEST(correct_multislice_nalu_sequence_without_eos) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IiPpPpIiPpPp", settings[_i]); test_stream_check_types(list, "IiPpPpIiSPpPp"); @@ -565,6 +568,7 @@ START_TEST(sei_increase_with_gop_length) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; struct sv_setting setting = settings[_i]; // Turn off emulation prevention @@ -595,6 +599,7 @@ START_TEST(fallback_to_gop_level) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; // By construction, run the test for SV_AUTHENTICITY_LEVEL_FRAME only. if (settings[_i].auth_level != SV_AUTHENTICITY_LEVEL_FRAME) return; @@ -635,6 +640,7 @@ START_TEST(undefined_nalu_in_sequence) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_nalus("IPXPIPPIP", settings[_i]); test_stream_check_types(list, "IPXPISPPISP"); @@ -653,6 +659,7 @@ END_TEST */ START_TEST(two_completed_seis_pending) { + if (settings[_i].codec == SV_CODEC_AV1) return; #ifdef SIGNED_VIDEO_DEBUG // Verification the signature is not yet working for buffered signatures. return; @@ -741,6 +748,7 @@ END_TEST */ START_TEST(golden_sei_created) { + if (settings[_i].codec == SV_CODEC_AV1) return; SignedVideoReturnCode sv_rc; signed_video_t *sv = get_initialized_signed_video(settings[_i], false); @@ -778,6 +786,7 @@ END_TEST */ START_TEST(two_completed_seis_pending_legacy) { + if (settings[_i].codec == SV_CODEC_AV1) return; #ifdef SIGNED_VIDEO_DEBUG // Verification the signature is not yet working for buffered signatures. return; @@ -931,6 +940,7 @@ START_TEST(correct_signing_nalus_in_parts) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; test_stream_t *list = create_signed_splitted_nalus("IPPIPP", settings[_i]); test_stream_check_types(list, "IPPISPP"); @@ -1021,6 +1031,7 @@ START_TEST(limited_sei_payload_size) { // This test runs in a loop with loop index _i, corresponding to struct sv_setting _i in // |settings|; See signed_video_helpers.h. + if (settings[_i].codec == SV_CODEC_AV1) return; // No need to run this with GOP level authentication, since only frame level // authentication can dynamically affect the payload size. diff --git a/tests/check/test_helpers.c b/tests/check/test_helpers.c index 4e044cbd..894df278 100644 --- a/tests/check/test_helpers.c +++ b/tests/check/test_helpers.c @@ -95,6 +95,9 @@ struct sv_setting settings[NUM_SETTINGS] = { {SV_CODEC_H264, SV_AUTHENTICITY_LEVEL_FRAME, false, true, false, 0, NULL, 0, 1, false, false}, {SV_CODEC_H264, SV_AUTHENTICITY_LEVEL_FRAME, true, true, false, 0, "sha512", 0, 1, false, false}, + // AV1 tests + {SV_CODEC_AV1, SV_AUTHENTICITY_LEVEL_GOP, true, true, false, 0, NULL, 0, 1, false, false}, + {SV_CODEC_AV1, SV_AUTHENTICITY_LEVEL_FRAME, true, true, false, 0, NULL, 0, 1, false, false}, }; static char private_key_rsa[RSA_PRIVATE_KEY_ALLOC_BYTES]; diff --git a/tests/check/test_helpers.h b/tests/check/test_helpers.h index c42b17eb..86ddcb3a 100644 --- a/tests/check/test_helpers.h +++ b/tests/check/test_helpers.h @@ -54,7 +54,7 @@ struct sv_setting { bool is_vendor_axis; }; -#define NUM_SETTINGS 7 +#define NUM_SETTINGS 9 extern struct sv_setting settings[NUM_SETTINGS]; extern const char *axisDummyCertificateChain;