Skip to content

Commit fc320d8

Browse files
committed
Replace manual bookkeeping and unsafe{set_len()} with safe Vec methods
1 parent df6173b commit fc320d8

File tree

1 file changed

+9
-40
lines changed

1 file changed

+9
-40
lines changed

src/avx2/ycbcr.rs

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ macro_rules! ycbcr_image_avx2 {
4949
}
5050

5151
let [y_buffer, cb_buffer, cr_buffer, _] = buffers;
52-
// if spare capacity is less than self.width(), slicing will fail here
53-
let mut y_buffer = &mut y_buffer.spare_capacity_mut()[..self.width() as usize];
54-
let mut cb_buffer = &mut cb_buffer.spare_capacity_mut()[..self.width() as usize];
55-
let mut cr_buffer = &mut cr_buffer.spare_capacity_mut()[..self.width() as usize];
52+
y_buffer.reserve(self.width() as usize);
53+
cb_buffer.reserve(self.width() as usize);
54+
cr_buffer.reserve(self.width() as usize);
5655

5756
let ymulr = _mm256_set1_epi32(19595);
5857
let ymulg = _mm256_set1_epi32(38470);
@@ -85,11 +84,7 @@ macro_rules! ycbcr_image_avx2 {
8584
let y: [i32; 8] = avx_as_i32_array(y);
8685
let mut y: [u8; 8] = y.map(|x| x as u8);
8786
y.reverse();
88-
89-
for (in_byte, out_byte) in y.iter().copied().zip(y_buffer[..8].iter_mut()) {
90-
out_byte.write(in_byte);
91-
}
92-
y_buffer = &mut y_buffer[8..];
87+
y_buffer.extend_from_slice(&y);
9388

9489
let cbr = _mm256_mullo_epi32(cbmulr, r);
9590
let cbg = _mm256_mullo_epi32(cbmulg, g);
@@ -102,11 +97,7 @@ macro_rules! ycbcr_image_avx2 {
10297
let cb: [i32; 8] = avx_as_i32_array(cb);
10398
let mut cb: [u8; 8] = cb.map(|x| x as u8);
10499
cb.reverse();
105-
106-
for (in_byte, out_byte) in cb.iter().copied().zip(cb_buffer[..8].iter_mut()) {
107-
out_byte.write(in_byte);
108-
}
109-
cb_buffer = &mut cb_buffer[8..];
100+
cb_buffer.extend_from_slice(&cb);
110101

111102
let crr = _mm256_mullo_epi32(crmulr, r);
112103
let crg = _mm256_mullo_epi32(crmulg, g);
@@ -119,38 +110,16 @@ macro_rules! ycbcr_image_avx2 {
119110
let cr: [i32; 8] = avx_as_i32_array(cr);
120111
let mut cr: [u8; 8] = cr.map(|x| x as u8);
121112
cr.reverse();
122-
123-
for (in_byte, out_byte) in cr.iter().copied().zip(cr_buffer[..8].iter_mut()) {
124-
out_byte.write(in_byte);
125-
}
126-
cr_buffer = &mut cr_buffer[8..];
113+
cr_buffer.extend_from_slice(&cr);
127114
}
128115

129116
for _ in 0..self.width() % 8 {
130117
let (y, cb, cr) = rgb_to_ycbcr(data[$o1], data[$o2], data[$o3]);
131-
132118
data = &data[$num_colors..];
133119

134-
y_buffer[0].write(y);
135-
y_buffer = &mut y_buffer[1..];
136-
137-
cb_buffer[0].write(cb);
138-
cb_buffer = &mut cb_buffer[1..];
139-
140-
cr_buffer[0].write(cr);
141-
cr_buffer = &mut cr_buffer[1..];
142-
}
143-
144-
// SAFETY: We know the buffers are long enough,
145-
// otherwise `buffer.spare_capacity_mut()[..self.width()]` above would panic,
146-
// and we've just filled these with data.
147-
//
148-
// We do this at the end so that if the above code panics, and the panic is caught,
149-
// the vectors will not have their length inflated yet and uninit memory will not be exposed
150-
unsafe {
151-
buffers[0].set_len(buffers[0].len() + self.width() as usize);
152-
buffers[1].set_len(buffers[1].len() + self.width() as usize);
153-
buffers[2].set_len(buffers[2].len() + self.width() as usize);
120+
y_buffer.push(y);
121+
cb_buffer.push(cb);
122+
cr_buffer.push(cr);
154123
}
155124
}
156125
}

0 commit comments

Comments
 (0)