Branch data Line data Source code
1 : : #include "utils.h"
2 : :
3 : : #include <libplacebo/options.h>
4 : :
5 : 6 : static void count_cb(void *priv, pl_opt_data data)
6 : : {
7 : : int *num = priv;
8 : 6 : printf("Iterating over option: %s = %s\n", data->opt->key, data->text);
9 : 6 : (*num)++;
10 : 6 : }
11 : :
12 : 9 : static void set_cb(void *priv, pl_opt_data data)
13 : : {
14 : : pl_options dst = priv;
15 [ - + ]: 9 : REQUIRE(pl_options_set_str(dst, data->opt->key, data->text));
16 : 9 : }
17 : :
18 : 1 : int main()
19 : : {
20 : 1 : pl_log log = pl_test_logger();
21 : 1 : pl_options test = pl_options_alloc(log);
22 : :
23 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
24 [ - + ]: 1 : REQUIRE(pl_options_load(test, ""));
25 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
26 : :
27 : 1 : pl_options_reset(test, &pl_render_fast_params);
28 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
29 [ - + ]: 1 : REQUIRE(pl_options_load(test, "preset=fast"));
30 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
31 : :
32 : : const char *def_opts = "upscaler=lanczos,downscaler=hermite,frame_mixer=oversample,sigmoid=yes,peak_detect=yes,dither=yes";
33 : 1 : pl_options_reset(test, &pl_render_default_params);
34 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), def_opts);
35 : 1 : struct pl_options_t def_pre = *test;
36 : 1 : pl_options_reset(test, NULL);
37 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
38 [ - + ]: 1 : REQUIRE(pl_options_load(test, def_opts));
39 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), def_opts);
40 : 1 : REQUIRE_MEMEQ(test, &def_pre, sizeof(*test));
41 : 1 : pl_options_reset(test, NULL);
42 [ - + ]: 1 : REQUIRE(pl_options_load(test, "preset=default"));
43 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), def_opts);
44 : 1 : REQUIRE_MEMEQ(test, &def_pre, sizeof(*test));
45 : :
46 : 1 : int num = 0;
47 : 1 : pl_options_iterate(test, count_cb, &num);
48 [ - + ]: 1 : REQUIRE_CMP(num, ==, 6, "d");
49 : :
50 : : pl_opt_data data;
51 [ - + ]: 1 : REQUIRE((data = pl_options_get(test, "tile_size")));
52 [ - + ]: 1 : REQUIRE_STREQ(data->opt->key, "tile_size");
53 [ - + ]: 1 : REQUIRE_CMP(*(int *) data->value, =, pl_render_default_params.tile_size, "d");
54 [ - + ]: 1 : REQUIRE_STREQ(data->text, "32");
55 : :
56 : : const char *hq_opts = "upscaler=ewa_lanczossharp,downscaler=hermite,frame_mixer=oversample,deband=yes,sigmoid=yes,peak_detect=yes,peak_percentile=99.99500274658203,contrast_recovery=0.30000001192092896,dither=yes";
57 : : // fallback can produce different precision
58 : : const char *hq_opts2 = "upscaler=ewa_lanczossharp,downscaler=hermite,frame_mixer=oversample,deband=yes,sigmoid=yes,peak_detect=yes,peak_percentile=99.99500274658203125,contrast_recovery=0.30000001192092896,dither=yes";
59 : :
60 : 1 : pl_options_reset(test, &pl_render_high_quality_params);
61 : 1 : const char *opts = pl_options_save(test);
62 [ - + ]: 1 : if (!strcmp(opts, hq_opts2))
63 : : hq_opts = hq_opts2;
64 [ - + ]: 1 : REQUIRE_STREQ(opts, hq_opts);
65 : 1 : struct pl_options_t hq_pre = *test;
66 : 1 : pl_options_reset(test, NULL);
67 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "");
68 [ - + ]: 1 : REQUIRE(pl_options_load(test, hq_opts));
69 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), hq_opts);
70 : 1 : REQUIRE_MEMEQ(test, &hq_pre, sizeof(*test));
71 [ - + ]: 1 : REQUIRE(pl_options_load(test, "preset=high_quality"));
72 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), hq_opts);
73 : 1 : REQUIRE_MEMEQ(test, &hq_pre, sizeof(*test));
74 : :
75 : 1 : pl_options test2 = pl_options_alloc(log);
76 : 1 : pl_options_iterate(test, set_cb, test2);
77 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), pl_options_save(test2));
78 : 1 : pl_options_free(&test2);
79 : :
80 : : // Test custom scalers
81 : 1 : pl_options_reset(test, pl_render_params(
82 : : .upscaler = &(struct pl_filter_config) {
83 : : .kernel = &pl_filter_function_jinc,
84 : : .window = &pl_filter_function_jinc,
85 : : .radius = 4.0,
86 : : .polar = true,
87 : : },
88 : : ));
89 : : const char *jinc4_opts = "upscaler=custom,upscaler_kernel=jinc,upscaler_window=jinc,upscaler_radius=4,upscaler_polar=yes";
90 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), jinc4_opts);
91 : 1 : struct pl_options_t jinc4_pre = *test;
92 : 1 : pl_options_reset(test, NULL);
93 [ - + ]: 1 : REQUIRE(pl_options_load(test, "upscaler=custom,upscaler_preset=ewa_lanczos,upscaler_radius=4.0,upscaler_clamp=0.0"));
94 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), jinc4_opts);
95 : 1 : REQUIRE_MEMEQ(test, &jinc4_pre, sizeof(*test));
96 : :
97 : : // Test params presets
98 : 1 : pl_options_reset(test, NULL);
99 [ - + ]: 1 : REQUIRE(pl_options_load(test, "cone=yes,cone_preset=deuteranomaly"));
100 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(test), "cone=yes,cones=m,cone_strength=0.5");
101 : :
102 : : // Test error paths
103 : 1 : pl_options bad = pl_options_alloc(NULL);
104 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "scale_preset=help"));
105 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "dither_method=invalid"));
106 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "lut_entries=-1"));
107 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "deband_iterations=100"));
108 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "tone_lut_size=abc"));
109 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "show_clipping=hello"));
110 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "brightness=2.0"));
111 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "gamma=oops"));
112 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "invalid"));
113 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "="));
114 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "preset==bar"));
115 [ - + ]: 1 : REQUIRE(!pl_options_load(bad, "peak_percentile=E8203125"));
116 [ - + ]: 1 : REQUIRE(!pl_options_get(bad, "invalid"));
117 [ - + ]: 1 : REQUIRE_STREQ(pl_options_save(bad), "");
118 : 1 : pl_options_free(&bad);
119 : :
120 : 1 : pl_options_free(&test);
121 : 1 : pl_log_destroy(&log);
122 : : return 0;
123 : : }
|