213 lines
7.1 KiB
C++
213 lines
7.1 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#include "CameraHal.h"
|
|
|
|
namespace Ti {
|
|
namespace Camera {
|
|
|
|
const char CameraHal::PARAMS_DELIMITER []= ",";
|
|
|
|
#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
|
|
|
|
struct timeval CameraHal::ppm_start;
|
|
|
|
#endif
|
|
|
|
#if PPM_INSTRUMENTATION
|
|
|
|
/**
|
|
@brief PPM instrumentation
|
|
|
|
Dumps the current time offset. The time reference point
|
|
lies within the CameraHAL constructor.
|
|
|
|
@param str - log message
|
|
@return none
|
|
|
|
*/
|
|
void CameraHal::PPM(const char* str){
|
|
struct timeval ppm;
|
|
|
|
gettimeofday(&ppm, NULL);
|
|
ppm.tv_sec = ppm.tv_sec - ppm_start.tv_sec;
|
|
ppm.tv_sec = ppm.tv_sec * 1000000;
|
|
ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_start.tv_usec;
|
|
|
|
CAMHAL_LOGI("PPM: %s :%ld.%ld ms", str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ));
|
|
}
|
|
|
|
#elif PPM_INSTRUMENTATION_ABS
|
|
|
|
/**
|
|
@brief PPM instrumentation
|
|
|
|
Dumps the current time offset. The time reference point
|
|
lies within the CameraHAL constructor. This implemetation
|
|
will also dump the abosolute timestamp, which is useful when
|
|
post calculation is done with data coming from the upper
|
|
layers (Camera application etc.)
|
|
|
|
@param str - log message
|
|
@return none
|
|
|
|
*/
|
|
void CameraHal::PPM(const char* str){
|
|
struct timeval ppm;
|
|
|
|
unsigned long long elapsed, absolute;
|
|
gettimeofday(&ppm, NULL);
|
|
elapsed = ppm.tv_sec - ppm_start.tv_sec;
|
|
elapsed *= 1000000;
|
|
elapsed += ppm.tv_usec - ppm_start.tv_usec;
|
|
absolute = ppm.tv_sec;
|
|
absolute *= 1000;
|
|
absolute += ppm.tv_usec /1000;
|
|
|
|
CAMHAL_LOGI("PPM: %s :%llu.%llu ms : %llu ms", str, ( elapsed /1000 ), ( elapsed % 1000 ), absolute);
|
|
}
|
|
|
|
#endif
|
|
|
|
#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
|
|
|
|
/**
|
|
@brief PPM instrumentation
|
|
|
|
Calculates and dumps the elapsed time using 'ppm_first' as
|
|
reference.
|
|
|
|
@param str - log message
|
|
@return none
|
|
|
|
*/
|
|
void CameraHal::PPM(const char* str, struct timeval* ppm_first, ...){
|
|
char temp_str[256];
|
|
struct timeval ppm;
|
|
unsigned long long absolute;
|
|
va_list args;
|
|
|
|
va_start(args, ppm_first);
|
|
vsprintf(temp_str, str, args);
|
|
gettimeofday(&ppm, NULL);
|
|
absolute = ppm.tv_sec;
|
|
absolute *= 1000;
|
|
absolute += ppm.tv_usec /1000;
|
|
ppm.tv_sec = ppm.tv_sec - ppm_first->tv_sec;
|
|
ppm.tv_sec = ppm.tv_sec * 1000000;
|
|
ppm.tv_sec = ppm.tv_sec + ppm.tv_usec - ppm_first->tv_usec;
|
|
|
|
CAMHAL_LOGI("PPM: %s :%ld.%ld ms : %llu ms", temp_str, ( ppm.tv_sec /1000 ), ( ppm.tv_sec % 1000 ), absolute);
|
|
|
|
va_end(args);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
/** Common utility function definitions used all over the HAL */
|
|
|
|
unsigned int CameraHal::getBPP(const char* format) {
|
|
unsigned int bytesPerPixel;
|
|
|
|
// Calculate bytes per pixel based on the pixel format
|
|
if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) {
|
|
bytesPerPixel = 2;
|
|
} else if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0 ||
|
|
strcmp(format, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) {
|
|
bytesPerPixel = 2;
|
|
} else if (strcmp(format, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) {
|
|
bytesPerPixel = 1;
|
|
} else {
|
|
bytesPerPixel = 1;
|
|
}
|
|
|
|
return bytesPerPixel;
|
|
}
|
|
|
|
void CameraHal::getXYFromOffset(unsigned int *x, unsigned int *y,
|
|
unsigned int offset, unsigned int stride,
|
|
const char* format)
|
|
{
|
|
CAMHAL_ASSERT( x && y && format && (0U < stride) );
|
|
|
|
*x = (offset % stride) / getBPP(format);
|
|
*y = (offset / stride);
|
|
}
|
|
|
|
const char* CameraHal::getPixelFormatConstant(const char* parametersFormat)
|
|
{
|
|
const char *pixelFormat = NULL;
|
|
|
|
if ( NULL != parametersFormat ) {
|
|
if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I) ) {
|
|
CAMHAL_LOGVA("CbYCrY format selected");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I;
|
|
} else if ( (0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP)) ||
|
|
(0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420P)) ) {
|
|
// TODO(XXX): We are treating YV12 the same as YUV420SP
|
|
CAMHAL_LOGVA("YUV420SP format selected");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
|
|
} else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565) ) {
|
|
CAMHAL_LOGVA("RGB565 format selected");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565;
|
|
} else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ) {
|
|
CAMHAL_LOGVA("BAYER format selected");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
|
|
} else if ( 0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_JPEG) ) {
|
|
CAMHAL_LOGVA("JPEG format selected");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_JPEG;
|
|
} else {
|
|
CAMHAL_LOGEA("Invalid format, NV12 format selected as default");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
|
|
}
|
|
} else {
|
|
CAMHAL_LOGEA("Preview format is NULL, defaulting to NV12");
|
|
pixelFormat = (const char *) android::CameraParameters::PIXEL_FORMAT_YUV420SP;
|
|
}
|
|
|
|
return pixelFormat;
|
|
}
|
|
|
|
size_t CameraHal::calculateBufferSize(const char* parametersFormat, int width, int height)
|
|
{
|
|
int bufferSize = -1;
|
|
|
|
if ( NULL != parametersFormat ) {
|
|
if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_YUV422I) ) {
|
|
bufferSize = width * height * 2;
|
|
} else if ( (0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP)) ||
|
|
(0 == strcmp(parametersFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P)) ) {
|
|
bufferSize = width * height * 3 / 2;
|
|
} else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_RGB565) ) {
|
|
bufferSize = width * height * 2;
|
|
} else if ( 0 == strcmp(parametersFormat, (const char *) android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ) {
|
|
bufferSize = width * height * 2;
|
|
} else {
|
|
CAMHAL_LOGEA("Invalid format");
|
|
bufferSize = 0;
|
|
}
|
|
} else {
|
|
CAMHAL_LOGEA("Preview format is NULL");
|
|
bufferSize = 0;
|
|
}
|
|
|
|
return bufferSize;
|
|
}
|
|
|
|
|
|
} // namespace Camera
|
|
} // namespace Ti
|