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