172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/* 272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Copyright (C) Texas Instruments - http://www.ti.com/ 372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * 472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Licensed under the Apache License, Version 2.0 (the "License"); 572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * you may not use this file except in compliance with the License. 672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * You may obtain a copy of the License at 772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * 872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * http://www.apache.org/licenses/LICENSE-2.0 972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * 1072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * Unless required by applicable law or agreed to in writing, software 1172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * distributed under the License is distributed on an "AS IS" BASIS, 1272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * See the License for the specific language governing permissions and 1472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng * limitations under the License. 1572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng */ 1672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 1772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/** 1872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng* @file CameraHalUtilClasses.cpp 1972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng* 2072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng* This file maps the CameraHardwareInterface to the Camera interfaces on OMAP4 (mainly OMX). 2172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng* 2272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng*/ 2372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 2472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#include "CameraHal.h" 2572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 26f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 27f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 2872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 2972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------FrameProvider Class STARTS here-----------------------------*/ 3072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 3172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint FrameProvider::enableFrameNotification(int32_t frameTypes) 3272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 3372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 3472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 3572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 3672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) 3772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->enableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION 3872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mFrameCallback 3972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , NULL 4072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 4172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 4272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 4372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 4472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 4572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 4672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 4772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint FrameProvider::disableFrameNotification(int32_t frameTypes) 4872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 4972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 5072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 5172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 5272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION 5372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 5472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 5572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 5672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 5772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 5872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 5972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint FrameProvider::returnFrame(CameraBuffer *frameBuf, CameraFrame::FrameType frameType) 6172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 6272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 6372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 6472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->returnFrame(frameBuf, frameType); 6572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 6672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 6772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 6872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid FrameProvider::addFramePointers(CameraBuffer *frameBuf, void *buf) 7072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 7172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->addFramePointers(frameBuf, buf); 7272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return; 7372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 7472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 7572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengvoid FrameProvider::removeFramePointers() 7672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 7772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->removeFramePointers(); 7872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return; 7972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 8072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------FrameProvider Class ENDS here-----------------------------*/ 8272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------EventProvider Class STARTS here-----------------------------*/ 8472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint EventProvider::enableEventNotification(int32_t frameTypes) 8672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 8772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 8872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 8972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 9072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) 9172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mEventNotifier->enableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION 9272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , NULL 9372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mEventCallback 9472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 9572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 9672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 9772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 9872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 9972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 10072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 10172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint EventProvider::disableEventNotification(int32_t frameTypes) 10272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 10372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 10472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 10572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mEventNotifier->disableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION 10772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 10872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 10972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 11172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 11272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 11372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------EventProvider Class ENDS here-----------------------------*/ 11572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------CameraArea Class STARTS here-----------------------------*/ 11772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::transfrom(size_t width, 11972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t height, 12072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &top, 12172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &left, 12272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &areaWidth, 12372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &areaHeight) 12472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 12572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 12672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t hRange, vRange; 12772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng double hScale, vScale; 12872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 12972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME 13072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 13172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng hRange = CameraArea::RIGHT - CameraArea::LEFT; 13272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng vRange = CameraArea::BOTTOM - CameraArea::TOP; 13372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng hScale = ( double ) width / ( double ) hRange; 13472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng vScale = ( double ) height / ( double ) vRange; 13572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 13672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng top = ( mTop + vRange / 2 ) * vScale; 13772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng left = ( mLeft + hRange / 2 ) * hScale; 13872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaHeight = ( mBottom + vRange / 2 ) * vScale; 13972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaHeight -= top; 14072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaWidth = ( mRight + hRange / 2) * hScale; 14172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaWidth -= left; 14272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 14372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT 14472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 14572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 14672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 14772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 14872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::checkArea(ssize_t top, 14972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t left, 15072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t bottom, 15172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t right, 15272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t weight) 15372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 15472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 15572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng //Handles the invalid regin corner case. 15672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( 0 == top ) && ( 0 == left ) && ( 0 == bottom ) && ( 0 == right ) && ( 0 == weight ) ) { 15772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return NO_ERROR; 15872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 15972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 16072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::WEIGHT_MIN > weight ) || ( CameraArea::WEIGHT_MAX < weight ) ) { 16172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area weight is invalid %d", weight); 16272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 16372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 16472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 16572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::TOP > top ) || ( CameraArea::BOTTOM < top ) ) { 16672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area top coordinate is invalid %d", top ); 16772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 16872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 16972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 17072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::TOP > bottom ) || ( CameraArea::BOTTOM < bottom ) ) { 17172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area bottom coordinate is invalid %d", bottom ); 17272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 17372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 17472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 17572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::LEFT > left ) || ( CameraArea::RIGHT < left ) ) { 17672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area left coordinate is invalid %d", left ); 17772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 17872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 17972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 18072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::LEFT > right ) || ( CameraArea::RIGHT < right ) ) { 18172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area right coordinate is invalid %d", right ); 18272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 18372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 18472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 18572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( left >= right ) { 18672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Camera area left larger than right"); 18772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 18872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 18972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 19072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( top >= bottom ) { 19172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Camera area top larger than bottom"); 19272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 19372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 19472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 19572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return NO_ERROR; 19672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 19772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 19872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::parseAreas(const char *area, 19972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t areaLength, 200f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::Vector<android::sp<CameraArea> > &areas) 20172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 20272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 20372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *ctx; 20472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pArea = NULL; 20572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pStart = NULL; 20672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pEnd = NULL; 20772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char *startToken = "("; 20872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char endToken = ')'; 20972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char sep = ','; 21072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t top, left, bottom, right, weight; 21172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *tmpBuffer = NULL; 212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<CameraArea> currentArea; 21372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 21472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME 21572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 21672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( NULL == area ) || 21772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( 0 >= areaLength ) ) 21872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 21972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 22072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 22172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 22272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng tmpBuffer = ( char * ) malloc(areaLength); 22372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL == tmpBuffer ) 22472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 22572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -ENOMEM; 22672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 22772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 22872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng memcpy(tmpBuffer, area, areaLength); 22972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pArea = strtok_r(tmpBuffer, startToken, &ctx); 23172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng do 23372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 23472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pStart = pArea; 23672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL == pStart ) 23772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 23872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the left area coordinate failed!"); 23972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 24072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 24172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 24272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 24372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 24472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng left = static_cast<ssize_t>(strtol(pStart, &pEnd, 10)); 24572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 24672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 24772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 24872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 24972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the top area coordinate failed!"); 25072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 25172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 25272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 25372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 25472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 25572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng top = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 25672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 25772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 25872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 25972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 26072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the right area coordinate failed!"); 26172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 26272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 26372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 26472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 26572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 26672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng right = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 26772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 26872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 26972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 27072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 27172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the bottom area coordinate failed!"); 27272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 27372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 27472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 27572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 27672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 27772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng bottom = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 27872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 27972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 28072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 28172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 28272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the weight area coordinate failed!"); 28372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 28472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 28572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 28672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 28772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 28872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng weight = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 28972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 29072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 29172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( endToken != *pEnd ) 29272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 29372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Malformed area!"); 29472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 29572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 29672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 29772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 29872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = checkArea(top, left, bottom, right, weight); 29972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NO_ERROR != ret ) { 30072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 30172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 30272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 30372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng currentArea = new CameraArea(top, left, bottom, right, weight); 30472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGDB("Area parsed [%dx%d, %dx%d] %d", 30572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) top, 30672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) left, 30772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) bottom, 30872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) right, 30972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) weight); 31072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL != currentArea.get() ) 31172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 31272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areas.add(currentArea); 31372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 31472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 31572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 31672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -ENOMEM; 31772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 31872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 31972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pArea = strtok_r(NULL, startToken, &ctx); 32172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 32372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng while ( NULL != pArea ); 32472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL != tmpBuffer ) 32672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 32772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng free(tmpBuffer); 32872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 32972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 33072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT 33172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 33272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 33372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 33472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraArea::areAreasDifferent(android::Vector< android::sp<CameraArea> > &area1, 336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::Vector< android::sp<CameraArea> > &area2) { 33772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if (area1.size() != area2.size()) { 33872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return true; 33972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 34172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng // not going to care about sorting order for now 34272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng for (int i = 0; i < area1.size(); i++) { 34372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if (!area1.itemAt(i)->compare(area2.itemAt(i))) { 34472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return true; 34572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 34872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return false; 34972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 35072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraArea::compare(const android::sp<CameraArea> &area) { 35272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ((mTop == area->mTop) && (mLeft == area->mLeft) && 35372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng (mBottom == area->mBottom) && (mRight == area->mRight) && 35472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng (mWeight == area->mWeight)); 35572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 35672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 35772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 35872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------CameraArea Class ENDS here-----------------------------*/ 35972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 362