xref: /aosp_15_r20/external/libultrahdr/lib/include/ultrahdr/multipictureformat.h (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
1*89a0ef05SAndroid Build Coastguard Worker /*
2*89a0ef05SAndroid Build Coastguard Worker  * Copyright 2022 The Android Open Source Project
3*89a0ef05SAndroid Build Coastguard Worker  *
4*89a0ef05SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*89a0ef05SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*89a0ef05SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*89a0ef05SAndroid Build Coastguard Worker  *
8*89a0ef05SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*89a0ef05SAndroid Build Coastguard Worker  *
10*89a0ef05SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*89a0ef05SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*89a0ef05SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*89a0ef05SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*89a0ef05SAndroid Build Coastguard Worker  * limitations under the License.
15*89a0ef05SAndroid Build Coastguard Worker  */
16*89a0ef05SAndroid Build Coastguard Worker 
17*89a0ef05SAndroid Build Coastguard Worker #ifndef ULTRAHDR_MULTIPICTUREFORMAT_H
18*89a0ef05SAndroid Build Coastguard Worker #define ULTRAHDR_MULTIPICTUREFORMAT_H
19*89a0ef05SAndroid Build Coastguard Worker 
20*89a0ef05SAndroid Build Coastguard Worker #include <memory>
21*89a0ef05SAndroid Build Coastguard Worker 
22*89a0ef05SAndroid Build Coastguard Worker #ifndef USE_BIG_ENDIAN_IN_MPF
23*89a0ef05SAndroid Build Coastguard Worker #define USE_BIG_ENDIAN_IN_MPF true
24*89a0ef05SAndroid Build Coastguard Worker #endif
25*89a0ef05SAndroid Build Coastguard Worker 
26*89a0ef05SAndroid Build Coastguard Worker #undef Endian_SwapBE32
27*89a0ef05SAndroid Build Coastguard Worker #undef Endian_SwapBE16
28*89a0ef05SAndroid Build Coastguard Worker #if USE_BIG_ENDIAN_IN_MPF
29*89a0ef05SAndroid Build Coastguard Worker #define Endian_SwapBE32(n) EndianSwap32(n)
30*89a0ef05SAndroid Build Coastguard Worker #define Endian_SwapBE16(n) EndianSwap16(n)
31*89a0ef05SAndroid Build Coastguard Worker #else
32*89a0ef05SAndroid Build Coastguard Worker #define Endian_SwapBE32(n) (n)
33*89a0ef05SAndroid Build Coastguard Worker #define Endian_SwapBE16(n) (n)
34*89a0ef05SAndroid Build Coastguard Worker #endif
35*89a0ef05SAndroid Build Coastguard Worker 
36*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegr.h"
37*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/gainmapmath.h"
38*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegrutils.h"
39*89a0ef05SAndroid Build Coastguard Worker 
40*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr {
41*89a0ef05SAndroid Build Coastguard Worker 
42*89a0ef05SAndroid Build Coastguard Worker constexpr size_t kNumPictures = 2;
43*89a0ef05SAndroid Build Coastguard Worker constexpr size_t kMpEndianSize = 4;
44*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kTagSerializedCount = 3;
45*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kTagSize = 12;
46*89a0ef05SAndroid Build Coastguard Worker 
47*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kTypeLong = 0x4;
48*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kTypeUndefined = 0x7;
49*89a0ef05SAndroid Build Coastguard Worker 
50*89a0ef05SAndroid Build Coastguard Worker static constexpr uint8_t kMpfSig[] = {'M', 'P', 'F', '\0'};
51*89a0ef05SAndroid Build Coastguard Worker constexpr uint8_t kMpLittleEndian[kMpEndianSize] = {0x49, 0x49, 0x2A, 0x00};
52*89a0ef05SAndroid Build Coastguard Worker constexpr uint8_t kMpBigEndian[kMpEndianSize] = {0x4D, 0x4D, 0x00, 0x2A};
53*89a0ef05SAndroid Build Coastguard Worker 
54*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kVersionTag = 0xB000;
55*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kVersionType = kTypeUndefined;
56*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kVersionCount = 4;
57*89a0ef05SAndroid Build Coastguard Worker constexpr size_t kVersionSize = 4;
58*89a0ef05SAndroid Build Coastguard Worker constexpr uint8_t kVersionExpected[kVersionSize] = {'0', '1', '0', '0'};
59*89a0ef05SAndroid Build Coastguard Worker 
60*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kNumberOfImagesTag = 0xB001;
61*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kNumberOfImagesType = kTypeLong;
62*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kNumberOfImagesCount = 1;
63*89a0ef05SAndroid Build Coastguard Worker 
64*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kMPEntryTag = 0xB002;
65*89a0ef05SAndroid Build Coastguard Worker constexpr uint16_t kMPEntryType = kTypeUndefined;
66*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kMPEntrySize = 16;
67*89a0ef05SAndroid Build Coastguard Worker 
68*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kMPEntryAttributeFormatJpeg = 0x0000000;
69*89a0ef05SAndroid Build Coastguard Worker constexpr uint32_t kMPEntryAttributeTypePrimary = 0x030000;
70*89a0ef05SAndroid Build Coastguard Worker 
71*89a0ef05SAndroid Build Coastguard Worker size_t calculateMpfSize();
72*89a0ef05SAndroid Build Coastguard Worker std::shared_ptr<DataStruct> generateMpf(size_t primary_image_size, size_t primary_image_offset,
73*89a0ef05SAndroid Build Coastguard Worker                                         size_t secondary_image_size, size_t secondary_image_offset);
74*89a0ef05SAndroid Build Coastguard Worker 
75*89a0ef05SAndroid Build Coastguard Worker }  // namespace ultrahdr
76*89a0ef05SAndroid Build Coastguard Worker 
77*89a0ef05SAndroid Build Coastguard Worker #endif  // ULTRAHDR_MULTIPICTUREFORMAT_H
78