mediaframe/source/gbrapf16/
mod.rs1use crate::{
14 PixelSink, SourceFormat,
15 frame::{Gbrapf16Frame, Gbrapf16LeFrame},
16 source::sealed::Sealed,
17};
18
19#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
22pub struct Gbrapf16<const BE: bool = false>;
23
24impl<const BE: bool> Sealed for Gbrapf16<BE> {}
25impl<const BE: bool> SourceFormat for Gbrapf16<BE> {}
26
27#[derive(Debug, Clone, Copy)]
31pub struct Gbrapf16Row<'a> {
32 g: &'a [half::f16],
33 b: &'a [half::f16],
34 r: &'a [half::f16],
35 a: &'a [half::f16],
36 row: usize,
37}
38
39impl<'a> Gbrapf16Row<'a> {
40 #[cfg_attr(not(tarpaulin), inline(always))]
41 pub(crate) fn new(
42 g: &'a [half::f16],
43 b: &'a [half::f16],
44 r: &'a [half::f16],
45 a: &'a [half::f16],
46 row: usize,
47 ) -> Self {
48 Self { g, b, r, a, row }
49 }
50
51 #[cfg_attr(not(tarpaulin), inline(always))]
53 pub fn g(&self) -> &'a [half::f16] {
54 self.g
55 }
56 #[cfg_attr(not(tarpaulin), inline(always))]
58 pub fn b(&self) -> &'a [half::f16] {
59 self.b
60 }
61 #[cfg_attr(not(tarpaulin), inline(always))]
63 pub fn r(&self) -> &'a [half::f16] {
64 self.r
65 }
66 #[cfg_attr(not(tarpaulin), inline(always))]
68 pub fn a(&self) -> &'a [half::f16] {
69 self.a
70 }
71 #[cfg_attr(not(tarpaulin), inline(always))]
73 pub const fn row(&self) -> usize {
74 self.row
75 }
76}
77
78pub trait Gbrapf16Sink<const BE: bool = false>:
81 for<'a> PixelSink<Input<'a> = Gbrapf16Row<'a>>
82{
83}
84
85pub fn gbrapf16_to_endian<S, const BE: bool>(
90 src: &Gbrapf16Frame<'_, BE>,
91 sink: &mut S,
92) -> Result<(), S::Error>
93where
94 S: Gbrapf16Sink<BE>,
95{
96 sink.begin_frame(src.width(), src.height())?;
97
98 let w = src.width() as usize;
99 let h = src.height() as usize;
100 let g_plane = src.g();
101 let b_plane = src.b();
102 let r_plane = src.r();
103 let a_plane = src.a();
104 let g_stride = src.g_stride() as usize;
105 let b_stride = src.b_stride() as usize;
106 let r_stride = src.r_stride() as usize;
107 let a_stride = src.a_stride() as usize;
108
109 for row in 0..h {
110 let g = &g_plane[row * g_stride..row * g_stride + w];
111 let b = &b_plane[row * b_stride..row * b_stride + w];
112 let r = &r_plane[row * r_stride..row * r_stride + w];
113 let a = &a_plane[row * a_stride..row * a_stride + w];
114 sink.process(Gbrapf16Row::new(g, b, r, a, row))?;
115 }
116 Ok(())
117}
118
119#[cfg_attr(not(tarpaulin), inline(always))]
129pub fn gbrapf16_to<S>(src: &Gbrapf16LeFrame<'_>, sink: &mut S) -> Result<(), S::Error>
130where
131 S: Gbrapf16Sink<false>,
132{
133 gbrapf16_to_endian::<S, false>(src, sink)
134}
135
136#[cfg(all(test, feature = "std"))]
137mod tests;