@@ -120,66 +120,9 @@ namespace video {
120120 return avcodec_colorspace;
121121 }
122122
123- const color_t *color_vectors_from_colorspace (const sunshine_colorspace_t &colorspace) {
124- return color_vectors_from_colorspace (colorspace.colorspace , colorspace.full_range );
125- }
126-
127- const color_t *color_vectors_from_colorspace (colorspace_e colorspace, bool full_range) {
128- using float2 = float [2 ];
129- auto make_color_matrix = [](float Cr, float Cb, const float2 &range_Y, const float2 &range_UV) -> color_t {
130- float Cg = 1 .0f - Cr - Cb;
131-
132- float Cr_i = 1 .0f - Cr;
133- float Cb_i = 1 .0f - Cb;
134-
135- float shift_y = range_Y[0 ] / 255 .0f ;
136- float shift_uv = range_UV[0 ] / 255 .0f ;
137-
138- float scale_y = (range_Y[1 ] - range_Y[0 ]) / 255 .0f ;
139- float scale_uv = (range_UV[1 ] - range_UV[0 ]) / 255 .0f ;
140- return {
141- {Cr, Cg, Cb, 0 .0f },
142- {-(Cr * 0 .5f / Cb_i), -(Cg * 0 .5f / Cb_i), 0 .5f , 0 .5f },
143- {0 .5f , -(Cg * 0 .5f / Cr_i), -(Cb * 0 .5f / Cr_i), 0 .5f },
144- {scale_y, shift_y},
145- {scale_uv, shift_uv},
146- };
147- };
148-
149- static const color_t colors[] {
150- make_color_matrix (0 .299f , 0 .114f , {16 .0f , 235 .0f }, {16 .0f , 240 .0f }), // BT601 MPEG
151- make_color_matrix (0 .299f , 0 .114f , {0 .0f , 255 .0f }, {0 .0f , 255 .0f }), // BT601 JPEG
152- make_color_matrix (0 .2126f , 0 .0722f , {16 .0f , 235 .0f }, {16 .0f , 240 .0f }), // BT709 MPEG
153- make_color_matrix (0 .2126f , 0 .0722f , {0 .0f , 255 .0f }, {0 .0f , 255 .0f }), // BT709 JPEG
154- make_color_matrix (0 .2627f , 0 .0593f , {16 .0f , 235 .0f }, {16 .0f , 240 .0f }), // BT2020 MPEG
155- make_color_matrix (0 .2627f , 0 .0593f , {0 .0f , 255 .0f }, {0 .0f , 255 .0f }), // BT2020 JPEG
156- };
157-
158- const color_t *result = nullptr ;
159-
160- switch (colorspace) {
161- case colorspace_e::rec601:
162- default :
163- result = &colors[0 ];
164- break ;
165- case colorspace_e::rec709:
166- result = &colors[2 ];
167- break ;
168- case colorspace_e::bt2020:
169- case colorspace_e::bt2020sdr:
170- result = &colors[4 ];
171- break ;
172- };
173-
174- if (full_range) {
175- result++;
176- }
177-
178- return result;
179- }
180-
181- const color_t *new_color_vectors_from_colorspace (const sunshine_colorspace_t &colorspace) {
182- constexpr auto generate_color_vectors = [](const sunshine_colorspace_t &colorspace) -> color_t {
123+ const color_t *color_vectors_from_colorspace (const sunshine_colorspace_t &colorspace, bool unorm_output) {
124+ constexpr auto generate_color_vectors = [](const sunshine_colorspace_t &colorspace, bool unorm_output) -> color_t {
125+ // "Table 4 – Interpretation of matrix coefficients (MatrixCoefficients) value" section of ITU-T H.273
183126 double Kr, Kb;
184127 switch (colorspace.colorspace ) {
185128 case colorspace_e::rec601:
@@ -202,7 +145,7 @@ namespace video {
202145 double y_mult, y_add;
203146 double uv_mult, uv_add;
204147
205- // "Matrix coefficients" section of ITU-T H.273
148+ // "8.3 Matrix coefficients" section of ITU-T H.273
206149 if (colorspace.full_range ) {
207150 y_mult = (1 << colorspace.bit_depth ) - 1 ;
208151 y_add = 0 ;
@@ -215,9 +158,17 @@ namespace video {
215158 uv_add = (1 << (colorspace.bit_depth - 8 )) * 128 ;
216159 }
217160
218- // For rounding
219- y_add += 0.5 ;
220- uv_add += 0.5 ;
161+ if (unorm_output) {
162+ const double unorm_range = (1 << colorspace.bit_depth ) - 1 ;
163+ y_mult /= unorm_range;
164+ y_add /= unorm_range;
165+ uv_mult /= unorm_range;
166+ uv_add /= unorm_range;
167+ } else {
168+ // For rounding
169+ y_add += 0 .5f ;
170+ uv_add += 0 .5f ;
171+ }
221172
222173 color_t color_vectors;
223174
@@ -246,18 +197,31 @@ namespace video {
246197 };
247198
248199 static constexpr color_t colors[] = {
249- generate_color_vectors ({colorspace_e::rec601, false , 8 }),
250- generate_color_vectors ({colorspace_e::rec601, true , 8 }),
251- generate_color_vectors ({colorspace_e::rec601, false , 10 }),
252- generate_color_vectors ({colorspace_e::rec601, true , 10 }),
253- generate_color_vectors ({colorspace_e::rec709, false , 8 }),
254- generate_color_vectors ({colorspace_e::rec709, true , 8 }),
255- generate_color_vectors ({colorspace_e::rec709, false , 10 }),
256- generate_color_vectors ({colorspace_e::rec709, true , 10 }),
257- generate_color_vectors ({colorspace_e::bt2020, false , 8 }),
258- generate_color_vectors ({colorspace_e::bt2020, true , 8 }),
259- generate_color_vectors ({colorspace_e::bt2020, false , 10 }),
260- generate_color_vectors ({colorspace_e::bt2020, true , 10 }),
200+ generate_color_vectors ({colorspace_e::rec601, false , 8 }, false ),
201+ generate_color_vectors ({colorspace_e::rec601, true , 8 }, false ),
202+ generate_color_vectors ({colorspace_e::rec601, false , 10 }, false ),
203+ generate_color_vectors ({colorspace_e::rec601, true , 10 }, false ),
204+ generate_color_vectors ({colorspace_e::rec709, false , 8 }, false ),
205+ generate_color_vectors ({colorspace_e::rec709, true , 8 }, false ),
206+ generate_color_vectors ({colorspace_e::rec709, false , 10 }, false ),
207+ generate_color_vectors ({colorspace_e::rec709, true , 10 }, false ),
208+ generate_color_vectors ({colorspace_e::bt2020, false , 8 }, false ),
209+ generate_color_vectors ({colorspace_e::bt2020, true , 8 }, false ),
210+ generate_color_vectors ({colorspace_e::bt2020, false , 10 }, false ),
211+ generate_color_vectors ({colorspace_e::bt2020, true , 10 }, false ),
212+
213+ generate_color_vectors ({colorspace_e::rec601, false , 8 }, true ),
214+ generate_color_vectors ({colorspace_e::rec601, true , 8 }, true ),
215+ generate_color_vectors ({colorspace_e::rec601, false , 10 }, true ),
216+ generate_color_vectors ({colorspace_e::rec601, true , 10 }, true ),
217+ generate_color_vectors ({colorspace_e::rec709, false , 8 }, true ),
218+ generate_color_vectors ({colorspace_e::rec709, true , 8 }, true ),
219+ generate_color_vectors ({colorspace_e::rec709, false , 10 }, true ),
220+ generate_color_vectors ({colorspace_e::rec709, true , 10 }, true ),
221+ generate_color_vectors ({colorspace_e::bt2020, false , 8 }, true ),
222+ generate_color_vectors ({colorspace_e::bt2020, true , 8 }, true ),
223+ generate_color_vectors ({colorspace_e::bt2020, false , 10 }, true ),
224+ generate_color_vectors ({colorspace_e::bt2020, true , 10 }, true ),
261225 };
262226
263227 const color_t *result = nullptr ;
@@ -282,6 +246,9 @@ namespace video {
282246 if (colorspace.full_range ) {
283247 result += 1 ;
284248 }
249+ if (unorm_output) {
250+ result += 12 ;
251+ }
285252
286253 return result;
287254 }
0 commit comments