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