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)]

// Table B.1
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Marker {
    ZERO,
    /// Start Of Frame markers
    SOF(SOFType),
    /// Reserved for JPEG extensions
    JPG,
    /// Define Huffman table(s)
    DHT,
    /// Define arithmetic coding conditioning(s)
    DAC,
    /// Restart with modulo 8 count `m`
    RST(u8),
    /// Start of image
    SOI,
    /// End of image
    EOI,
    /// Start of scan
    SOS,
    /// Define quantization table(s)
    DQT,
    /// Define number of lines
    DNL,
    /// Define restart interval
    DRI,
    /// Define hierarchical progression
    DHP,
    /// Expand reference component(s)
    EXP,
    /// Reserved for application segments
    APP(u8),
    /// Reserved for JPEG extensions
    JPGn(u8),
    /// Comment
    COM,
    /// For temporary private use in arithmetic coding
    TEM,
    /// Reserved
    RES,
    /// Fill byte
    FILL,
}

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum SOFType {
    /// SOF(0)
    BaselineDCT,
    /// SOF(1)
    ExtendedSequentialDCT,
    /// SOF(2)
    ProgressiveDCT,
    /// SOF(3)
    Lossless,
    /// SOF(5)
    DifferentialSequentialDCT,
    /// SOF(6)
    DifferentialProgressiveDCT,
    /// SOF(7)
    DifferentialLossless,
    /// SOF(9)
    ExtendedSequentialDCTArithmetic,
    /// SOF(10)
    ProgressiveDCTArithmetic,
    /// SOF(11)
    LosslessArithmeticCoding,
    /// SOF(13)
    DifferentialSequentialDCTArithmetic,
    /// SOF(14)
    DifferentialProgressiveDCTArithmetic,
    /// SOF(15)
    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,
        }
    }
}