CameraHalUtilClasses.cpp revision 72dbc3152137ec7b77deddede4229f73149e92c8
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#define LOG_TAG "CameraHAL" 2572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 2672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 2772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng#include "CameraHal.h" 2872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 2972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengnamespace android { 3072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 3172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------FrameProvider Class STARTS here-----------------------------*/ 3272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 3372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint FrameProvider::enableFrameNotification(int32_t frameTypes) 3472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 3572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 3672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 3772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 3872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) 3972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->enableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION 4072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mFrameCallback 4172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , NULL 4272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 4372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 4472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 4572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 4672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 4772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 4872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 4972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint FrameProvider::disableFrameNotification(int32_t frameTypes) 5072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 5172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 5272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 5372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 5472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION 5572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 5672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 5772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 5872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 5972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 6072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 6172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 6272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint FrameProvider::returnFrame(void *frameBuf, CameraFrame::FrameType frameType) 6372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 6472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 6572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 6672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->returnFrame(frameBuf, frameType); 6772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 6872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 6972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 7072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 7172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengvoid FrameProvider::addFramePointers(void *frameBuf, void *buf) 7272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 7372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->addFramePointers(frameBuf, buf); 7472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return; 7572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 7672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 7772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengvoid FrameProvider::removeFramePointers() 7872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 7972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mFrameNotifier->removeFramePointers(); 8072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return; 8172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 8272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------FrameProvider Class ENDS here-----------------------------*/ 8472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------EventProvider Class STARTS here-----------------------------*/ 8672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 8772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint EventProvider::enableEventNotification(int32_t frameTypes) 8872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 8972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 9072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 9172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 9272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) 9372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mEventNotifier->enableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION 9472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , NULL 9572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mEventCallback 9672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 9772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 9872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 9972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 10072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 10172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 10272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 10372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengint EventProvider::disableEventNotification(int32_t frameTypes) 10472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 10572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME; 10672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 10772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 10872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng mEventNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION 10972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng , mCookie 11072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ); 11172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 11372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 11472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 11572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------EventProvider Class ENDS here-----------------------------*/ 11772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 11872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------CameraArea Class STARTS here-----------------------------*/ 11972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 12072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::transfrom(size_t width, 12172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t height, 12272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &top, 12372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &left, 12472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &areaWidth, 12572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t &areaHeight) 12672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 12772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 12872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t hRange, vRange; 12972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng double hScale, vScale; 13072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 13172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME 13272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 13372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng hRange = CameraArea::RIGHT - CameraArea::LEFT; 13472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng vRange = CameraArea::BOTTOM - CameraArea::TOP; 13572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng hScale = ( double ) width / ( double ) hRange; 13672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng vScale = ( double ) height / ( double ) vRange; 13772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 13872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng top = ( mTop + vRange / 2 ) * vScale; 13972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng left = ( mLeft + hRange / 2 ) * hScale; 14072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaHeight = ( mBottom + vRange / 2 ) * vScale; 14172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaHeight -= top; 14272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaWidth = ( mRight + hRange / 2) * hScale; 14372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areaWidth -= left; 14472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 14572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT 14672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 14772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 14872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 14972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 15072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::checkArea(ssize_t top, 15172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t left, 15272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t bottom, 15372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t right, 15472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t weight) 15572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 15672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 15772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng //Handles the invalid regin corner case. 15872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( 0 == top ) && ( 0 == left ) && ( 0 == bottom ) && ( 0 == right ) && ( 0 == weight ) ) { 15972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return NO_ERROR; 16072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 16172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 16272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::WEIGHT_MIN > weight ) || ( CameraArea::WEIGHT_MAX < weight ) ) { 16372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area weight is invalid %d", weight); 16472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 16572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 16672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 16772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::TOP > top ) || ( CameraArea::BOTTOM < top ) ) { 16872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area top coordinate is invalid %d", top ); 16972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 17072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 17172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 17272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::TOP > bottom ) || ( CameraArea::BOTTOM < bottom ) ) { 17372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area bottom coordinate is invalid %d", bottom ); 17472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 17572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 17672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 17772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::LEFT > left ) || ( CameraArea::RIGHT < left ) ) { 17872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area left coordinate is invalid %d", left ); 17972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 18072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 18172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 18272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( CameraArea::LEFT > right ) || ( CameraArea::RIGHT < right ) ) { 18372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEB("Camera area right coordinate is invalid %d", right ); 18472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 18572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 18672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 18772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( left >= right ) { 18872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Camera area left larger than right"); 18972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 19072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 19172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 19272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( top >= bottom ) { 19372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Camera area top larger than bottom"); 19472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 19572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 19672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 19772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return NO_ERROR; 19872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 19972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 20072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengstatus_t CameraArea::parseAreas(const char *area, 20172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng size_t areaLength, 20272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng Vector< sp<CameraArea> > &areas) 20372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng{ 20472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng status_t ret = NO_ERROR; 20572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *ctx; 20672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pArea = NULL; 20772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pStart = NULL; 20872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *pEnd = NULL; 20972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char *startToken = "("; 21072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char endToken = ')'; 21172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng const char sep = ','; 21272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ssize_t top, left, bottom, right, weight; 21372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng char *tmpBuffer = NULL; 21472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng sp<CameraArea> currentArea; 21572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 21672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME 21772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 21872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( ( NULL == area ) || 21972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( 0 >= areaLength ) ) 22072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 22172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -EINVAL; 22272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 22372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 22472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng tmpBuffer = ( char * ) malloc(areaLength); 22572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL == tmpBuffer ) 22672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 22772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return -ENOMEM; 22872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 22972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng memcpy(tmpBuffer, area, areaLength); 23172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pArea = strtok_r(tmpBuffer, startToken, &ctx); 23372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng do 23572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 23672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 23772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pStart = pArea; 23872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL == pStart ) 23972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 24072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the left area coordinate failed!"); 24172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 24272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 24372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 24472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 24572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 24672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng left = static_cast<ssize_t>(strtol(pStart, &pEnd, 10)); 24772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 24872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 24972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 25072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 25172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the top area coordinate failed!"); 25272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 25372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 25472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 25572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 25672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 25772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng top = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 25872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 25972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 26072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 26172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 26272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the right area coordinate failed!"); 26372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 26472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 26572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 26672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 26772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 26872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng right = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 26972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 27072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 27172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 27272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 27372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the bottom area coordinate failed!"); 27472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 27572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 27672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 27772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 27872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 27972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng bottom = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 28072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 28172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 28272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( sep != *pEnd ) 28372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 28472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Parsing of the weight area coordinate failed!"); 28572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 28672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 28772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 28872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 28972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 29072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng weight = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); 29172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 29272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 29372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( endToken != *pEnd ) 29472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 29572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGEA("Malformed area!"); 29672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -EINVAL; 29772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 29872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 29972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 30072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = checkArea(top, left, bottom, right, weight); 30172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NO_ERROR != ret ) { 30272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 30372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 30472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 30572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng currentArea = new CameraArea(top, left, bottom, right, weight); 30672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng CAMHAL_LOGDB("Area parsed [%dx%d, %dx%d] %d", 30772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) top, 30872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) left, 30972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) bottom, 31072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) right, 31172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ( int ) weight); 31272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL != currentArea.get() ) 31372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 31472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng areas.add(currentArea); 31572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 31672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng else 31772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 31872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng ret = -ENOMEM; 31972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng break; 32072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 32172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng pArea = strtok_r(NULL, startToken, &ctx); 32372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 32572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng while ( NULL != pArea ); 32672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 32772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if ( NULL != tmpBuffer ) 32872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng { 32972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng free(tmpBuffer); 33072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 33172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 33272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng LOG_FUNCTION_NAME_EXIT 33372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 33472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ret; 33572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 33672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 33772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengbool CameraArea::areAreasDifferent(Vector< sp<CameraArea> > &area1, 33872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng Vector< sp<CameraArea> > &area2) { 33972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if (area1.size() != area2.size()) { 34072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return true; 34172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 34372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng // not going to care about sorting order for now 34472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng for (int i = 0; i < area1.size(); i++) { 34572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng if (!area1.itemAt(i)->compare(area2.itemAt(i))) { 34672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return true; 34772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng } 34972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 35072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return false; 35172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 35272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 35372dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boatengbool CameraArea::compare(const sp<CameraArea> &area) { 35472dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng return ((mTop == area->mTop) && (mLeft == area->mLeft) && 35572dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng (mBottom == area->mBottom) && (mRight == area->mRight) && 35672dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng (mWeight == area->mWeight)); 35772dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng} 35872dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 35972dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 36072dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng/*--------------------CameraArea Class ENDS here-----------------------------*/ 36172dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng 36272dbc3152137ec7b77deddede4229f73149e92c8Akwasi Boateng}; 363