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