Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions src/encoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,12 +354,20 @@ impl<W: JfifWrite> Encoder<W> {
///
/// Returns an error if the segment number is invalid or data exceeds the allowed size
pub fn add_app_segment(&mut self, segment_nr: u8, data: &[u8]) -> Result<(), EncodingError> {
self.add_app_segment_internal(segment_nr, data.to_vec())
}

fn add_app_segment_internal(
&mut self,
segment_nr: u8,
data: Vec<u8>,
) -> Result<(), EncodingError> {
if segment_nr == 0 || segment_nr > 15 {
Err(EncodingError::InvalidAppSegment(segment_nr))
} else if data.len() > 65533 {
Err(EncodingError::AppSegmentTooLarge(data.len()))
} else {
self.app_segments.push((segment_nr, data.to_vec()));
self.app_segments.push((segment_nr, data));
Ok(())
}
}
Expand All @@ -385,16 +393,14 @@ impl<W: JfifWrite> Encoder<W> {
return Err(EncodingError::IccTooLarge(data.len()));
}

let mut chunk_data = Vec::with_capacity(MAX_CHUNK_LENGTH);

for (i, data) in data.chunks(MAX_CHUNK_LENGTH).enumerate() {
chunk_data.clear();
let mut chunk_data = Vec::with_capacity(MAX_CHUNK_LENGTH);
chunk_data.extend_from_slice(MARKER);
chunk_data.push(i as u8 + 1);
chunk_data.push(num_chunks as u8);
chunk_data.extend_from_slice(data);

self.add_app_segment(2, &chunk_data)?;
self.add_app_segment_internal(2, chunk_data)?;
}

Ok(())
Expand Down
Loading