xref: /aosp_15_r20/external/skia/src/codec/SkJpegConstants.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2023 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkJpegConstants_codec_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkJpegConstants_codec_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
12*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker // The first marker of all JPEG files is StartOfImage.
15*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kJpegMarkerStartOfImage = 0xD8;
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker // The last marker of all JPEG files (excluding auxiliary data, e.g, MPF images) is EndOfImage.
18*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kJpegMarkerEndOfImage = 0xD9;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker // The header of a JPEG file is the data in all segments before the first StartOfScan.
21*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kJpegMarkerStartOfScan = 0xDA;
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker // Metadata and auxiliary images are stored in the APP1 through APP15 markers.
24*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kJpegMarkerAPP0 = 0xE0;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker // The number of bytes in a marker code is two. The first byte is all marker codes is 0xFF.
27*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t kJpegMarkerCodeSize = 2;
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker // The number of bytes used to specify the length of a segment's parameters is two. This length
30*c8dee2aaSAndroid Build Coastguard Worker // value includes these two bytes.
31*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t kJpegSegmentParameterLengthSize = 2;
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker // The first three bytes of all JPEG files is a StartOfImage marker (two bytes) followed by the
34*c8dee2aaSAndroid Build Coastguard Worker // first byte of the next marker.
35*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kJpegSig[] = {0xFF, kJpegMarkerStartOfImage, 0xFF};
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker // ICC profile segment marker and signature.
38*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kICCMarker = kJpegMarkerAPP0 + 2;
39*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kICCMarkerHeaderSize = 14;
40*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kICCMarkerIndexSize = 1;
41*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kICCSig[] = {
42*c8dee2aaSAndroid Build Coastguard Worker         'I', 'C', 'C', '_', 'P', 'R', 'O', 'F', 'I', 'L', 'E', '\0',
43*c8dee2aaSAndroid Build Coastguard Worker };
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker // XMP segment marker and signature.
46*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kXMPMarker = kJpegMarkerAPP0 + 1;
47*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kXMPStandardSig[] = {
48*c8dee2aaSAndroid Build Coastguard Worker         'h', 't', 't', 'p', ':', '/', '/', 'n', 's', '.', 'a', 'd', 'o', 'b', 'e', '.', 'c', 'o',
49*c8dee2aaSAndroid Build Coastguard Worker         'm', '/', 'x', 'a', 'p', '/', '1', '.', '0', '/', '\0'};
50*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kXMPExtendedSig[] = {
51*c8dee2aaSAndroid Build Coastguard Worker         'h', 't', 't', 'p', ':', '/', '/', 'n', 's', '.', 'a', 'd', 'o', 'b', 'e', '.', 'c', 'o',
52*c8dee2aaSAndroid Build Coastguard Worker         'm', '/', 'x', 'm', 'p', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '/', '\0'};
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker // EXIF segment marker and signature.
55*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kExifMarker = kJpegMarkerAPP0 + 1;
56*c8dee2aaSAndroid Build Coastguard Worker constexpr uint8_t kExifSig[] = {'E', 'x', 'i', 'f', '\0'};
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker // MPF segment marker and signature.
59*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kMpfMarker = kJpegMarkerAPP0 + 2;
60*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kMpfSig[] = {'M', 'P', 'F', '\0'};
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker // ISO 21496-1 marker and signature.
63*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t kISOGainmapMarker = kJpegMarkerAPP0 + 2;
64*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint8_t kISOGainmapSig[] = {'u', 'r', 'n', ':', 'i', 's', 'o', ':', 's', 't',
65*c8dee2aaSAndroid Build Coastguard Worker                                              'd', ':', 'i', 's', 'o', ':', 't', 's', ':', '2',
66*c8dee2aaSAndroid Build Coastguard Worker                                              '1', '4', '9', '6', ':', '-', '1', '\0'};
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker #endif
69