/rust/registry/src/index.crates.io-6f17d22bba15001f/exr-1.73.0/src/block/reader.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Composable structures to handle reading an image. |
2 | | |
3 | | |
4 | | use std::convert::TryFrom; |
5 | | use std::fmt::Debug; |
6 | | use std::io::{Read, Seek}; |
7 | | use std::sync::mpsc; |
8 | | use rayon_core::{ThreadPool, ThreadPoolBuildError}; |
9 | | |
10 | | use smallvec::alloc::sync::Arc; |
11 | | |
12 | | use crate::block::{BlockIndex, UncompressedBlock}; |
13 | | use crate::block::chunk::{Chunk, TileCoordinates}; |
14 | | use crate::compression::Compression; |
15 | | use crate::error::{Error, Result, u64_to_usize, UnitResult}; |
16 | | use crate::io::{PeekRead, Tracking}; |
17 | | use crate::meta::{MetaData, OffsetTables}; |
18 | | use crate::meta::header::Header; |
19 | | |
20 | | /// Decode the meta data from a byte source, keeping the source ready for further reading. |
21 | | /// Continue decoding the remaining bytes by calling `filtered_chunks` or `all_chunks`. |
22 | | #[derive(Debug)] |
23 | | pub struct Reader<R> { |
24 | | meta_data: MetaData, |
25 | | remaining_reader: PeekRead<Tracking<R>>, // TODO does R need to be Seek or is Tracking enough? |
26 | | } |
27 | | |
28 | | impl<R: Read + Seek> Reader<R> { |
29 | | |
30 | | /// Start the reading process. |
31 | | /// Immediately decodes the meta data into an internal field. |
32 | | /// Access it via`meta_data()`. |
33 | 0 | pub fn read_from_buffered(read: R, pedantic: bool) -> Result<Self> { |
34 | 0 | let mut remaining_reader = PeekRead::new(Tracking::new(read)); |
35 | 0 | let meta_data = MetaData::read_validated_from_buffered_peekable(&mut remaining_reader, pedantic)?; |
36 | 0 | Ok(Self { meta_data, remaining_reader }) |
37 | 0 | } Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<_>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::read_from_buffered Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::read_from_buffered |
38 | | |
39 | | // must not be mutable, as reading the file later on relies on the meta data |
40 | | /// The decoded exr meta data from the file. |
41 | 0 | pub fn meta_data(&self) -> &MetaData { &self.meta_data } Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<_>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::meta_data Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::meta_data |
42 | | |
43 | | /// The decoded exr meta data from the file. |
44 | 0 | pub fn headers(&self) -> &[Header] { &self.meta_data.headers } Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<_>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::headers Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::headers |
45 | | |
46 | | /// Obtain the meta data ownership. |
47 | 0 | pub fn into_meta_data(self) -> MetaData { self.meta_data } |
48 | | |
49 | | /// Prepare to read all the chunks from the file. |
50 | | /// Does not decode the chunks now, but returns a decoder. |
51 | | /// Reading all chunks reduces seeking the file, but some chunks might be read without being used. |
52 | 0 | pub fn all_chunks(mut self, pedantic: bool) -> Result<AllChunksReader<R>> { |
53 | 0 | let total_chunk_count = { |
54 | 0 | if pedantic { |
55 | 0 | let offset_tables = MetaData::read_offset_tables(&mut self.remaining_reader, &self.meta_data.headers)?; |
56 | 0 | validate_offset_tables(self.meta_data.headers.as_slice(), &offset_tables, self.remaining_reader.byte_position())?; |
57 | 0 | offset_tables.iter().map(|table| table.len()).sum() |
58 | | } |
59 | | else { |
60 | 0 | usize::try_from(MetaData::skip_offset_tables(&mut self.remaining_reader, &self.meta_data.headers)?) |
61 | 0 | .expect("too large chunk count for this machine") |
62 | | } |
63 | | }; |
64 | | |
65 | 0 | Ok(AllChunksReader { |
66 | 0 | meta_data: self.meta_data, |
67 | 0 | remaining_chunks: 0 .. total_chunk_count, |
68 | 0 | remaining_bytes: self.remaining_reader, |
69 | 0 | pedantic |
70 | 0 | }) |
71 | 0 | } |
72 | | |
73 | | /// Prepare to read some the chunks from the file. |
74 | | /// Does not decode the chunks now, but returns a decoder. |
75 | | /// Reading only some chunks may seeking the file, potentially skipping many bytes. |
76 | | // TODO tile indices add no new information to block index?? |
77 | 0 | pub fn filter_chunks(mut self, pedantic: bool, mut filter: impl FnMut(&MetaData, TileCoordinates, BlockIndex) -> bool) -> Result<FilteredChunksReader<R>> { |
78 | 0 | let offset_tables = MetaData::read_offset_tables(&mut self.remaining_reader, &self.meta_data.headers)?; |
79 | | |
80 | | // TODO regardless of pedantic, if invalid, read all chunks instead, and filter after reading each chunk? |
81 | 0 | if pedantic { |
82 | 0 | validate_offset_tables( |
83 | 0 | self.meta_data.headers.as_slice(), &offset_tables, |
84 | 0 | self.remaining_reader.byte_position() |
85 | 0 | )?; |
86 | 0 | } |
87 | | |
88 | 0 | let mut filtered_offsets = Vec::with_capacity( |
89 | 0 | (self.meta_data.headers.len() * 32).min(2*2048) |
90 | 0 | ); |
91 | | |
92 | | // TODO detect whether the filter actually would skip chunks, and aviod sorting etc when not filtering is applied |
93 | | |
94 | 0 | for (header_index, header) in self.meta_data.headers.iter().enumerate() { // offset tables are stored same order as headers |
95 | 0 | for (block_index, tile) in header.blocks_increasing_y_order().enumerate() { // in increasing_y order |
96 | 0 | let data_indices = header.get_absolute_block_pixel_coordinates(tile.location)?; |
97 | | |
98 | 0 | let block = BlockIndex { |
99 | 0 | layer: header_index, |
100 | 0 | level: tile.location.level_index, |
101 | 0 | pixel_position: data_indices.position.to_usize("data indices start")?, |
102 | 0 | pixel_size: data_indices.size, |
103 | 0 | }; |
104 | 0 |
|
105 | 0 | if filter(&self.meta_data, tile.location, block) { |
106 | 0 | filtered_offsets.push(offset_tables[header_index][block_index]) // safe indexing from `enumerate()` |
107 | 0 | } |
108 | | }; |
109 | | } |
110 | | |
111 | 0 | filtered_offsets.sort_unstable(); // enables reading continuously if possible (already sorted where line order increasing) |
112 | 0 |
|
113 | 0 | if pedantic { |
114 | | // table is sorted. if any two neighbours are equal, we have duplicates. this is invalid. |
115 | 0 | if filtered_offsets.windows(2).any(|pair| pair[0] == pair[1]) { Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<_>>::filter_chunks::<_>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}>::{closure#0} |
116 | 0 | return Err(Error::invalid("chunk offset table")) |
117 | 0 | } |
118 | 0 | } |
119 | | |
120 | 0 | Ok(FilteredChunksReader { |
121 | 0 | meta_data: self.meta_data, |
122 | 0 | expected_filtered_chunk_count: filtered_offsets.len(), |
123 | 0 | remaining_filtered_chunk_indices: filtered_offsets.into_iter(), |
124 | 0 | remaining_bytes: self.remaining_reader |
125 | 0 | }) |
126 | 0 | } Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<_>>::filter_chunks::<_> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#0}> Unexecuted instantiation: <exr::block::reader::Reader<std::io::cursor::Cursor<&[u8]>>>::filter_chunks::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#0}> |
127 | | } |
128 | | |
129 | | |
130 | 0 | fn validate_offset_tables(headers: &[Header], offset_tables: &OffsetTables, chunks_start_byte: usize) -> UnitResult { |
131 | 0 | let max_pixel_bytes: usize = headers.iter() // when compressed, chunks are smaller, but never larger than max |
132 | 0 | .map(|header| header.max_pixel_file_bytes()) |
133 | 0 | .sum(); |
134 | 0 |
|
135 | 0 | // check that each offset is within the bounds |
136 | 0 | let end_byte = chunks_start_byte + max_pixel_bytes; |
137 | 0 | let is_invalid = offset_tables.iter().flatten().map(|&u64| u64_to_usize(u64)) |
138 | 0 | .any(|chunk_start| chunk_start < chunks_start_byte || chunk_start > end_byte); |
139 | 0 |
|
140 | 0 | if is_invalid { Err(Error::invalid("offset table")) } |
141 | 0 | else { Ok(()) } |
142 | 0 | } |
143 | | |
144 | | |
145 | | |
146 | | |
147 | | /// Decode the desired chunks and skip the unimportant chunks in the file. |
148 | | /// The decoded chunks can be decompressed by calling |
149 | | /// `decompress_parallel`, `decompress_sequential`, or `sequential_decompressor` or `parallel_decompressor`. |
150 | | /// Call `on_progress` to have a callback with each block. |
151 | | /// Also contains the image meta data. |
152 | | #[derive(Debug)] |
153 | | pub struct FilteredChunksReader<R> { |
154 | | meta_data: MetaData, |
155 | | expected_filtered_chunk_count: usize, |
156 | | remaining_filtered_chunk_indices: std::vec::IntoIter<u64>, |
157 | | remaining_bytes: PeekRead<Tracking<R>>, |
158 | | } |
159 | | |
160 | | /// Decode all chunks in the file without seeking. |
161 | | /// The decoded chunks can be decompressed by calling |
162 | | /// `decompress_parallel`, `decompress_sequential`, or `sequential_decompressor` or `parallel_decompressor`. |
163 | | /// Call `on_progress` to have a callback with each block. |
164 | | /// Also contains the image meta data. |
165 | | #[derive(Debug)] |
166 | | pub struct AllChunksReader<R> { |
167 | | meta_data: MetaData, |
168 | | remaining_chunks: std::ops::Range<usize>, |
169 | | remaining_bytes: PeekRead<Tracking<R>>, |
170 | | pedantic: bool, |
171 | | } |
172 | | |
173 | | /// Decode chunks in the file without seeking. |
174 | | /// Calls the supplied closure for each chunk. |
175 | | /// The decoded chunks can be decompressed by calling |
176 | | /// `decompress_parallel`, `decompress_sequential`, or `sequential_decompressor`. |
177 | | /// Also contains the image meta data. |
178 | | #[derive(Debug)] |
179 | | pub struct OnProgressChunksReader<R, F> { |
180 | | chunks_reader: R, |
181 | | decoded_chunks: usize, |
182 | | callback: F, |
183 | | } |
184 | | |
185 | | /// Decode chunks in the file. |
186 | | /// The decoded chunks can be decompressed by calling |
187 | | /// `decompress_parallel`, `decompress_sequential`, or `sequential_decompressor`. |
188 | | /// Call `on_progress` to have a callback with each block. |
189 | | /// Also contains the image meta data. |
190 | | pub trait ChunksReader: Sized + Iterator<Item=Result<Chunk>> + ExactSizeIterator { |
191 | | |
192 | | /// The decoded exr meta data from the file. |
193 | | fn meta_data(&self) -> &MetaData; |
194 | | |
195 | | /// The decoded exr headers from the file. |
196 | 0 | fn headers(&self) -> &[Header] { &self.meta_data().headers } |
197 | | |
198 | | /// The number of chunks that this reader will return in total. |
199 | | /// Can be less than the total number of chunks in the file, if some chunks are skipped. |
200 | | fn expected_chunk_count(&self) -> usize; |
201 | | |
202 | | /// Read the next compressed chunk from the file. |
203 | | /// Equivalent to `.next()`, as this also is an iterator. |
204 | | /// Returns `None` if all chunks have been read. |
205 | 0 | fn read_next_chunk(&mut self) -> Option<Result<Chunk>> { self.next() } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::read_next_chunk |
206 | | |
207 | | /// Create a new reader that calls the provided progress |
208 | | /// callback for each chunk that is read from the file. |
209 | | /// If the file can be successfully decoded, |
210 | | /// the progress will always at least once include 0.0 at the start and 1.0 at the end. |
211 | 0 | fn on_progress<F>(self, on_progress: F) -> OnProgressChunksReader<Self, F> where F: FnMut(f64) { |
212 | 0 | OnProgressChunksReader { chunks_reader: self, callback: on_progress, decoded_chunks: 0 } |
213 | 0 | } Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::on_progress::<_> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::on_progress::<&mut fn(f64)> |
214 | | |
215 | | /// Decompress all blocks in the file, using multiple cpu cores, and call the supplied closure for each block. |
216 | | /// The order of the blocks is not deterministic. |
217 | | /// You can also use `parallel_decompressor` to obtain an iterator instead. |
218 | | /// Will fallback to sequential processing where threads are not available, or where it would not speed up the process. |
219 | | // FIXME try async + futures instead of rayon! Maybe even allows for external async decoding? (-> impl Stream<UncompressedBlock>) |
220 | 0 | fn decompress_parallel( |
221 | 0 | self, pedantic: bool, |
222 | 0 | mut insert_block: impl FnMut(&MetaData, UncompressedBlock) -> UnitResult |
223 | 0 | ) -> UnitResult |
224 | 0 | { |
225 | 0 | let mut decompressor = match self.parallel_decompressor(pedantic) { |
226 | 0 | Err(old_self) => return old_self.decompress_sequential(pedantic, insert_block), |
227 | 0 | Ok(decompressor) => decompressor, |
228 | | }; |
229 | | |
230 | 0 | while let Some(block) = decompressor.next() { |
231 | 0 | insert_block(decompressor.meta_data(), block?)?; |
232 | | } |
233 | | |
234 | 0 | debug_assert_eq!(decompressor.len(), 0, "compressed blocks left after decompressing all blocks"); |
235 | 0 | Ok(()) |
236 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::decompress_parallel::<_> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_parallel::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> |
237 | | |
238 | | /// Return an iterator that decompresses the chunks with multiple threads. |
239 | | /// The order of the blocks is not deterministic. |
240 | | /// Use `ParallelBlockDecompressor::new` if you want to use your own thread pool. |
241 | | /// By default, this uses as many threads as there are CPUs. |
242 | | /// Returns the `self` if there is no need for parallel decompression. |
243 | 0 | fn parallel_decompressor(self, pedantic: bool) -> std::result::Result<ParallelBlockDecompressor<Self>, Self> { |
244 | 0 | ParallelBlockDecompressor::new(self, pedantic) |
245 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::parallel_decompressor |
246 | | |
247 | | /// Return an iterator that decompresses the chunks in this thread. |
248 | | /// You can alternatively use `sequential_decompressor` if you prefer an external iterator. |
249 | 0 | fn decompress_sequential( |
250 | 0 | self, pedantic: bool, |
251 | 0 | mut insert_block: impl FnMut(&MetaData, UncompressedBlock) -> UnitResult |
252 | 0 | ) -> UnitResult |
253 | 0 | { |
254 | 0 | let mut decompressor = self.sequential_decompressor(pedantic); |
255 | 0 | while let Some(block) = decompressor.next() { |
256 | 0 | insert_block(decompressor.meta_data(), block?)?; |
257 | | } |
258 | | |
259 | 0 | debug_assert_eq!(decompressor.len(), 0, "compressed blocks left after decompressing all blocks"); |
260 | 0 | Ok(()) |
261 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::decompress_sequential::<_> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<alloc::vec::Vec<u8>>>::{closure#1}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#2}> Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::decompress_sequential::<<exr::image::read::image::ReadImage<fn(f64), exr::image::read::layers::ReadFirstValidLayer<exr::image::read::specific_channels::CollectPixels<exr::image::read::specific_channels::ReadOptionalChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::read::specific_channels::ReadRequiredChannel<exr::image::recursive::NoneMore, f32>, f32>, f32>, f32>, (f32, f32, f32, f32), alloc::vec::Vec<f32>, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#2}, <image::codecs::openexr::OpenExrDecoder<std::io::cursor::Cursor<&[u8]>> as image::io::decoder::ImageDecoder>::read_image::{closure#3}>>>>::from_chunks<exr::image::Layer<exr::image::SpecificChannels<alloc::vec::Vec<f32>, (exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, exr::meta::attribute::ChannelDescription, core::option::Option<exr::meta::attribute::ChannelDescription>)>>, std::io::cursor::Cursor<&[u8]>>::{closure#1}> |
262 | | |
263 | | /// Prepare reading the chunks sequentially, only a single thread, but with less memory overhead. |
264 | 0 | fn sequential_decompressor(self, pedantic: bool) -> SequentialBlockDecompressor<Self> { |
265 | 0 | SequentialBlockDecompressor { remaining_chunks_reader: self, pedantic } |
266 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <_ as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::sequential_decompressor |
267 | | } |
268 | | |
269 | | impl<R, F> ChunksReader for OnProgressChunksReader<R, F> where R: ChunksReader, F: FnMut(f64) { |
270 | 0 | fn meta_data(&self) -> &MetaData { self.chunks_reader.meta_data() } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::meta_data |
271 | 0 | fn expected_chunk_count(&self) -> usize { self.chunks_reader.expected_chunk_count() } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as exr::block::reader::ChunksReader>::expected_chunk_count |
272 | | } |
273 | | |
274 | | impl<R, F> ExactSizeIterator for OnProgressChunksReader<R, F> where R: ChunksReader, F: FnMut(f64) {} |
275 | | impl<R, F> Iterator for OnProgressChunksReader<R, F> where R: ChunksReader, F: FnMut(f64) { |
276 | | type Item = Result<Chunk>; |
277 | | |
278 | 0 | fn next(&mut self) -> Option<Self::Item> { |
279 | 0 | self.chunks_reader.next().map(|item|{ |
280 | 0 | { |
281 | 0 | let total_chunks = self.expected_chunk_count() as f64; |
282 | 0 | let callback = &mut self.callback; |
283 | 0 | callback(self.decoded_chunks as f64 / total_chunks); |
284 | 0 | } |
285 | 0 |
|
286 | 0 | self.decoded_chunks += 1; |
287 | 0 | item |
288 | 0 | }) Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#0} |
289 | 0 | .or_else(||{ |
290 | 0 | debug_assert_eq!( |
291 | 0 | self.decoded_chunks, self.expected_chunk_count(), |
292 | 0 | "chunks reader finished but not all chunks are decompressed" |
293 | | ); |
294 | | |
295 | 0 | let callback = &mut self.callback; |
296 | 0 | callback(1.0); |
297 | 0 | None |
298 | 0 | }) Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next::{closure#1} |
299 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::next |
300 | | |
301 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
302 | 0 | self.chunks_reader.size_hint() |
303 | 0 | } Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<_, _> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)> as core::iter::traits::iterator::Iterator>::size_hint |
304 | | } |
305 | | |
306 | | impl<R: Read + Seek> ChunksReader for AllChunksReader<R> { |
307 | 0 | fn meta_data(&self) -> &MetaData { &self.meta_data } |
308 | 0 | fn expected_chunk_count(&self) -> usize { self.remaining_chunks.end } |
309 | | } |
310 | | |
311 | | impl<R: Read + Seek> ExactSizeIterator for AllChunksReader<R> {} |
312 | | impl<R: Read + Seek> Iterator for AllChunksReader<R> { |
313 | | type Item = Result<Chunk>; |
314 | | |
315 | 0 | fn next(&mut self) -> Option<Self::Item> { |
316 | 0 | // read as many chunks as the file should contain (inferred from meta data) |
317 | 0 | let next_chunk = self.remaining_chunks.next() |
318 | 0 | .map(|_| Chunk::read(&mut self.remaining_bytes, &self.meta_data)); |
319 | 0 |
|
320 | 0 | // if no chunks are left, but some bytes remain, return error |
321 | 0 | if self.pedantic && next_chunk.is_none() && self.remaining_bytes.peek_u8().is_ok() { |
322 | 0 | return Some(Err(Error::invalid("end of file expected"))); |
323 | 0 | } |
324 | 0 |
|
325 | 0 | next_chunk |
326 | 0 | } |
327 | | |
328 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
329 | 0 | (self.remaining_chunks.len(), Some(self.remaining_chunks.len())) |
330 | 0 | } |
331 | | } |
332 | | |
333 | | impl<R: Read + Seek> ChunksReader for FilteredChunksReader<R> { |
334 | 0 | fn meta_data(&self) -> &MetaData { &self.meta_data } Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<_> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as exr::block::reader::ChunksReader>::meta_data Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::meta_data |
335 | 0 | fn expected_chunk_count(&self) -> usize { self.expected_filtered_chunk_count } Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<_> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as exr::block::reader::ChunksReader>::expected_chunk_count Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as exr::block::reader::ChunksReader>::expected_chunk_count |
336 | | } |
337 | | |
338 | | impl<R: Read + Seek> ExactSizeIterator for FilteredChunksReader<R> {} |
339 | | impl<R: Read + Seek> Iterator for FilteredChunksReader<R> { |
340 | | type Item = Result<Chunk>; |
341 | | |
342 | 0 | fn next(&mut self) -> Option<Self::Item> { |
343 | 0 | // read as many chunks as we have desired chunk offsets |
344 | 0 | self.remaining_filtered_chunk_indices.next().map(|next_chunk_location|{ |
345 | 0 | self.remaining_bytes.skip_to( // no-op for seek at current position, uses skip_bytes for small amounts |
346 | 0 | usize::try_from(next_chunk_location) |
347 | 0 | .expect("too large chunk position for this machine") |
348 | 0 | )?; |
349 | | |
350 | 0 | let meta_data = &self.meta_data; |
351 | 0 | Chunk::read(&mut self.remaining_bytes, meta_data) |
352 | 0 | }) Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<_> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as core::iter::traits::iterator::Iterator>::next::{closure#0} Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next::{closure#0} |
353 | 0 |
|
354 | 0 | // TODO remember last chunk index and then seek to index+size and check whether bytes are left? |
355 | 0 | } Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<_> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::next |
356 | | |
357 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
358 | 0 | (self.remaining_filtered_chunk_indices.len(), Some(self.remaining_filtered_chunk_indices.len())) |
359 | 0 | } Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<_> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as core::iter::traits::iterator::Iterator>::size_hint Unexecuted instantiation: <exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>> as core::iter::traits::iterator::Iterator>::size_hint |
360 | | } |
361 | | |
362 | | /// Read all chunks from the file, decompressing each chunk immediately. |
363 | | /// Implements iterator. |
364 | | #[derive(Debug)] |
365 | | pub struct SequentialBlockDecompressor<R: ChunksReader> { |
366 | | remaining_chunks_reader: R, |
367 | | pedantic: bool, |
368 | | } |
369 | | |
370 | | impl<R: ChunksReader> SequentialBlockDecompressor<R> { |
371 | | |
372 | | /// The extracted meta data from the image file. |
373 | 0 | pub fn meta_data(&self) -> &MetaData { self.remaining_chunks_reader.meta_data() } Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<_>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data |
374 | | |
375 | | /// Read and then decompress a single block of pixels from the byte source. |
376 | 0 | pub fn decompress_next_block(&mut self) -> Option<Result<UncompressedBlock>> { |
377 | 0 | self.remaining_chunks_reader.read_next_chunk().map(|compressed_chunk|{ |
378 | 0 | UncompressedBlock::decompress_chunk(compressed_chunk?, &self.remaining_chunks_reader.meta_data(), self.pedantic) |
379 | 0 | }) Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<_>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} |
380 | 0 | } Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<_>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block |
381 | | } |
382 | | |
383 | | /// Decompress the chunks in a file in parallel. |
384 | | /// The first call to `next` will fill the thread pool with jobs, |
385 | | /// starting to decompress the next few blocks. |
386 | | /// These jobs will finish, even if you stop reading more blocks. |
387 | | /// Implements iterator. |
388 | | #[derive(Debug)] |
389 | | pub struct ParallelBlockDecompressor<R: ChunksReader> { |
390 | | remaining_chunks: R, |
391 | | sender: mpsc::Sender<Result<UncompressedBlock>>, |
392 | | receiver: mpsc::Receiver<Result<UncompressedBlock>>, |
393 | | currently_decompressing_count: usize, |
394 | | max_threads: usize, |
395 | | |
396 | | shared_meta_data_ref: Arc<MetaData>, |
397 | | pedantic: bool, |
398 | | |
399 | | pool: ThreadPool, |
400 | | } |
401 | | |
402 | | impl<R: ChunksReader> ParallelBlockDecompressor<R> { |
403 | | |
404 | | /// Create a new decompressor. Does not immediately spawn any tasks. |
405 | | /// Decompression starts after the first call to `next`. |
406 | | /// Returns the chunks if parallel decompression should not be used. |
407 | | /// Use `new_with_thread_pool` to customize the threadpool. |
408 | 0 | pub fn new(chunks: R, pedantic: bool) -> std::result::Result<Self, R> { |
409 | 0 | Self::new_with_thread_pool(chunks, pedantic, ||{ |
410 | 0 | rayon_core::ThreadPoolBuilder::new() |
411 | 0 | .thread_name(|index| format!("OpenEXR Block Decompressor Thread #{}", index)) Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}::{closure#0} |
412 | 0 | .build() |
413 | 0 | }) Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0} |
414 | 0 | } Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new |
415 | | |
416 | | /// Create a new decompressor. Does not immediately spawn any tasks. |
417 | | /// Decompression starts after the first call to `next`. |
418 | | /// Returns the chunks if parallel decompression should not be used. |
419 | 0 | pub fn new_with_thread_pool<CreatePool>(chunks: R, pedantic: bool, try_create_thread_pool: CreatePool) |
420 | 0 | -> std::result::Result<Self, R> |
421 | 0 | where CreatePool: FnOnce() -> std::result::Result<ThreadPool, ThreadPoolBuildError> |
422 | 0 | { |
423 | 0 | // if no compression is used in the file, don't use a threadpool |
424 | 0 | if chunks.meta_data().headers.iter() |
425 | 0 | .all(|head|head.compression == Compression::Uncompressed) Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::new_with_thread_pool::<_>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}>::{closure#0} |
426 | | { |
427 | 0 | return Err(chunks); |
428 | 0 | } |
429 | | |
430 | | // in case thread pool creation fails (for example on WASM currently), |
431 | | // we revert to sequential decompression |
432 | 0 | let pool = match try_create_thread_pool() { |
433 | 0 | Ok(pool) => pool, |
434 | | |
435 | | // TODO print warning? |
436 | 0 | Err(_) => return Err(chunks), |
437 | | }; |
438 | | |
439 | 0 | let max_threads = pool.current_num_threads().max(1).min(chunks.len()) + 2; // ca one block for each thread at all times |
440 | 0 |
|
441 | 0 | let (send, recv) = mpsc::channel(); // TODO bounded channel simplifies logic? |
442 | 0 |
|
443 | 0 | Ok(Self { |
444 | 0 | shared_meta_data_ref: Arc::new(chunks.meta_data().clone()), |
445 | 0 | currently_decompressing_count: 0, |
446 | 0 | remaining_chunks: chunks, |
447 | 0 | sender: send, |
448 | 0 | receiver: recv, |
449 | 0 | pedantic, |
450 | 0 | max_threads, |
451 | 0 |
|
452 | 0 | pool, |
453 | 0 | }) |
454 | 0 | } Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::new_with_thread_pool::<_> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::new::{closure#0}> Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new_with_thread_pool::<<exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::new::{closure#0}> |
455 | | |
456 | | /// Fill the pool with decompression jobs. Returns the first job that finishes. |
457 | 0 | pub fn decompress_next_block(&mut self) -> Option<Result<UncompressedBlock>> { |
458 | | |
459 | 0 | while self.currently_decompressing_count < self.max_threads { |
460 | 0 | let block = self.remaining_chunks.next(); |
461 | 0 | if let Some(block) = block { |
462 | 0 | let block = match block { |
463 | 0 | Ok(block) => block, |
464 | 0 | Err(error) => return Some(Err(error)) |
465 | | }; |
466 | | |
467 | 0 | let sender = self.sender.clone(); |
468 | 0 | let meta = self.shared_meta_data_ref.clone(); |
469 | 0 | let pedantic = self.pedantic; |
470 | 0 |
|
471 | 0 | self.currently_decompressing_count += 1; |
472 | 0 |
|
473 | 0 | self.pool.spawn(move || { |
474 | 0 | let decompressed_or_err = UncompressedBlock::decompress_chunk( |
475 | 0 | block, &meta, pedantic |
476 | 0 | ); |
477 | 0 |
|
478 | 0 | // by now, decompressing could have failed in another thread. |
479 | 0 | // the error is then already handled, so we simply |
480 | 0 | // don't send the decompressed block and do nothing |
481 | 0 | let _ = sender.send(decompressed_or_err); |
482 | 0 | }); Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block::{closure#0} |
483 | 0 | } |
484 | | else { |
485 | | // there are no chunks left to decompress |
486 | 0 | break; |
487 | | } |
488 | | } |
489 | | |
490 | 0 | if self.currently_decompressing_count > 0 { |
491 | 0 | let next = self.receiver.recv() |
492 | 0 | .expect("all decompressing senders hung up but more messages were expected"); |
493 | 0 |
|
494 | 0 | self.currently_decompressing_count -= 1; |
495 | 0 | Some(next) |
496 | | } |
497 | | else { |
498 | 0 | debug_assert!(self.receiver.try_recv().is_err(), "uncompressed chunks left in channel after decompressing all chunks"); // TODO not reliable |
499 | 0 | debug_assert_eq!(self.len(), 0, "compressed chunks left after decompressing all chunks"); |
500 | 0 | None |
501 | | } |
502 | 0 | } Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::decompress_next_block Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::decompress_next_block |
503 | | |
504 | | /// The extracted meta data of the image file. |
505 | 0 | pub fn meta_data(&self) -> &MetaData { self.remaining_chunks.meta_data() } Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>>>::meta_data Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>>>::meta_data |
506 | | } |
507 | | |
508 | | impl<R: ChunksReader> ExactSizeIterator for SequentialBlockDecompressor<R> {} |
509 | | impl<R: ChunksReader> Iterator for SequentialBlockDecompressor<R> { |
510 | | type Item = Result<UncompressedBlock>; |
511 | 0 | fn next(&mut self) -> Option<Self::Item> { self.decompress_next_block() } Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<_> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::SequentialBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next |
512 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { self.remaining_chunks_reader.size_hint() } |
513 | | } |
514 | | |
515 | | impl<R: ChunksReader> ExactSizeIterator for ParallelBlockDecompressor<R> {} |
516 | | impl<R: ChunksReader> Iterator for ParallelBlockDecompressor<R> { |
517 | | type Item = Result<UncompressedBlock>; |
518 | 0 | fn next(&mut self) -> Option<Self::Item> { self.decompress_next_block() } Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<_> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next Unexecuted instantiation: <exr::block::reader::ParallelBlockDecompressor<exr::block::reader::OnProgressChunksReader<exr::block::reader::FilteredChunksReader<std::io::cursor::Cursor<&[u8]>>, &mut fn(f64)>> as core::iter::traits::iterator::Iterator>::next |
519 | 0 | fn size_hint(&self) -> (usize, Option<usize>) { |
520 | 0 | let remaining = self.remaining_chunks.len() + self.currently_decompressing_count; |
521 | 0 | (remaining, Some(remaining)) |
522 | 0 | } |
523 | | } |
524 | | |
525 | | |
526 | | |
527 | | |
528 | | |