1 /* 2 * Copyright 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef IMG_UTILS_DNG_UTILS_H 18 #define IMG_UTILS_DNG_UTILS_H 19 20 #include <img_utils/ByteArrayOutput.h> 21 #include <img_utils/EndianUtils.h> 22 23 #include <utils/Errors.h> 24 #include <utils/Log.h> 25 #include <utils/RefBase.h> 26 27 #include <cutils/compiler.h> 28 #include <stdint.h> 29 30 namespace android { 31 namespace img_utils { 32 33 #define NELEMS(x) ((int) (sizeof(x) / sizeof((x)[0]))) 34 35 /** 36 * Utility class for building values for the OpcodeList tags specified 37 * in the Adobe DNG 1.4 spec. 38 */ 39 class ANDROID_API OpcodeListBuilder : public LightRefBase<OpcodeListBuilder> { 40 public: 41 enum CfaLayout { 42 CFA_RGGB = 0, 43 CFA_GRBG, 44 CFA_GBRG, 45 CFA_BGGR, 46 }; 47 48 OpcodeListBuilder(); 49 virtual ~OpcodeListBuilder(); 50 51 /** 52 * Get the total size of this opcode list in bytes. 53 */ 54 virtual size_t getSize() const; 55 56 /** 57 * Get the number of opcodes defined in this list. 58 */ 59 virtual uint32_t getCount() const; 60 61 /** 62 * Write the opcode list into the given buffer. This buffer 63 * must be able to hold at least as many elements as returned 64 * by calling the getSize() method. 65 * 66 * Returns OK on success, or a negative error code. 67 */ 68 virtual status_t buildOpList(/*out*/ uint8_t* buf) const; 69 70 /** 71 * Add GainMap opcode(s) for the given metadata parameters. The given 72 * CFA layout must match the layout of the shading map passed into the 73 * lensShadingMap parameter. 74 * 75 * Returns OK on success, or a negative error code. 76 */ 77 virtual status_t addGainMapsForMetadata(uint32_t lsmWidth, 78 uint32_t lsmHeight, 79 uint32_t activeAreaTop, 80 uint32_t activeAreaLeft, 81 uint32_t activeAreaBottom, 82 uint32_t activeAreaRight, 83 CfaLayout cfa, 84 const float* lensShadingMap); 85 86 87 /** 88 * Add a GainMap opcode with the given fields. The mapGains array 89 * must have mapPointsV * mapPointsH * mapPlanes elements. 90 * 91 * Returns OK on success, or a negative error code. 92 */ 93 virtual status_t addGainMap(uint32_t top, 94 uint32_t left, 95 uint32_t bottom, 96 uint32_t right, 97 uint32_t plane, 98 uint32_t planes, 99 uint32_t rowPitch, 100 uint32_t colPitch, 101 uint32_t mapPointsV, 102 uint32_t mapPointsH, 103 double mapSpacingV, 104 double mapSpacingH, 105 double mapOriginV, 106 double mapOriginH, 107 uint32_t mapPlanes, 108 const float* mapGains); 109 110 // TODO: Add other Opcode methods 111 protected: 112 static const uint32_t FLAG_OPTIONAL = 0x1u; 113 static const uint32_t FLAG_OPTIONAL_FOR_PREVIEW = 0x2u; 114 115 enum { 116 GAIN_MAP_ID = 9, 117 LSM_R_IND = 0, 118 LSM_GE_IND = 1, 119 LSM_GO_IND = 2, 120 LSM_B_IND = 3, 121 }; 122 123 uint32_t mCount; 124 ByteArrayOutput mOpList; 125 EndianOutput mEndianOut; 126 127 }; 128 129 } /*namespace img_utils*/ 130 } /*namespace android*/ 131 132 #endif /*IMG_UTILS_DNG_UTILS_H*/ 133