1f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/*
2f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Copyright (C) Texas Instruments - http://www.ti.com/
3f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *
4f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Licensed under the Apache License, Version 2.0 (the "License");
5f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * you may not use this file except in compliance with the License.
6f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * You may obtain a copy of the License at
7f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *
8f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *      http://www.apache.org/licenses/LICENSE-2.0
9f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *
10f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * Unless required by applicable law or agreed to in writing, software
11f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * distributed under the License is distributed on an "AS IS" BASIS,
12f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * See the License for the specific language governing permissions and
14f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons * limitations under the License.
15f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */
16f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
17f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/**
18f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* @file OMX3A.cpp
19f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons*
20f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons* This file contains functionality for handling 3A configurations.
21f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons*
22f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons*/
23f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
24f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#undef LOG_TAG
25f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
26f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#define LOG_TAG "OMXMetaData"
27f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
28f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "OMXCameraAdapter.h"
29f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include <camera/CameraMetadata.h>
30f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
31f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti {
32f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera {
33f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonscamera_memory_t * OMXCameraAdapter::getMetaData(const OMX_PTR plat_pvt,
36f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                                                camera_request_memory allocator) const
37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_memory_t * ret = NULL;
39f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
40f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_OTHER_EXTRADATATYPE *extraData;
41f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_FACEDETECTIONTYPE *faceData = NULL;
42f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_WHITEBALANCERESULTTYPE * WBdata = NULL;
43f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_VECTSHOTINFOTYPE *shotInfo = NULL;
44f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_TI_LSCTABLETYPE *lscTbl = NULL;
45f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    camera_metadata_t *metaData;
46f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    size_t offset = 0;
47f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    size_t metaDataSize = sizeof(camera_metadata_t);
49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    extraData = getExtradata(plat_pvt, (OMX_EXTRADATATYPE) OMX_FaceDetection);
51f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != extraData ) {
52f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        faceData = ( OMX_FACEDETECTIONTYPE * ) extraData->data;
53f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaDataSize += faceData->ulFaceCount * sizeof(camera_metadata_face_t);
54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    extraData = getExtradata(plat_pvt, (OMX_EXTRADATATYPE) OMX_WhiteBalance);
57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != extraData ) {
58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        WBdata = ( OMX_TI_WHITEBALANCERESULTTYPE * ) extraData->data;
59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    extraData = getExtradata(plat_pvt, (OMX_EXTRADATATYPE) OMX_TI_VectShotInfo);
62f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != extraData ) {
63f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        shotInfo = ( OMX_TI_VECTSHOTINFOTYPE * ) extraData->data;
64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
65f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    extraData = getExtradata(plat_pvt, (OMX_EXTRADATATYPE) OMX_TI_LSCTable);
67f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != extraData ) {
68f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        lscTbl = ( OMX_TI_LSCTABLETYPE * ) extraData->data;
69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaDataSize += OMX_TI_LSC_GAIN_TABLE_SIZE;
70f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
71f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    ret = allocator(-1, metaDataSize, 1, NULL);
73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL == ret ) {
74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        return NULL;
75f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData = static_cast<camera_metadata_t *> (ret->data);
77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        offset += sizeof(camera_metadata_t);
78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
80f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != faceData ) {
81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->number_of_faces = 0;
82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        int idx = 0;
83f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->faces_offset = offset;
84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        struct camera_metadata_face *faces = reinterpret_cast<struct camera_metadata_face *> (static_cast<char*>(ret->data) + offset);
85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        for ( int j = 0; j < faceData->ulFaceCount ; j++ ) {
86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            if(faceData->tFacePosition[j].nScore <= FACE_DETECTION_THRESHOLD) {
87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons                continue;
88f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            }
89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            idx = metaData->number_of_faces;
90f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            metaData->number_of_faces++;
91f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            // TODO: Rework and re-use encodeFaceCoordinates()
92f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            faces[idx].left  = faceData->tFacePosition[j].nLeft;
93f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            faces[idx].top = faceData->tFacePosition[j].nTop;
94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            faces[idx].bottom = faceData->tFacePosition[j].nWidth;
95f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons            faces[idx].right = faceData->tFacePosition[j].nHeight;
96f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        }
97f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        offset += sizeof(camera_metadata_face_t) * metaData->number_of_faces;
98f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
99f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != WBdata ) {
101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->awb_temp = WBdata->nColorTemperature;
102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->gain_b = WBdata->nGainB;
103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->gain_gb = WBdata->nGainGB;
104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->gain_gr = WBdata->nGainGR;
105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->gain_r = WBdata->nGainR;
106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->offset_b = WBdata->nOffsetB;
107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->offset_gb = WBdata->nOffsetGB;
108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->offset_gr = WBdata->nOffsetGR;
109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->offset_r = WBdata->nOffsetR;
110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != lscTbl ) {
113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->lsc_table_applied = lscTbl->bApplied;
114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->lsc_table_size = OMX_TI_LSC_GAIN_TABLE_SIZE;
115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->lsc_table_offset = offset;
116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        uint8_t *lsc_table = reinterpret_cast<uint8_t *> (static_cast<char*>(ret->data) + offset);
117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        memcpy(lsc_table, lscTbl->pGainTable, OMX_TI_LSC_GAIN_TABLE_SIZE);
118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        offset += metaData->lsc_table_size;
119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( NULL != shotInfo ) {
122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->frame_number = shotInfo->nFrameNum;
123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->shot_number = shotInfo->nConfigId;
124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain = shotInfo->nAGain;
125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain_req = shotInfo->nReqGain;
126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain_min = shotInfo->nGainMin;
127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain_max = shotInfo->nGainMax;
128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain_error = shotInfo->nSenAGainErr;
129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->analog_gain_dev = shotInfo->nDevAGain;
130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time = shotInfo->nExpTime;
131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time_req = shotInfo->nReqExpTime;
132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time_min = shotInfo->nExpMin;
133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time_max = shotInfo->nExpMax;
134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time_dev = shotInfo->nDevExpTime;
135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_time_error = shotInfo->nSenExpTimeErr;
136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_compensation_req = shotInfo->nReqEC;
137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metaData->exposure_dev = shotInfo->nDevEV;
138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t OMXCameraAdapter::encodePreviewMetadata(camera_frame_metadata_t *meta, const OMX_PTR plat_pvt)
145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{
146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    status_t ret = NO_ERROR;
147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM
148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    OMX_OTHER_EXTRADATATYPE *extraData = NULL;
149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    extraData = getExtradata(plat_pvt, (OMX_EXTRADATATYPE) OMX_TI_VectShotInfo);
151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ( (NULL != extraData) && (NULL != extraData->data) ) {
153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        OMX_TI_VECTSHOTINFOTYPE *shotInfo;
154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        shotInfo = (OMX_TI_VECTSHOTINFOTYPE*) extraData->data;
155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        meta->analog_gain = shotInfo->nAGain;
157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        meta->exposure_time = shotInfo->nExpTime;
158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        meta->analog_gain = -1;
160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        meta->exposure_time = -1;
161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // Send metadata event only after any value has been changed
164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    if ((metadataLastAnalogGain == meta->analog_gain) &&
165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        (metadataLastExposureTime == meta->exposure_time)) {
166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        ret = NOT_ENOUGH_DATA;
167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    } else {
168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metadataLastAnalogGain = meta->analog_gain;
169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons        metadataLastExposureTime = meta->exposure_time;
170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    }
171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else
172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    // no-op in non enhancement mode
173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_UNUSED(meta);
174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    CAMHAL_UNUSED(plat_pvt);
175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif
176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons    return ret;
178f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}
179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons
180f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera
181f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti
182