summaryrefslogtreecommitdiffstats
path: root/camera/CameraHal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/CameraHal.cpp')
-rw-r--r--camera/CameraHal.cpp4333
1 files changed, 0 insertions, 4333 deletions
diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp
deleted file mode 100644
index a1920c5..0000000
--- a/camera/CameraHal.cpp
+++ /dev/null
@@ -1,4333 +0,0 @@
-/*
- * 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 CameraHal.cpp
-*
-* This file maps the Camera Hardware Interface to V4L2.
-*
-*/
-
-#include "CameraHal.h"
-#include "ANativeWindowDisplayAdapter.h"
-#include "BufferSourceAdapter.h"
-#include "TICameraParameters.h"
-#include "CameraProperties.h"
-#include <cutils/properties.h>
-
-#include <poll.h>
-#include <math.h>
-
-namespace Ti {
-namespace Camera {
-
-extern "C" CameraAdapter* OMXCameraAdapter_Factory(size_t);
-extern "C" CameraAdapter* V4LCameraAdapter_Factory(size_t);
-
-/*****************************************************************************/
-
-////Constant definitions and declarations
-////@todo Have a CameraProperties class to store these parameters as constants for every camera
-//// Currently, they are hard-coded
-
-const int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
-const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 5;
-const int CameraHal::SW_SCALING_FPS_LIMIT = 15;
-
-const uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 16;
-
-const uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
-
-// TODO(XXX): Temporarily increase number of buffers we can allocate from ANW
-// until faux-NPA mode is implemented
-const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP = 15;
-
-#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
-// HACK: Default path to directory where RAW images coming from video port will be saved to.
-// If directory not exists the saving is skipped and video port frame is ignored.
-// The directory name is choosed in so weird way to enable RAW images saving only when
-// directory has been created explicitly by user.
-extern const char * const kRawImagesOutputDirPath = "/data/misc/camera/RaW_PiCtUrEs";
-extern const char * const kYuvImagesOutputDirPath = "/data/misc/camera/YuV_PiCtUrEs";
-#endif
-
-/******************************************************************************/
-
-
-#ifdef OMAP_ENHANCEMENT_CPCAM
-static int dummy_update_and_get_buffer(preview_stream_ops_t*, buffer_handle_t**, int*) {
- return INVALID_OPERATION;
-}
-
-static int dummy_get_buffer_dimension(preview_stream_ops_t*, int*, int*) {
- return INVALID_OPERATION;
-}
-
-static int dummy_get_buffer_format(preview_stream_ops_t*, int*) {
- return INVALID_OPERATION;
-}
-
-static int dummy_set_metadata(preview_stream_ops_t*, const camera_memory_t*) {
- return INVALID_OPERATION;
-}
-#endif
-
-#ifdef OMAP_ENHANCEMENT
-static preview_stream_extended_ops_t dummyPreviewStreamExtendedOps = {
-#ifdef OMAP_ENHANCEMENT_CPCAM
- dummy_update_and_get_buffer,
- dummy_get_buffer_dimension,
- dummy_get_buffer_format,
- dummy_set_metadata,
-#endif
-};
-#endif
-
-
-DisplayAdapter::DisplayAdapter()
-{
-#ifdef OMAP_ENHANCEMENT
- mExtendedOps = &dummyPreviewStreamExtendedOps;
-#endif
-}
-
-#ifdef OMAP_ENHANCEMENT
-void DisplayAdapter::setExtendedOps(preview_stream_extended_ops_t * extendedOps) {
- mExtendedOps = extendedOps ? extendedOps : &dummyPreviewStreamExtendedOps;
-}
-#endif
-
-
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
-struct timeval CameraHal::mStartPreview;
-struct timeval CameraHal::mStartFocus;
-struct timeval CameraHal::mStartCapture;
-
-#endif
-
-static void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
- CameraHal *camera = NULL;
-
- if (cookie) {
- camera = (CameraHal*) cookie;
- camera->onOrientationEvent(orientation, tilt);
- }
-
-}
-/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
-
-/**
- Callback function to receive orientation events from SensorListener
- */
-void CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
- LOG_FUNCTION_NAME;
-
- if ( NULL != mCameraAdapter ) {
- mCameraAdapter->onOrientationEvent(orientation, tilt);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Set the notification and data callbacks
-
- @param[in] notify_cb Notify callback for notifying the app about events and errors
- @param[in] data_cb Buffer callback for sending the preview/raw frames to the app
- @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
- @param[in] user Callback cookie
- @return none
-
- */
-void CameraHal::setCallbacks(camera_notify_callback notify_cb,
- camera_data_callback data_cb,
- camera_data_timestamp_callback data_cb_timestamp,
- camera_request_memory get_memory,
- void *user)
-{
- LOG_FUNCTION_NAME;
-
- if ( NULL != mAppCallbackNotifier.get() )
- {
- mAppCallbackNotifier->setCallbacks(this,
- notify_cb,
- data_cb,
- data_cb_timestamp,
- get_memory,
- user);
- }
-
- if ( NULL != mCameraAdapter ) {
- mCameraAdapter->setSharedAllocator(get_memory);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Enable a message, or set of messages.
-
- @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
- @return none
-
- */
-void CameraHal::enableMsgType(int32_t msgType)
-{
- LOG_FUNCTION_NAME;
-
- if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
- {
- msgType &= ~CAMERA_MSG_SHUTTER;
- }
-
- // ignoring enable focus message from camera service
- // we will enable internally in autoFocus call
- msgType &= ~CAMERA_MSG_FOCUS;
-#ifdef ANDROID_API_JB_OR_LATER
- msgType &= ~CAMERA_MSG_FOCUS_MOVE;
-#endif
-
- {
- android::AutoMutex lock(mLock);
- mMsgEnabled |= msgType;
- }
-
- if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
- {
- if(mDisplayPaused)
- {
- CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
- msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
- }else
- {
- CAMHAL_LOGDA("Enabling Preview Callback");
- }
- }
- else
- {
- CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
- }
-
-
- ///Configure app callback notifier with the message callback required
- mAppCallbackNotifier->enableMsgType (msgType);
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Disable a message, or set of messages.
-
- @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
- @return none
-
- */
-void CameraHal::disableMsgType(int32_t msgType)
-{
- LOG_FUNCTION_NAME;
-
- {
- android::AutoMutex lock(mLock);
- mMsgEnabled &= ~msgType;
- }
-
- if( msgType & CAMERA_MSG_PREVIEW_FRAME)
- {
- CAMHAL_LOGDA("Disabling Preview Callback");
- }
-
- ///Configure app callback notifier
- mAppCallbackNotifier->disableMsgType (msgType);
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Query whether a message, or a set of messages, is enabled.
-
- Note that this is operates as an AND, if any of the messages queried are off, this will
- return false.
-
- @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
- @return true If all message types are enabled
- false If any message type
-
- */
-int CameraHal::msgTypeEnabled(int32_t msgType)
-{
- int32_t msgEnabled = 0;
-
- LOG_FUNCTION_NAME;
- android::AutoMutex lock(mLock);
-
- msgEnabled = mMsgEnabled;
- if (!previewEnabled() && !mPreviewInitializationDone) {
- msgEnabled &= ~(CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_PREVIEW_METADATA);
- }
-
- LOG_FUNCTION_NAME_EXIT;
- return (msgEnabled & msgType);
-}
-
-/**
- @brief Set the camera parameters.
-
- @param[in] params Camera parameters to configure the camera
- @return NO_ERROR
- @todo Define error codes
-
- */
-int CameraHal::setParameters(const char* parameters)
-{
-
- LOG_FUNCTION_NAME;
-
- android::CameraParameters params;
-
- android::String8 str_params(parameters);
- params.unflatten(str_params);
-
- LOG_FUNCTION_NAME_EXIT;
-
- return setParameters(params);
-}
-
-/**
- @brief Set the camera parameters.
-
- @param[in] params Camera parameters to configure the camera
- @return NO_ERROR
- @todo Define error codes
-
- */
-int CameraHal::setParameters(const android::CameraParameters& params)
-{
-
- LOG_FUNCTION_NAME;
-
- int w, h;
- int framerate;
- int maxFPS, minFPS;
- const char *valstr = NULL;
- int varint = 0;
- status_t ret = NO_ERROR;
- // Needed for KEY_RECORDING_HINT
- bool restartPreviewRequired = false;
- bool updateRequired = false;
- android::CameraParameters oldParams = mParameters;
-
-#ifdef V4L_CAMERA_ADAPTER
- if (strcmp (V4L_CAMERA_NAME_USB, mCameraProperties->get(CameraProperties::CAMERA_NAME)) == 0 ) {
- updateRequired = true;
- }
-#endif
-
- {
- android::AutoMutex lock(mLock);
-
- ///Ensure that preview is not enabled when the below parameters are changed.
- if(!previewEnabled())
- {
- if ((valstr = params.getPreviewFormat()) != NULL) {
- if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
- mParameters.setPreviewFormat(valstr);
- CAMHAL_LOGDB("PreviewFormat set %s", valstr);
- } else {
- CAMHAL_LOGEB("Invalid preview format: %s. Supported: %s", valstr,
- mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
- return BAD_VALUE;
- }
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
- if (strcmp(mCameraProperties->get(CameraProperties::VNF_SUPPORTED),
- android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGDB("VNF %s", valstr);
- mParameters.set(TICameraParameters::KEY_VNF, valstr);
- } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
- return BAD_VALUE;
- } else {
- mParameters.set(TICameraParameters::KEY_VNF,
- android::CameraParameters::FALSE);
- }
- }
-
- if ((valstr = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
- // make sure we support vstab...if we don't and application is trying to set
- // vstab then return an error
- if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
- android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGDB("VSTAB %s", valstr);
- mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, valstr);
- } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
- return BAD_VALUE;
- } else {
- mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
- android::CameraParameters::FALSE);
- }
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) {
-
- if (strcmp(TICameraParameters::VIDEO_MODE, valstr)) {
- mCapModeBackup = valstr;
- }
-
- CAMHAL_LOGDB("Capture mode set %s", valstr);
-
- const char *currentMode = mParameters.get(TICameraParameters::KEY_CAP_MODE);
- if ( NULL != currentMode ) {
- if ( strcmp(currentMode, valstr) != 0 ) {
- updateRequired = true;
- }
- } else {
- updateRequired = true;
- }
-
- mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
- } else if (!mCapModeBackup.isEmpty()) {
- // Restore previous capture mode after stopPreview()
- mParameters.set(TICameraParameters::KEY_CAP_MODE,
- mCapModeBackup.string());
- updateRequired = true;
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
- if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
- CAMHAL_LOGDB("IPP mode set %s", valstr);
- mParameters.set(TICameraParameters::KEY_IPP, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
- return BAD_VALUE;
- }
- }
-
-#ifdef OMAP_ENHANCEMENT_VTC
- if ((valstr = params.get(TICameraParameters::KEY_VTC_HINT)) != NULL ) {
- mParameters.set(TICameraParameters::KEY_VTC_HINT, valstr);
- if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
- mVTCUseCase = true;
- } else {
- mVTCUseCase = false;
- }
- CAMHAL_LOGDB("VTC Hint = %d", mVTCUseCase);
- }
-
- if (mVTCUseCase) {
- if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL ) {
- mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE, valstr);
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL ) {
- mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT, valstr);
- }
- }
-#endif
- }
-
-#ifndef OMAP_TUNA
- if ( (valstr = params.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL )
- {
- if (strcmp(valstr, mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)))
- {
- CAMHAL_LOGDB("Stereo 3D preview image layout is %s", valstr);
- mParameters.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, valstr);
- restartPreviewRequired = true;
- }
- }
-#endif
-
-#ifdef OMAP_ENHANCEMENT
- int orientation =0;
- if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
- {
- doesSetParameterNeedUpdate(valstr,
- mParameters.get(TICameraParameters::KEY_SENSOR_ORIENTATION),
- updateRequired);
-
- orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
- if ( orientation < 0 || orientation >= 360 || (orientation%90) != 0 ) {
- CAMHAL_LOGE("Invalid sensor orientation: %s. Value must be one of: [0, 90, 180, 270]", valstr);
- return BAD_VALUE;
- }
-
- CAMHAL_LOGD("Sensor Orientation is set to %d", orientation);
- mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
- }
-#endif
-
- params.getPreviewSize(&w, &h);
- if (w == -1 && h == -1) {
- CAMHAL_LOGEA("Unable to get preview size");
- return BAD_VALUE;
- }
-
- mVideoWidth = w;
- mVideoHeight = h;
-
- // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
- valstr = params.get(android::CameraParameters::KEY_RECORDING_HINT);
- if(valstr != NULL)
- {
- CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
- if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
- {
- CAMHAL_LOGVB("Video Resolution: %d x %d", mVideoWidth, mVideoHeight);
-#ifdef OMAP_ENHANCEMENT_VTC
- if (!mVTCUseCase)
-#endif
- {
- int maxFPS, minFPS;
-
- params.getPreviewFpsRange(&minFPS, &maxFPS);
- maxFPS /= CameraHal::VFR_SCALE;
- if ( ( maxFPS <= SW_SCALING_FPS_LIMIT ) ) {
- getPreferredPreviewRes(&w, &h);
- }
- }
- mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
- restartPreviewRequired |= setVideoModeParameters(params);
- }
- else if(strcmp(valstr, android::CameraParameters::FALSE) == 0)
- {
- mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
- restartPreviewRequired |= resetVideoModeParameters();
- }
- else
- {
- CAMHAL_LOGEA("Invalid RECORDING_HINT");
- return BAD_VALUE;
- }
- }
- else
- {
- // This check is required in following case.
- // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
- // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
- // then Video Mode parameters may remain present in ImageCapture activity as well.
- CAMHAL_LOGDA("Recording Hint is set to NULL");
- mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, "");
- restartPreviewRequired |= resetVideoModeParameters();
- }
-
- if ( (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
-#ifndef OMAP_TUNA
- && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES)))
- && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES)))
- && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES)))
-#endif
- ) {
- CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
- return BAD_VALUE;
- }
-
- int oldWidth, oldHeight;
- mParameters.getPreviewSize(&oldWidth, &oldHeight);
- if ( ( oldWidth != w ) || ( oldHeight != h ) )
- {
- mParameters.setPreviewSize(w, h);
- restartPreviewRequired = true;
- }
-
- CAMHAL_LOGDB("Preview Resolution: %d x %d", w, h);
-
- if ((valstr = params.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
- CAMHAL_LOGDB("Focus mode set %s", valstr);
-
- // we need to take a decision on the capture mode based on whether CAF picture or
- // video is chosen so the behavior of each is consistent to the application
- if(strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
- restartPreviewRequired |= resetVideoModeParameters();
- } else if (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
- restartPreviewRequired |= setVideoModeParameters(params);
- }
-
- mParameters.set(android::CameraParameters::KEY_FOCUS_MODE, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- mRawCapture = false;
-
-#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
- valstr = params.get(TICameraParameters::KEY_CAP_MODE);
- if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) &&
- access(kRawImagesOutputDirPath, F_OK) != -1 ) {
- mRawCapture = true;
- }
-#endif
-
-#ifndef OMAP_TUNA
- if ( (valstr = params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL )
- {
- CAMHAL_LOGDB("Stereo 3D capture image layout is %s", valstr);
- mParameters.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, valstr);
- }
-#endif
-
- params.getPictureSize(&w, &h);
- if ( (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES)))
-#ifndef OMAP_TUNA
- || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES)))
- || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES)))
- || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES)))
-#endif
- ) {
- mParameters.setPictureSize(w, h);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid picture resolution %d x %d", w, h);
- return BAD_VALUE;
- }
-
- CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
-
- if ( (valstr = params.getPictureFormat()) != NULL ) {
- if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
- if ((strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) &&
- mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH) &&
- mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT)) {
- unsigned int width = 0, height = 0;
- // Set picture size to full frame for raw bayer capture
- width = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH));
- height = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT));
- mParameters.setPictureSize(width,height);
- }
- mParameters.setPictureFormat(valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
- ret = BAD_VALUE;
- }
- }
-
-#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
- if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
- if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
- CAMHAL_LOGDB("Burst set %s", valstr);
- mParameters.set(TICameraParameters::KEY_BURST, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
- return BAD_VALUE;
- }
- }
-#endif
-
- // Variable framerate ranges have higher priority over
- // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
- // be cleared by the client in order for constant FPS to get
- // applied.
- // If Port FPS needs to be used for configuring, then FPS RANGE should not be set by the APP.
- valstr = params.get(android::CameraParameters::KEY_PREVIEW_FPS_RANGE);
- if (valstr != NULL && strlen(valstr)) {
- int curMaxFPS = 0;
- int curMinFPS = 0;
-
- // APP wants to set FPS range
- // Set framerate = MAXFPS
- CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
-
- mParameters.getPreviewFpsRange(&curMinFPS, &curMaxFPS);
- CAMHAL_LOGDB("## current minFPS = %d; maxFPS=%d",curMinFPS, curMaxFPS);
-
- params.getPreviewFpsRange(&minFPS, &maxFPS);
- CAMHAL_LOGDB("## requested minFPS = %d; maxFPS=%d",minFPS, maxFPS);
- // Validate VFR
- if (!isFpsRangeValid(minFPS, maxFPS, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)) &&
- !isFpsRangeValid(minFPS, maxFPS, params.get(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED))) {
- CAMHAL_LOGEA("Invalid FPS Range");
- return BAD_VALUE;
- } else {
- framerate = maxFPS / CameraHal::VFR_SCALE;
- mParameters.setPreviewFrameRate(framerate);
- CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
- mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
- CAMHAL_LOGDB("FPS Range = %s", valstr);
- if ( curMaxFPS == (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) &&
- (unsigned int)maxFPS < (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) ) {
- restartPreviewRequired = true;
- }
- }
- } else {
- framerate = params.getPreviewFrameRate();
- if (!isParameterValid(framerate, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)) &&
- !isParameterValid(framerate, params.get(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED))) {
- CAMHAL_LOGEA("Invalid frame rate");
- return BAD_VALUE;
- }
- char tmpBuffer[MAX_PROP_VALUE_LENGTH];
-
- sprintf(tmpBuffer, "%d,%d", framerate * CameraHal::VFR_SCALE, framerate * CameraHal::VFR_SCALE);
- mParameters.setPreviewFrameRate(framerate);
- CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
- mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, tmpBuffer);
- CAMHAL_LOGDB("FPS Range = %s", tmpBuffer);
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_GBCE)) != NULL) {
- if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GBCE),
- android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGDB("GBCE %s", valstr);
- mParameters.set(TICameraParameters::KEY_GBCE, valstr);
- } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGEB("ERROR: Invalid GBCE: %s", valstr);
- return BAD_VALUE;
- } else {
- mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
- }
- } else {
- mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_GLBCE)) != NULL) {
- if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE),
- android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGDB("GLBCE %s", valstr);
- mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
- } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
- CAMHAL_LOGEB("ERROR: Invalid GLBCE: %s", valstr);
- return BAD_VALUE;
- } else {
- mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
- }
- } else {
- mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
- }
-
-#ifdef OMAP_ENHANCEMENT_S3D
- ///Update the current parameter set
- if ( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE_MODE)) != NULL ) {
- CAMHAL_LOGDB("AutoConvergence mode set = %s", valstr);
- mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, valstr);
- }
-
- if ( (valstr = params.get(TICameraParameters::KEY_MANUAL_CONVERGENCE)) != NULL ) {
- int manualConvergence = (int)strtol(valstr, 0, 0);
-
- if ( ( manualConvergence < strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN), 0, 0) ) ||
- ( manualConvergence > strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX), 0, 0) ) ) {
- CAMHAL_LOGEB("ERROR: Invalid Manual Convergence = %d", manualConvergence);
- return BAD_VALUE;
- } else {
- CAMHAL_LOGDB("ManualConvergence Value = %d", manualConvergence);
- mParameters.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, valstr);
- }
- }
-
-#ifndef OMAP_TUNA
- if((valstr = params.get(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION)) != NULL) {
- if ( strcmp(mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED),
- android::CameraParameters::TRUE) == 0 ) {
- CAMHAL_LOGDB("Mechanical Mialignment Correction is %s", valstr);
- mParameters.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, valstr);
- } else {
- mParameters.remove(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION);
- }
- }
-#endif
-
- if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
- CAMHAL_LOGDB("Exposure mode set = %s", valstr);
- mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
- if (!strcmp(valstr, TICameraParameters::EXPOSURE_MODE_MANUAL)) {
- int manualVal;
- if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE)) != NULL) {
- manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE);
- if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
- manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
- CAMHAL_LOGEB("ERROR: Manual Exposure = %s is out of range - "
- "setting minimum supported value", valstr);
- valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
- }
- CAMHAL_LOGDB("Manual Exposure = %s", valstr);
- mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE, valstr);
- }
- if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT)) != NULL) {
- manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT);
- if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
- manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
- CAMHAL_LOGEB("ERROR: Manual Exposure right = %s is out of range - "
- "setting minimum supported value", valstr);
- valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
- }
- CAMHAL_LOGDB("Manual Exposure right = %s", valstr);
- mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, valstr);
- }
- if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO)) != NULL) {
- manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO);
- if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
- manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
- CAMHAL_LOGEB("ERROR: Manual Gain = %s is out of range - "
- "setting minimum supported value", valstr);
- valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
- }
- CAMHAL_LOGDB("Manual Gain = %s", valstr);
- mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, valstr);
- }
- if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT)) != NULL) {
- manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT);
- if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
- manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
- CAMHAL_LOGEB("ERROR: Manual Gain right = %s is out of range - "
- "setting minimum supported value", valstr);
- valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
- }
- CAMHAL_LOGDB("Manual Gain right = %s", valstr);
- mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, valstr);
- }
- }
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Exposure mode = %s", valstr);
- return BAD_VALUE;
- }
- }
-#endif
-
- if ((valstr = params.get(android::CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
- if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
- CAMHAL_LOGDB("White balance set %s", valstr);
- mParameters.set(android::CameraParameters::KEY_WHITE_BALANCE, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid white balance = %s", valstr);
- return BAD_VALUE;
- }
- }
-
-#ifdef OMAP_ENHANCEMENT
- if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
- if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
- CAMHAL_LOGDB("Contrast set %s", valstr);
- mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Contrast = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
- if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
- CAMHAL_LOGDB("Sharpness set %s", valstr);
- mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
- if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
- CAMHAL_LOGDB("Saturation set %s", valstr);
- mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
- if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
- CAMHAL_LOGDB("Brightness set %s", valstr);
- mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
- return BAD_VALUE;
- }
- }
-#endif
-
- if ((valstr = params.get(android::CameraParameters::KEY_ANTIBANDING)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
- CAMHAL_LOGDB("Antibanding set %s", valstr);
- mParameters.set(android::CameraParameters::KEY_ANTIBANDING, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
- return BAD_VALUE;
- }
- }
-
-#ifdef OMAP_ENHANCEMENT
- if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
- CAMHAL_LOGDB("ISO set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ISO, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
- return BAD_VALUE;
- }
- }
-#endif
-
- if( (valstr = params.get(android::CameraParameters::KEY_FOCUS_AREAS)) != NULL )
- {
- CAMHAL_LOGDB("Focus areas position set %s", params.get(android::CameraParameters::KEY_FOCUS_AREAS));
- mParameters.set(android::CameraParameters::KEY_FOCUS_AREAS, valstr);
- }
-
-#ifdef OMAP_ENHANCEMENT
- if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
- {
- CAMHAL_LOGDB("Measurements set to %s", valstr);
- mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
-
- if (strcmp(valstr, android::CameraParameters::TRUE) == 0)
- {
- mMeasurementEnabled = true;
- }
- else if (strcmp(valstr, android::CameraParameters::FALSE) == 0)
- {
- mMeasurementEnabled = false;
- }
- else
- {
- mMeasurementEnabled = false;
- }
-
- }
-#endif
-
- if( (valstr = params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
- {
- CAMHAL_LOGDB("Exposure compensation set %s", params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION));
- mParameters.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
- }
-
- if ((valstr = params.get(android::CameraParameters::KEY_SCENE_MODE)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
- CAMHAL_LOGDB("Scene mode set %s", valstr);
- doesSetParameterNeedUpdate(valstr,
- mParameters.get(android::CameraParameters::KEY_SCENE_MODE),
- updateRequired);
- mParameters.set(android::CameraParameters::KEY_SCENE_MODE, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if ((valstr = params.get(android::CameraParameters::KEY_FLASH_MODE)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
- CAMHAL_LOGDB("Flash mode set %s", valstr);
- mParameters.set(android::CameraParameters::KEY_FLASH_MODE, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if ((valstr = params.get(android::CameraParameters::KEY_EFFECT)) != NULL) {
- if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
- CAMHAL_LOGDB("Effect set %s", valstr);
- mParameters.set(android::CameraParameters::KEY_EFFECT, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
- return BAD_VALUE;
- }
- }
-
- varint = params.getInt(android::CameraParameters::KEY_ROTATION);
- if ( varint >= 0 ) {
- CAMHAL_LOGDB("Rotation set %d", varint);
- mParameters.set(android::CameraParameters::KEY_ROTATION, varint);
- }
-
- varint = params.getInt(android::CameraParameters::KEY_JPEG_QUALITY);
- if ( varint >= 0 ) {
- CAMHAL_LOGDB("Jpeg quality set %d", varint);
- mParameters.set(android::CameraParameters::KEY_JPEG_QUALITY, varint);
- }
-
- varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
- if ( varint >= 0 ) {
- CAMHAL_LOGDB("Thumbnail width set %d", varint);
- mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint);
- }
-
- varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
- if ( varint >= 0 ) {
- CAMHAL_LOGDB("Thumbnail width set %d", varint);
- mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint);
- }
-
- varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
- if ( varint >= 0 ) {
- CAMHAL_LOGDB("Thumbnail quality set %d", varint);
- mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_GPS_LATITUDE)) != NULL )
- {
- CAMHAL_LOGDB("GPS latitude set %s", params.get(android::CameraParameters::KEY_GPS_LATITUDE));
- mParameters.set(android::CameraParameters::KEY_GPS_LATITUDE, valstr);
- }else{
- mParameters.remove(android::CameraParameters::KEY_GPS_LATITUDE);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
- {
- CAMHAL_LOGDB("GPS longitude set %s", params.get(android::CameraParameters::KEY_GPS_LONGITUDE));
- mParameters.set(android::CameraParameters::KEY_GPS_LONGITUDE, valstr);
- }else{
- mParameters.remove(android::CameraParameters::KEY_GPS_LONGITUDE);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
- {
- CAMHAL_LOGDB("GPS altitude set %s", params.get(android::CameraParameters::KEY_GPS_ALTITUDE));
- mParameters.set(android::CameraParameters::KEY_GPS_ALTITUDE, valstr);
- }else{
- mParameters.remove(android::CameraParameters::KEY_GPS_ALTITUDE);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
- {
- CAMHAL_LOGDB("GPS timestamp set %s", params.get(android::CameraParameters::KEY_GPS_TIMESTAMP));
- mParameters.set(android::CameraParameters::KEY_GPS_TIMESTAMP, valstr);
- }else{
- mParameters.remove(android::CameraParameters::KEY_GPS_TIMESTAMP);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
- {
- CAMHAL_LOGDB("GPS datestamp set %s", valstr);
- mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
- }else{
- mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
- {
- CAMHAL_LOGDB("GPS processing method set %s", params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD));
- mParameters.set(android::CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
- }else{
- mParameters.remove(android::CameraParameters::KEY_GPS_PROCESSING_METHOD);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
- {
- CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
- mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
- }else{
- mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
- {
- CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
- mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
- }else{
- mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
- {
- CAMHAL_LOGDB("EXIF Model set %s", valstr);
- mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
- {
- CAMHAL_LOGDB("EXIF Make set %s", valstr);
- mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
- }
-
-#ifdef OMAP_ENHANCEMENT
- if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
- {
- CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
- mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
- mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
- }
- else if ((valstr = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) {
- CAMHAL_LOGDB("ABS Exposure+Gain Bracketing set %s", params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE));
- mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valstr);
- mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
- } else
- {
- mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE)) != NULL ) {
- CAMHAL_LOGDB("Zoom Bracketing range %s", valstr);
- mParameters.set(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE, valstr);
- } else {
- mParameters.remove(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE);
- }
-#endif
-
- if ((valstr = params.get(android::CameraParameters::KEY_ZOOM)) != NULL ) {
- varint = atoi(valstr);
- if ( varint >= 0 && varint <= mMaxZoomSupported ) {
- CAMHAL_LOGDB("Zoom set %d", varint);
- doesSetParameterNeedUpdate(valstr,
- mParameters.get(android::CameraParameters::KEY_ZOOM),
- updateRequired);
- mParameters.set(android::CameraParameters::KEY_ZOOM, valstr);
- } else {
- CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
- return BAD_VALUE;
- }
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
- {
- CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr);
- doesSetParameterNeedUpdate(valstr,
- mParameters.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
- updateRequired);
- mParameters.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
- }
-
- if( (valstr = params.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
- {
- CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr);
- doesSetParameterNeedUpdate(valstr,
- mParameters.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
- updateRequired);
- mParameters.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
- }
- if( (valstr = params.get(android::CameraParameters::KEY_METERING_AREAS)) != NULL )
- {
- CAMHAL_LOGDB("Metering areas position set %s", params.get(android::CameraParameters::KEY_METERING_AREAS));
- mParameters.set(android::CameraParameters::KEY_METERING_AREAS, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::RAW_WIDTH)) != NULL ) {
- CAMHAL_LOGDB("Raw image width set %s", params.get(TICameraParameters::RAW_WIDTH));
- mParameters.set(TICameraParameters::RAW_WIDTH, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::RAW_HEIGHT)) != NULL ) {
- CAMHAL_LOGDB("Raw image height set %s", params.get(TICameraParameters::RAW_HEIGHT));
- mParameters.set(TICameraParameters::RAW_HEIGHT, valstr);
- }
-
-#ifndef OMAP_TUNA
- //TI extensions for enable/disable algos
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_FIXED_GAMMA)) != NULL )
- {
- CAMHAL_LOGDB("Fixed Gamma set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_FIXED_GAMMA, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF1)) != NULL )
- {
- CAMHAL_LOGDB("NSF1 set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_NSF1, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF2)) != NULL )
- {
- CAMHAL_LOGDB("NSF2 set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_NSF2, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_SHARPENING)) != NULL )
- {
- CAMHAL_LOGDB("Sharpening set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_SHARPENING, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_THREELINCOLORMAP)) != NULL )
- {
- CAMHAL_LOGDB("Color Conversion set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, valstr);
- }
-
- if( (valstr = params.get(TICameraParameters::KEY_ALGO_GIC)) != NULL )
- {
- CAMHAL_LOGDB("Green Inballance Correction set %s", valstr);
- mParameters.set(TICameraParameters::KEY_ALGO_GIC, valstr);
- }
-#endif
-
- android::CameraParameters adapterParams = mParameters;
-
-#ifdef OMAP_ENHANCEMENT
- if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
- {
- int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
- if ( 0 < posBracketRange )
- {
- mBracketRangePositive = posBracketRange;
- }
- }
- CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
-
-
- if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
- {
- int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
- if ( 0 < negBracketRange )
- {
- mBracketRangeNegative = negBracketRange;
- }
- }
- CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
-
- if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
- ( strcmp(valstr, android::CameraParameters::TRUE) == 0 )) {
- if ( !mBracketingEnabled ) {
- CAMHAL_LOGDA("Enabling bracketing");
- mBracketingEnabled = true;
- } else {
- CAMHAL_LOGDA("Bracketing already enabled");
- }
- adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
- mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
- } else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
- ( strcmp(valstr, android::CameraParameters::FALSE) == 0 )) {
- CAMHAL_LOGDA("Disabling bracketing");
-
- adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
- mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
- mBracketingEnabled = false;
- if ( mBracketingRunning ) {
- stopImageBracketing();
- }
-
- } else {
- adapterParams.remove(TICameraParameters::KEY_TEMP_BRACKETING);
- mParameters.remove(TICameraParameters::KEY_TEMP_BRACKETING);
- }
-#endif
-
-#ifdef OMAP_ENHANCEMENT_VTC
- if (mVTCUseCase && !mTunnelSetup && (mCameraAdapter != NULL) &&
- ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL )&&
- ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL )) {
-
- uint32_t sliceHeight = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT);
- uint32_t encoderHandle = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE);
- int w, h;
- mParameters.getPreviewSize(&w, &h);
- status_t done = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SETUP_TUNNEL, sliceHeight, encoderHandle, w, h);
- if (done == NO_ERROR) mTunnelSetup = true;
- ret |= done;
- }
-#endif
-
- // Only send parameters to adapter if preview is already
- // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
- // will be called in startPreview()
- // TODO(XXX): Need to identify other parameters that need update from camera adapter
- if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) && !restartPreviewRequired ) {
- ret |= mCameraAdapter->setParameters(adapterParams);
- }
-
-#ifdef OMAP_ENHANCEMENT
- if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
- ( strcmp(valstr, android::CameraParameters::TRUE) == 0 ))
- {
- CAMHAL_LOGDA("Enabling shutter sound");
-
- mShutterEnabled = true;
- mMsgEnabled |= CAMERA_MSG_SHUTTER;
- mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
- }
- else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
- ( strcmp(valstr, android::CameraParameters::FALSE) == 0 ))
- {
- CAMHAL_LOGDA("Disabling shutter sound");
-
- mShutterEnabled = false;
- mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
- mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
- }
-#endif
- }
-
- //On fail restore old parameters
- if ( NO_ERROR != ret ) {
- mParameters = oldParams;
- }
-
- // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
- // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
- if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
- CAMHAL_LOGDA("Restarting Preview");
- ret = restartPreview();
- } else if (restartPreviewRequired && !previewEnabled() &&
- mDisplayPaused && !mRecordingEnabled) {
- CAMHAL_LOGDA("Stopping Preview");
- forceStopPreview();
- }
-
- if ( !mBracketingRunning && mBracketingEnabled ) {
- startImageBracketing();
- }
-
- if (ret != NO_ERROR)
- {
- CAMHAL_LOGEA("Failed to restart Preview");
- return ret;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
- unsigned int buffercount, unsigned int &max_queueable)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if(mDisplayAdapter.get() == NULL)
- {
- // Memory allocation of preview buffers is now placed in gralloc
- // CameraHal should not allocate preview buffers without DisplayAdapter
- return NO_MEMORY;
- }
-
- if(!mPreviewBuffers)
- {
- mPreviewLength = 0;
- mPreviewBuffers = mDisplayAdapter->allocateBufferList(width, height,
- previewFormat,
- mPreviewLength,
- buffercount);
- if (NULL == mPreviewBuffers ) {
- CAMHAL_LOGEA("Couldn't allocate preview buffers");
- return NO_MEMORY;
- }
-
- mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
- if ( NULL == mPreviewOffsets ) {
- CAMHAL_LOGEA("Buffer mapping failed");
- return BAD_VALUE;
- }
-
- mBufProvider = (BufferProvider*) mDisplayAdapter.get();
-
- ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
- if (ret != NO_ERROR) {
- return ret;
- }
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::freePreviewBufs()
-{
- status_t ret = NO_ERROR;
- LOG_FUNCTION_NAME;
-
- CAMHAL_LOGDB("mPreviewBuffers = %p", mPreviewBuffers);
- if(mPreviewBuffers)
- {
- ret = mBufProvider->freeBufferList(mPreviewBuffers);
- mPreviewBuffers = NULL;
- LOG_FUNCTION_NAME_EXIT;
- return ret;
- }
- LOG_FUNCTION_NAME_EXIT;
- return ret;
-}
-
-
-status_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
-{
- status_t ret = NO_ERROR;
- int bytes;
-
- LOG_FUNCTION_NAME;
-
- bytes = size;
-
- if ( NO_ERROR == ret )
- {
- if( NULL != mPreviewDataBuffers )
- {
- ret = freePreviewDataBufs();
- }
- }
-
- if ( NO_ERROR == ret )
- {
- bytes = ((bytes+4095)/4096)*4096;
- mPreviewDataBuffers = mMemoryManager->allocateBufferList(0, 0, NULL, bytes, bufferCount);
-
- CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
- if( NULL == mPreviewDataBuffers )
- {
- CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
- ret = -NO_MEMORY;
- }
- else
- {
- bytes = size;
- }
- }
-
- if ( NO_ERROR == ret )
- {
- mPreviewDataFd = mMemoryManager->getFd();
- mPreviewDataLength = bytes;
- mPreviewDataOffsets = mMemoryManager->getOffsets();
- }
- else
- {
- mPreviewDataFd = -1;
- mPreviewDataLength = 0;
- mPreviewDataOffsets = NULL;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::freePreviewDataBufs()
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if ( NO_ERROR == ret )
- {
-
- if( NULL != mPreviewDataBuffers )
- {
-
- ret = mMemoryManager->freeBufferList(mPreviewDataBuffers);
- mPreviewDataBuffers = NULL;
-
- }
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size,
- const char* previewFormat, unsigned int bufferCount,
- unsigned int *max_queueable)
-{
- status_t ret = NO_ERROR;
- int bytes;
-
- LOG_FUNCTION_NAME;
-
- bytes = size;
-
- // allocate image buffers only if not already allocated
- if(NULL != mImageBuffers) {
- if (mBufferSourceAdapter_Out.get()) {
- mBufferSourceAdapter_Out->maxQueueableBuffers(*max_queueable);
- } else {
- *max_queueable = bufferCount;
- }
- return NO_ERROR;
- }
-
- if (mBufferSourceAdapter_Out.get()) {
- mImageBuffers = mBufferSourceAdapter_Out->allocateBufferList(width, height, previewFormat,
- bytes, bufferCount);
- mBufferSourceAdapter_Out->maxQueueableBuffers(*max_queueable);
- } else {
- bytes = ((bytes + 4095) / 4096) * 4096;
- mImageBuffers = mMemoryManager->allocateBufferList(0, 0, previewFormat, bytes, bufferCount);
- *max_queueable = bufferCount;
- }
-
- CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
- if ( NULL == mImageBuffers ) {
- CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
- ret = -NO_MEMORY;
- } else {
- bytes = size;
- }
-
- if ( NO_ERROR == ret ) {
- mImageFd = mMemoryManager->getFd();
- mImageLength = bytes;
- mImageOffsets = mMemoryManager->getOffsets();
- } else {
- mImageFd = -1;
- mImageLength = 0;
- mImageOffsets = NULL;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
-{
- status_t ret = NO_ERROR;
- LOG_FUNCTION_NAME;
-
- if( NULL != mVideoBuffers ){
- ret = freeVideoBufs(mVideoBuffers);
- mVideoBuffers = NULL;
- }
-
- if ( NO_ERROR == ret ){
- int32_t stride;
- CameraBuffer *buffers = new CameraBuffer [bufferCount];
-
- memset (buffers, 0, sizeof(CameraBuffer) * bufferCount);
-
- if (buffers != NULL){
- for (unsigned int i = 0; i< bufferCount; i++){
- android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
- buffer_handle_t handle;
- ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &handle, &stride);
- if (ret != NO_ERROR){
- CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
- ret = -NO_MEMORY;
- for (unsigned int j=0; j< i; j++){
- CAMHAL_LOGEB("Freeing Gralloc Buffer %p", buffers[i].opaque);
- GrallocAlloc.free((buffer_handle_t)buffers[i].opaque);
- }
- delete [] buffers;
- goto exit;
- }
- buffers[i].type = CAMERA_BUFFER_GRALLOC;
- buffers[i].opaque = (void *)handle;
- CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", handle);
- }
-
- mVideoBuffers = buffers;
- }
- else{
- CAMHAL_LOGEA("Couldn't allocate video buffers ");
- ret = -NO_MEMORY;
- }
- }
-
- exit:
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::allocRawBufs(int width, int height, const char* previewFormat, int bufferCount)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME
-
-
- ///@todo Enhance this method allocImageBufs() to take in a flag for burst capture
- ///Always allocate the buffers for image capture using MemoryManager
- if (NO_ERROR == ret) {
- if(( NULL != mVideoBuffers )) {
- // Re-use the buffer for raw capture.
- return ret;
- }
- }
-
- if ( NO_ERROR == ret ) {
- mVideoLength = 0;
- mVideoLength = (((width * height * 2) + 4095)/4096)*4096;
- mVideoBuffers = mMemoryManager->allocateBufferList(width, height, previewFormat,
- mVideoLength, bufferCount);
-
- CAMHAL_LOGDB("Size of Video cap buffer (used for RAW capture) %d", mVideoLength);
- if( NULL == mVideoBuffers ) {
- CAMHAL_LOGEA("Couldn't allocate Video buffers using memory manager");
- ret = -NO_MEMORY;
- }
- }
-
- if ( NO_ERROR == ret ) {
- mVideoFd = mMemoryManager->getFd();
- mVideoOffsets = mMemoryManager->getOffsets();
- } else {
- mVideoFd = -1;
- mVideoOffsets = NULL;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-void endImageCapture( void *userData)
-{
- LOG_FUNCTION_NAME;
-
- if ( NULL != userData )
- {
- CameraHal *c = reinterpret_cast<CameraHal *>(userData);
- c->signalEndImageCapture();
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void releaseImageBuffers(void *userData)
-{
- LOG_FUNCTION_NAME;
-
- if (NULL != userData) {
- CameraHal *c = reinterpret_cast<CameraHal *>(userData);
- c->freeImageBufs();
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-status_t CameraHal::signalEndImageCapture()
-{
- status_t ret = NO_ERROR;
- int w,h;
- android::AutoMutex lock(mLock);
-
- LOG_FUNCTION_NAME;
-
- if (mBufferSourceAdapter_Out.get()) {
- mBufferSourceAdapter_Out->disableDisplay();
- }
-
- if (mBufferSourceAdapter_In.get()) {
- mBufferSourceAdapter_In->disableDisplay();
- }
-
- if ( mBracketingRunning ) {
- stopImageBracketing();
- } else {
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::freeImageBufs()
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if (NULL == mImageBuffers) {
- return -EINVAL;
- }
-
- if (mBufferSourceAdapter_Out.get()) {
- ret = mBufferSourceAdapter_Out->freeBufferList(mImageBuffers);
- } else {
- ret = mMemoryManager->freeBufferList(mImageBuffers);
- }
-
- if (ret == NO_ERROR) {
- mImageBuffers = NULL;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::freeVideoBufs(CameraBuffer *bufs)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
- if(bufs == NULL)
- {
- CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
- LOG_FUNCTION_NAME_EXIT;
- return BAD_VALUE;
- }
-
- android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
-
- for(int i = 0; i < count; i++){
- CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", bufs[i].opaque);
- GrallocAlloc.free((buffer_handle_t)bufs[i].opaque);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::freeRawBufs()
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME
-
- if ( NO_ERROR == ret ) {
- if( NULL != mVideoBuffers ) {
- ///@todo Pluralise the name of this method to freeBuffers
- ret = mMemoryManager->freeBufferList(mVideoBuffers);
- mVideoBuffers = NULL;
- } else {
- ret = -EINVAL;
- }
- }
-
- LOG_FUNCTION_NAME_EXIT
-
- return ret;
-}
-
-/**
- @brief Start preview mode.
-
- @param none
- @return NO_ERROR Camera switched to VF mode
- @todo Update function header with the different errors that are possible
-
- */
-status_t CameraHal::startPreview() {
- LOG_FUNCTION_NAME;
-
- // When tunneling is enabled during VTC, startPreview happens in 2 steps:
- // When the application sends the command CAMERA_CMD_PREVIEW_INITIALIZATION,
- // cameraPreviewInitialization() is called, which in turn causes the CameraAdapter
- // to move from loaded to idle state. And when the application calls startPreview,
- // the CameraAdapter moves from idle to executing state.
- //
- // If the application calls startPreview() without sending the command
- // CAMERA_CMD_PREVIEW_INITIALIZATION, then the function cameraPreviewInitialization()
- // AND startPreview() are executed. In other words, if the application calls
- // startPreview() without sending the command CAMERA_CMD_PREVIEW_INITIALIZATION,
- // then the CameraAdapter moves from loaded to idle to executing state in one shot.
- status_t ret = cameraPreviewInitialization();
-
- // The flag mPreviewInitializationDone is set to true at the end of the function
- // cameraPreviewInitialization(). Therefore, if everything goes alright, then the
- // flag will be set. Sometimes, the function cameraPreviewInitialization() may
- // return prematurely if all the resources are not available for starting preview.
- // For example, if the preview window is not set, then it would return NO_ERROR.
- // Under such circumstances, one should return from startPreview as well and should
- // not continue execution. That is why, we check the flag and not the return value.
- if (!mPreviewInitializationDone) return ret;
-
- // Once startPreview is called, there is no need to continue to remember whether
- // the function cameraPreviewInitialization() was called earlier or not. And so
- // the flag mPreviewInitializationDone is reset here. Plus, this preserves the
- // current behavior of startPreview under the circumstances where the application
- // calls startPreview twice or more.
- mPreviewInitializationDone = false;
-
- ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
- if(mDisplayAdapter.get() != NULL) {
- CAMHAL_LOGDA("Enabling display");
- int width, height;
- mParameters.getPreviewSize(&width, &height);
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
- ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview);
-#else
- ret = mDisplayAdapter->enableDisplay(width, height, NULL);
-#endif
-
- if ( ret != NO_ERROR ) {
- CAMHAL_LOGEA("Couldn't enable display");
-
- // FIXME: At this stage mStateSwitchLock is locked and unlock is supposed to be called
- // only from mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW)
- // below. But this will never happen because of goto error. Thus at next
- // startPreview() call CameraHAL will be deadlocked.
- // Need to revisit mStateSwitch lock, for now just abort the process.
- CAMHAL_ASSERT_X(false,
- "At this stage mCameraAdapter->mStateSwitchLock is still locked, "
- "deadlock is guaranteed");
-
- goto error;
- }
-
- }
-
- ///Send START_PREVIEW command to adapter
- CAMHAL_LOGDA("Starting CameraAdapter preview mode");
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
-
- if(ret!=NO_ERROR) {
- CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
- goto error;
- }
- CAMHAL_LOGDA("Started preview");
-
- mPreviewEnabled = true;
- mPreviewStartInProgress = false;
- return ret;
-
- error:
-
- CAMHAL_LOGEA("Performing cleanup after error");
-
- //Do all the cleanup
- freePreviewBufs();
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
- if(mDisplayAdapter.get() != NULL) {
- mDisplayAdapter->disableDisplay(false);
- }
- mAppCallbackNotifier->stop();
- mPreviewStartInProgress = false;
- mPreviewEnabled = false;
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-////////////
-/**
- @brief Set preview mode related initialization
- -> Camera Adapter set params
- -> Allocate buffers
- -> Set use buffers for preview
- @param none
- @return NO_ERROR
- @todo Update function header with the different errors that are possible
-
- */
-status_t CameraHal::cameraPreviewInitialization()
-{
-
- status_t ret = NO_ERROR;
- CameraAdapter::BuffersDescriptor desc;
- CameraFrame frame;
- unsigned int required_buffer_count;
- unsigned int max_queueble_buffers;
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
- gettimeofday(&mStartPreview, NULL);
-#endif
-
- LOG_FUNCTION_NAME;
-
- if (mPreviewInitializationDone) {
- return NO_ERROR;
- }
-
- if ( mPreviewEnabled ){
- CAMHAL_LOGDA("Preview already running");
- LOG_FUNCTION_NAME_EXIT;
- return ALREADY_EXISTS;
- }
-
- if ( NULL != mCameraAdapter ) {
- ret = mCameraAdapter->setParameters(mParameters);
- }
-
- if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
- if ( NO_ERROR != ret ){
- CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
- return ret;
- }
-
- ///Update the current preview width and height
- mPreviewWidth = frame.mWidth;
- mPreviewHeight = frame.mHeight;
- }
-
- ///If we don't have the preview callback enabled and display adapter,
- if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
- CAMHAL_LOGD("Preview not started. Preview in progress flag set");
- mPreviewStartInProgress = true;
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
- if ( NO_ERROR != ret ){
- CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
- return ret;
- }
- return NO_ERROR;
- }
-
- if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
- {
- CAMHAL_LOGDA("Preview is in paused state");
-
- mDisplayPaused = false;
- mPreviewEnabled = true;
- if ( NO_ERROR == ret )
- {
- ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
-
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("Display adapter resume failed %x", ret);
- }
- }
- //restart preview callbacks
- if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
- {
- mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
- }
-
- signalEndImageCapture();
- return ret;
- }
-
- required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
-
- ///Allocate the preview buffers
- ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
-
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
- goto error;
- }
-
- if ( mMeasurementEnabled )
- {
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
- ( int ) &frame,
- required_buffer_count);
- if ( NO_ERROR != ret )
- {
- return ret;
- }
-
- ///Allocate the preview data buffers
- ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
- if ( NO_ERROR != ret ) {
- CAMHAL_LOGEA("Couldn't allocate preview data buffers");
- goto error;
- }
-
- if ( NO_ERROR == ret )
- {
- desc.mBuffers = mPreviewDataBuffers;
- desc.mOffsets = mPreviewDataOffsets;
- desc.mFd = mPreviewDataFd;
- desc.mLength = mPreviewDataLength;
- desc.mCount = ( size_t ) required_buffer_count;
- desc.mMaxQueueable = (size_t) required_buffer_count;
-
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
- ( int ) &desc);
- }
-
- }
-
- ///Pass the buffers to Camera Adapter
- desc.mBuffers = mPreviewBuffers;
- desc.mOffsets = mPreviewOffsets;
- desc.mFd = mPreviewFd;
- desc.mLength = mPreviewLength;
- desc.mCount = ( size_t ) required_buffer_count;
- desc.mMaxQueueable = (size_t) max_queueble_buffers;
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
- ( int ) &desc);
-
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
- freePreviewBufs();
- return ret;
- }
-
- ///Start the callback notifier
- ret = mAppCallbackNotifier->start();
-
- if( ALREADY_EXISTS == ret )
- {
- //Already running, do nothing
- CAMHAL_LOGDA("AppCallbackNotifier already running");
- ret = NO_ERROR;
- }
- else if ( NO_ERROR == ret ) {
- CAMHAL_LOGDA("Started AppCallbackNotifier..");
- mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
- }
- else
- {
- CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
- goto error;
- }
-
- if (ret == NO_ERROR) mPreviewInitializationDone = true;
-
- mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
-
- return ret;
-
- error:
-
- CAMHAL_LOGEA("Performing cleanup after error");
-
- //Do all the cleanup
- freePreviewBufs();
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
- if(mDisplayAdapter.get() != NULL)
- {
- mDisplayAdapter->disableDisplay(false);
- }
- mAppCallbackNotifier->stop();
- mPreviewStartInProgress = false;
- mPreviewEnabled = false;
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Sets ANativeWindow object.
-
- Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
- to render buffers to display.
-
- @param[in] window The ANativeWindow object created by Surface flinger
- @return NO_ERROR If the ANativeWindow object passes validation criteria
- @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
-
- */
-status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
-{
- status_t ret = NO_ERROR;
- CameraAdapter::BuffersDescriptor desc;
-
- LOG_FUNCTION_NAME;
- mSetPreviewWindowCalled = true;
-
- ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
- if(!window)
- {
- if(mDisplayAdapter.get() != NULL)
- {
- ///NULL window passed, destroy the display adapter if present
- CAMHAL_LOGD("NULL window passed, destroying display adapter");
- mDisplayAdapter.clear();
- ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
- ///@remarks so, we will wait until it passes a valid window to begin the preview again
- mSetPreviewWindowCalled = false;
- }
- CAMHAL_LOGD("NULL ANativeWindow passed to setPreviewWindow");
- return NO_ERROR;
- }else if(mDisplayAdapter.get() == NULL)
- {
- // Need to create the display adapter since it has not been created
- // Create display adapter
- mDisplayAdapter = new ANativeWindowDisplayAdapter();
-#ifdef OMAP_ENHANCEMENT
- mDisplayAdapter->setExtendedOps(mExtendedPreviewStreamOps);
-#endif
- ret = NO_ERROR;
- if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
- {
- if(ret!=NO_ERROR)
- {
- mDisplayAdapter.clear();
- CAMHAL_LOGEA("DisplayAdapter initialize failed");
- LOG_FUNCTION_NAME_EXIT;
- return ret;
- }
- else
- {
- CAMHAL_LOGEA("Couldn't create DisplayAdapter");
- LOG_FUNCTION_NAME_EXIT;
- return NO_MEMORY;
- }
- }
-
- // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
- // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
- mDisplayAdapter->setFrameProvider(mCameraAdapter);
-
- // Any dynamic errors that happen during the camera use case has to be propagated back to the application
- // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application
- // Set it as the error handler for the DisplayAdapter
- mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
-
- // Update the display adapter with the new window that is passed from CameraService
- ret = mDisplayAdapter->setPreviewWindow(window);
- if(ret!=NO_ERROR)
- {
- CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
- }
-
- if(mPreviewStartInProgress)
- {
- CAMHAL_LOGDA("setPreviewWindow called when preview running");
- // Start the preview since the window is now available
- ret = startPreview();
- }
- } else {
- // Update the display adapter with the new window that is passed from CameraService
- ret = mDisplayAdapter->setPreviewWindow(window);
- if ( (NO_ERROR == ret) && previewEnabled() ) {
- restartPreview();
- } else if (ret == ALREADY_EXISTS) {
- // ALREADY_EXISTS should be treated as a noop in this case
- ret = NO_ERROR;
- }
- }
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-
-}
-
-
-#ifdef OMAP_ENHANCEMENT_CPCAM
-void CameraHal::setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops)
-{
- mExtendedPreviewStreamOps = ops;
-}
-
-/**
- @brief Sets ANativeWindow object.
-
- Buffers provided to CameraHal via this object for tap-in/tap-out
- functionality.
-
- TODO(XXX): this is just going to use preview_stream_ops for now, but we
- most likely need to extend it when we want more functionality
-
- @param[in] window The ANativeWindow object created by Surface flinger
- @return NO_ERROR If the ANativeWindow object passes validation criteria
- @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
-
- */
-status_t CameraHal::setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- // If either a tapin or tapout was previously set
- // we need to clean up and clear capturing
- if ((!tapout && mBufferSourceAdapter_Out.get()) ||
- (!tapin && mBufferSourceAdapter_In.get())) {
- signalEndImageCapture();
- }
-
- // Set tapout point
- // destroy current buffer tapout if NULL tapout is passed
- if (!tapout) {
- if (mBufferSourceAdapter_Out.get() != NULL) {
- CAMHAL_LOGD("NULL tapout passed, destroying buffer tapout adapter");
- mBufferSourceAdapter_Out.clear();
- mBufferSourceAdapter_Out = 0;
- }
- ret = NO_ERROR;
- } else if (mBufferSourceAdapter_Out.get() == NULL) {
- mBufferSourceAdapter_Out = new BufferSourceAdapter();
- mBufferSourceAdapter_Out->setExtendedOps(mExtendedPreviewStreamOps);
- if(!mBufferSourceAdapter_Out.get()) {
- CAMHAL_LOGEA("Couldn't create DisplayAdapter");
- ret = NO_MEMORY;
- goto exit;
- }
-
- ret = mBufferSourceAdapter_Out->initialize();
- if (ret != NO_ERROR)
- {
- mBufferSourceAdapter_Out.clear();
- mBufferSourceAdapter_Out = 0;
- CAMHAL_LOGEA("DisplayAdapter initialize failed");
- goto exit;
- }
-
- // CameraAdapter will be the frame provider for BufferSourceAdapter
- mBufferSourceAdapter_Out->setFrameProvider(mCameraAdapter);
-
- // BufferSourceAdapter will use ErrorHandler to send errors back to
- // the application
- mBufferSourceAdapter_Out->setErrorHandler(mAppCallbackNotifier.get());
-
- // Update the display adapter with the new window that is passed from CameraService
- ret = mBufferSourceAdapter_Out->setPreviewWindow(tapout);
- if(ret != NO_ERROR) {
- CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
- goto exit;
- }
- } else {
- // Update the display adapter with the new window that is passed from CameraService
- freeImageBufs();
- ret = mBufferSourceAdapter_Out->setPreviewWindow(tapout);
- if (ret == ALREADY_EXISTS) {
- // ALREADY_EXISTS should be treated as a noop in this case
- ret = NO_ERROR;
- }
- }
-
- if (ret != NO_ERROR) {
- CAMHAL_LOGE("Error while trying to set tapout point");
- goto exit;
- }
-
- // 1. Set tapin point
- if (!tapin) {
- if (mBufferSourceAdapter_In.get() != NULL) {
- CAMHAL_LOGD("NULL tapin passed, destroying buffer tapin adapter");
- mBufferSourceAdapter_In.clear();
- mBufferSourceAdapter_In = 0;
- }
- ret = NO_ERROR;
- } else if (mBufferSourceAdapter_In.get() == NULL) {
- mBufferSourceAdapter_In = new BufferSourceAdapter();
- mBufferSourceAdapter_In->setExtendedOps(mExtendedPreviewStreamOps);
- if(!mBufferSourceAdapter_In.get()) {
- CAMHAL_LOGEA("Couldn't create DisplayAdapter");
- ret = NO_MEMORY;
- goto exit;
- }
-
- ret = mBufferSourceAdapter_In->initialize();
- if (ret != NO_ERROR)
- {
- mBufferSourceAdapter_In.clear();
- mBufferSourceAdapter_In = 0;
- CAMHAL_LOGEA("DisplayAdapter initialize failed");
- goto exit;
- }
-
- // We need to set a frame provider so camera adapter can return the frame back to us
- mBufferSourceAdapter_In->setFrameProvider(mCameraAdapter);
-
- // BufferSourceAdapter will use ErrorHandler to send errors back to
- // the application
- mBufferSourceAdapter_In->setErrorHandler(mAppCallbackNotifier.get());
-
- // Update the display adapter with the new window that is passed from CameraService
- ret = mBufferSourceAdapter_In->setPreviewWindow(tapin);
- if(ret != NO_ERROR) {
- CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
- goto exit;
- }
- } else {
- // Update the display adapter with the new window that is passed from CameraService
- ret = mBufferSourceAdapter_In->setPreviewWindow(tapin);
- if (ret == ALREADY_EXISTS) {
- // ALREADY_EXISTS should be treated as a noop in this case
- ret = NO_ERROR;
- }
- }
-
- exit:
- return ret;
-}
-#endif
-
-
-/**
- @brief Stop a previously started preview.
-
- @param none
- @return none
-
- */
-void CameraHal::stopPreview()
-{
- LOG_FUNCTION_NAME;
-
- if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
- {
- LOG_FUNCTION_NAME_EXIT;
- return;
- }
-
- bool imageCaptureRunning = (mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) &&
- (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
- if(mDisplayPaused && !imageCaptureRunning)
- {
- // Display is paused, which essentially means there is no preview active.
- // Note: this is done so that when stopPreview is called by client after
- // an image capture, we do not de-initialize the camera adapter and
- // restart over again.
-
- return;
- }
-
- forceStopPreview();
-
- // Reset Capture-Mode to default, so that when we switch from VideoRecording
- // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
- CAMHAL_LOGDA("Resetting Capture-Mode to default");
- mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Returns true if preview is enabled
-
- @param none
- @return true If preview is running currently
- false If preview has been stopped
-
- */
-bool CameraHal::previewEnabled()
-{
- LOG_FUNCTION_NAME;
-
- return (mPreviewEnabled || mPreviewStartInProgress);
-}
-
-/**
- @brief Start record mode.
-
- When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
- the corresponding frame. Every record frame must be released by calling
- releaseRecordingFrame().
-
- @param none
- @return NO_ERROR If recording could be started without any issues
- @todo Update the header with possible error values in failure scenarios
-
- */
-status_t CameraHal::startRecording( )
-{
- int w, h;
- const char *valstr = NULL;
- bool restartPreviewRequired = false;
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- gettimeofday(&mStartPreview, NULL);
-
-#endif
-
- if(!previewEnabled())
- {
- return NO_INIT;
- }
-
- // set internal recording hint in case camera adapter needs to make some
- // decisions....(will only be sent to camera adapter if camera restart is required)
- mParameters.set(TICameraParameters::KEY_RECORDING_HINT, android::CameraParameters::TRUE);
-
- // if application starts recording in continuous focus picture mode...
- // then we need to force default capture mode (as opposed to video mode)
- if ( ((valstr = mParameters.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
- (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
- restartPreviewRequired = resetVideoModeParameters();
- }
-
- // only need to check recording hint if preview restart is not already needed
- valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
- if ( !restartPreviewRequired &&
- (!valstr || (valstr && (strcmp(valstr, android::CameraParameters::TRUE) != 0))) ) {
- restartPreviewRequired = setVideoModeParameters(mParameters);
- }
-
- if (restartPreviewRequired) {
- {
- android::AutoMutex lock(mLock);
- mCapModeBackup = mParameters.get(TICameraParameters::KEY_CAP_MODE);
- }
- ret = restartPreview();
- }
-
- if ( NO_ERROR == ret )
- {
- int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
- mParameters.getPreviewSize(&w, &h);
- CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
-
- if ((w != mVideoWidth) && (h != mVideoHeight))
- {
- ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
- mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
- return ret;
- }
-
- mAppCallbackNotifier->useVideoBuffers(true);
- mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
- ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBuffers);
- }
- else
- {
- mAppCallbackNotifier->useVideoBuffers(false);
- mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
- ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
- }
- }
-
- if ( NO_ERROR == ret )
- {
- ret = mAppCallbackNotifier->startRecording();
- }
-
- if ( NO_ERROR == ret )
- {
- ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
- }
-
- if ( NO_ERROR == ret )
- {
- mRecordingEnabled = true;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Set the camera parameters specific to Video Recording.
-
- This function checks for the camera parameters which have to be set for recording.
- Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
- This function also enables Video Recording specific functions like VSTAB & VNF.
-
- @param none
- @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
- @todo Modify the policies for enabling VSTAB & VNF usecase based later.
-
- */
-bool CameraHal::setVideoModeParameters(const android::CameraParameters& params)
-{
- const char *valstr = NULL;
- const char *valstrRemote = NULL;
- bool restartPreviewRequired = false;
-
- LOG_FUNCTION_NAME;
-
- // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
- valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
- if ( (valstr == NULL) ||
- ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
- {
- CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
- mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
- restartPreviewRequired = true;
- }
-
- // set VSTAB. restart is required if vstab value has changed
- if ( (valstrRemote = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL ) {
- // make sure we support vstab
- if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
- android::CameraParameters::TRUE) == 0) {
- valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
- // vstab value has changed
- if ((valstr != NULL) &&
- strcmp(valstr, valstrRemote) != 0) {
- restartPreviewRequired = true;
- }
- mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
- valstrRemote);
- }
- } else if (mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) {
- // vstab was configured but now unset
- restartPreviewRequired = true;
- mParameters.remove(android::CameraParameters::KEY_VIDEO_STABILIZATION);
- }
-
- // Set VNF
- if ((valstrRemote = params.get(TICameraParameters::KEY_VNF)) == NULL) {
- CAMHAL_LOGDA("Enable VNF");
- mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
- restartPreviewRequired = true;
- } else {
- valstr = mParameters.get(TICameraParameters::KEY_VNF);
- if (valstr && strcmp(valstr, valstrRemote) != 0) {
- restartPreviewRequired = true;
- }
- mParameters.set(TICameraParameters::KEY_VNF, valstrRemote);
- }
-
-#if !defined(OMAP_ENHANCEMENT) && !defined(ENHANCED_DOMX)
- // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
- // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
- // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
- int w, h;
- params.getPreviewSize(&w, &h);
- valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
- if (valstr && (strcmp(valstr, android::CameraParameters::TRUE) == 0) && (w == 1920)) {
- CAMHAL_LOGDA("Force Enable VNF for 1080p");
- const char *valKeyVnf = mParameters.get(TICameraParameters::KEY_VNF);
- if(!valKeyVnf || (strcmp(valKeyVnf, android::CameraParameters::TRUE) != 0)) {
- mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
- restartPreviewRequired = true;
- }
- }
-#endif
-
- LOG_FUNCTION_NAME_EXIT;
-
- return restartPreviewRequired;
-}
-
-/**
- @brief Reset the camera parameters specific to Video Recording.
-
- This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
-
- @param none
- @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
-
- */
-bool CameraHal::resetVideoModeParameters()
-{
- const char *valstr = NULL;
- bool restartPreviewRequired = false;
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- // ignore this if we are already recording
- if (mRecordingEnabled) {
- return false;
- }
-
- // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
- valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
- if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
- CAMHAL_LOGDA("Reset Capture-Mode to default");
- mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
- restartPreviewRequired = true;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return restartPreviewRequired;
-}
-
-/**
- @brief Restart the preview with setParameter.
-
- This function restarts preview, for some VIDEO_MODE parameters to take effect.
-
- @param none
- @return NO_ERROR If recording parameters could be set without any issues
-
- */
-status_t CameraHal::restartPreview()
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
-
- forceStopPreview();
-
- {
- android::AutoMutex lock(mLock);
- if (!mCapModeBackup.isEmpty()) {
- mParameters.set(TICameraParameters::KEY_CAP_MODE, mCapModeBackup.string());
- mCapModeBackup = "";
- } else {
- mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
- }
- mCameraAdapter->setParameters(mParameters);
- }
-
- ret = startPreview();
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Stop a previously started recording.
-
- @param none
- @return none
-
- */
-void CameraHal::stopRecording()
-{
- CameraAdapter::AdapterState currentState;
-
- LOG_FUNCTION_NAME;
-
- android::AutoMutex lock(mLock);
-
- if (!mRecordingEnabled )
- {
- return;
- }
-
- currentState = mCameraAdapter->getState();
- if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
- }
-
- mAppCallbackNotifier->stopRecording();
-
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
-
- mRecordingEnabled = false;
-
- if ( mAppCallbackNotifier->getUesVideoBuffers() ){
- freeVideoBufs(mVideoBuffers);
- if (mVideoBuffers){
- CAMHAL_LOGVB(" FREEING mVideoBuffers %p", mVideoBuffers);
- delete [] mVideoBuffers;
- }
- mVideoBuffers = NULL;
- }
-
- // reset internal recording hint in case camera adapter needs to make some
- // decisions....(will only be sent to camera adapter if camera restart is required)
- mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Returns true if recording is enabled.
-
- @param none
- @return true If recording is currently running
- false If recording has been stopped
-
- */
-int CameraHal::recordingEnabled()
-{
- LOG_FUNCTION_NAME;
-
- LOG_FUNCTION_NAME_EXIT;
-
- return mRecordingEnabled;
-}
-
-/**
- @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
-
- @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
- previously given by CameraHal
- @return none
-
- */
-void CameraHal::releaseRecordingFrame(const void* mem)
-{
- LOG_FUNCTION_NAME;
-
- //CAMHAL_LOGDB(" 0x%x", mem->pointer());
-
- if ( ( mRecordingEnabled ) && mem != NULL)
- {
- mAppCallbackNotifier->releaseRecordingFrame(mem);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return;
-}
-
-/**
- @brief Start auto focus
-
- This call asynchronous.
- The notification callback routine is called with CAMERA_MSG_FOCUS once when
- focusing is complete. autoFocus() will be called again if another auto focus is
- needed.
-
- @param none
- @return NO_ERROR
- @todo Define the error codes if the focus is not locked
-
- */
-status_t CameraHal::autoFocus()
-{
- status_t ret = NO_ERROR;
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- gettimeofday(&mStartFocus, NULL);
-
-#endif
-
- LOG_FUNCTION_NAME;
-
- android::AutoMutex lock(mLock);
-
- mMsgEnabled |= CAMERA_MSG_FOCUS;
-
- if ( NULL == mCameraAdapter )
- {
- ret = -1;
- goto EXIT;
- }
-
- CameraAdapter::AdapterState state;
- ret = mCameraAdapter->getState(state);
- if (ret != NO_ERROR)
- {
- goto EXIT;
- }
-
- if (state == CameraAdapter::AF_STATE)
- {
- CAMHAL_LOGI("Ignoring start-AF (already in progress)");
- goto EXIT;
- }
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- //pass the autoFocus timestamp along with the command to camera adapter
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
-
-#else
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
-
-#endif
-
-EXIT:
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Cancels auto-focus function.
-
- If the auto-focus is still in progress, this function will cancel it.
- Whether the auto-focus is in progress or not, this function will return the
- focus position to the default. If the camera does not support auto-focus, this is a no-op.
-
-
- @param none
- @return NO_ERROR If the cancel succeeded
- @todo Define error codes if cancel didnt succeed
-
- */
-status_t CameraHal::cancelAutoFocus()
-{
- LOG_FUNCTION_NAME;
-
- android::AutoMutex lock(mLock);
- android::CameraParameters adapterParams = mParameters;
- mMsgEnabled &= ~CAMERA_MSG_FOCUS;
-
- if( NULL != mCameraAdapter )
- {
- adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, android::CameraParameters::FALSE);
- mCameraAdapter->setParameters(adapterParams);
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
- mAppCallbackNotifier->flushEventQueue();
- }
-
- LOG_FUNCTION_NAME_EXIT;
- return NO_ERROR;
-}
-
-void CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
-{
-
- LOG_FUNCTION_NAME;
-
- if ( NULL != mEventProvider )
- {
- mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
- delete mEventProvider;
- mEventProvider = NULL;
- }
-
- mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
- if ( NULL == mEventProvider )
- {
- CAMHAL_LOGEA("Error in creating EventProvider");
- }
- else
- {
- mEventProvider->enableEventNotification(eventMask);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void CameraHal::eventCallbackRelay(CameraHalEvent* event)
-{
- LOG_FUNCTION_NAME;
-
- CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
- appcbn->eventCallback(event );
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void CameraHal::eventCallback(CameraHalEvent* event)
-{
- LOG_FUNCTION_NAME;
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-status_t CameraHal::startImageBracketing()
-{
- status_t ret = NO_ERROR;
- CameraFrame frame;
- CameraAdapter::BuffersDescriptor desc;
- unsigned int max_queueable = 0;
-
-
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- gettimeofday(&mStartCapture, NULL);
-
-#endif
-
- LOG_FUNCTION_NAME;
-
- if(!previewEnabled() && !mDisplayPaused)
- {
- LOG_FUNCTION_NAME_EXIT;
- return NO_INIT;
- }
-
- if ( !mBracketingEnabled )
- {
- return ret;
- }
-
- if ( NO_ERROR == ret )
- {
- mBracketingRunning = true;
- }
-
- if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
- {
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
- ( int ) &frame,
- ( mBracketRangeNegative + 1 ));
-
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
- }
- }
-
- if ( NO_ERROR == ret )
- {
- if ( NULL != mAppCallbackNotifier.get() )
- {
- mAppCallbackNotifier->setBurst(true);
- }
- }
-
- if ( NO_ERROR == ret )
- {
- unsigned int bufferCount = mBracketRangeNegative + 1;
- mParameters.getPictureSize(( int * ) &frame.mWidth,
- ( int * ) &frame.mHeight);
-
- ret = allocImageBufs(frame.mWidth,
- frame.mHeight,
- frame.mLength,
- mParameters.getPictureFormat(),
- bufferCount,
- &max_queueable);
- mBracketRangeNegative = bufferCount - 1;
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
- }
- }
-
- if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
- {
-
- desc.mBuffers = mImageBuffers;
- desc.mOffsets = mImageOffsets;
- desc.mFd = mImageFd;
- desc.mLength = mImageLength;
- desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
- desc.mMaxQueueable = ( size_t) max_queueable;
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
- ( int ) &desc);
-
- if ( NO_ERROR == ret )
- {
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- //pass capture timestamp along with the camera adapter command
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ), (int) &mStartCapture);
-
-#else
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
-
-#endif
-
- }
- }
-
- return ret;
-}
-
-status_t CameraHal::stopImageBracketing()
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if( !previewEnabled() )
- {
- return NO_INIT;
- }
-
- mBracketingRunning = false;
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Take a picture.
-
- @param none
- @return NO_ERROR If able to switch to image capture
- @todo Define error codes if unable to switch to image capture
-
- */
-status_t CameraHal::takePicture(const char *params)
-{
- android::AutoMutex lock(mLock);
- return __takePicture(params);
-}
-
-/**
- @brief Internal function for getting a captured image.
- shared by takePicture and reprocess.
- @param none
- @return NO_ERROR If able to switch to image capture
- @todo Define error codes if unable to switch to image capture
-
- */
-status_t CameraHal::__takePicture(const char *params)
-{
- // cancel AF state if needed (before any operation and mutex lock)
- if (mCameraAdapter->getState() == CameraAdapter::AF_STATE) {
- cancelAutoFocus();
- }
-
- status_t ret = NO_ERROR;
- CameraFrame frame;
- CameraAdapter::BuffersDescriptor desc;
- int burst = -1;
- const char *valstr = NULL;
- unsigned int bufferCount = 1;
- unsigned int max_queueable = 0;
- unsigned int rawBufferCount = 1;
- bool isCPCamMode = false;
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- gettimeofday(&mStartCapture, NULL);
-
-#endif
-
- LOG_FUNCTION_NAME;
-
- if(!previewEnabled() && !mDisplayPaused)
- {
- LOG_FUNCTION_NAME_EXIT;
- CAMHAL_LOGEA("Preview not started...");
- return NO_INIT;
- }
-
- valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
-
- isCPCamMode = valstr && !strcmp(valstr, TICameraParameters::CP_CAM_MODE);
-
- // return error if we are already capturing
- // however, we can queue a capture when in cpcam mode
- if ( ((mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
- mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
- (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
- mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE)) &&
- !isCPCamMode) {
- CAMHAL_LOGEA("Already capturing an image...");
- return NO_INIT;
- }
-
- // we only support video snapshot if we are in video mode (recording hint is set)
- if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
- (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
- CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
- return INVALID_OPERATION;
- }
-
-#ifdef OMAP_ENHANCEMENT_CPCAM
- // check if camera application is using shots parameters
- // api. parameters set here override anything set using setParameters
- // TODO(XXX): Just going to use legacy TI parameters for now. Need
- // add new APIs in CameraHal to utilize ShotParameters later, so
- // we don't have to parse through the whole set of parameters
- // in camera adapter
- if (strlen(params) > 0) {
- android::ShotParameters shotParams;
- const char *valStr;
- const char *valExpComp, *valExpGain;
- int valNum;
-
- android::String8 shotParams8(params);
-
- shotParams.unflatten(shotParams8);
- mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
- mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
-
- valExpGain = shotParams.get(android::ShotParameters::KEY_EXP_GAIN_PAIRS);
- valExpComp = shotParams.get(android::ShotParameters::KEY_EXP_COMPENSATION);
- if (NULL != valExpComp) {
- mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valExpComp);
- } else if (NULL != valExpGain) {
- mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valExpGain);
- }
-
- valNum = shotParams.getInt(android::ShotParameters::KEY_BURST);
- if (valNum >= 0) {
- mParameters.set(TICameraParameters::KEY_BURST, valNum);
- burst = valNum;
- }
-
- valStr = shotParams.get(android::ShotParameters::KEY_FLUSH_CONFIG);
- if (valStr!= NULL) {
- if ( 0 == strcmp(valStr, android::ShotParameters::TRUE) ) {
- mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
- android::CameraParameters::TRUE);
- } else if ( 0 == strcmp(valStr, android::ShotParameters::FALSE) ) {
- mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
- android::CameraParameters::FALSE);
- }
- }
-
- mCameraAdapter->setParameters(mParameters);
- } else
-#endif
- {
- // TODO(XXX): Should probably reset burst and bracketing params
- // when we remove legacy TI parameters implementation
- }
-
- // if we are already in the middle of a capture...then we just need
- // setParameters and start image capture to queue more shots
- if (((mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) ==
- CameraAdapter::CAPTURE_STATE) &&
- (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE)) {
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
- //pass capture timestamp along with the camera adapter command
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,
- (int) &mStartCapture);
-#else
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
-#endif
- return ret;
- }
-
- if ( !mBracketingRunning )
- {
- // if application didn't set burst through ShotParameters
- // then query from TICameraParameters
- if ((burst == -1) && (NO_ERROR == ret)) {
- burst = mParameters.getInt(TICameraParameters::KEY_BURST);
- }
-
- //Allocate all buffers only in burst capture case
- if ( burst > 0 ) {
- // For CPCam mode...allocate for worst case burst
- bufferCount = isCPCamMode || (burst > CameraHal::NO_BUFFERS_IMAGE_CAPTURE) ?
- CameraHal::NO_BUFFERS_IMAGE_CAPTURE : burst;
-
- if (mBufferSourceAdapter_Out.get()) {
- // TODO(XXX): Temporarily increase number of buffers we can allocate from ANW
- // until faux-NPA mode is implemented
- bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
- }
-
- if ( NULL != mAppCallbackNotifier.get() ) {
- mAppCallbackNotifier->setBurst(true);
- }
- } else if ( mBracketingEnabled ) {
- bufferCount = mBracketRangeNegative + 1;
- if ( NULL != mAppCallbackNotifier.get() ) {
- mAppCallbackNotifier->setBurst(false);
- }
- } else {
- if ( NULL != mAppCallbackNotifier.get() ) {
- mAppCallbackNotifier->setBurst(false);
- }
- }
-
- // pause preview during normal image capture
- // do not pause preview if recording (video state)
- if ( (NO_ERROR == ret) && (NULL != mDisplayAdapter.get()) ) {
- if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
- mDisplayPaused = true;
- mPreviewEnabled = false;
- ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
- // since preview is paused we should stop sending preview frames too
- if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
- mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
- }
- }
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
- mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
-#endif
- }
-
- // if we taking video snapshot...
- if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
- // enable post view frames if not already enabled so we can internally
- // save snapshot frames for generating thumbnail
- if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
- mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
- }
- }
-
- if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
- {
- if ( NO_ERROR == ret )
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
- ( int ) &frame,
- bufferCount);
-
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
- }
- }
-
- if ( NO_ERROR == ret )
- {
- ret = allocImageBufs(frame.mAlignment,
- frame.mHeight,
- frame.mLength,
- mParameters.getPictureFormat(),
- bufferCount,
- &max_queueable);
- if ( NO_ERROR != ret )
- {
- CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
- }
- }
-
- if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
- {
- desc.mBuffers = mImageBuffers;
- desc.mOffsets = mImageOffsets;
- desc.mFd = mImageFd;
- desc.mLength = mImageLength;
- desc.mCount = ( size_t ) bufferCount;
- desc.mMaxQueueable = ( size_t ) max_queueable;
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
- ( int ) &desc);
- }
- if (mRawCapture) {
- if ( NO_ERROR == ret ) {
- CAMHAL_LOGDB("Raw capture buffers setup - %s", mParameters.getPictureFormat());
- ret = allocRawBufs(mParameters.getInt(TICameraParameters::RAW_WIDTH),
- mParameters.getInt(TICameraParameters::RAW_HEIGHT),
- android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB,
- rawBufferCount);
-
- if ( NO_ERROR != ret ) {
- CAMHAL_LOGEB("allocRawBufs (for RAW capture) returned error 0x%x", ret);
- }
- }
-
- if ((NO_ERROR == ret) && ( NULL != mCameraAdapter )) {
- desc.mBuffers = mVideoBuffers;
- desc.mOffsets = mVideoOffsets;
- desc.mFd = mVideoFd;
- desc.mLength = mVideoLength;
- desc.mCount = ( size_t ) rawBufferCount;
- desc.mMaxQueueable = ( size_t ) rawBufferCount;
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE,
- ( int ) &desc);
- }
- }
- }
-
- if ((ret == NO_ERROR) && mBufferSourceAdapter_Out.get()) {
- mBufferSourceAdapter_Out->enableDisplay(0, 0, NULL);
- }
-
- if ((NO_ERROR == ret) && (NULL != mCameraAdapter)) {
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- //pass capture timestamp along with the camera adapter command
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE, (int) &mStartCapture);
-
-#else
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
-
-#endif
-
- }
-
- return ret;
-}
-
-/**
- @brief Cancel a picture that was started with takePicture.
-
- Calling this method when no picture is being taken is a no-op.
-
- @param none
- @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
- @todo Define error codes
-
- */
-status_t CameraHal::cancelPicture( )
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- ret = signalEndImageCapture();
- return NO_ERROR;
-}
-
-/**
- @brief Return the camera parameters.
-
- @param none
- @return Currently configured camera parameters
-
- */
-char* CameraHal::getParameters()
-{
- android::String8 params_str8;
- char* params_string;
- const char * valstr = NULL;
-
- LOG_FUNCTION_NAME;
-
- if( NULL != mCameraAdapter )
- {
- mCameraAdapter->getParameters(mParameters);
- }
-
-#ifndef OMAP_TUNA
- if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) {
- if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
- } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
- } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
- || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
- }
- }
-
- if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL ) {
- if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
- } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
- } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
- || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
- mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
- }
- }
-#endif
-
- android::CameraParameters mParams = mParameters;
-
- // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
- valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
- if(valstr != NULL)
- {
- if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
- {
- //HACK FOR MMS MODE
- resetPreviewRes(&mParams);
- }
- }
-
- // do not send internal parameters to upper layers
- mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
- mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
-
- params_str8 = mParams.flatten();
-
- // camera service frees this string...
- params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
- strcpy(params_string, params_str8.string());
-
- LOG_FUNCTION_NAME_EXIT;
-
- ///Return the current set of parameters
-
- return params_string;
-}
-
-
-#ifdef OMAP_ENHANCEMENT_CPCAM
-/**
- @brief Starts reprocessing operation.
- */
-status_t CameraHal::reprocess(const char *params)
-{
- status_t ret = NO_ERROR;
- int bufferCount = 0;
- CameraAdapter::BuffersDescriptor desc;
- CameraBuffer *reprocBuffers = NULL;
- android::ShotParameters shotParams;
-
- android::AutoMutex lock(mLock);
-
- LOG_FUNCTION_NAME;
-
- // 1. Get buffers
- if (mBufferSourceAdapter_In.get()) {
- reprocBuffers = mBufferSourceAdapter_In->getBufferList(&bufferCount);
- }
-
- if (!reprocBuffers) {
- CAMHAL_LOGE("Error: couldn't get input buffers for reprocess()");
- goto exit;
- }
-
- // 2. Get buffer information and parse parameters
- {
- shotParams.setBurst(bufferCount);
- }
-
- // 3. Give buffer to camera adapter
- desc.mBuffers = reprocBuffers;
- desc.mOffsets = 0;
- desc.mFd = 0;
- desc.mLength = 0;
- desc.mCount = (size_t) bufferCount;
- desc.mMaxQueueable = (size_t) bufferCount;
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS, (int) &desc);
- if (ret != NO_ERROR) {
- CAMHAL_LOGE("Error calling camera use buffers");
- goto exit;
- }
-
- // 4. Start reprocessing
- ret = mBufferSourceAdapter_In->enableDisplay(0, 0, NULL);
- if (ret != NO_ERROR) {
- CAMHAL_LOGE("Error enabling tap in point");
- goto exit;
- }
-
- // 5. Start capturing
- ret = __takePicture(shotParams.flatten().string());
-
- exit:
- return ret;
-}
-
-/**
- @brief Cancels current reprocessing operation
-
- */
-status_t CameraHal::cancel_reprocess( )
-{
- LOG_FUNCTION_NAME;
- status_t ret = NO_ERROR;
-
- ret = signalEndImageCapture();
- return NO_ERROR;
-}
-#endif
-
-
-void CameraHal::putParameters(char *parms)
-{
- free(parms);
-}
-
-/**
- @brief Send command to camera driver.
-
- @param none
- @return NO_ERROR If the command succeeds
- @todo Define the error codes that this function can return
-
- */
-status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
-{
- status_t ret = NO_ERROR;
-
- LOG_FUNCTION_NAME;
-
- if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
- {
- CAMHAL_LOGEA("No CameraAdapter instance");
- return -EINVAL;
- }
-
- ///////////////////////////////////////////////////////
- // Following commands do NOT need preview to be started
- ///////////////////////////////////////////////////////
-
- switch ( cmd ) {
-#ifdef ANDROID_API_JB_OR_LATER
- case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
- {
- const bool enable = static_cast<bool>(arg1);
- android::AutoMutex lock(mLock);
- if ( enable ) {
- mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE;
- } else {
- mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE;
- }
- }
- return OK;
-#endif
- }
-
- if ( ret == OK && !previewEnabled()
-#ifdef OMAP_ENHANCEMENT_VTC
- && (cmd != CAMERA_CMD_PREVIEW_INITIALIZATION)
-#endif
- ) {
- CAMHAL_LOGEA("Preview is not running");
- ret = -EINVAL;
- }
-
- ///////////////////////////////////////////////////////
- // Following commands NEED preview to be started
- ///////////////////////////////////////////////////////
-
- if ( NO_ERROR == ret )
- {
- switch(cmd)
- {
- case CAMERA_CMD_START_SMOOTH_ZOOM:
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
-
- break;
- case CAMERA_CMD_STOP_SMOOTH_ZOOM:
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
- break;
-
- case CAMERA_CMD_START_FACE_DETECTION:
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
-
- break;
-
- case CAMERA_CMD_STOP_FACE_DETECTION:
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
-
- break;
-
-#ifdef OMAP_ENHANCEMENT_VTC
- case CAMERA_CMD_PREVIEW_DEINITIALIZATION:
- if(mDisplayAdapter.get() != NULL) {
- ///Stop the buffer display first
- mDisplayAdapter->disableDisplay();
- }
-
- if(mAppCallbackNotifier.get() != NULL) {
- //Stop the callback sending
- mAppCallbackNotifier->stop();
- mAppCallbackNotifier->flushAndReturnFrames();
- mAppCallbackNotifier->stopPreviewCallbacks();
- }
-
- ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_DESTROY_TUNNEL);
- mTunnelSetup = false;
-
- break;
-
- case CAMERA_CMD_PREVIEW_INITIALIZATION:
- ret = cameraPreviewInitialization();
-
- break;
-#endif
-
- default:
- break;
- };
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-/**
- @brief Release the hardware resources owned by this object.
-
- Note that this is *not* done in the destructor.
-
- @param none
- @return none
-
- */
-void CameraHal::release()
-{
- LOG_FUNCTION_NAME;
- ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
- ///just before CameraHal object destruction
- deinitialize();
- LOG_FUNCTION_NAME_EXIT;
-}
-
-
-/**
- @brief Dump state of the camera hardware
-
- @param[in] fd File descriptor
- @param[in] args Arguments
- @return NO_ERROR Dump succeeded
- @todo Error codes for dump fail
-
- */
-status_t CameraHal::dump(int fd) const
-{
- LOG_FUNCTION_NAME;
- ///Implement this method when the h/w dump function is supported on Ducati side
- return NO_ERROR;
-}
-
-/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
-
-
-
-
-/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
-
-/**
- @brief Constructor of CameraHal
-
- Member variables are initialized here. No allocations should be done here as we
- don't use c++ exceptions in the code.
-
- */
-CameraHal::CameraHal(int cameraId)
-{
- LOG_FUNCTION_NAME;
-
- ///Initialize all the member variables to their defaults
- mPreviewEnabled = false;
- mPreviewBuffers = NULL;
- mImageBuffers = NULL;
- mBufProvider = NULL;
- mPreviewStartInProgress = false;
- mVideoBuffers = NULL;
- mVideoBufProvider = NULL;
- mRecordingEnabled = false;
- mDisplayPaused = false;
- mSetPreviewWindowCalled = false;
- mMsgEnabled = 0;
- mAppCallbackNotifier = NULL;
- mMemoryManager = NULL;
- mCameraAdapter = NULL;
- mBracketingEnabled = false;
- mBracketingRunning = false;
- mEventProvider = NULL;
- mBracketRangePositive = 1;
- mBracketRangeNegative = 1;
- mMaxZoomSupported = 0;
- mShutterEnabled = true;
- mMeasurementEnabled = false;
- mPreviewDataBuffers = NULL;
- mCameraProperties = NULL;
- mCurrentTime = 0;
- mFalsePreview = 0;
- mImageOffsets = NULL;
- mImageLength = 0;
- mImageFd = 0;
- mVideoOffsets = NULL;
- mVideoFd = 0;
- mVideoLength = 0;
- mPreviewDataOffsets = NULL;
- mPreviewDataFd = 0;
- mPreviewDataLength = 0;
- mPreviewFd = 0;
- mPreviewWidth = 0;
- mPreviewHeight = 0;
- mPreviewLength = 0;
- mPreviewOffsets = NULL;
- mPreviewRunning = 0;
- mPreviewStateOld = 0;
- mRecordingEnabled = 0;
- mRecordEnabled = 0;
- mSensorListener = NULL;
- mVideoWidth = 0;
- mVideoHeight = 0;
-#ifdef OMAP_ENHANCEMENT_VTC
- mVTCUseCase = false;
- mTunnelSetup = false;
-#endif
- mPreviewInitializationDone = false;
-
-#ifdef OMAP_ENHANCEMENT_CPCAM
- mExtendedPreviewStreamOps = 0;
-#endif
-
- //These values depends on the sensor characteristics
-
- mRawCapture = false;
-
-#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
-
- //Initialize the CameraHAL constructor timestamp, which is used in the
- // PPM() method as time reference if the user does not supply one.
- gettimeofday(&ppm_start, NULL);
-
-#endif
-
- mCameraIndex = cameraId;
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Destructor of CameraHal
-
- This function simply calls deinitialize() to free up memory allocate during construct
- phase
- */
-CameraHal::~CameraHal()
-{
- LOG_FUNCTION_NAME;
-
- ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
- deinitialize();
-
- if ( NULL != mEventProvider )
- {
- mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
- delete mEventProvider;
- mEventProvider = NULL;
- }
-
- /// Free the callback notifier
- mAppCallbackNotifier.clear();
-
- /// Free the display adapter
- mDisplayAdapter.clear();
-
- if ( NULL != mCameraAdapter ) {
- int strongCount = mCameraAdapter->getStrongCount();
-
- mCameraAdapter->decStrong(mCameraAdapter);
-
- mCameraAdapter = NULL;
- }
-
- freeImageBufs();
- freeRawBufs();
-
- /// Free the memory manager
- mMemoryManager.clear();
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Initialize the Camera HAL
-
- Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
-
- @param None
- @return NO_ERROR - On success
- NO_MEMORY - On failure to allocate memory for any of the objects
- @remarks Camera Hal internal function
-
- */
-
-status_t CameraHal::initialize(CameraProperties::Properties* properties)
-{
- LOG_FUNCTION_NAME;
-
- int sensor_index = 0;
- const char* sensor_name = NULL;
-
- ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
- ///Currently, registering all events as to be coming from CameraAdapter
- int32_t eventMask = CameraHalEvent::ALL_EVENTS;
-
- // Get my camera properties
- mCameraProperties = properties;
-
- if(!mCameraProperties)
- {
- goto fail_loop;
- }
-
- // Dump the properties of this Camera
- // will only print if DEBUG macro is defined
- mCameraProperties->dump();
-
- if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
- {
- sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
- }
-
- if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_NAME)) != 0 ) {
- sensor_name = mCameraProperties->get(CameraProperties::CAMERA_NAME);
- }
- CAMHAL_LOGDB("Sensor index= %d; Sensor name= %s", sensor_index, sensor_name);
-
- if (strcmp(sensor_name, V4L_CAMERA_NAME_USB) == 0) {
-#ifdef V4L_CAMERA_ADAPTER
- mCameraAdapter = V4LCameraAdapter_Factory(sensor_index);
-#endif
- }
- else {
-#ifdef OMX_CAMERA_ADAPTER
- mCameraAdapter = OMXCameraAdapter_Factory(sensor_index);
-#endif
- }
-
- if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
- {
- CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
- mCameraAdapter = NULL;
- goto fail_loop;
- }
-
- mCameraAdapter->incStrong(mCameraAdapter);
- mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
- mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
-
- if(!mAppCallbackNotifier.get())
- {
- /// Create the callback notifier
- mAppCallbackNotifier = new AppCallbackNotifier();
- if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
- {
- CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
- goto fail_loop;
- }
- }
-
- if(!mMemoryManager.get())
- {
- /// Create Memory Manager
- mMemoryManager = new MemoryManager();
- if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
- {
- CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
- goto fail_loop;
- }
- }
-
- ///Setup the class dependencies...
-
- ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
- ///CameraAdapter is the one which provides those events
- ///Set it as the frame and event providers for AppCallbackNotifier
- ///@remarks setEventProvider API takes in a bit mask of events for registering a provider for the different events
- /// That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
- /// for any event
- mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
- mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
-
- ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
- ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application
- ///Set it as the error handler for CameraAdapter
- mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
-
- ///Start the callback notifier
- if(mAppCallbackNotifier->start() != NO_ERROR)
- {
- CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
- goto fail_loop;
- }
-
- CAMHAL_LOGDA("Started AppCallbackNotifier..");
- mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
-
- ///Initialize default parameters
- initDefaultParameters();
-
-
- if ( setParameters(mParameters) != NO_ERROR )
- {
- CAMHAL_LOGEA("Failed to set default parameters?!");
- }
-
- // register for sensor events
- mSensorListener = new SensorListener();
- if (mSensorListener.get()) {
- if (mSensorListener->initialize() == NO_ERROR) {
- mSensorListener->setCallbacks(orientation_cb, this);
- mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
- } else {
- CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
- mSensorListener.clear();
- mSensorListener = NULL;
- }
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return NO_ERROR;
-
- fail_loop:
-
- ///Free up the resources because we failed somewhere up
- deinitialize();
- LOG_FUNCTION_NAME_EXIT;
-
- return NO_MEMORY;
-
-}
-
-bool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
-{
- bool ret = false;
- status_t status = NO_ERROR;
- char tmpBuffer[MAX_PROP_VALUE_LENGTH];
- char *pos = NULL;
-
- LOG_FUNCTION_NAME;
-
- if (NULL == supportedResolutions) {
- CAMHAL_LOGEA("Invalid supported resolutions string");
- goto exit;
- }
-
- status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%dx%d", width, height);
- if (0 > status) {
- CAMHAL_LOGEA("Error encountered while generating validation string");
- goto exit;
- }
-
- ret = isParameterValid(tmpBuffer, supportedResolutions);
-
-exit:
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-bool CameraHal::isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges)
-{
- bool ret = false;
- char supported[MAX_PROP_VALUE_LENGTH];
- char *pos;
- int suppFpsRangeArray[2];
- int i = 0;
-
- LOG_FUNCTION_NAME;
-
- if ( NULL == supportedFpsRanges ) {
- CAMHAL_LOGEA("Invalid supported FPS ranges string");
- return false;
- }
-
- if (fpsMin <= 0 || fpsMax <= 0 || fpsMin > fpsMax) {
- return false;
- }
-
- strncpy(supported, supportedFpsRanges, MAX_PROP_VALUE_LENGTH);
- pos = strtok(supported, " (,)");
- while (pos != NULL) {
- suppFpsRangeArray[i] = atoi(pos);
- if (i++) {
- if (fpsMin >= suppFpsRangeArray[0] && fpsMax <= suppFpsRangeArray[1]) {
- ret = true;
- break;
- }
- i = 0;
- }
- pos = strtok(NULL, " (,)");
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-bool CameraHal::isParameterValid(const char *param, const char *supportedParams)
-{
- bool ret = false;
- char *pos;
- char supported[MAX_PROP_VALUE_LENGTH];
-
- LOG_FUNCTION_NAME;
-
- if (NULL == supportedParams) {
- CAMHAL_LOGEA("Invalid supported parameters string");
- goto exit;
- }
-
- if (NULL == param) {
- CAMHAL_LOGEA("Invalid parameter string");
- goto exit;
- }
-
- strncpy(supported, supportedParams, MAX_PROP_VALUE_LENGTH - 1);
-
- pos = strtok(supported, ",");
- while (pos != NULL) {
- if (!strcmp(pos, param)) {
- ret = true;
- break;
- }
- pos = strtok(NULL, ",");
- }
-
-exit:
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-bool CameraHal::isParameterValid(int param, const char *supportedParams)
-{
- bool ret = false;
- status_t status;
- char tmpBuffer[MAX_PROP_VALUE_LENGTH];
-
- LOG_FUNCTION_NAME;
-
- if (NULL == supportedParams) {
- CAMHAL_LOGEA("Invalid supported parameters string");
- goto exit;
- }
-
- status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%d", param);
- if (0 > status) {
- CAMHAL_LOGEA("Error encountered while generating validation string");
- goto exit;
- }
-
- ret = isParameterValid(tmpBuffer, supportedParams);
-
-exit:
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-status_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
- if (!new_param || !old_param) {
- return -EINVAL;
- }
-
- // if params mismatch we should update parameters for camera adapter
- if ((strcmp(new_param, old_param) != 0)) {
- update = true;
- }
-
- return NO_ERROR;
-}
-
-status_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
-{
- status_t ret = NO_ERROR;
- char *ctx, *pWidth, *pHeight;
- const char *sep = "x";
-
- LOG_FUNCTION_NAME;
-
- if ( NULL == resStr )
- {
- return -EINVAL;
- }
-
- //This fixes "Invalid input resolution"
- char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
- if ( NULL != resStr_copy )
- {
- strcpy(resStr_copy, resStr);
- pWidth = strtok_r(resStr_copy, sep, &ctx);
-
- if ( NULL != pWidth )
- {
- width = atoi(pWidth);
- }
- else
- {
- CAMHAL_LOGEB("Invalid input resolution %s", resStr);
- ret = -EINVAL;
- }
- }
-
- if ( NO_ERROR == ret )
- {
- pHeight = strtok_r(NULL, sep, &ctx);
-
- if ( NULL != pHeight )
- {
- height = atoi(pHeight);
- }
- else
- {
- CAMHAL_LOGEB("Invalid input resolution %s", resStr);
- ret = -EINVAL;
- }
- }
-
- free(resStr_copy);
- resStr_copy = NULL;
-
- LOG_FUNCTION_NAME_EXIT;
-
- return ret;
-}
-
-void CameraHal::insertSupportedParams()
-{
- LOG_FUNCTION_NAME;
-
- android::CameraParameters &p = mParameters;
-
- ///Set the name of the camera
- p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
-
- mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
-
- p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
- p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
- p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
- p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
-#ifndef OMAP_TUNA
- p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
- p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
- p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
- p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
- p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
- p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
-#endif
- p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
- p.set(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES_EXT));
- p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
- p.set(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_EXT_SUPPORTED));
- p.set(android::CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
- p.set(android::CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
- p.set(android::CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
- p.set(android::CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
- p.set(android::CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
- p.set(android::CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
- p.set(android::CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
- p.set(android::CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
- p.set(android::CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
- p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
- p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP));
- p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
- p.set(android::CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
- p.set(android::CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
- p.set(android::CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
- p.set(android::CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
- p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
-#ifndef OMAP_TUNA
- p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES));
- p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES));
-#endif
- p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE_VALUES, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE_VALUES));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX));
- p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_STEP));
- p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
- p.set(TICameraParameters::KEY_VNF_SUPPORTED, mCameraProperties->get(CameraProperties::VNF_SUPPORTED));
- p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
- p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
- p.set(android::CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
-#ifndef OMAP_TUNA
- p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED));
-#endif
- p.set(TICameraParameters::KEY_CAP_MODE_VALUES, mCameraProperties->get(CameraProperties::CAP_MODE_VALUES));
-
- LOG_FUNCTION_NAME_EXIT;
-
-}
-
-void CameraHal::initDefaultParameters()
-{
- //Purpose of this function is to initialize the default current and supported parameters for the currently
- //selected camera.
-
- android::CameraParameters &p = mParameters;
- int currentRevision, adapterRevision;
- status_t ret = NO_ERROR;
- int width, height;
- const char *valstr;
-
- LOG_FUNCTION_NAME;
-
- insertSupportedParams();
-
- ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
-
- if ( NO_ERROR == ret )
- {
- p.setPreviewSize(width, height);
- }
- else
- {
- p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
- }
-
- ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
-
- if ( NO_ERROR == ret )
- {
- p.setPictureSize(width, height);
- }
- else
- {
- p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
- }
-
- ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
-
- if ( NO_ERROR == ret )
- {
- p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
- p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
- }
- else
- {
- p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
- p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
- }
-
- //Insert default values
- p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
- p.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
- p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
- p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
- p.set(android::CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
- p.set(android::CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
- p.set(android::CameraParameters::KEY_EFFECT, mCameraProperties->get(CameraProperties::EFFECT));
- p.set(android::CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
- p.set(android::CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
- p.set(android::CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
- p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
- p.set(android::CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
- p.set(android::CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
- p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
- p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
- p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
- p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
- p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
- p.set(TICameraParameters::KEY_MANUAL_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
- p.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
- p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
- p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
- p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
- p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
- p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
- p.set(TICameraParameters::KEY_GBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GBCE));
- p.set(TICameraParameters::KEY_GLBCE, mCameraProperties->get(CameraProperties::GLBCE));
- p.set(TICameraParameters::KEY_GLBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE));
-#ifndef OMAP_TUNA
- p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT));
- p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT));
-#endif
- p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
- p.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, mCameraProperties->get(CameraProperties::MANUAL_CONVERGENCE));
- p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
- p.set(TICameraParameters::KEY_VNF, mCameraProperties->get(CameraProperties::VNF));
- p.set(android::CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
- p.set(android::CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
- p.set(android::CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
- p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
- p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
- p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
- p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
- p.set(android::CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
- p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
- p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
-#ifndef OMAP_TUNA
- p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION));
-#endif
- // Only one area a.k.a Touch AF for now.
- // TODO: Add support for multiple focus areas.
- p.set(android::CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
- p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
- p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
- p.set(android::CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
- p.set(TICameraParameters::RAW_WIDTH, mCameraProperties->get(CameraProperties::RAW_WIDTH));
- p.set(TICameraParameters::RAW_HEIGHT,mCameraProperties->get(CameraProperties::RAW_HEIGHT));
-
-#ifndef OMAP_TUNA
- // TI extensions for enable/disable algos
- // Hadcoded for now
- p.set(TICameraParameters::KEY_ALGO_FIXED_GAMMA, android::CameraParameters::TRUE);
- p.set(TICameraParameters::KEY_ALGO_NSF1, android::CameraParameters::TRUE);
- p.set(TICameraParameters::KEY_ALGO_NSF2, android::CameraParameters::TRUE);
- p.set(TICameraParameters::KEY_ALGO_SHARPENING, android::CameraParameters::TRUE);
- p.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, android::CameraParameters::TRUE);
- p.set(TICameraParameters::KEY_ALGO_GIC, android::CameraParameters::TRUE);
-#endif
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Stop a previously started preview.
- @param none
- @return none
-
- */
-void CameraHal::forceStopPreview()
-{
- LOG_FUNCTION_NAME;
-
- // stop bracketing if it is running
- if ( mBracketingRunning ) {
- stopImageBracketing();
- }
-
- if(mDisplayAdapter.get() != NULL) {
- ///Stop the buffer display first
- mDisplayAdapter->disableDisplay();
- }
-
- if(mAppCallbackNotifier.get() != NULL) {
- //Stop the callback sending
- mAppCallbackNotifier->stop();
- mAppCallbackNotifier->flushAndReturnFrames();
- mAppCallbackNotifier->stopPreviewCallbacks();
- }
-
- if ( NULL != mCameraAdapter ) {
- // only need to send these control commands to state machine if we are
- // passed the LOADED_PREVIEW_STATE
- if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) {
- // according to javadoc...FD should be stopped in stopPreview
- // and application needs to call startFaceDection again
- // to restart FD
- mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
- }
-
- mCameraAdapter->rollbackToInitializedState();
-
- }
-
- freePreviewBufs();
- freePreviewDataBufs();
-
- mPreviewEnabled = false;
- mDisplayPaused = false;
- mPreviewStartInProgress = false;
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-/**
- @brief Deallocates memory for all the resources held by Camera HAL.
-
- Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
- and Memory Manager
-
- @param none
- @return none
-
- */
-void CameraHal::deinitialize()
-{
- LOG_FUNCTION_NAME;
-
- if ( mPreviewEnabled || mDisplayPaused ) {
- forceStopPreview();
- }
-
- mSetPreviewWindowCalled = false;
-
- if (mSensorListener.get()) {
- mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
- mSensorListener.clear();
- mSensorListener = NULL;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-
-}
-
-status_t CameraHal::storeMetaDataInBuffers(bool enable)
-{
- LOG_FUNCTION_NAME;
-
- return mAppCallbackNotifier->useMetaDataBufferMode(enable);
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void CameraHal::getPreferredPreviewRes(int *width, int *height)
-{
- LOG_FUNCTION_NAME;
-
- // We request Ducati for a higher resolution so preview looks better and then downscale the frame before the callback.
- // TODO: This should be moved to configuration constants and boolean flag whether to provide such optimization
- // Also consider providing this configurability of the desired display resolution from the application
- if ( ( *width == 320 ) && ( *height == 240 ) ) {
- *width = 640;
- *height = 480;
- } else if ( ( *width == 176 ) && ( *height == 144 ) ) {
- *width = 704;
- *height = 576;
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void CameraHal::resetPreviewRes(android::CameraParameters *params)
-{
- LOG_FUNCTION_NAME;
-
- if ( (mVideoWidth <= 320) && (mVideoHeight <= 240)){
- params->setPreviewSize(mVideoWidth, mVideoHeight);
- }
-
- LOG_FUNCTION_NAME_EXIT;
-}
-
-void *
-camera_buffer_get_omx_ptr (CameraBuffer *buffer)
-{
- CAMHAL_LOGSV("buffer_type %d opaque %p", buffer->type, buffer->opaque);
-
- if (buffer->type == CAMERA_BUFFER_ANW) {
- buffer_handle_t *handle = (buffer_handle_t *)buffer->opaque;
- CAMHAL_LOGSV("anw %08x", *handle);
- return (void *)*handle;
- } else if (buffer->type == CAMERA_BUFFER_ION) {
- return (void *)buffer->fd;
- } else {
- CAMHAL_LOGSV("other %08x", buffer->opaque);
- return (void *)buffer->opaque;
- }
-}
-
-} // namespace Camera
-} // namespace Ti