Skip to main content

pdfluent_jpeg2000/j2c/
mod.rs

1mod 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/// Decoded data for one JPEG2000 component.
32#[derive(Debug, Clone)]
33pub struct ComponentData {
34    pub(crate) container: SimdBuffer<{ SIMD_WIDTH }>,
35    pub(crate) bit_depth: u8,
36}
37
38impl ComponentData {
39    /// The bit depth of this component.
40    pub fn bit_depth(&self) -> u8 {
41        self.bit_depth
42    }
43
44    /// The decoded samples of this component.
45    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    // If we are just decoding a raw codestream, we assume greyscale or
56    // RGB.
57    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}