jpeg_decoder/
marker.rs

1// Table B.1
2#[derive(Clone, Copy, Debug, PartialEq)]
3// Note: Established names.
4#[allow(clippy::upper_case_acronyms)]
5pub enum Marker {
6    /// Start Of Frame markers
7    ///
8    /// - SOF(0):  Baseline DCT (Huffman coding)
9    /// - SOF(1):  Extended sequential DCT (Huffman coding)
10    /// - SOF(2):  Progressive DCT (Huffman coding)
11    /// - SOF(3):  Lossless (sequential) (Huffman coding)
12    /// - SOF(5):  Differential sequential DCT (Huffman coding)
13    /// - SOF(6):  Differential progressive DCT (Huffman coding)
14    /// - SOF(7):  Differential lossless (sequential) (Huffman coding)
15    /// - SOF(9):  Extended sequential DCT (arithmetic coding)
16    /// - SOF(10): Progressive DCT (arithmetic coding)
17    /// - SOF(11): Lossless (sequential) (arithmetic coding)
18    /// - SOF(13): Differential sequential DCT (arithmetic coding)
19    /// - SOF(14): Differential progressive DCT (arithmetic coding)
20    /// - SOF(15): Differential lossless (sequential) (arithmetic coding)
21    SOF(u8),
22    /// Reserved for JPEG extensions
23    JPG,
24    /// Define Huffman table(s)
25    DHT,
26    /// Define arithmetic coding conditioning(s)
27    DAC,
28    /// Restart with modulo 8 count `m`
29    RST(u8),
30    /// Start of image
31    SOI,
32    /// End of image
33    EOI,
34    /// Start of scan
35    SOS,
36    /// Define quantization table(s)
37    DQT,
38    /// Define number of lines
39    DNL,
40    /// Define restart interval
41    DRI,
42    /// Define hierarchical progression
43    DHP,
44    /// Expand reference component(s)
45    EXP,
46    /// Reserved for application segments
47    APP(u8),
48    /// Reserved for JPEG extensions
49    JPGn(u8),
50    /// Comment
51    COM,
52    /// For temporary private use in arithmetic coding
53    TEM,
54    /// Reserved
55    RES,
56}
57
58impl Marker {
59    pub fn has_length(self) -> bool {
60        use self::Marker::*;
61        ! matches!(self, RST(..) | SOI | EOI | TEM)
62    }
63
64    pub fn from_u8(n: u8) -> Option<Marker> {
65        use self::Marker::*;
66        match n {
67            0x00 => None, // Byte stuffing
68            0x01 => Some(TEM),
69            0x02 ..= 0xBF => Some(RES),
70            0xC0 => Some(SOF(0)),
71            0xC1 => Some(SOF(1)),
72            0xC2 => Some(SOF(2)),
73            0xC3 => Some(SOF(3)),
74            0xC4 => Some(DHT),
75            0xC5 => Some(SOF(5)),
76            0xC6 => Some(SOF(6)),
77            0xC7 => Some(SOF(7)),
78            0xC8 => Some(JPG),
79            0xC9 => Some(SOF(9)),
80            0xCA => Some(SOF(10)),
81            0xCB => Some(SOF(11)),
82            0xCC => Some(DAC),
83            0xCD => Some(SOF(13)),
84            0xCE => Some(SOF(14)),
85            0xCF => Some(SOF(15)),
86            0xD0 => Some(RST(0)),
87            0xD1 => Some(RST(1)),
88            0xD2 => Some(RST(2)),
89            0xD3 => Some(RST(3)),
90            0xD4 => Some(RST(4)),
91            0xD5 => Some(RST(5)),
92            0xD6 => Some(RST(6)),
93            0xD7 => Some(RST(7)),
94            0xD8 => Some(SOI),
95            0xD9 => Some(EOI),
96            0xDA => Some(SOS),
97            0xDB => Some(DQT),
98            0xDC => Some(DNL),
99            0xDD => Some(DRI),
100            0xDE => Some(DHP),
101            0xDF => Some(EXP),
102            0xE0 => Some(APP(0)),
103            0xE1 => Some(APP(1)),
104            0xE2 => Some(APP(2)),
105            0xE3 => Some(APP(3)),
106            0xE4 => Some(APP(4)),
107            0xE5 => Some(APP(5)),
108            0xE6 => Some(APP(6)),
109            0xE7 => Some(APP(7)),
110            0xE8 => Some(APP(8)),
111            0xE9 => Some(APP(9)),
112            0xEA => Some(APP(10)),
113            0xEB => Some(APP(11)),
114            0xEC => Some(APP(12)),
115            0xED => Some(APP(13)),
116            0xEE => Some(APP(14)),
117            0xEF => Some(APP(15)),
118            0xF0 => Some(JPGn(0)),
119            0xF1 => Some(JPGn(1)),
120            0xF2 => Some(JPGn(2)),
121            0xF3 => Some(JPGn(3)),
122            0xF4 => Some(JPGn(4)),
123            0xF5 => Some(JPGn(5)),
124            0xF6 => Some(JPGn(6)),
125            0xF7 => Some(JPGn(7)),
126            0xF8 => Some(JPGn(8)),
127            0xF9 => Some(JPGn(9)),
128            0xFA => Some(JPGn(10)),
129            0xFB => Some(JPGn(11)),
130            0xFC => Some(JPGn(12)),
131            0xFD => Some(JPGn(13)),
132            0xFE => Some(COM),
133            0xFF => None, // Fill byte
134        }
135    }
136}