1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#![allow(clippy::upper_case_acronyms)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Marker {
ZERO,
SOF(SOFType),
JPG,
DHT,
DAC,
RST(u8),
SOI,
EOI,
SOS,
DQT,
DNL,
DRI,
DHP,
EXP,
APP(u8),
JPGn(u8),
COM,
TEM,
RES,
FILL,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum SOFType {
BaselineDCT,
ExtendedSequentialDCT,
ProgressiveDCT,
Lossless,
DifferentialSequentialDCT,
DifferentialProgressiveDCT,
DifferentialLossless,
ExtendedSequentialDCTArithmetic,
ProgressiveDCTArithmetic,
LosslessArithmeticCoding,
DifferentialSequentialDCTArithmetic,
DifferentialProgressiveDCTArithmetic,
DifferentialLosslessArithmetic,
}
impl From<Marker> for u8 {
fn from(marker: Marker) -> Self {
use self::{Marker::*, SOFType::*};
match marker {
ZERO => 0x00,
TEM => 0x01,
RES => 0x02,
SOF(BaselineDCT) => 0xC0,
SOF(ExtendedSequentialDCT) => 0xC1,
SOF(ProgressiveDCT) => 0xC2,
SOF(Lossless) => 0xC3,
DHT => 0xC4,
SOF(DifferentialSequentialDCT) => 0xC5,
SOF(DifferentialProgressiveDCT) => 0xC6,
SOF(DifferentialLossless) => 0xC7,
JPG => 0xC8,
SOF(ExtendedSequentialDCTArithmetic) => 0xC9,
SOF(ProgressiveDCTArithmetic) => 0xCA,
SOF(LosslessArithmeticCoding) => 0xCB,
DAC => 0xCC,
SOF(DifferentialSequentialDCTArithmetic) => 0xCD,
SOF(DifferentialProgressiveDCTArithmetic) => 0xCE,
SOF(DifferentialLosslessArithmetic) => 0xCF,
RST(v) => 0xD0 + v,
SOI => 0xD8,
EOI => 0xD9,
SOS => 0xDA,
DQT => 0xDB,
DNL => 0xDC,
DRI => 0xDD,
DHP => 0xDE,
EXP => 0xDF,
APP(v) => 0xE0 + v,
JPGn(v) => 0xF0 + v,
COM => 0xFE,
FILL => 0xFF,
}
}
}