Skip to main content

singe_npp/image/
color_ycbcr_yuv.rs

1use super::*;
2
3impl_color_convert_planar_to_planar!(rgb_to_yuv_u8_p3, u8, 3, nppiRGBToYUV_8u_P3R_Ctx);
4impl_color_convert_same_layout!(bgr_to_yuv_u8_c3, u8, C3, nppiBGRToYUV_8u_C3R_Ctx);
5impl_color_convert_same_layout!(bgr_to_yuv_u8_ac4, u8, AC4, nppiBGRToYUV_8u_AC4R_Ctx);
6impl_generic_color_convert_same_layout!(BgrToYuvC3, bgr_to_yuv, bgr_to_yuv_c3, C3, [
7    u8 => bgr_to_yuv_u8_c3,
8]);
9impl_generic_color_convert_same_layout!(BgrToYuvAC4, bgr_to_yuv, bgr_to_yuv_ac4, AC4, [
10    u8 => bgr_to_yuv_u8_ac4,
11]);
12impl_color_convert_planar_to_planar!(bgr_to_yuv_u8_p3, u8, 3, nppiBGRToYUV_8u_P3R_Ctx);
13impl_color_convert_planar_to_planar!(yuv_to_rgb_u8_p3, u8, 3, nppiYUVToRGB_8u_P3R_Ctx);
14impl_color_convert_same_layout!(yuv_to_bgr_u8_c3, u8, C3, nppiYUVToBGR_8u_C3R_Ctx);
15impl_color_convert_same_layout!(yuv_to_bgr_u8_ac4, u8, AC4, nppiYUVToBGR_8u_AC4R_Ctx);
16impl_generic_color_convert_same_layout!(YuvToBgrC3, yuv_to_bgr, yuv_to_bgr_c3, C3, [
17    u8 => yuv_to_bgr_u8_c3,
18]);
19impl_generic_color_convert_same_layout!(YuvToBgrAC4, yuv_to_bgr, yuv_to_bgr_ac4, AC4, [
20    u8 => yuv_to_bgr_u8_ac4,
21]);
22impl_color_convert_batch_same_layout!(yuv_to_bgr_batch_u8_c3, u8, C3, nppiYUVToBGRBatch_8u_C3R_Ctx);
23impl_color_convert_batch_same_layout_advanced!(
24    yuv_to_bgr_batch_u8_c3_advanced,
25    u8,
26    C3,
27    nppiYUVToBGRBatch_8u_C3R_Advanced_Ctx
28);
29
30macro_rules! impl_color_convert_batch_c3_dispatch {
31    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
32        pub trait $trait: DataTypeLike {
33            fn $method(
34                stream_context: &StreamContext,
35                sources: &[ImageView<'_, Self, C3>],
36                destinations: &mut [ImageViewMut<'_, Self, C3>],
37            ) -> Result<()>;
38        }
39
40        pub fn $function<T>(
41            stream_context: &StreamContext,
42            sources: &[ImageView<'_, T, C3>],
43            destinations: &mut [ImageViewMut<'_, T, C3>],
44        ) -> Result<()>
45        where
46            T: $trait,
47        {
48            T::$method(stream_context, sources, destinations)
49        }
50
51        $(
52            impl $trait for $ty {
53                fn $method(
54                    stream_context: &StreamContext,
55                    sources: &[ImageView<'_, Self, C3>],
56                    destinations: &mut [ImageViewMut<'_, Self, C3>],
57                ) -> Result<()> {
58                    $direct(stream_context, sources, destinations)
59                }
60            }
61        )*
62    };
63}
64
65impl_color_convert_batch_c3_dispatch!(YuvToRgbBatchC3, yuv_to_rgb_batch, yuv_to_rgb_batch_c3, [
66    u8 => yuv_to_rgb_batch_u8_c3,
67]);
68impl_color_convert_batch_c3_dispatch!(
69    YuvToRgbBatchAdvancedC3,
70    yuv_to_rgb_batch_advanced,
71    yuv_to_rgb_batch_c3_advanced,
72    [u8 => yuv_to_rgb_batch_u8_c3_advanced]
73);
74impl_color_convert_batch_c3_dispatch!(
75    YcbcrToRgbBatchC3,
76    ycbcr_to_rgb_batch,
77    ycbcr_to_rgb_batch_c3,
78    [u8 => ycbcr_to_rgb_batch_u8_c3]
79);
80impl_color_convert_batch_c3_dispatch!(
81    YcbcrToRgbBatchAdvancedC3,
82    ycbcr_to_rgb_batch_advanced,
83    ycbcr_to_rgb_batch_c3_advanced,
84    [u8 => ycbcr_to_rgb_batch_u8_c3_advanced]
85);
86impl_color_convert_batch_c3_dispatch!(
87    YcbcrToBgrBatchC3,
88    ycbcr_to_bgr_batch,
89    ycbcr_to_bgr_batch_c3,
90    [u8 => ycbcr_to_bgr_batch_u8_c3]
91);
92impl_color_convert_batch_c3_dispatch!(
93    YcbcrToBgrBatchAdvancedC3,
94    ycbcr_to_bgr_batch_advanced,
95    ycbcr_to_bgr_batch_c3_advanced,
96    [u8 => ycbcr_to_bgr_batch_u8_c3_advanced]
97);
98impl_color_convert_batch_c3_dispatch!(YuvToBgrBatchC3, yuv_to_bgr_batch, yuv_to_bgr_batch_c3, [
99    u8 => yuv_to_bgr_batch_u8_c3,
100]);
101impl_color_convert_batch_c3_dispatch!(
102    YuvToBgrBatchAdvancedC3,
103    yuv_to_bgr_batch_advanced,
104    yuv_to_bgr_batch_c3_advanced,
105    [u8 => yuv_to_bgr_batch_u8_c3_advanced]
106);
107
108impl_color_convert_batch_planar_to_packed!(
109    yuv_to_bgr_batch_u8_p3_to_c3,
110    u8,
111    3,
112    C3,
113    nppiYUVToBGRBatch_8u_P3C3R_Ctx
114);
115impl_color_convert_batch_planar_to_packed_advanced!(
116    yuv_to_bgr_batch_u8_p3_to_c3_advanced,
117    u8,
118    3,
119    C3,
120    nppiYUVToBGRBatch_8u_P3C3R_Advanced_Ctx
121);
122
123macro_rules! impl_color_convert_batch_p3_to_c3_dispatch {
124    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
125        pub trait $trait: DataTypeLike {
126            fn $method(
127                stream_context: &StreamContext,
128                sources: &[PlanarImageView<'_, Self, 3>],
129                destinations: &mut [ImageViewMut<'_, Self, C3>],
130            ) -> Result<()>;
131        }
132
133        pub fn $function<T>(
134            stream_context: &StreamContext,
135            sources: &[PlanarImageView<'_, T, 3>],
136            destinations: &mut [ImageViewMut<'_, T, C3>],
137        ) -> Result<()>
138        where
139            T: $trait,
140        {
141            T::$method(stream_context, sources, destinations)
142        }
143
144        $(
145            impl $trait for $ty {
146                fn $method(
147                    stream_context: &StreamContext,
148                    sources: &[PlanarImageView<'_, Self, 3>],
149                    destinations: &mut [ImageViewMut<'_, Self, C3>],
150                ) -> Result<()> {
151                    $direct(stream_context, sources, destinations)
152                }
153            }
154        )*
155    };
156}
157
158impl_color_convert_batch_p3_to_c3_dispatch!(
159    YuvToRgbBatchP3ToC3,
160    yuv_to_rgb_batch_p3_to_c3,
161    yuv_to_rgb_batch_p3_to_c3,
162    [u8 => yuv_to_rgb_batch_u8_p3_to_c3]
163);
164impl_color_convert_batch_p3_to_c3_dispatch!(
165    YuvToRgbBatchP3ToC3Advanced,
166    yuv_to_rgb_batch_p3_to_c3_advanced,
167    yuv_to_rgb_batch_p3_to_c3_advanced,
168    [u8 => yuv_to_rgb_batch_u8_p3_to_c3_advanced]
169);
170impl_color_convert_batch_p3_to_c3_dispatch!(
171    YcbcrToRgbBatchP3ToC3,
172    ycbcr_to_rgb_batch_p3_to_c3,
173    ycbcr_to_rgb_batch_p3_to_c3,
174    [u8 => ycbcr_to_rgb_batch_u8_p3_to_c3]
175);
176impl_color_convert_batch_p3_to_c3_dispatch!(
177    YcbcrToRgbBatchP3ToC3Advanced,
178    ycbcr_to_rgb_batch_p3_to_c3_advanced,
179    ycbcr_to_rgb_batch_p3_to_c3_advanced,
180    [u8 => ycbcr_to_rgb_batch_u8_p3_to_c3_advanced]
181);
182impl_color_convert_batch_p3_to_c3_dispatch!(
183    YcbcrToBgrBatchP3ToC3,
184    ycbcr_to_bgr_batch_p3_to_c3,
185    ycbcr_to_bgr_batch_p3_to_c3,
186    [u8 => ycbcr_to_bgr_batch_u8_p3_to_c3]
187);
188impl_color_convert_batch_p3_to_c3_dispatch!(
189    YcbcrToBgrBatchP3ToC3Advanced,
190    ycbcr_to_bgr_batch_p3_to_c3_advanced,
191    ycbcr_to_bgr_batch_p3_to_c3_advanced,
192    [u8 => ycbcr_to_bgr_batch_u8_p3_to_c3_advanced]
193);
194impl_color_convert_batch_p3_to_c3_dispatch!(
195    YuvToBgrBatchP3ToC3,
196    yuv_to_bgr_batch_p3_to_c3,
197    yuv_to_bgr_batch_p3_to_c3,
198    [u8 => yuv_to_bgr_batch_u8_p3_to_c3]
199);
200impl_color_convert_batch_p3_to_c3_dispatch!(
201    YuvToBgrBatchP3ToC3Advanced,
202    yuv_to_bgr_batch_p3_to_c3_advanced,
203    yuv_to_bgr_batch_p3_to_c3_advanced,
204    [u8 => yuv_to_bgr_batch_u8_p3_to_c3_advanced]
205);
206
207impl_subsampled_color_convert_batch_planar_to_packed!(
208    yuv422_to_bgr_batch_u8_p3_to_c3,
209    u8,
210    C3,
211    nppiYUV422ToBGRBatch_8u_P3C3R_Ctx,
212    2,
213    1
214);
215impl_subsampled_color_convert_batch_planar_to_packed_advanced!(
216    yuv422_to_bgr_batch_u8_p3_to_c3_advanced,
217    u8,
218    C3,
219    nppiYUV422ToBGRBatch_8u_P3C3R_Advanced_Ctx,
220    2,
221    1
222);
223impl_subsampled_color_convert_batch_planar_to_packed!(
224    yuv420_to_bgr_batch_u8_p3_to_c3,
225    u8,
226    C3,
227    nppiYUV420ToBGRBatch_8u_P3C3R_Ctx,
228    2,
229    2
230);
231impl_subsampled_color_convert_batch_planar_to_packed_advanced!(
232    yuv420_to_bgr_batch_u8_p3_to_c3_advanced,
233    u8,
234    C3,
235    nppiYUV420ToBGRBatch_8u_P3C3R_Advanced_Ctx,
236    2,
237    2
238);
239
240macro_rules! impl_subsampled_color_convert_batch_p3_to_c3_dispatch {
241    ($trait:ident, $method:ident, $function:ident, [$($ty:ty => $direct:ident),* $(,)?]) => {
242        pub trait $trait: DataTypeLike {
243            fn $method(
244                stream_context: &StreamContext,
245                source_plane_0: &[ImageView<'_, Self, C1>],
246                source_plane_1: &[ImageView<'_, Self, C1>],
247                source_plane_2: &[ImageView<'_, Self, C1>],
248                destinations: &mut [ImageViewMut<'_, Self, C3>],
249            ) -> Result<()>;
250        }
251
252        pub fn $function<T>(
253            stream_context: &StreamContext,
254            source_plane_0: &[ImageView<'_, T, C1>],
255            source_plane_1: &[ImageView<'_, T, C1>],
256            source_plane_2: &[ImageView<'_, T, C1>],
257            destinations: &mut [ImageViewMut<'_, T, C3>],
258        ) -> Result<()>
259        where
260            T: $trait,
261        {
262            T::$method(
263                stream_context,
264                source_plane_0,
265                source_plane_1,
266                source_plane_2,
267                destinations,
268            )
269        }
270
271        $(
272            impl $trait for $ty {
273                fn $method(
274                    stream_context: &StreamContext,
275                    source_plane_0: &[ImageView<'_, Self, C1>],
276                    source_plane_1: &[ImageView<'_, Self, C1>],
277                    source_plane_2: &[ImageView<'_, Self, C1>],
278                    destinations: &mut [ImageViewMut<'_, Self, C3>],
279                ) -> Result<()> {
280                    $direct(
281                        stream_context,
282                        source_plane_0,
283                        source_plane_1,
284                        source_plane_2,
285                        destinations,
286                    )
287                }
288            }
289        )*
290    };
291}
292
293impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
294    Yuv422ToRgbBatchP3ToC3,
295    yuv422_to_rgb_batch_p3_to_c3,
296    yuv422_to_rgb_batch_p3_to_c3,
297    [u8 => yuv422_to_rgb_batch_u8_p3_to_c3]
298);
299impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
300    Yuv422ToRgbBatchP3ToC3Advanced,
301    yuv422_to_rgb_batch_p3_to_c3_advanced,
302    yuv422_to_rgb_batch_p3_to_c3_advanced,
303    [u8 => yuv422_to_rgb_batch_u8_p3_to_c3_advanced]
304);
305impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
306    Yuv420ToRgbBatchP3ToC3,
307    yuv420_to_rgb_batch_p3_to_c3,
308    yuv420_to_rgb_batch_p3_to_c3,
309    [u8 => yuv420_to_rgb_batch_u8_p3_to_c3]
310);
311impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
312    Yuv420ToRgbBatchP3ToC3Advanced,
313    yuv420_to_rgb_batch_p3_to_c3_advanced,
314    yuv420_to_rgb_batch_p3_to_c3_advanced,
315    [u8 => yuv420_to_rgb_batch_u8_p3_to_c3_advanced]
316);
317impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
318    Ycbcr422ToRgbBatchP3ToC3,
319    ycbcr422_to_rgb_batch_p3_to_c3,
320    ycbcr422_to_rgb_batch_p3_to_c3,
321    [u8 => ycbcr422_to_rgb_batch_u8_p3_to_c3]
322);
323impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
324    Ycbcr422ToRgbBatchP3ToC3Advanced,
325    ycbcr422_to_rgb_batch_p3_to_c3_advanced,
326    ycbcr422_to_rgb_batch_p3_to_c3_advanced,
327    [u8 => ycbcr422_to_rgb_batch_u8_p3_to_c3_advanced]
328);
329impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
330    Ycbcr420ToRgbBatchP3ToC3,
331    ycbcr420_to_rgb_batch_p3_to_c3,
332    ycbcr420_to_rgb_batch_p3_to_c3,
333    [u8 => ycbcr420_to_rgb_batch_u8_p3_to_c3]
334);
335impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
336    Ycbcr420ToRgbBatchP3ToC3Advanced,
337    ycbcr420_to_rgb_batch_p3_to_c3_advanced,
338    ycbcr420_to_rgb_batch_p3_to_c3_advanced,
339    [u8 => ycbcr420_to_rgb_batch_u8_p3_to_c3_advanced]
340);
341impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
342    Ycbcr422ToBgrBatchP3ToC3,
343    ycbcr422_to_bgr_batch_p3_to_c3,
344    ycbcr422_to_bgr_batch_p3_to_c3,
345    [u8 => ycbcr422_to_bgr_batch_u8_p3_to_c3]
346);
347impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
348    Ycbcr422ToBgrBatchP3ToC3Advanced,
349    ycbcr422_to_bgr_batch_p3_to_c3_advanced,
350    ycbcr422_to_bgr_batch_p3_to_c3_advanced,
351    [u8 => ycbcr422_to_bgr_batch_u8_p3_to_c3_advanced]
352);
353impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
354    Ycbcr420ToBgrBatchP3ToC3,
355    ycbcr420_to_bgr_batch_p3_to_c3,
356    ycbcr420_to_bgr_batch_p3_to_c3,
357    [u8 => ycbcr420_to_bgr_batch_u8_p3_to_c3]
358);
359impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
360    Ycbcr420ToBgrBatchP3ToC3Advanced,
361    ycbcr420_to_bgr_batch_p3_to_c3_advanced,
362    ycbcr420_to_bgr_batch_p3_to_c3_advanced,
363    [u8 => ycbcr420_to_bgr_batch_u8_p3_to_c3_advanced]
364);
365impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
366    Yuv422ToBgrBatchP3ToC3,
367    yuv422_to_bgr_batch_p3_to_c3,
368    yuv422_to_bgr_batch_p3_to_c3,
369    [u8 => yuv422_to_bgr_batch_u8_p3_to_c3]
370);
371impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
372    Yuv422ToBgrBatchP3ToC3Advanced,
373    yuv422_to_bgr_batch_p3_to_c3_advanced,
374    yuv422_to_bgr_batch_p3_to_c3_advanced,
375    [u8 => yuv422_to_bgr_batch_u8_p3_to_c3_advanced]
376);
377impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
378    Yuv420ToBgrBatchP3ToC3,
379    yuv420_to_bgr_batch_p3_to_c3,
380    yuv420_to_bgr_batch_p3_to_c3,
381    [u8 => yuv420_to_bgr_batch_u8_p3_to_c3]
382);
383impl_subsampled_color_convert_batch_p3_to_c3_dispatch!(
384    Yuv420ToBgrBatchP3ToC3Advanced,
385    yuv420_to_bgr_batch_p3_to_c3_advanced,
386    yuv420_to_bgr_batch_p3_to_c3_advanced,
387    [u8 => yuv420_to_bgr_batch_u8_p3_to_c3_advanced]
388);
389
390impl_color_convert_planar_to_planar!(yuv_to_bgr_u8_p3, u8, 3, nppiYUVToBGR_8u_P3R_Ctx);
391impl_color_convert_packed_to_planar!(bgr_to_yuv_u8_c3_to_p3, u8, C3, 3, nppiBGRToYUV_8u_C3P3R_Ctx);
392impl_color_convert_packed_to_planar!(
393    bgr_to_yuv_u8_ac4_to_p4,
394    u8,
395    AC4,
396    4,
397    nppiBGRToYUV_8u_AC4P4R_Ctx
398);
399impl_color_convert_planar_to_packed!(yuv_to_bgr_u8_p3_to_c3, u8, 3, C3, nppiYUVToBGR_8u_P3C3R_Ctx);
400
401macro_rules! impl_color_convert_packed_c3_to_planar_dispatch {
402    ($trait:ident, $method:ident, $function:ident, $planes:literal, [$($ty:ty => $direct:ident),* $(,)?]) => {
403        pub trait $trait: DataTypeLike {
404            fn $method(
405                stream_context: &StreamContext,
406                source: &ImageView<'_, Self, C3>,
407                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
408            ) -> Result<()>;
409        }
410
411        pub fn $function<T>(
412            stream_context: &StreamContext,
413            source: &ImageView<'_, T, C3>,
414            destination: &mut PlanarImageViewMut<'_, T, $planes>,
415        ) -> Result<()>
416        where
417            T: $trait,
418        {
419            T::$method(stream_context, source, destination)
420        }
421
422        $(
423            impl $trait for $ty {
424                fn $method(
425                    stream_context: &StreamContext,
426                    source: &ImageView<'_, Self, C3>,
427                    destination: &mut PlanarImageViewMut<'_, Self, $planes>,
428                ) -> Result<()> {
429                    $direct(stream_context, source, destination)
430                }
431            }
432        )*
433    };
434}
435
436macro_rules! impl_color_convert_planar_to_packed_c3_dispatch {
437    ($trait:ident, $method:ident, $function:ident, $planes:literal, [$($ty:ty => $direct:ident),* $(,)?]) => {
438        pub trait $trait: DataTypeLike {
439            fn $method(
440                stream_context: &StreamContext,
441                source: &PlanarImageView<'_, Self, $planes>,
442                destination: &mut ImageViewMut<'_, Self, C3>,
443            ) -> Result<()>;
444        }
445
446        pub fn $function<T>(
447            stream_context: &StreamContext,
448            source: &PlanarImageView<'_, T, $planes>,
449            destination: &mut ImageViewMut<'_, T, C3>,
450        ) -> Result<()>
451        where
452            T: $trait,
453        {
454            T::$method(stream_context, source, destination)
455        }
456
457        $(
458            impl $trait for $ty {
459                fn $method(
460                    stream_context: &StreamContext,
461                    source: &PlanarImageView<'_, Self, $planes>,
462                    destination: &mut ImageViewMut<'_, Self, C3>,
463                ) -> Result<()> {
464                    $direct(stream_context, source, destination)
465                }
466            }
467        )*
468    };
469}
470
471macro_rules! impl_color_convert_planar_to_planar_dispatch {
472    ($trait:ident, $method:ident, $function:ident, $planes:literal, [$($ty:ty => $direct:ident),* $(,)?]) => {
473        pub trait $trait: DataTypeLike {
474            fn $method(
475                stream_context: &StreamContext,
476                source: &PlanarImageView<'_, Self, $planes>,
477                destination: &mut PlanarImageViewMut<'_, Self, $planes>,
478            ) -> Result<()>;
479        }
480
481        pub fn $function<T>(
482            stream_context: &StreamContext,
483            source: &PlanarImageView<'_, T, $planes>,
484            destination: &mut PlanarImageViewMut<'_, T, $planes>,
485        ) -> Result<()>
486        where
487            T: $trait,
488        {
489            T::$method(stream_context, source, destination)
490        }
491
492        $(
493            impl $trait for $ty {
494                fn $method(
495                    stream_context: &StreamContext,
496                    source: &PlanarImageView<'_, Self, $planes>,
497                    destination: &mut PlanarImageViewMut<'_, Self, $planes>,
498                ) -> Result<()> {
499                    $direct(stream_context, source, destination)
500                }
501            }
502        )*
503    };
504}
505
506impl_color_convert_packed_c3_to_planar_dispatch!(
507    RgbToYuvC3ToP3,
508    rgb_to_yuv_c3_to_p3,
509    rgb_to_yuv_c3_to_p3,
510    3,
511    [u8 => rgb_to_yuv_u8_c3_to_p3]
512);
513impl_color_convert_packed_c3_to_planar_dispatch!(
514    BgrToYuvC3ToP3,
515    bgr_to_yuv_c3_to_p3,
516    bgr_to_yuv_c3_to_p3,
517    3,
518    [u8 => bgr_to_yuv_u8_c3_to_p3]
519);
520impl_color_convert_planar_to_packed_c3_dispatch!(
521    YuvToRgbP3ToC3,
522    yuv_to_rgb_p3_to_c3,
523    yuv_to_rgb_p3_to_c3,
524    3,
525    [u8 => yuv_to_rgb_u8_p3_to_c3]
526);
527impl_color_convert_planar_to_packed_c3_dispatch!(
528    YuvToBgrP3ToC3,
529    yuv_to_bgr_p3_to_c3,
530    yuv_to_bgr_p3_to_c3,
531    3,
532    [u8 => yuv_to_bgr_u8_p3_to_c3]
533);
534impl_color_convert_planar_to_planar_dispatch!(RgbToYuvP3, rgb_to_yuv_p3, rgb_to_yuv_p3, 3, [
535    u8 => rgb_to_yuv_u8_p3,
536]);
537impl_color_convert_planar_to_planar_dispatch!(BgrToYuvP3, bgr_to_yuv_p3, bgr_to_yuv_p3, 3, [
538    u8 => bgr_to_yuv_u8_p3,
539]);
540impl_color_convert_planar_to_planar_dispatch!(YuvToRgbP3, yuv_to_rgb_p3, yuv_to_rgb_p3, 3, [
541    u8 => yuv_to_rgb_u8_p3,
542]);
543impl_color_convert_planar_to_planar_dispatch!(YuvToBgrP3, yuv_to_bgr_p3, yuv_to_bgr_p3, 3, [
544    u8 => yuv_to_bgr_u8_p3,
545]);