From 032b9b070b3512ecb7bf03986611a9984a39f250 Mon Sep 17 00:00:00 2001 From: Koichiro Iwao Date: Thu, 28 Nov 2024 23:21:20 +0900 Subject: [PATCH] tests: add tests for OpenH264 params and prefered H264 encoder (cherry picked from commit 92bd0812a398bc8d966e978cac32d3f80ffb1df2) --- tests/xrdp/Makefile.am | 15 ++-- tests/xrdp/gfx/gfx_h264_encoder_invalid.toml | 86 +++++++++++++++++++ tests/xrdp/gfx/gfx_h264_encoder_openh264.toml | 86 +++++++++++++++++++ .../xrdp/gfx/gfx_h264_encoder_undefined.toml | 86 +++++++++++++++++++ tests/xrdp/gfx/gfx_h264_encoder_x264.toml | 86 +++++++++++++++++++ tests/xrdp/test_tconfig.c | 59 +++++++++++++ 6 files changed, 413 insertions(+), 5 deletions(-) create mode 100644 tests/xrdp/gfx/gfx_h264_encoder_invalid.toml create mode 100644 tests/xrdp/gfx/gfx_h264_encoder_openh264.toml create mode 100644 tests/xrdp/gfx/gfx_h264_encoder_undefined.toml create mode 100644 tests/xrdp/gfx/gfx_h264_encoder_x264.toml diff --git a/tests/xrdp/Makefile.am b/tests/xrdp/Makefile.am index 5106116f..505e4887 100644 --- a/tests/xrdp/Makefile.am +++ b/tests/xrdp/Makefile.am @@ -21,13 +21,18 @@ EXTRA_DIST = \ test_not4_24bit.bmp \ test1.jpg \ test_alpha_blend.png \ - gfx/gfx.toml\ - gfx/gfx_codec_order_undefined.toml \ - gfx/gfx_codec_h264_preferred.toml \ + gfx/gfx.toml \ gfx/gfx_codec_h264_only.toml \ - gfx/gfx_codec_rfx_preferred.toml \ + gfx/gfx_codec_h264_preferred.toml \ + gfx/gfx_codec_order_undefined.toml \ + gfx/gfx_codec_rfx_only.toml \ gfx/gfx_codec_rfx_preferred_odd.toml \ - gfx/gfx_codec_rfx_only.toml + gfx/gfx_codec_rfx_preferred.toml \ + gfx/gfx_h264_encoder_invalid.toml \ + gfx/gfx_h264_encoder_openh264.toml \ + gfx/gfx_h264_encoder_undefined.toml \ + gfx/gfx_h264_encoder_x264.toml \ + gfx/gfx_missing_h264.toml TESTS = test_xrdp check_PROGRAMS = test_xrdp diff --git a/tests/xrdp/gfx/gfx_h264_encoder_invalid.toml b/tests/xrdp/gfx/gfx_h264_encoder_invalid.toml new file mode 100644 index 00000000..7aee6971 --- /dev/null +++ b/tests/xrdp/gfx/gfx_h264_encoder_invalid.toml @@ -0,0 +1,86 @@ +[codec] +order = [ "H.264", "RFX" ] + +# Specify a preferred H.264 encoder, "x264" or "OpenH264". +# This parameter takes effect only when more than one encoder is +# enabled at compile time. If only one encoder is enabled, the encoder +# will be used regardless the value of this parameter. +h264_encoder = "FreeH264" + +# +# Configurations for x264 +# +[x264.default] +# NOTE: x264 specifies bitrate in unit of kbps. +preset = "ultrafast" +tune = "zerolatency" +profile = "main" # profile is forced to baseline if preset == ultrafast +vbv_max_bitrate = 0 +vbv_buffer_size = 0 +fps_num = 60 +fps_den = 1 + +[x264.lan] +# inherits default + +[x264.wan] +vbv_max_bitrate = 15_000 +vbv_buffer_size = 1_500 + +[x264.broadband_high] +preset = "superfast" +vbv_max_bitrate = 8_000 +vbv_buffer_Size = 800 + +[x264.satellite] +preset = "superfast" +vbv_max_bitrate = 5_000 +vbv_buffer_size = 500 + +[x264.broadband_low] +preset = "veryfast" +vbv_max_bitrate = 1_600 +vbv_buffer_size = 66 + +[x264.modem] +preset = "fast" +vbv_max_bitrate = 1_200 +vbv_buffer_size = 50 + +# +# Configurations for OpenH264 +# +[OpenH264.default] +# NOTE: OpenH264 specifies bitrate in unit of bps, not kbps. +EnableFrameSkip = false +TargetBitrate = 20_000_000 +MaxBitrate = 0 # unspecified +MaxFrameRate = 60.0 + +[OpenH264.lan] +# inherits default + +[OpenH264.wan] +TargetBitrate = 10_000_000 +MaxBitrate = 12_000_000 + +[OpenH264.broadband_high] +EnableFrameSkip = true +TargetBitrate = 8_000_000 +MaxBitrate = 10_000_000 + +[OpenH264.satellite] +EnableFrameSkip = true +TargetBitrate = 4_000_000 +MaxBitrate = 6_000_000 + +[OpenH264.broadband_low] +EnableFrameSkip = true +TargetBitrate = 1_600_000 +MaxBitrate = 1_800_000 + +[OpenH264.modem] +EnableFrameSkip = true +TargetBitrate = 600_000 +MaxBitrate = 1_200_000 + diff --git a/tests/xrdp/gfx/gfx_h264_encoder_openh264.toml b/tests/xrdp/gfx/gfx_h264_encoder_openh264.toml new file mode 100644 index 00000000..ef98c4e1 --- /dev/null +++ b/tests/xrdp/gfx/gfx_h264_encoder_openh264.toml @@ -0,0 +1,86 @@ +[codec] +order = [ "H.264", "RFX" ] + +# Specify a preferred H.264 encoder, "x264" or "OpenH264". +# This parameter takes effect only when more than one encoder is +# enabled at compile time. If only one encoder is enabled, the encoder +# will be used regardless the value of this parameter. +h264_encoder = "OpenH264" + +# +# Configurations for x264 +# +[x264.default] +# NOTE: x264 specifies bitrate in unit of kbps. +preset = "ultrafast" +tune = "zerolatency" +profile = "main" # profile is forced to baseline if preset == ultrafast +vbv_max_bitrate = 0 +vbv_buffer_size = 0 +fps_num = 60 +fps_den = 1 + +[x264.lan] +# inherits default + +[x264.wan] +vbv_max_bitrate = 15_000 +vbv_buffer_size = 1_500 + +[x264.broadband_high] +preset = "superfast" +vbv_max_bitrate = 8_000 +vbv_buffer_Size = 800 + +[x264.satellite] +preset = "superfast" +vbv_max_bitrate = 5_000 +vbv_buffer_size = 500 + +[x264.broadband_low] +preset = "veryfast" +vbv_max_bitrate = 1_600 +vbv_buffer_size = 66 + +[x264.modem] +preset = "fast" +vbv_max_bitrate = 1_200 +vbv_buffer_size = 50 + +# +# Configurations for OpenH264 +# +[OpenH264.default] +# NOTE: OpenH264 specifies bitrate in unit of bps, not kbps. +EnableFrameSkip = false +TargetBitrate = 20_000_000 +MaxBitrate = 0 # unspecified +MaxFrameRate = 60.0 + +[OpenH264.lan] +# inherits default + +[OpenH264.wan] +TargetBitrate = 10_000_000 +MaxBitrate = 12_000_000 + +[OpenH264.broadband_high] +EnableFrameSkip = true +TargetBitrate = 8_000_000 +MaxBitrate = 10_000_000 + +[OpenH264.satellite] +EnableFrameSkip = true +TargetBitrate = 4_000_000 +MaxBitrate = 6_000_000 + +[OpenH264.broadband_low] +EnableFrameSkip = true +TargetBitrate = 1_600_000 +MaxBitrate = 1_800_000 + +[OpenH264.modem] +EnableFrameSkip = true +TargetBitrate = 600_000 +MaxBitrate = 1_200_000 + diff --git a/tests/xrdp/gfx/gfx_h264_encoder_undefined.toml b/tests/xrdp/gfx/gfx_h264_encoder_undefined.toml new file mode 100644 index 00000000..74f4d618 --- /dev/null +++ b/tests/xrdp/gfx/gfx_h264_encoder_undefined.toml @@ -0,0 +1,86 @@ +[codec] +order = [ "H.264", "RFX" ] + +# Specify a preferred H.264 encoder, "x264" or "OpenH264". +# This parameter takes effect only when more than one encoder is +# enabled at compile time. If only one encoder is enabled, the encoder +# will be used regardless the value of this parameter. +#h264_encoder = "OpenH264" + +# +# Configurations for x264 +# +[x264.default] +# NOTE: x264 specifies bitrate in unit of kbps. +preset = "ultrafast" +tune = "zerolatency" +profile = "main" # profile is forced to baseline if preset == ultrafast +vbv_max_bitrate = 0 +vbv_buffer_size = 0 +fps_num = 60 +fps_den = 1 + +[x264.lan] +# inherits default + +[x264.wan] +vbv_max_bitrate = 15_000 +vbv_buffer_size = 1_500 + +[x264.broadband_high] +preset = "superfast" +vbv_max_bitrate = 8_000 +vbv_buffer_Size = 800 + +[x264.satellite] +preset = "superfast" +vbv_max_bitrate = 5_000 +vbv_buffer_size = 500 + +[x264.broadband_low] +preset = "veryfast" +vbv_max_bitrate = 1_600 +vbv_buffer_size = 66 + +[x264.modem] +preset = "fast" +vbv_max_bitrate = 1_200 +vbv_buffer_size = 50 + +# +# Configurations for OpenH264 +# +[OpenH264.default] +# NOTE: OpenH264 specifies bitrate in unit of bps, not kbps. +EnableFrameSkip = false +TargetBitrate = 20_000_000 +MaxBitrate = 0 # unspecified +MaxFrameRate = 60.0 + +[OpenH264.lan] +# inherits default + +[OpenH264.wan] +TargetBitrate = 10_000_000 +MaxBitrate = 12_000_000 + +[OpenH264.broadband_high] +EnableFrameSkip = true +TargetBitrate = 8_000_000 +MaxBitrate = 10_000_000 + +[OpenH264.satellite] +EnableFrameSkip = true +TargetBitrate = 4_000_000 +MaxBitrate = 6_000_000 + +[OpenH264.broadband_low] +EnableFrameSkip = true +TargetBitrate = 1_600_000 +MaxBitrate = 1_800_000 + +[OpenH264.modem] +EnableFrameSkip = true +TargetBitrate = 600_000 +MaxBitrate = 1_200_000 + diff --git a/tests/xrdp/gfx/gfx_h264_encoder_x264.toml b/tests/xrdp/gfx/gfx_h264_encoder_x264.toml new file mode 100644 index 00000000..94b75144 --- /dev/null +++ b/tests/xrdp/gfx/gfx_h264_encoder_x264.toml @@ -0,0 +1,86 @@ +[codec] +order = [ "H.264", "RFX" ] + +# Specify a preferred H.264 encoder, "x264" or "OpenH264". +# This parameter takes effect only when more than one encoder is +# enabled at compile time. If only one encoder is enabled, the encoder +# will be used regardless the value of this parameter. +h264_encoder = "x264" + +# +# Configurations for x264 +# +[x264.default] +# NOTE: x264 specifies bitrate in unit of kbps. +preset = "ultrafast" +tune = "zerolatency" +profile = "main" # profile is forced to baseline if preset == ultrafast +vbv_max_bitrate = 0 +vbv_buffer_size = 0 +fps_num = 60 +fps_den = 1 + +[x264.lan] +# inherits default + +[x264.wan] +vbv_max_bitrate = 15_000 +vbv_buffer_size = 1_500 + +[x264.broadband_high] +preset = "superfast" +vbv_max_bitrate = 8_000 +vbv_buffer_Size = 800 + +[x264.satellite] +preset = "superfast" +vbv_max_bitrate = 5_000 +vbv_buffer_size = 500 + +[x264.broadband_low] +preset = "veryfast" +vbv_max_bitrate = 1_600 +vbv_buffer_size = 66 + +[x264.modem] +preset = "fast" +vbv_max_bitrate = 1_200 +vbv_buffer_size = 50 + +# +# Configurations for OpenH264 +# +[OpenH264.default] +# NOTE: OpenH264 specifies bitrate in unit of bps, not kbps. +EnableFrameSkip = false +TargetBitrate = 20_000_000 +MaxBitrate = 0 # unspecified +MaxFrameRate = 60.0 + +[OpenH264.lan] +# inherits default + +[OpenH264.wan] +TargetBitrate = 10_000_000 +MaxBitrate = 12_000_000 + +[OpenH264.broadband_high] +EnableFrameSkip = true +TargetBitrate = 8_000_000 +MaxBitrate = 10_000_000 + +[OpenH264.satellite] +EnableFrameSkip = true +TargetBitrate = 4_000_000 +MaxBitrate = 6_000_000 + +[OpenH264.broadband_low] +EnableFrameSkip = true +TargetBitrate = 1_600_000 +MaxBitrate = 1_800_000 + +[OpenH264.modem] +EnableFrameSkip = true +TargetBitrate = 600_000 +MaxBitrate = 1_200_000 + diff --git a/tests/xrdp/test_tconfig.c b/tests/xrdp/test_tconfig.c index 1fd29ad6..2971b278 100644 --- a/tests/xrdp/test_tconfig.c +++ b/tests/xrdp/test_tconfig.c @@ -14,6 +14,56 @@ START_TEST(test_tconfig_gfx_always_success) } END_TEST +START_TEST(test_tconfig_gfx_h264_oh264) +{ + struct xrdp_tconfig_gfx gfxconfig; + tconfig_load_gfx(GFXCONF_STUBDIR "/gfx_h264_encoder_openh264.toml", &gfxconfig); + + /* H.264 encoder is OpenH264 */ + ck_assert_int_eq(gfxconfig.h264_encoder, XTC_H264_OPENH264); +} + +START_TEST(test_tconfig_gfx_h264_x264) +{ + struct xrdp_tconfig_gfx gfxconfig; + tconfig_load_gfx(GFXCONF_STUBDIR "/gfx_h264_encoder_x264.toml", &gfxconfig); + + /* H.264 encoder is x264 */ + ck_assert_int_eq(gfxconfig.h264_encoder, XTC_H264_X264); +} + +START_TEST(test_tconfig_gfx_h264_undefined) +{ + struct xrdp_tconfig_gfx gfxconfig; + tconfig_load_gfx(GFXCONF_STUBDIR "/gfx_h264_encoder_undefined.toml", &gfxconfig); + + /* H.264 encoder is x264 if undefined */ + ck_assert_int_eq(gfxconfig.h264_encoder, XTC_H264_X264); +} + +START_TEST(test_tconfig_gfx_h264_invalid) +{ + struct xrdp_tconfig_gfx gfxconfig; + tconfig_load_gfx(GFXCONF_STUBDIR "/gfx_h264_encoder_invalid.toml", &gfxconfig); + + /* H.264 encoder is x264 if invalid, unknown encoder specified */ + ck_assert_int_eq(gfxconfig.h264_encoder, XTC_H264_X264); +} + +START_TEST(test_tconfig_gfx_oh264_load_basic) +{ + struct xrdp_tconfig_gfx gfxconfig; + int rv = tconfig_load_gfx(GFXCONF_STUBDIR "/gfx.toml", &gfxconfig); + + ck_assert_int_eq(rv, 0); + + /* default */ + ck_assert_int_eq(gfxconfig.openh264_param[0].EnableFrameSkip, 0); + ck_assert_int_eq(gfxconfig.openh264_param[0].TargetBitrate, 20000000); + ck_assert_int_eq(gfxconfig.openh264_param[0].MaxBitrate, 0); + ck_assert_float_eq(gfxconfig.openh264_param[0].MaxFrameRate, 60.0); +} + START_TEST(test_tconfig_gfx_x264_load_basic) { struct xrdp_tconfig_gfx gfxconfig; @@ -111,6 +161,15 @@ make_suite_tconfig_load_gfx(void) tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_missing_file); tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_missing_h264); + /* OpenH264 */ + tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_oh264_load_basic); + + /* H.264 encoder */ + tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_h264_oh264); + tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_h264_x264); + tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_h264_undefined); + tcase_add_test(tc_tconfig_load_gfx, test_tconfig_gfx_h264_invalid); + suite_add_tcase(s, tc_tconfig_load_gfx); return s;