GPEG File Format

GPEG File Format#

[2]<byte; =[0xff, 0xd8]>(name="start marker"; id="SOI")

while (1) {
    [2]<byte; :marker>
    if (marker == [0xff, 0xe0]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="app0")

    if (marker == [0xff, 0xdb]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Define Quantization Table")

    if (marker == [0xff, 0xc0]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Baseline JPEG"; class="start_of_frame")

    if (marker == [0xff, 0xc1]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Extended Sequential"; class="start_of_frame")

    if (marker == [0xff, 0xc2]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Progressive JPEG"; class="start_of_frame")

    if (marker == [0xff, 0xc4]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Define Huffman Table")

    if (marker == [0xff, 0xdd]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        continue;
    }(name="Define Restart Interval")

    if (marker == [0xff, 0xda]) {
        [1]<uint16; data_len>(name="payload length"; endian="big")
        [data_len - 2]<byte>
        break;
    }(name="Start of Scan")
}

[+]<byte>(name="Entropy-coded scan data";
          note="all 0xff bytes in original are stored as 0xff 0x00")

[*]{
    [2]<byte; [0]=0xff; [1]=(0xd0, 0xd7)>(name="marker")
    [+]<byte>(note="all 0xff bytes in original are stored as 0xff 0x00")
}(name="Restart Markers")

[2]<byte; =[0xff, 0xd9]>(name="end marker"; id="EOI")