pdfluent_jpeg2000/j2c/
mod.rs1mod arithmetic_decoder;
2mod bitplane;
3mod build;
4mod codestream;
5mod decode;
6mod idwt;
7mod mct;
8mod progression;
9mod rect;
10mod segment;
11mod tag_tree;
12mod tile;
13
14use super::jp2::ImageBoxes;
15use super::jp2::colr::{ColorSpace, ColorSpecificationBox, EnumeratedColorspace};
16use crate::error::{FormatError, MarkerError, Result, bail};
17use crate::j2c::codestream::markers;
18use crate::reader::BitReader;
19use crate::{DecodeSettings, Image, resolve_alpha_and_color_space};
20
21use crate::math::{SIMD_WIDTH, SimdBuffer};
22pub(crate) use codestream::Header;
23pub use decode::DecoderContext;
24pub(crate) use decode::decode;
25
26pub(crate) struct ParsedCodestream<'a> {
27 pub(crate) header: Header<'a>,
28 pub(crate) data: &'a [u8],
29}
30
31#[derive(Debug, Clone)]
33pub struct ComponentData {
34 pub(crate) container: SimdBuffer<{ SIMD_WIDTH }>,
35 pub(crate) bit_depth: u8,
36}
37
38impl ComponentData {
39 pub fn bit_depth(&self) -> u8 {
41 self.bit_depth
42 }
43
44 pub fn samples(&self) -> &[f32] {
46 self.container.truncated()
47 }
48}
49
50pub(crate) fn parse<'a>(stream: &'a [u8], settings: &DecodeSettings) -> Result<Image<'a>> {
51 let parsed_codestream = parse_raw(stream, settings)?;
52 let header = &parsed_codestream.header;
53 let mut boxes = ImageBoxes::default();
54
55 let cs = if header.component_infos.len() < 3 {
58 ColorSpace::Enumerated(EnumeratedColorspace::Greyscale)
59 } else {
60 ColorSpace::Enumerated(EnumeratedColorspace::Srgb)
61 };
62
63 boxes.color_specification = Some(ColorSpecificationBox { color_space: cs });
64
65 let (color_space, has_alpha) =
66 resolve_alpha_and_color_space(&boxes, &parsed_codestream.header, settings)?;
67
68 Ok(Image {
69 codestream: parsed_codestream.data,
70 header: parsed_codestream.header,
71 boxes,
72 settings: *settings,
73 color_space,
74 has_alpha,
75 })
76}
77
78pub(crate) fn parse_raw<'a>(
79 stream: &'a [u8],
80 settings: &DecodeSettings,
81) -> Result<ParsedCodestream<'a>> {
82 let mut reader = BitReader::new(stream);
83
84 let marker = reader.read_marker()?;
85 if marker != markers::SOC {
86 bail!(MarkerError::Expected("SOC"));
87 }
88
89 let header = codestream::read_header(&mut reader, settings)?;
90 let code_stream_data = reader.tail().ok_or(FormatError::MissingCodestream)?;
91
92 Ok(ParsedCodestream {
93 header,
94 data: code_stream_data,
95 })
96}