/* | |
* Copyright (C) Texas Instruments - http://www.ti.com/ | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
/** | |
* @file CameraHalUtilClasses.cpp | |
* | |
* This file maps the CameraHardwareInterface to the Camera interfaces on OMAP4 (mainly OMX). | |
* | |
*/ | |
#define LOG_TAG "CameraHAL" | |
#include "CameraHal.h" | |
namespace android { | |
/*--------------------FrameProvider Class STARTS here-----------------------------*/ | |
int FrameProvider::enableFrameNotification(int32_t frameTypes) | |
{ | |
LOG_FUNCTION_NAME; | |
status_t ret = NO_ERROR; | |
///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) | |
mFrameNotifier->enableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION | |
, mFrameCallback | |
, NULL | |
, mCookie | |
); | |
LOG_FUNCTION_NAME_EXIT; | |
return ret; | |
} | |
int FrameProvider::disableFrameNotification(int32_t frameTypes) | |
{ | |
LOG_FUNCTION_NAME; | |
status_t ret = NO_ERROR; | |
mFrameNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION | |
, mCookie | |
); | |
LOG_FUNCTION_NAME_EXIT; | |
return ret; | |
} | |
int FrameProvider::returnFrame(void *frameBuf, CameraFrame::FrameType frameType) | |
{ | |
status_t ret = NO_ERROR; | |
mFrameNotifier->returnFrame(frameBuf, frameType); | |
return ret; | |
} | |
void FrameProvider::addFramePointers(void *frameBuf, void *buf) | |
{ | |
mFrameNotifier->addFramePointers(frameBuf, buf); | |
return; | |
} | |
void FrameProvider::removeFramePointers() | |
{ | |
mFrameNotifier->removeFramePointers(); | |
return; | |
} | |
/*--------------------FrameProvider Class ENDS here-----------------------------*/ | |
/*--------------------EventProvider Class STARTS here-----------------------------*/ | |
int EventProvider::enableEventNotification(int32_t frameTypes) | |
{ | |
LOG_FUNCTION_NAME; | |
status_t ret = NO_ERROR; | |
///Enable the frame notification to CameraAdapter (which implements FrameNotifier interface) | |
mEventNotifier->enableMsgType(frameTypes<<MessageNotifier::EVENT_BIT_FIELD_POSITION | |
, NULL | |
, mEventCallback | |
, mCookie | |
); | |
LOG_FUNCTION_NAME_EXIT; | |
return ret; | |
} | |
int EventProvider::disableEventNotification(int32_t frameTypes) | |
{ | |
LOG_FUNCTION_NAME; | |
status_t ret = NO_ERROR; | |
mEventNotifier->disableMsgType(frameTypes<<MessageNotifier::FRAME_BIT_FIELD_POSITION | |
, mCookie | |
); | |
LOG_FUNCTION_NAME_EXIT; | |
return ret; | |
} | |
/*--------------------EventProvider Class ENDS here-----------------------------*/ | |
/*--------------------CameraArea Class STARTS here-----------------------------*/ | |
status_t CameraArea::transfrom(size_t width, | |
size_t height, | |
size_t &top, | |
size_t &left, | |
size_t &areaWidth, | |
size_t &areaHeight) | |
{ | |
status_t ret = NO_ERROR; | |
size_t hRange, vRange; | |
double hScale, vScale; | |
LOG_FUNCTION_NAME | |
hRange = CameraArea::RIGHT - CameraArea::LEFT; | |
vRange = CameraArea::BOTTOM - CameraArea::TOP; | |
hScale = ( double ) width / ( double ) hRange; | |
vScale = ( double ) height / ( double ) vRange; | |
top = ( mTop + vRange / 2 ) * vScale; | |
left = ( mLeft + hRange / 2 ) * hScale; | |
areaHeight = ( mBottom + vRange / 2 ) * vScale; | |
areaHeight -= top; | |
areaWidth = ( mRight + hRange / 2) * hScale; | |
areaWidth -= left; | |
LOG_FUNCTION_NAME_EXIT | |
return ret; | |
} | |
status_t CameraArea::checkArea(ssize_t top, | |
ssize_t left, | |
ssize_t bottom, | |
ssize_t right, | |
ssize_t weight) | |
{ | |
//Handles the invalid regin corner case. | |
if ( ( 0 == top ) && ( 0 == left ) && ( 0 == bottom ) && ( 0 == right ) && ( 0 == weight ) ) { | |
return NO_ERROR; | |
} | |
if ( ( CameraArea::WEIGHT_MIN > weight ) || ( CameraArea::WEIGHT_MAX < weight ) ) { | |
CAMHAL_LOGEB("Camera area weight is invalid %d", weight); | |
return -EINVAL; | |
} | |
if ( ( CameraArea::TOP > top ) || ( CameraArea::BOTTOM < top ) ) { | |
CAMHAL_LOGEB("Camera area top coordinate is invalid %d", top ); | |
return -EINVAL; | |
} | |
if ( ( CameraArea::TOP > bottom ) || ( CameraArea::BOTTOM < bottom ) ) { | |
CAMHAL_LOGEB("Camera area bottom coordinate is invalid %d", bottom ); | |
return -EINVAL; | |
} | |
if ( ( CameraArea::LEFT > left ) || ( CameraArea::RIGHT < left ) ) { | |
CAMHAL_LOGEB("Camera area left coordinate is invalid %d", left ); | |
return -EINVAL; | |
} | |
if ( ( CameraArea::LEFT > right ) || ( CameraArea::RIGHT < right ) ) { | |
CAMHAL_LOGEB("Camera area right coordinate is invalid %d", right ); | |
return -EINVAL; | |
} | |
if ( left >= right ) { | |
CAMHAL_LOGEA("Camera area left larger than right"); | |
return -EINVAL; | |
} | |
if ( top >= bottom ) { | |
CAMHAL_LOGEA("Camera area top larger than bottom"); | |
return -EINVAL; | |
} | |
return NO_ERROR; | |
} | |
status_t CameraArea::parseAreas(const char *area, | |
size_t areaLength, | |
Vector< sp<CameraArea> > &areas) | |
{ | |
status_t ret = NO_ERROR; | |
char *ctx; | |
char *pArea = NULL; | |
char *pStart = NULL; | |
char *pEnd = NULL; | |
const char *startToken = "("; | |
const char endToken = ')'; | |
const char sep = ','; | |
ssize_t top, left, bottom, right, weight; | |
char *tmpBuffer = NULL; | |
sp<CameraArea> currentArea; | |
LOG_FUNCTION_NAME | |
if ( ( NULL == area ) || | |
( 0 >= areaLength ) ) | |
{ | |
return -EINVAL; | |
} | |
tmpBuffer = ( char * ) malloc(areaLength); | |
if ( NULL == tmpBuffer ) | |
{ | |
return -ENOMEM; | |
} | |
memcpy(tmpBuffer, area, areaLength); | |
pArea = strtok_r(tmpBuffer, startToken, &ctx); | |
do | |
{ | |
pStart = pArea; | |
if ( NULL == pStart ) | |
{ | |
CAMHAL_LOGEA("Parsing of the left area coordinate failed!"); | |
ret = -EINVAL; | |
break; | |
} | |
else | |
{ | |
left = static_cast<ssize_t>(strtol(pStart, &pEnd, 10)); | |
} | |
if ( sep != *pEnd ) | |
{ | |
CAMHAL_LOGEA("Parsing of the top area coordinate failed!"); | |
ret = -EINVAL; | |
break; | |
} | |
else | |
{ | |
top = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); | |
} | |
if ( sep != *pEnd ) | |
{ | |
CAMHAL_LOGEA("Parsing of the right area coordinate failed!"); | |
ret = -EINVAL; | |
break; | |
} | |
else | |
{ | |
right = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); | |
} | |
if ( sep != *pEnd ) | |
{ | |
CAMHAL_LOGEA("Parsing of the bottom area coordinate failed!"); | |
ret = -EINVAL; | |
break; | |
} | |
else | |
{ | |
bottom = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); | |
} | |
if ( sep != *pEnd ) | |
{ | |
CAMHAL_LOGEA("Parsing of the weight area coordinate failed!"); | |
ret = -EINVAL; | |
break; | |
} | |
else | |
{ | |
weight = static_cast<ssize_t>(strtol(pEnd+1, &pEnd, 10)); | |
} | |
if ( endToken != *pEnd ) | |
{ | |
CAMHAL_LOGEA("Malformed area!"); | |
ret = -EINVAL; | |
break; | |
} | |
ret = checkArea(top, left, bottom, right, weight); | |
if ( NO_ERROR != ret ) { | |
break; | |
} | |
currentArea = new CameraArea(top, left, bottom, right, weight); | |
CAMHAL_LOGDB("Area parsed [%dx%d, %dx%d] %d", | |
( int ) top, | |
( int ) left, | |
( int ) bottom, | |
( int ) right, | |
( int ) weight); | |
if ( NULL != currentArea.get() ) | |
{ | |
areas.add(currentArea); | |
} | |
else | |
{ | |
ret = -ENOMEM; | |
break; | |
} | |
pArea = strtok_r(NULL, startToken, &ctx); | |
} | |
while ( NULL != pArea ); | |
if ( NULL != tmpBuffer ) | |
{ | |
free(tmpBuffer); | |
} | |
LOG_FUNCTION_NAME_EXIT | |
return ret; | |
} | |
bool CameraArea::areAreasDifferent(Vector< sp<CameraArea> > &area1, | |
Vector< sp<CameraArea> > &area2) { | |
if (area1.size() != area2.size()) { | |
return true; | |
} | |
// not going to care about sorting order for now | |
for (int i = 0; i < area1.size(); i++) { | |
if (!area1.itemAt(i)->compare(area2.itemAt(i))) { | |
return true; | |
} | |
} | |
return false; | |
} | |
bool CameraArea::compare(const sp<CameraArea> &area) { | |
return ((mTop == area->mTop) && (mLeft == area->mLeft) && | |
(mBottom == area->mBottom) && (mRight == area->mRight) && | |
(mWeight == area->mWeight)); | |
} | |
/*--------------------CameraArea Class ENDS here-----------------------------*/ | |
}; |