Skip to content

Commit c0d40d0

Browse files
Shnatselvstroebel
authored andcommitted
Fewer copies when writing metadata
1 parent fd7b408 commit c0d40d0

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

src/encoder.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,20 @@ impl<W: JfifWrite> Encoder<W> {
354354
///
355355
/// Returns an error if the segment number is invalid or data exceeds the allowed size
356356
pub fn add_app_segment(&mut self, segment_nr: u8, data: &[u8]) -> Result<(), EncodingError> {
357+
self.add_app_segment_internal(segment_nr, data.to_vec())
358+
}
359+
360+
fn add_app_segment_internal(
361+
&mut self,
362+
segment_nr: u8,
363+
data: Vec<u8>,
364+
) -> Result<(), EncodingError> {
357365
if segment_nr == 0 || segment_nr > 15 {
358366
Err(EncodingError::InvalidAppSegment(segment_nr))
359367
} else if data.len() > 65533 {
360368
Err(EncodingError::AppSegmentTooLarge(data.len()))
361369
} else {
362-
self.app_segments.push((segment_nr, data.to_vec()));
370+
self.app_segments.push((segment_nr, data));
363371
Ok(())
364372
}
365373
}
@@ -385,16 +393,14 @@ impl<W: JfifWrite> Encoder<W> {
385393
return Err(EncodingError::IccTooLarge(data.len()));
386394
}
387395

388-
let mut chunk_data = Vec::with_capacity(MAX_CHUNK_LENGTH);
389-
390396
for (i, data) in data.chunks(MAX_CHUNK_LENGTH).enumerate() {
391-
chunk_data.clear();
397+
let mut chunk_data = Vec::with_capacity(MAX_CHUNK_LENGTH);
392398
chunk_data.extend_from_slice(MARKER);
393399
chunk_data.push(i as u8 + 1);
394400
chunk_data.push(num_chunks as u8);
395401
chunk_data.extend_from_slice(data);
396402

397-
self.add_app_segment(2, &chunk_data)?;
403+
self.add_app_segment_internal(2, chunk_data)?;
398404
}
399405

400406
Ok(())

0 commit comments

Comments
 (0)