• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
35 
36 /**
37  * Utility class for building values for the OpcodeList tags specified
38  * in the Adobe DNG 1.4 spec.
39  */
40 class ANDROID_API OpcodeListBuilder : public LightRefBase<OpcodeListBuilder> {
41     public:
42         enum CfaLayout {
43             CFA_RGGB = 0,
44             CFA_GRBG,
45             CFA_GBRG,
46             CFA_BGGR,
47         };
48 
49         OpcodeListBuilder();
50         virtual ~OpcodeListBuilder();
51 
52         /**
53          * Get the total size of this opcode list in bytes.
54          */
55         virtual size_t getSize() const;
56 
57         /**
58          * Get the number of opcodes defined in this list.
59          */
60         virtual uint32_t getCount() const;
61 
62         /**
63          * Write the opcode list into the given buffer.  This buffer
64          * must be able to hold at least as many elements as returned
65          * by calling the getSize() method.
66          *
67          * Returns OK on success, or a negative error code.
68          */
69         virtual status_t buildOpList(/*out*/ uint8_t* buf) const;
70 
71         /**
72          * Add GainMap opcode(s) for the given metadata parameters.  The given
73          * CFA layout must match the layout of the shading map passed into the
74          * lensShadingMap parameter.
75          *
76          * Returns OK on success, or a negative error code.
77          */
78         virtual status_t addGainMapsForMetadata(uint32_t lsmWidth,
79                                                 uint32_t lsmHeight,
80                                                 uint32_t activeAreaTop,
81                                                 uint32_t activeAreaLeft,
82                                                 uint32_t activeAreaBottom,
83                                                 uint32_t activeAreaRight,
84                                                 CfaLayout cfa,
85                                                 const float* lensShadingMap);
86 
87 
88         /**
89          * Add a GainMap opcode with the given fields.  The mapGains array
90          * must have mapPointsV * mapPointsH * mapPlanes elements.
91          *
92          * Returns OK on success, or a negative error code.
93          */
94         virtual status_t addGainMap(uint32_t top,
95                                     uint32_t left,
96                                     uint32_t bottom,
97                                     uint32_t right,
98                                     uint32_t plane,
99                                     uint32_t planes,
100                                     uint32_t rowPitch,
101                                     uint32_t colPitch,
102                                     uint32_t mapPointsV,
103                                     uint32_t mapPointsH,
104                                     double mapSpacingV,
105                                     double mapSpacingH,
106                                     double mapOriginV,
107                                     double mapOriginH,
108                                     uint32_t mapPlanes,
109                                     const float* mapGains);
110 
111         /**
112          * Add WarpRectilinear opcode for the given metadata parameters.
113          *
114          * Returns OK on success, or a negative error code.
115          */
116         virtual status_t addWarpRectilinearForMetadata(const float* kCoeffs,
117                                                        uint32_t activeArrayWidth,
118                                                        uint32_t activeArrayHeight,
119                                                        float opticalCenterX,
120                                                        float opticalCenterY);
121 
122         /**
123          * Add a WarpRectilinear opcode.
124          *
125          * numPlanes - Number of planes included in this opcode.
126          * opticalCenterX, opticalCenterY - Normalized x,y coordinates of the sensor optical
127          *          center relative to the top,left pixel of the produced images (e.g. [0.5, 0.5]
128          *          gives a sensor optical center in the image center.
129          * kCoeffs - A list of coefficients for the polynomial equation representing the distortion
130          *          correction.  For each plane, 6 coefficients must be included:
131          *          {k_r0, k_r1, k_r2, k_r3, k_t0, k_t1}.  See the DNG 1.4 specification for an
132          *          outline of the polynomial used here.
133          *
134          * Returns OK on success, or a negative error code.
135          */
136         virtual status_t addWarpRectilinear(uint32_t numPlanes,
137                                             double opticalCenterX,
138                                             double opticalCenterY,
139                                             const double* kCoeffs);
140 
141 
142         /**
143          * Add FixBadPixelsList opcode for the given metadata parameters.
144          *
145          * Returns OK on success, or a negative error code.
146          */
147         virtual status_t addBadPixelListForMetadata(const uint32_t* hotPixels,
148                                                     uint32_t xyPairCount,
149                                                     uint32_t colorFilterArrangement);
150 
151         /**
152          * Add FixBadPixelsList opcode.
153          *
154          * bayerPhase - 0=top-left of image is red, 1=top-left of image is green pixel in red row,
155          *              2=top-left of image is green pixel in blue row, 3=top-left of image is
156          *              blue.
157          * badPointCount - number of (x,y) pairs of bad pixels are given in badPointRowColPairs.
158          * badRectCount - number of (top, left, bottom, right) tuples are given in
159          *              badRectTopLeftBottomRightTuples
160          *
161          * Returns OK on success, or a negative error code.
162          */
163         virtual status_t addBadPixelList(uint32_t bayerPhase,
164                                          uint32_t badPointCount,
165                                          uint32_t badRectCount,
166                                          const uint32_t* badPointRowColPairs,
167                                          const uint32_t* badRectTopLeftBottomRightTuples);
168 
169         // TODO: Add other Opcode methods
170     protected:
171         static const uint32_t FLAG_OPTIONAL = 0x1u;
172         static const uint32_t FLAG_OPTIONAL_FOR_PREVIEW = 0x2u;
173 
174         // Opcode IDs
175         enum {
176             WARP_RECTILINEAR_ID = 1,
177             FIX_BAD_PIXELS_LIST = 5,
178             GAIN_MAP_ID = 9,
179         };
180 
181         // LSM mosaic indices
182         enum {
183             LSM_R_IND = 0,
184             LSM_GE_IND = 1,
185             LSM_GO_IND = 2,
186             LSM_B_IND = 3,
187         };
188 
189         uint32_t mCount;
190         ByteArrayOutput mOpList;
191         EndianOutput mEndianOut;
192 
193         status_t addOpcodePreamble(uint32_t opcodeId);
194 
195 };
196 
197 } /*namespace img_utils*/
198 } /*namespace android*/
199 
200 #endif /*IMG_UTILS_DNG_UTILS_H*/
201