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