1e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/* 2e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Copyright 2014 The Android Open Source Project 3e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 4e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * you may not use this file except in compliance with the License. 6e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * You may obtain a copy of the License at 7e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 8e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 10e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * See the License for the specific language governing permissions and 14e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * limitations under the License. 15e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 16e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 17e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#ifndef IMG_UTILS_DNG_UTILS_H 18e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#define IMG_UTILS_DNG_UTILS_H 19e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 20e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/ByteArrayOutput.h> 21e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <img_utils/EndianUtils.h> 22e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 23e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/Errors.h> 24e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/Log.h> 25e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <utils/RefBase.h> 26e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 27e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <cutils/compiler.h> 28e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#include <stdint.h> 29e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 30e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace android { 31e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunknamespace img_utils { 32e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 33e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#define NELEMS(x) ((int) (sizeof(x) / sizeof((x)[0]))) 340f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) 35e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 36e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk/** 37e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Utility class for building values for the OpcodeList tags specified 38e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * in the Adobe DNG 1.4 spec. 39e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 40e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunkclass ANDROID_API OpcodeListBuilder : public LightRefBase<OpcodeListBuilder> { 41e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk public: 42e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk enum CfaLayout { 43e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk CFA_RGGB = 0, 44e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk CFA_GRBG, 45e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk CFA_GBRG, 46e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk CFA_BGGR, 47e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk }; 48e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 49e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk OpcodeListBuilder(); 50e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual ~OpcodeListBuilder(); 51e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 52e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk /** 53e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Get the total size of this opcode list in bytes. 54e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 55e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual size_t getSize() const; 56e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 57e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk /** 58e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Get the number of opcodes defined in this list. 59e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 60e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual uint32_t getCount() const; 61e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 62e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk /** 63e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Write the opcode list into the given buffer. This buffer 64e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * must be able to hold at least as many elements as returned 65e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * by calling the getSize() method. 66e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 67e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Returns OK on success, or a negative error code. 68e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 69e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual status_t buildOpList(/*out*/ uint8_t* buf) const; 70e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 71e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk /** 72e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Add GainMap opcode(s) for the given metadata parameters. The given 73e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * CFA layout must match the layout of the shading map passed into the 74e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * lensShadingMap parameter. 75e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 76e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Returns OK on success, or a negative error code. 77e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 78e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual status_t addGainMapsForMetadata(uint32_t lsmWidth, 79e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t lsmHeight, 80e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t activeAreaTop, 81e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t activeAreaLeft, 82e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t activeAreaBottom, 83e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t activeAreaRight, 84e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk CfaLayout cfa, 85e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk const float* lensShadingMap); 86e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 87e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 88e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk /** 89e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Add a GainMap opcode with the given fields. The mapGains array 90e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * must have mapPointsV * mapPointsH * mapPlanes elements. 91e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * 92e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk * Returns OK on success, or a negative error code. 93e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk */ 94e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk virtual status_t addGainMap(uint32_t top, 95e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t left, 96e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t bottom, 97e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t right, 98e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t plane, 99e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t planes, 100e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t rowPitch, 101e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t colPitch, 102e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t mapPointsV, 103e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t mapPointsH, 104e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk double mapSpacingV, 105e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk double mapSpacingH, 106e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk double mapOriginV, 107e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk double mapOriginH, 108e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t mapPlanes, 109e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk const float* mapGains); 110e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 1110f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk /** 1120f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * Add WarpRectilinear opcode for the given metadata parameters. 1130f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * 1140f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * Returns OK on success, or a negative error code. 1150f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk */ 1160f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk virtual status_t addWarpRectilinearForMetadata(const float* kCoeffs, 1170f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk uint32_t activeArrayWidth, 1180f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk uint32_t activeArrayHeight, 1190f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk float opticalCenterX, 1200f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk float opticalCenterY); 1210f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk 1220f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk /** 1230f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * Add a WarpRectilinear opcode. 1240f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * 1250f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * numPlanes - Number of planes included in this opcode. 1260f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * opticalCenterX, opticalCenterY - Normalized x,y coordinates of the sensor optical 1270f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * center relative to the top,left pixel of the produced images (e.g. [0.5, 0.5] 1280f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * gives a sensor optical center in the image center. 1290f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * kCoeffs - A list of coefficients for the polynomial equation representing the distortion 1300f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * correction. For each plane, 6 coefficients must be included: 1310f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * {k_r0, k_r1, k_r2, k_r3, k_t0, k_t1}. See the DNG 1.4 specification for an 1320f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * outline of the polynomial used here. 1330f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * 1340f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk * Returns OK on success, or a negative error code. 1350f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk */ 1360f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk virtual status_t addWarpRectilinear(uint32_t numPlanes, 1370f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk double opticalCenterX, 1380f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk double opticalCenterY, 1390f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk const double* kCoeffs); 1400f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk 141bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk 142bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk /** 143bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * Add FixBadPixelsList opcode for the given metadata parameters. 144bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * 145bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * Returns OK on success, or a negative error code. 146bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk */ 147bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk virtual status_t addBadPixelListForMetadata(const uint32_t* hotPixels, 148bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk uint32_t xyPairCount, 149bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk uint32_t colorFilterArrangement); 150bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk 151bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk /** 152bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * Add FixBadPixelsList opcode. 153bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * 154bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * bayerPhase - 0=top-left of image is red, 1=top-left of image is green pixel in red row, 155bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * 2=top-left of image is green pixel in blue row, 3=top-left of image is 156bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * blue. 157bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * badPointCount - number of (x,y) pairs of bad pixels are given in badPointRowColPairs. 158bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * badRectCount - number of (top, left, bottom, right) tuples are given in 159bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * badRectTopLeftBottomRightTuples 160bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * 161bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk * Returns OK on success, or a negative error code. 162bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk */ 163bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk virtual status_t addBadPixelList(uint32_t bayerPhase, 164bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk uint32_t badPointCount, 165bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk uint32_t badRectCount, 166bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk const uint32_t* badPointRowColPairs, 167bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk const uint32_t* badRectTopLeftBottomRightTuples); 168bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk 169e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk // TODO: Add other Opcode methods 170e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk protected: 171e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk static const uint32_t FLAG_OPTIONAL = 0x1u; 172e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk static const uint32_t FLAG_OPTIONAL_FOR_PREVIEW = 0x2u; 173e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 1740f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk // Opcode IDs 175e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk enum { 1760f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk WARP_RECTILINEAR_ID = 1, 177bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk FIX_BAD_PIXELS_LIST = 5, 178e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk GAIN_MAP_ID = 9, 1790f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk }; 1800f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk 1810f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk // LSM mosaic indices 1820f212b73e47ef0e1fa39aa250ebabedb9d81a361Ruben Brunk enum { 183e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk LSM_R_IND = 0, 184e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk LSM_GE_IND = 1, 185e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk LSM_GO_IND = 2, 186e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk LSM_B_IND = 3, 187e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk }; 188e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 189e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk uint32_t mCount; 190e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk ByteArrayOutput mOpList; 191e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk EndianOutput mEndianOut; 192e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 193bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk status_t addOpcodePreamble(uint32_t opcodeId); 194bdd368796e7773f0fefb9e238dd16c9242180db5Ruben Brunk 195e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk}; 196e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 197e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace img_utils*/ 198e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk} /*namespace android*/ 199e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk 200e507721000647a7d8afe44c63ef7fd04ef8971b1Ruben Brunk#endif /*IMG_UTILS_DNG_UTILS_H*/ 201