Skip to content

Commit f295220

Browse files
authored
Avoid cloning frame (#126)
1 parent de20379 commit f295220

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

src/decoder.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -643,10 +643,8 @@ impl<R: BufRead + Seek> WebPDecoder<R> {
643643
.chunks
644644
.get(&WebPRiffChunk::VP8)
645645
.ok_or(DecodingError::ChunkMissing)?;
646-
// TODO: avoid cloning frame
647-
let frame = Vp8Decoder::new(range_reader(&mut self.r, range.start..range.end)?)
648-
.decode_frame()?
649-
.clone();
646+
let reader = range_reader(&mut self.r, range.start..range.end)?;
647+
let frame = Vp8Decoder::decode_frame(reader)?;
650648
if u32::from(frame.width) != self.width || u32::from(frame.height) != self.height {
651649
return Err(DecodingError::InconsistentImageSizes);
652650
}
@@ -750,8 +748,7 @@ impl<R: BufRead + Seek> WebPDecoder<R> {
750748
let (frame, frame_has_alpha): (Vec<u8>, bool) = match chunk {
751749
WebPRiffChunk::VP8 => {
752750
let reader = (&mut self.r).take(chunk_size);
753-
let mut vp8_decoder = Vp8Decoder::new(reader);
754-
let raw_frame = vp8_decoder.decode_frame()?;
751+
let raw_frame = Vp8Decoder::decode_frame(reader)?;
755752
if u32::from(raw_frame.width) != frame_width
756753
|| u32::from(raw_frame.height) != frame_height
757754
{
@@ -786,8 +783,7 @@ impl<R: BufRead + Seek> WebPDecoder<R> {
786783
return Err(DecodingError::ChunkHeaderInvalid(next_chunk.to_fourcc()));
787784
}
788785

789-
let mut vp8_decoder = Vp8Decoder::new((&mut self.r).take(next_chunk_size));
790-
let frame = vp8_decoder.decode_frame()?;
786+
let frame = Vp8Decoder::decode_frame((&mut self.r).take(next_chunk_size))?;
791787

792788
let mut rgba_frame = vec![0; frame_width as usize * frame_height as usize * 4];
793789
frame.fill_rgba(&mut rgba_frame);

src/vp8.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,7 @@ pub struct Vp8Decoder<R> {
10861086
impl<R: Read> Vp8Decoder<R> {
10871087
/// Create a new decoder.
10881088
/// The reader must present a raw vp8 bitstream to the decoder
1089-
pub fn new(r: R) -> Self {
1089+
fn new(r: R) -> Self {
10901090
let f = Frame::default();
10911091
let s = Segment::default();
10921092
let m = MacroBlock::default();
@@ -2168,7 +2168,12 @@ impl<R: Read> Vp8Decoder<R> {
21682168
}
21692169

21702170
/// Decodes the current frame
2171-
pub fn decode_frame(&mut self) -> Result<&Frame, DecodingError> {
2171+
pub fn decode_frame(r: R) -> Result<Frame, DecodingError> {
2172+
let decoder = Self::new(r);
2173+
decoder.decode_frame_()
2174+
}
2175+
2176+
fn decode_frame_(mut self) -> Result<Frame, DecodingError> {
21722177
self.read_frame_header()?;
21732178

21742179
for mby in 0..self.mbheight as usize {
@@ -2210,7 +2215,7 @@ impl<R: Read> Vp8Decoder<R> {
22102215
}
22112216
}
22122217

2213-
Ok(&self.frame)
2218+
Ok(self.frame)
22142219
}
22152220
}
22162221

0 commit comments

Comments
 (0)