Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) Texas Instruments - http://www.ti.com/
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18 * @file CameraHal.cpp
     19 *
     20 * This file maps the Camera Hardware Interface to V4L2.
     21 *
     22 */
     23 
     24 #include "CameraHal.h"
     25 #include "ANativeWindowDisplayAdapter.h"
     26 #include "BufferSourceAdapter.h"
     27 #include "TICameraParameters.h"
     28 #include "CameraProperties.h"
     29 #include <cutils/properties.h>
     30 
     31 #include <poll.h>
     32 #include <math.h>
     33 
     34 namespace Ti {
     35 namespace Camera {
     36 
     37 extern "C" CameraAdapter* OMXCameraAdapter_Factory(size_t);
     38 extern "C" CameraAdapter* V4LCameraAdapter_Factory(size_t);
     39 
     40 /*****************************************************************************/
     41 
     42 ////Constant definitions and declarations
     43 ////@todo Have a CameraProperties class to store these parameters as constants for every camera
     44 ////       Currently, they are hard-coded
     45 
     46 const int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
     47 const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 5;
     48 const int CameraHal::SW_SCALING_FPS_LIMIT = 15;
     49 
     50 const uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 16;
     51 
     52 const uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
     53 
     54 // TODO(XXX): Temporarily increase number of buffers we can allocate from ANW
     55 // until faux-NPA mode is implemented
     56 const int CameraHal::NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP = 15;
     57 
     58 #ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
     59 // HACK: Default path to directory where RAW images coming from video port will be saved to.
     60 //       If directory not exists the saving is skipped and video port frame is ignored.
     61 //       The directory name is choosed in so weird way to enable RAW images saving only when
     62 //       directory has been created explicitly by user.
     63 extern const char * const kRawImagesOutputDirPath = "/data/misc/camera/RaW_PiCtUrEs";
     64 extern const char * const kYuvImagesOutputDirPath = "/data/misc/camera/YuV_PiCtUrEs";
     65 #endif
     66 
     67 /******************************************************************************/
     68 
     69 
     70 #ifdef OMAP_ENHANCEMENT_CPCAM
     71 static int dummy_update_and_get_buffer(preview_stream_ops_t*, buffer_handle_t**, int*) {
     72     return INVALID_OPERATION;
     73 }
     74 
     75 static int dummy_get_buffer_dimension(preview_stream_ops_t*, int*, int*) {
     76     return INVALID_OPERATION;
     77 }
     78 
     79 static int dummy_get_buffer_format(preview_stream_ops_t*, int*) {
     80     return INVALID_OPERATION;
     81 }
     82 
     83 static int dummy_set_metadata(preview_stream_ops_t*, const camera_memory_t*) {
     84     return INVALID_OPERATION;
     85 }
     86 
     87 static int dummy_get_id(preview_stream_ops_t*, char *data, unsigned int dataSize) {
     88     return INVALID_OPERATION;
     89 }
     90 
     91 static int dummy_get_buffer_count(preview_stream_ops_t*, int *count) {
     92     return INVALID_OPERATION;
     93 }
     94 
     95 static int dummy_get_crop(preview_stream_ops_t*,
     96                           int *, int *, int *, int *) {
     97     return INVALID_OPERATION;
     98 }
     99 
    100 static int dummy_get_current_size(preview_stream_ops_t*,
    101                                   int *, int *) {
    102     return INVALID_OPERATION;
    103 }
    104 #endif
    105 
    106 #ifdef OMAP_ENHANCEMENT
    107 static preview_stream_extended_ops_t dummyPreviewStreamExtendedOps = {
    108 #ifdef OMAP_ENHANCEMENT_CPCAM
    109     dummy_update_and_get_buffer,
    110     dummy_get_buffer_dimension,
    111     dummy_get_buffer_format,
    112     dummy_set_metadata,
    113     dummy_get_id,
    114     dummy_get_buffer_count,
    115     dummy_get_crop,
    116     dummy_get_current_size,
    117 #endif
    118 };
    119 #endif
    120 
    121 
    122 DisplayAdapter::DisplayAdapter()
    123 {
    124 #ifdef OMAP_ENHANCEMENT
    125     mExtendedOps = &dummyPreviewStreamExtendedOps;
    126 #endif
    127 }
    128 
    129 #ifdef OMAP_ENHANCEMENT
    130 void DisplayAdapter::setExtendedOps(preview_stream_extended_ops_t * extendedOps) {
    131     mExtendedOps = extendedOps ? extendedOps : &dummyPreviewStreamExtendedOps;
    132 }
    133 #endif
    134 
    135 
    136 
    137 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    138 
    139 struct timeval CameraHal::mStartPreview;
    140 struct timeval CameraHal::mStartFocus;
    141 struct timeval CameraHal::mStartCapture;
    142 
    143 #endif
    144 
    145 static void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
    146     CameraHal *camera = NULL;
    147 
    148     if (cookie) {
    149         camera = (CameraHal*) cookie;
    150         camera->onOrientationEvent(orientation, tilt);
    151     }
    152 
    153 }
    154 
    155 /*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
    156 
    157 /**
    158   Callback function to receive orientation events from SensorListener
    159  */
    160 void CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
    161     LOG_FUNCTION_NAME;
    162 
    163     if ( NULL != mCameraAdapter ) {
    164         mCameraAdapter->onOrientationEvent(orientation, tilt);
    165     }
    166 
    167     LOG_FUNCTION_NAME_EXIT;
    168 }
    169 
    170 /**
    171    @brief Set the notification and data callbacks
    172 
    173    @param[in] notify_cb Notify callback for notifying the app about events and errors
    174    @param[in] data_cb   Buffer callback for sending the preview/raw frames to the app
    175    @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
    176    @param[in] user  Callback cookie
    177    @return none
    178 
    179  */
    180 void CameraHal::setCallbacks(camera_notify_callback notify_cb,
    181                             camera_data_callback data_cb,
    182                             camera_data_timestamp_callback data_cb_timestamp,
    183                             camera_request_memory get_memory,
    184                             void *user)
    185 {
    186     LOG_FUNCTION_NAME;
    187 
    188     if ( NULL != mAppCallbackNotifier.get() )
    189     {
    190             mAppCallbackNotifier->setCallbacks(this,
    191                                                 notify_cb,
    192                                                 data_cb,
    193                                                 data_cb_timestamp,
    194                                                 get_memory,
    195                                                 user);
    196     }
    197 
    198     if ( NULL != mCameraAdapter ) {
    199         mCameraAdapter->setSharedAllocator(get_memory);
    200     }
    201 
    202     LOG_FUNCTION_NAME_EXIT;
    203 }
    204 
    205 /**
    206    @brief Enable a message, or set of messages.
    207 
    208    @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
    209    @return none
    210 
    211  */
    212 void CameraHal::enableMsgType(int32_t msgType)
    213 {
    214     LOG_FUNCTION_NAME;
    215 
    216     if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
    217         {
    218         msgType &= ~CAMERA_MSG_SHUTTER;
    219         }
    220 
    221     // ignoring enable focus message from camera service
    222     // we will enable internally in autoFocus call
    223     msgType &= ~CAMERA_MSG_FOCUS;
    224 #ifdef ANDROID_API_JB_OR_LATER
    225     msgType &= ~CAMERA_MSG_FOCUS_MOVE;
    226 #endif
    227 
    228     {
    229     android::AutoMutex lock(mLock);
    230     mMsgEnabled |= msgType;
    231     }
    232 
    233     if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
    234     {
    235         if(mDisplayPaused)
    236         {
    237             CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
    238             msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
    239         }else
    240         {
    241             CAMHAL_LOGDA("Enabling Preview Callback");
    242         }
    243     }
    244     else
    245     {
    246         CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
    247     }
    248 
    249 
    250     ///Configure app callback notifier with the message callback required
    251     mAppCallbackNotifier->enableMsgType (msgType);
    252 
    253     LOG_FUNCTION_NAME_EXIT;
    254 }
    255 
    256 /**
    257    @brief Disable a message, or set of messages.
    258 
    259    @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
    260    @return none
    261 
    262  */
    263 void CameraHal::disableMsgType(int32_t msgType)
    264 {
    265     LOG_FUNCTION_NAME;
    266 
    267         {
    268         android::AutoMutex lock(mLock);
    269         mMsgEnabled &= ~msgType;
    270         }
    271 
    272     if( msgType & CAMERA_MSG_PREVIEW_FRAME)
    273         {
    274         CAMHAL_LOGDA("Disabling Preview Callback");
    275         }
    276 
    277     ///Configure app callback notifier
    278     mAppCallbackNotifier->disableMsgType (msgType);
    279 
    280     LOG_FUNCTION_NAME_EXIT;
    281 }
    282 
    283 /**
    284    @brief Query whether a message, or a set of messages, is enabled.
    285 
    286    Note that this is operates as an AND, if any of the messages queried are off, this will
    287    return false.
    288 
    289    @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
    290    @return true If all message types are enabled
    291           false If any message type
    292 
    293  */
    294 int CameraHal::msgTypeEnabled(int32_t msgType)
    295 {
    296     int32_t msgEnabled = 0;
    297 
    298     LOG_FUNCTION_NAME;
    299     android::AutoMutex lock(mLock);
    300 
    301     msgEnabled = mMsgEnabled;
    302     if (!previewEnabled() && !mPreviewInitializationDone) {
    303         msgEnabled &= ~(CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_PREVIEW_METADATA);
    304     }
    305 
    306     LOG_FUNCTION_NAME_EXIT;
    307     return (msgEnabled & msgType);
    308 }
    309 
    310 /**
    311    @brief Set the camera parameters.
    312 
    313    @param[in] params Camera parameters to configure the camera
    314    @return NO_ERROR
    315    @todo Define error codes
    316 
    317  */
    318 int CameraHal::setParameters(const char* parameters)
    319 {
    320 
    321     LOG_FUNCTION_NAME;
    322 
    323     android::CameraParameters params;
    324 
    325     android::String8 str_params(parameters);
    326     params.unflatten(str_params);
    327 
    328     LOG_FUNCTION_NAME_EXIT;
    329 
    330     return setParameters(params);
    331 }
    332 
    333 /**
    334    @brief Set the camera parameters.
    335 
    336    @param[in] params Camera parameters to configure the camera
    337    @return NO_ERROR
    338    @todo Define error codes
    339 
    340  */
    341 int CameraHal::setParameters(const android::CameraParameters& params)
    342 {
    343 
    344     LOG_FUNCTION_NAME;
    345 
    346     int w, h;
    347     int framerate;
    348     int maxFPS, minFPS;
    349     const char *valstr = NULL;
    350     int varint = 0;
    351     status_t ret = NO_ERROR;
    352     // Needed for KEY_RECORDING_HINT
    353     bool restartPreviewRequired = false;
    354     bool updateRequired = false;
    355     android::CameraParameters oldParams = mParameters;
    356 
    357 #ifdef V4L_CAMERA_ADAPTER
    358     if (strcmp (V4L_CAMERA_NAME_USB, mCameraProperties->get(CameraProperties::CAMERA_NAME)) == 0 ) {
    359         updateRequired = true;
    360     }
    361 #endif
    362 
    363     {
    364         android::AutoMutex lock(mLock);
    365 
    366         ///Ensure that preview is not enabled when the below parameters are changed.
    367         if(!previewEnabled())
    368             {
    369             if ((valstr = params.getPreviewFormat()) != NULL) {
    370                 if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
    371                     mParameters.setPreviewFormat(valstr);
    372                     CAMHAL_LOGDB("PreviewFormat set %s", valstr);
    373                 } else {
    374                     CAMHAL_LOGEB("Invalid preview format: %s. Supported: %s", valstr,
    375                         mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
    376                     return BAD_VALUE;
    377                 }
    378             }
    379 
    380             if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
    381                 if (strcmp(mCameraProperties->get(CameraProperties::VNF_SUPPORTED),
    382                            android::CameraParameters::TRUE) == 0) {
    383                     CAMHAL_LOGDB("VNF %s", valstr);
    384                     mParameters.set(TICameraParameters::KEY_VNF, valstr);
    385                 } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
    386                     CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
    387                     return BAD_VALUE;
    388                 } else {
    389                     mParameters.set(TICameraParameters::KEY_VNF,
    390                                     android::CameraParameters::FALSE);
    391                 }
    392             }
    393 
    394             if ((valstr = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
    395                 // make sure we support vstab...if we don't and application is trying to set
    396                 // vstab then return an error
    397                 if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
    398                            android::CameraParameters::TRUE) == 0) {
    399                     CAMHAL_LOGDB("VSTAB %s", valstr);
    400                     mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, valstr);
    401                 } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
    402                     CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
    403                     return BAD_VALUE;
    404                 } else {
    405                     mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
    406                                     android::CameraParameters::FALSE);
    407                 }
    408             }
    409 
    410             if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) {
    411 
    412                     if (strcmp(TICameraParameters::VIDEO_MODE, valstr)) {
    413                         mCapModeBackup = valstr;
    414                     }
    415 
    416                     CAMHAL_LOGDB("Capture mode set %s", valstr);
    417 
    418                     const char *currentMode = mParameters.get(TICameraParameters::KEY_CAP_MODE);
    419                     if ( NULL != currentMode ) {
    420                         if ( strcmp(currentMode, valstr) != 0 ) {
    421                             updateRequired = true;
    422                         }
    423                     } else {
    424                         updateRequired = true;
    425                     }
    426 
    427                     mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
    428             } else if (!mCapModeBackup.isEmpty()) {
    429                 // Restore previous capture mode after stopPreview()
    430                 mParameters.set(TICameraParameters::KEY_CAP_MODE,
    431                                 mCapModeBackup.string());
    432                 updateRequired = true;
    433             }
    434 
    435 #ifdef OMAP_ENHANCEMENT_VTC
    436             if ((valstr = params.get(TICameraParameters::KEY_VTC_HINT)) != NULL ) {
    437                 mParameters.set(TICameraParameters::KEY_VTC_HINT, valstr);
    438                 if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
    439                     mVTCUseCase = true;
    440                 } else {
    441                     mVTCUseCase = false;
    442                 }
    443                 CAMHAL_LOGDB("VTC Hint = %d", mVTCUseCase);
    444             }
    445 
    446             if (mVTCUseCase) {
    447                 if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL ) {
    448                     mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE, valstr);
    449                 }
    450 
    451                 if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL ) {
    452                     mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT, valstr);
    453                 }
    454             }
    455 #endif
    456         }
    457 
    458         if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
    459             if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
    460                 if ((mParameters.get(TICameraParameters::KEY_IPP) == NULL) ||
    461                         (strcmp(valstr, mParameters.get(TICameraParameters::KEY_IPP)))) {
    462                     CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
    463                     mParameters.set(TICameraParameters::KEY_IPP, valstr);
    464                     restartPreviewRequired = true;
    465                 }
    466             } else {
    467                 CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
    468                 return BAD_VALUE;
    469             }
    470         }
    471 
    472         if ( (valstr = params.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL )
    473             {
    474             if (strcmp(valstr, mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)))
    475                 {
    476                 CAMHAL_LOGDB("Stereo 3D preview image layout is %s", valstr);
    477                 mParameters.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, valstr);
    478                 restartPreviewRequired = true;
    479                 }
    480             }
    481 
    482 #ifdef OMAP_ENHANCEMENT
    483         int orientation =0;
    484         if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
    485             {
    486             doesSetParameterNeedUpdate(valstr,
    487                                        mParameters.get(TICameraParameters::KEY_SENSOR_ORIENTATION),
    488                                        updateRequired);
    489 
    490             orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
    491             if ( orientation < 0 || orientation >= 360 || (orientation%90) != 0 ) {
    492                 CAMHAL_LOGE("Invalid sensor orientation: %s. Value must be one of: [0, 90, 180, 270]", valstr);
    493                 return BAD_VALUE;
    494             }
    495 
    496             CAMHAL_LOGD("Sensor Orientation is set to %d", orientation);
    497             mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
    498             }
    499 #endif
    500 
    501         params.getPreviewSize(&w, &h);
    502         if (w == -1 && h == -1) {
    503             CAMHAL_LOGEA("Unable to get preview size");
    504             return BAD_VALUE;
    505         }
    506 
    507         mVideoWidth = w;
    508         mVideoHeight = h;
    509 
    510         // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
    511         valstr = params.get(android::CameraParameters::KEY_RECORDING_HINT);
    512         if(valstr != NULL)
    513             {
    514             CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
    515             if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
    516                 {
    517                 CAMHAL_LOGVB("Video Resolution: %d x %d", mVideoWidth, mVideoHeight);
    518 #ifdef OMAP_ENHANCEMENT_VTC
    519                 if (!mVTCUseCase)
    520 #endif
    521                 {
    522                     int maxFPS, minFPS;
    523 
    524                     params.getPreviewFpsRange(&minFPS, &maxFPS);
    525                     maxFPS /= CameraHal::VFR_SCALE;
    526                     if ( ( maxFPS <= SW_SCALING_FPS_LIMIT ) ) {
    527                         getPreferredPreviewRes(&w, &h);
    528                     }
    529                 }
    530                 mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
    531                 restartPreviewRequired |= setVideoModeParameters(params);
    532                 }
    533             else if(strcmp(valstr, android::CameraParameters::FALSE) == 0)
    534                 {
    535                 mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr);
    536                 restartPreviewRequired |= resetVideoModeParameters();
    537                 }
    538             else
    539                 {
    540                 CAMHAL_LOGEA("Invalid RECORDING_HINT");
    541                 return BAD_VALUE;
    542                 }
    543             }
    544         else
    545             {
    546             // This check is required in following case.
    547             // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
    548             // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
    549             // then Video Mode parameters may remain present in ImageCapture activity as well.
    550             CAMHAL_LOGDA("Recording Hint is set to NULL");
    551             mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, "");
    552             restartPreviewRequired |= resetVideoModeParameters();
    553             }
    554 
    555         if ( (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
    556                 && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES)))
    557                 && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES)))
    558                 && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES))) ) {
    559             CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
    560             return BAD_VALUE;
    561         }
    562 
    563         int oldWidth, oldHeight;
    564         mParameters.getPreviewSize(&oldWidth, &oldHeight);
    565         if ( ( oldWidth != w ) || ( oldHeight != h ) )
    566             {
    567             mParameters.setPreviewSize(w, h);
    568             restartPreviewRequired = true;
    569             }
    570 
    571         CAMHAL_LOGDB("Preview Resolution: %d x %d", w, h);
    572 
    573         if ((valstr = params.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) {
    574             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
    575                 CAMHAL_LOGDB("Focus mode set %s", valstr);
    576 
    577                 // we need to take a decision on the capture mode based on whether CAF picture or
    578                 // video is chosen so the behavior of each is consistent to the application
    579                 if(strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
    580                     restartPreviewRequired |= resetVideoModeParameters();
    581                 } else if (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
    582                     restartPreviewRequired |= setVideoModeParameters(params);
    583                 }
    584 
    585                 mParameters.set(android::CameraParameters::KEY_FOCUS_MODE, valstr);
    586              } else {
    587                 CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
    588                 return BAD_VALUE;
    589              }
    590         }
    591 
    592         mRawCapture = false;
    593 
    594 #ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING
    595         valstr = params.get(TICameraParameters::KEY_CAP_MODE);
    596         if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) &&
    597                 access(kRawImagesOutputDirPath, F_OK) != -1 ) {
    598             mRawCapture = true;
    599         }
    600 #endif
    601 
    602         if ( (valstr = params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL )
    603             {
    604             CAMHAL_LOGDB("Stereo 3D capture image layout is %s", valstr);
    605             mParameters.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, valstr);
    606             }
    607 
    608         params.getPictureSize(&w, &h);
    609         if ( (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES)))
    610                 || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES)))
    611                 || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES)))
    612                 || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES))) ) {
    613             mParameters.setPictureSize(w, h);
    614         } else {
    615             CAMHAL_LOGEB("ERROR: Invalid picture resolution %d x %d", w, h);
    616             return BAD_VALUE;
    617         }
    618 
    619         CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
    620 
    621         if ( (valstr = params.getPictureFormat()) != NULL ) {
    622             if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
    623                 if ((strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) &&
    624                     mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH) &&
    625                     mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT)) {
    626                     unsigned int width = 0, height = 0;
    627                     // Set picture size to full frame for raw bayer capture
    628                     width = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH));
    629                     height = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT));
    630                     mParameters.setPictureSize(width,height);
    631                 }
    632                 mParameters.setPictureFormat(valstr);
    633             } else {
    634                 CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
    635                 ret = BAD_VALUE;
    636             }
    637         }
    638 
    639 #ifdef OMAP_ENHANCEMENT_BURST_CAPTURE
    640         if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
    641             if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
    642                 CAMHAL_LOGDB("Burst set %s", valstr);
    643                 mParameters.set(TICameraParameters::KEY_BURST, valstr);
    644             } else {
    645                 CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
    646                 return BAD_VALUE;
    647             }
    648         }
    649 #endif
    650 
    651         // Variable framerate ranges have higher priority over
    652         // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
    653         // be cleared by the client in order for constant FPS to get
    654         // applied.
    655         // If Port FPS needs to be used for configuring, then FPS RANGE should not be set by the APP.
    656         valstr = params.get(android::CameraParameters::KEY_PREVIEW_FPS_RANGE);
    657         if (valstr != NULL && strlen(valstr)) {
    658             int curMaxFPS = 0;
    659             int curMinFPS = 0;
    660 
    661             // APP wants to set FPS range
    662             // Set framerate = MAXFPS
    663             CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
    664 
    665             mParameters.getPreviewFpsRange(&curMinFPS, &curMaxFPS);
    666             CAMHAL_LOGDB("## current minFPS = %d; maxFPS=%d",curMinFPS, curMaxFPS);
    667 
    668             params.getPreviewFpsRange(&minFPS, &maxFPS);
    669             CAMHAL_LOGDB("## requested minFPS = %d; maxFPS=%d",minFPS, maxFPS);
    670             // Validate VFR
    671             if (!isFpsRangeValid(minFPS, maxFPS, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)) &&
    672                 !isFpsRangeValid(minFPS, maxFPS, params.get(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED))) {
    673                 CAMHAL_LOGEA("Invalid FPS Range");
    674                 return BAD_VALUE;
    675             } else {
    676                 framerate = maxFPS / CameraHal::VFR_SCALE;
    677                 mParameters.setPreviewFrameRate(framerate);
    678                 CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
    679                 mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
    680                 CAMHAL_LOGDB("FPS Range = %s", valstr);
    681                 if ( curMaxFPS == (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) &&
    682                      maxFPS < (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) ) {
    683                     restartPreviewRequired = true;
    684                 }
    685             }
    686         } else {
    687             framerate = params.getPreviewFrameRate();
    688             if (!isParameterValid(framerate, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)) &&
    689                 !isParameterValid(framerate, params.get(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED))) {
    690                 CAMHAL_LOGEA("Invalid frame rate");
    691                 return BAD_VALUE;
    692             }
    693             char tmpBuffer[MAX_PROP_VALUE_LENGTH];
    694 
    695             sprintf(tmpBuffer, "%d,%d", framerate * CameraHal::VFR_SCALE, framerate * CameraHal::VFR_SCALE);
    696             mParameters.setPreviewFrameRate(framerate);
    697             CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
    698             mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, tmpBuffer);
    699             CAMHAL_LOGDB("FPS Range = %s", tmpBuffer);
    700         }
    701 
    702         if ((valstr = params.get(TICameraParameters::KEY_GBCE)) != NULL) {
    703             if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GBCE),
    704                     android::CameraParameters::TRUE) == 0) {
    705                 CAMHAL_LOGDB("GBCE %s", valstr);
    706                 mParameters.set(TICameraParameters::KEY_GBCE, valstr);
    707             } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
    708                 CAMHAL_LOGEB("ERROR: Invalid GBCE: %s", valstr);
    709                 return BAD_VALUE;
    710             } else {
    711                 mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
    712             }
    713         } else {
    714             mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE);
    715         }
    716 
    717         if ((valstr = params.get(TICameraParameters::KEY_GLBCE)) != NULL) {
    718             if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE),
    719                     android::CameraParameters::TRUE) == 0) {
    720                 CAMHAL_LOGDB("GLBCE %s", valstr);
    721                 mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
    722             } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) {
    723                 CAMHAL_LOGEB("ERROR: Invalid GLBCE: %s", valstr);
    724                 return BAD_VALUE;
    725             } else {
    726                 mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
    727             }
    728         } else {
    729             mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE);
    730         }
    731 
    732 #ifdef OMAP_ENHANCEMENT_S3D
    733         ///Update the current parameter set
    734         if ( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE_MODE)) != NULL ) {
    735             CAMHAL_LOGDB("AutoConvergence mode set = %s", valstr);
    736             mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, valstr);
    737         }
    738 
    739         if ( (valstr = params.get(TICameraParameters::KEY_MANUAL_CONVERGENCE)) != NULL ) {
    740             int manualConvergence = (int)strtol(valstr, 0, 0);
    741 
    742             if ( ( manualConvergence < strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN), 0, 0) ) ||
    743                     ( manualConvergence > strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX), 0, 0) ) ) {
    744                 CAMHAL_LOGEB("ERROR: Invalid Manual Convergence = %d", manualConvergence);
    745                 return BAD_VALUE;
    746             } else {
    747                 CAMHAL_LOGDB("ManualConvergence Value = %d", manualConvergence);
    748                 mParameters.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, valstr);
    749             }
    750         }
    751 
    752         if((valstr = params.get(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION)) != NULL) {
    753             if ( strcmp(mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED),
    754                     android::CameraParameters::TRUE) == 0 ) {
    755                 CAMHAL_LOGDB("Mechanical Mialignment Correction is %s", valstr);
    756                 mParameters.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, valstr);
    757             } else {
    758                 mParameters.remove(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION);
    759             }
    760         }
    761 
    762         if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
    763             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
    764                 CAMHAL_LOGDB("Exposure mode set = %s", valstr);
    765                 mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
    766                 if (!strcmp(valstr, TICameraParameters::EXPOSURE_MODE_MANUAL)) {
    767                     int manualVal;
    768                     if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE)) != NULL) {
    769                         manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE);
    770                         if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
    771                                 manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
    772                             CAMHAL_LOGEB("ERROR: Manual Exposure = %s is out of range - "
    773                                             "setting minimum supported value", valstr);
    774                             valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
    775                         }
    776                         CAMHAL_LOGDB("Manual Exposure = %s", valstr);
    777                         mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE, valstr);
    778                     }
    779                     if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT)) != NULL) {
    780                         manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT);
    781                         if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) ||
    782                                 manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) {
    783                             CAMHAL_LOGEB("ERROR: Manual Exposure right = %s is out of range - "
    784                                             "setting minimum supported value", valstr);
    785                             valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN);
    786                         }
    787                         CAMHAL_LOGDB("Manual Exposure right = %s", valstr);
    788                         mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, valstr);
    789                     }
    790                     if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO)) != NULL) {
    791                         manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO);
    792                         if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
    793                                 manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
    794                             CAMHAL_LOGEB("ERROR: Manual Gain = %s is out of range - "
    795                                             "setting minimum supported value", valstr);
    796                             valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
    797                         }
    798                         CAMHAL_LOGDB("Manual Gain = %s", valstr);
    799                         mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, valstr);
    800                     }
    801                     if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT)) != NULL) {
    802                         manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT);
    803                         if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) ||
    804                                 manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) {
    805                             CAMHAL_LOGEB("ERROR: Manual Gain right = %s is out of range - "
    806                                             "setting minimum supported value", valstr);
    807                             valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN);
    808                         }
    809                         CAMHAL_LOGDB("Manual Gain right = %s", valstr);
    810                         mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, valstr);
    811                     }
    812                 }
    813             } else {
    814                 CAMHAL_LOGEB("ERROR: Invalid Exposure mode = %s", valstr);
    815                 return BAD_VALUE;
    816             }
    817         }
    818 #endif
    819 
    820         if ((valstr = params.get(android::CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
    821            if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
    822                CAMHAL_LOGDB("White balance set %s", valstr);
    823                mParameters.set(android::CameraParameters::KEY_WHITE_BALANCE, valstr);
    824             } else {
    825                CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
    826                return BAD_VALUE;
    827             }
    828         }
    829 
    830 #ifdef OMAP_ENHANCEMENT
    831         if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
    832             if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
    833                 CAMHAL_LOGDB("Contrast set %s", valstr);
    834                 mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
    835             } else {
    836                 CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
    837                 return BAD_VALUE;
    838             }
    839         }
    840 
    841         if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
    842             if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
    843                 CAMHAL_LOGDB("Sharpness set %s", valstr);
    844                 mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
    845             } else {
    846                 CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
    847                 return BAD_VALUE;
    848             }
    849         }
    850 
    851         if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
    852             if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
    853                 CAMHAL_LOGDB("Saturation set %s", valstr);
    854                 mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
    855              } else {
    856                 CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
    857                 return BAD_VALUE;
    858             }
    859         }
    860 
    861         if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
    862             if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
    863                 CAMHAL_LOGDB("Brightness set %s", valstr);
    864                 mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
    865             } else {
    866                 CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
    867                 return BAD_VALUE;
    868             }
    869          }
    870 #endif
    871 
    872         if ((valstr = params.get(android::CameraParameters::KEY_ANTIBANDING)) != NULL) {
    873             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
    874                 CAMHAL_LOGDB("Antibanding set %s", valstr);
    875                 mParameters.set(android::CameraParameters::KEY_ANTIBANDING, valstr);
    876              } else {
    877                 CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
    878                 return BAD_VALUE;
    879              }
    880          }
    881 
    882 #ifdef OMAP_ENHANCEMENT
    883         if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
    884             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
    885                 CAMHAL_LOGDB("ISO set %s", valstr);
    886                 mParameters.set(TICameraParameters::KEY_ISO, valstr);
    887             } else {
    888                 CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
    889                 return BAD_VALUE;
    890             }
    891         }
    892 #endif
    893 
    894         if( (valstr = params.get(android::CameraParameters::KEY_FOCUS_AREAS)) != NULL )
    895             {
    896             CAMHAL_LOGDB("Focus areas position set %s", params.get(android::CameraParameters::KEY_FOCUS_AREAS));
    897             mParameters.set(android::CameraParameters::KEY_FOCUS_AREAS, valstr);
    898             }
    899 
    900 #ifdef OMAP_ENHANCEMENT
    901         if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
    902             {
    903             CAMHAL_LOGDB("Measurements set to %s", valstr);
    904             mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
    905 
    906             if (strcmp(valstr, android::CameraParameters::TRUE) == 0)
    907                 {
    908                 mMeasurementEnabled = true;
    909                 }
    910             else if (strcmp(valstr, android::CameraParameters::FALSE) == 0)
    911                 {
    912                 mMeasurementEnabled = false;
    913                 }
    914             else
    915                 {
    916                 mMeasurementEnabled = false;
    917                 }
    918 
    919             }
    920 #endif
    921 
    922         if( (valstr = params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
    923             {
    924             CAMHAL_LOGDB("Exposure compensation set %s", params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION));
    925             mParameters.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
    926             }
    927 
    928         if ((valstr = params.get(android::CameraParameters::KEY_SCENE_MODE)) != NULL) {
    929             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
    930                 CAMHAL_LOGDB("Scene mode set %s", valstr);
    931                 doesSetParameterNeedUpdate(valstr,
    932                                            mParameters.get(android::CameraParameters::KEY_SCENE_MODE),
    933                                            updateRequired);
    934                 mParameters.set(android::CameraParameters::KEY_SCENE_MODE, valstr);
    935             } else {
    936                 CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
    937                 return BAD_VALUE;
    938             }
    939         }
    940 
    941         if ((valstr = params.get(android::CameraParameters::KEY_FLASH_MODE)) != NULL) {
    942             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
    943                 CAMHAL_LOGDB("Flash mode set %s", valstr);
    944                 mParameters.set(android::CameraParameters::KEY_FLASH_MODE, valstr);
    945             } else {
    946                 CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
    947                 return BAD_VALUE;
    948             }
    949         }
    950 
    951         if ((valstr = params.get(android::CameraParameters::KEY_EFFECT)) != NULL) {
    952             if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
    953                 CAMHAL_LOGDB("Effect set %s", valstr);
    954                 mParameters.set(android::CameraParameters::KEY_EFFECT, valstr);
    955              } else {
    956                 CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
    957                 return BAD_VALUE;
    958              }
    959         }
    960 
    961         varint = params.getInt(android::CameraParameters::KEY_ROTATION);
    962         if ( varint >= 0 ) {
    963             CAMHAL_LOGDB("Rotation set %d", varint);
    964             mParameters.set(android::CameraParameters::KEY_ROTATION, varint);
    965         }
    966 
    967         varint = params.getInt(android::CameraParameters::KEY_JPEG_QUALITY);
    968         if ( varint >= 0 ) {
    969             CAMHAL_LOGDB("Jpeg quality set %d", varint);
    970             mParameters.set(android::CameraParameters::KEY_JPEG_QUALITY, varint);
    971         }
    972 
    973         varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
    974         if ( varint >= 0 ) {
    975             CAMHAL_LOGDB("Thumbnail width set %d", varint);
    976             mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint);
    977         }
    978 
    979         varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
    980         if ( varint >= 0 ) {
    981             CAMHAL_LOGDB("Thumbnail width set %d", varint);
    982             mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint);
    983         }
    984 
    985         varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
    986         if ( varint >= 0 ) {
    987             CAMHAL_LOGDB("Thumbnail quality set %d", varint);
    988             mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint);
    989         }
    990 
    991         if( (valstr = params.get(android::CameraParameters::KEY_GPS_LATITUDE)) != NULL )
    992             {
    993             CAMHAL_LOGDB("GPS latitude set %s", params.get(android::CameraParameters::KEY_GPS_LATITUDE));
    994             mParameters.set(android::CameraParameters::KEY_GPS_LATITUDE, valstr);
    995             }else{
    996                 mParameters.remove(android::CameraParameters::KEY_GPS_LATITUDE);
    997             }
    998 
    999         if( (valstr = params.get(android::CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
   1000             {
   1001             CAMHAL_LOGDB("GPS longitude set %s", params.get(android::CameraParameters::KEY_GPS_LONGITUDE));
   1002             mParameters.set(android::CameraParameters::KEY_GPS_LONGITUDE, valstr);
   1003             }else{
   1004                 mParameters.remove(android::CameraParameters::KEY_GPS_LONGITUDE);
   1005             }
   1006 
   1007         if( (valstr = params.get(android::CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
   1008             {
   1009             CAMHAL_LOGDB("GPS altitude set %s", params.get(android::CameraParameters::KEY_GPS_ALTITUDE));
   1010             mParameters.set(android::CameraParameters::KEY_GPS_ALTITUDE, valstr);
   1011             }else{
   1012                 mParameters.remove(android::CameraParameters::KEY_GPS_ALTITUDE);
   1013             }
   1014 
   1015         if( (valstr = params.get(android::CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
   1016             {
   1017             CAMHAL_LOGDB("GPS timestamp set %s", params.get(android::CameraParameters::KEY_GPS_TIMESTAMP));
   1018             mParameters.set(android::CameraParameters::KEY_GPS_TIMESTAMP, valstr);
   1019             }else{
   1020                 mParameters.remove(android::CameraParameters::KEY_GPS_TIMESTAMP);
   1021             }
   1022 
   1023         if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
   1024             {
   1025             CAMHAL_LOGDB("GPS datestamp set %s", valstr);
   1026             mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
   1027             }else{
   1028                 mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
   1029             }
   1030 
   1031         if( (valstr = params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
   1032             {
   1033             CAMHAL_LOGDB("GPS processing method set %s", params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD));
   1034             mParameters.set(android::CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
   1035             }else{
   1036                 mParameters.remove(android::CameraParameters::KEY_GPS_PROCESSING_METHOD);
   1037             }
   1038 
   1039         if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
   1040             {
   1041             CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
   1042             mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
   1043             }else{
   1044                 mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
   1045             }
   1046 
   1047         if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
   1048             {
   1049             CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
   1050             mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
   1051             }else{
   1052                 mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
   1053             }
   1054 
   1055         if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
   1056             {
   1057             CAMHAL_LOGDB("EXIF Model set %s", valstr);
   1058             mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
   1059             }
   1060 
   1061         if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
   1062             {
   1063             CAMHAL_LOGDB("EXIF Make set %s", valstr);
   1064             mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
   1065             }
   1066 
   1067 #ifdef OMAP_ENHANCEMENT
   1068         if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
   1069             {
   1070             CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
   1071             mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
   1072             mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
   1073             }
   1074         else if ((valstr = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) {
   1075             CAMHAL_LOGDB("ABS Exposure+Gain Bracketing set %s", params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE));
   1076             mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valstr);
   1077             mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
   1078         } else
   1079             {
   1080             mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
   1081             }
   1082 
   1083         if( (valstr = params.get(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE)) != NULL ) {
   1084             CAMHAL_LOGDB("Zoom Bracketing range %s", valstr);
   1085             mParameters.set(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE, valstr);
   1086         } else {
   1087             mParameters.remove(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE);
   1088         }
   1089 #endif
   1090 
   1091         if ((valstr = params.get(android::CameraParameters::KEY_ZOOM)) != NULL ) {
   1092             varint = atoi(valstr);
   1093             if ( varint >= 0 && varint <= mMaxZoomSupported ) {
   1094                 CAMHAL_LOGDB("Zoom set %d", varint);
   1095                 doesSetParameterNeedUpdate(valstr,
   1096                                            mParameters.get(android::CameraParameters::KEY_ZOOM),
   1097                                            updateRequired);
   1098                 mParameters.set(android::CameraParameters::KEY_ZOOM, valstr);
   1099              } else {
   1100                 CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
   1101                 return BAD_VALUE;
   1102             }
   1103         }
   1104 
   1105         if( (valstr = params.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
   1106           {
   1107             CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr);
   1108             doesSetParameterNeedUpdate(valstr,
   1109                                        mParameters.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
   1110                                        updateRequired);
   1111             mParameters.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
   1112           }
   1113 
   1114         if( (valstr = params.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
   1115           {
   1116             CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr);
   1117             doesSetParameterNeedUpdate(valstr,
   1118                                        mParameters.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
   1119                                        updateRequired);
   1120             mParameters.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
   1121           }
   1122         if( (valstr = params.get(android::CameraParameters::KEY_METERING_AREAS)) != NULL )
   1123             {
   1124             CAMHAL_LOGDB("Metering areas position set %s", params.get(android::CameraParameters::KEY_METERING_AREAS));
   1125             mParameters.set(android::CameraParameters::KEY_METERING_AREAS, valstr);
   1126             }
   1127 
   1128         if( (valstr = params.get(TICameraParameters::RAW_WIDTH)) != NULL ) {
   1129             CAMHAL_LOGDB("Raw image width set %s", params.get(TICameraParameters::RAW_WIDTH));
   1130             mParameters.set(TICameraParameters::RAW_WIDTH, valstr);
   1131         }
   1132 
   1133         if( (valstr = params.get(TICameraParameters::RAW_HEIGHT)) != NULL ) {
   1134             CAMHAL_LOGDB("Raw image height set %s", params.get(TICameraParameters::RAW_HEIGHT));
   1135             mParameters.set(TICameraParameters::RAW_HEIGHT, valstr);
   1136         }
   1137 
   1138         //TI extensions for enable/disable algos
   1139         if( (valstr = params.get(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA)) != NULL )
   1140             {
   1141             CAMHAL_LOGDB("External Gamma set %s", valstr);
   1142             mParameters.set(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA, valstr);
   1143             }
   1144 
   1145         if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF1)) != NULL )
   1146             {
   1147             CAMHAL_LOGDB("NSF1 set %s", valstr);
   1148             mParameters.set(TICameraParameters::KEY_ALGO_NSF1, valstr);
   1149             }
   1150 
   1151         if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF2)) != NULL )
   1152             {
   1153             CAMHAL_LOGDB("NSF2 set %s", valstr);
   1154             mParameters.set(TICameraParameters::KEY_ALGO_NSF2, valstr);
   1155             }
   1156 
   1157         if( (valstr = params.get(TICameraParameters::KEY_ALGO_SHARPENING)) != NULL )
   1158             {
   1159             CAMHAL_LOGDB("Sharpening set %s", valstr);
   1160             mParameters.set(TICameraParameters::KEY_ALGO_SHARPENING, valstr);
   1161             }
   1162 
   1163         if( (valstr = params.get(TICameraParameters::KEY_ALGO_THREELINCOLORMAP)) != NULL )
   1164             {
   1165             CAMHAL_LOGDB("Color Conversion set %s", valstr);
   1166             mParameters.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, valstr);
   1167             }
   1168 
   1169         if( (valstr = params.get(TICameraParameters::KEY_ALGO_GIC)) != NULL )
   1170             {
   1171             CAMHAL_LOGDB("Green Inballance Correction set %s", valstr);
   1172             mParameters.set(TICameraParameters::KEY_ALGO_GIC, valstr);
   1173             }
   1174 
   1175         if( (valstr = params.get(TICameraParameters::KEY_GAMMA_TABLE)) != NULL )
   1176             {
   1177             CAMHAL_LOGDB("Manual gamma table set %s", valstr);
   1178             mParameters.set(TICameraParameters::KEY_GAMMA_TABLE, valstr);
   1179             }
   1180 
   1181         android::CameraParameters adapterParams = mParameters;
   1182 
   1183 #ifdef OMAP_ENHANCEMENT
   1184         if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
   1185             {
   1186             int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
   1187             if ( 0 < posBracketRange )
   1188                 {
   1189                 mBracketRangePositive = posBracketRange;
   1190                 }
   1191             }
   1192         CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
   1193 
   1194 
   1195         if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
   1196             {
   1197             int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
   1198             if ( 0 < negBracketRange )
   1199                 {
   1200                 mBracketRangeNegative = negBracketRange;
   1201                 }
   1202             }
   1203         CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
   1204 
   1205         if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
   1206             ( strcmp(valstr, android::CameraParameters::TRUE) == 0 )) {
   1207             if ( !mBracketingEnabled ) {
   1208                 CAMHAL_LOGDA("Enabling bracketing");
   1209                 mBracketingEnabled = true;
   1210             } else {
   1211                 CAMHAL_LOGDA("Bracketing already enabled");
   1212             }
   1213             adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
   1214             mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
   1215         } else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
   1216             ( strcmp(valstr, android::CameraParameters::FALSE) == 0 )) {
   1217             CAMHAL_LOGDA("Disabling bracketing");
   1218 
   1219             adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
   1220             mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr);
   1221             mBracketingEnabled = false;
   1222             if ( mBracketingRunning ) {
   1223                 stopImageBracketing();
   1224             }
   1225 
   1226         } else {
   1227             adapterParams.remove(TICameraParameters::KEY_TEMP_BRACKETING);
   1228             mParameters.remove(TICameraParameters::KEY_TEMP_BRACKETING);
   1229         }
   1230 #endif
   1231 
   1232 #ifdef OMAP_ENHANCEMENT_VTC
   1233         if (mVTCUseCase && !mTunnelSetup && (mCameraAdapter != NULL) &&
   1234                 ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL )&&
   1235                 ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL )) {
   1236 
   1237             uint32_t sliceHeight = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT);
   1238             uint32_t encoderHandle = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE);
   1239             int w, h;
   1240             mParameters.getPreviewSize(&w, &h);
   1241             status_t done = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SETUP_TUNNEL, sliceHeight, encoderHandle, w, h);
   1242             if (done == NO_ERROR) mTunnelSetup = true;
   1243             ret |= done;
   1244         }
   1245 #endif
   1246 
   1247         // Only send parameters to adapter if preview is already
   1248         // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
   1249         // will be called in startPreview()
   1250         // TODO(XXX): Need to identify other parameters that need update from camera adapter
   1251         if ( (NULL != mCameraAdapter) &&
   1252              (mPreviewEnabled || updateRequired) &&
   1253              (!(mPreviewEnabled && restartPreviewRequired)) ) {
   1254             ret |= mCameraAdapter->setParameters(adapterParams);
   1255         }
   1256 
   1257 #ifdef OMAP_ENHANCEMENT
   1258         if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
   1259             ( strcmp(valstr, android::CameraParameters::TRUE) == 0 ))
   1260             {
   1261             CAMHAL_LOGDA("Enabling shutter sound");
   1262 
   1263             mShutterEnabled = true;
   1264             mMsgEnabled |= CAMERA_MSG_SHUTTER;
   1265             mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
   1266             }
   1267         else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
   1268             ( strcmp(valstr, android::CameraParameters::FALSE) == 0 ))
   1269             {
   1270             CAMHAL_LOGDA("Disabling shutter sound");
   1271 
   1272             mShutterEnabled = false;
   1273             mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
   1274             mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
   1275             }
   1276 #endif
   1277     }
   1278 
   1279     //On fail restore old parameters
   1280     if ( NO_ERROR != ret ) {
   1281         mParameters = oldParams;
   1282     }
   1283 
   1284     // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
   1285     // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
   1286     if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
   1287         CAMHAL_LOGDA("Restarting Preview");
   1288         ret = restartPreview();
   1289     } else if (restartPreviewRequired && !previewEnabled() &&
   1290                 mDisplayPaused && !mRecordingEnabled) {
   1291         CAMHAL_LOGDA("Restarting preview in paused mode");
   1292         ret = restartPreview();
   1293 
   1294         // TODO(XXX): If there is some delay between the restartPreview call and the code
   1295         // below, then the user could see some preview frames and callbacks. Let's find
   1296         // a better place to put this later...
   1297         if (ret == NO_ERROR) {
   1298             mDisplayPaused = true;
   1299             mPreviewEnabled = false;
   1300             ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
   1301         }
   1302     }
   1303 
   1304     if ( !mBracketingRunning && mBracketingEnabled ) {
   1305         startImageBracketing();
   1306     }
   1307 
   1308     if (ret != NO_ERROR)
   1309         {
   1310         CAMHAL_LOGEA("Failed to restart Preview");
   1311         return ret;
   1312         }
   1313 
   1314     LOG_FUNCTION_NAME_EXIT;
   1315 
   1316     return ret;
   1317 }
   1318 
   1319 status_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
   1320                                         unsigned int buffercount, unsigned int &max_queueable)
   1321 {
   1322     status_t ret = NO_ERROR;
   1323 
   1324     LOG_FUNCTION_NAME;
   1325 
   1326     if(mDisplayAdapter.get() == NULL)
   1327     {
   1328         // Memory allocation of preview buffers is now placed in gralloc
   1329         // CameraHal should not allocate preview buffers without DisplayAdapter
   1330         return NO_MEMORY;
   1331     }
   1332 
   1333     if(!mPreviewBuffers)
   1334     {
   1335         mPreviewLength = 0;
   1336         mPreviewBuffers = mDisplayAdapter->allocateBufferList(width, height,
   1337                                                                     previewFormat,
   1338                                                                     mPreviewLength,
   1339                                                                     buffercount);
   1340         if (NULL == mPreviewBuffers ) {
   1341             CAMHAL_LOGEA("Couldn't allocate preview buffers");
   1342             return NO_MEMORY;
   1343         }
   1344 
   1345         mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
   1346         if ( NULL == mPreviewOffsets ) {
   1347             CAMHAL_LOGEA("Buffer mapping failed");
   1348             return BAD_VALUE;
   1349         }
   1350 
   1351         mBufProvider = (BufferProvider*) mDisplayAdapter.get();
   1352 
   1353         ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
   1354         if (ret != NO_ERROR) {
   1355             return ret;
   1356         }
   1357     }
   1358 
   1359     LOG_FUNCTION_NAME_EXIT;
   1360 
   1361     return ret;
   1362 }
   1363 
   1364 status_t CameraHal::freePreviewBufs()
   1365 {
   1366     status_t ret = NO_ERROR;
   1367     LOG_FUNCTION_NAME;
   1368 
   1369     CAMHAL_LOGDB("mPreviewBuffers = %p", mPreviewBuffers);
   1370     if(mPreviewBuffers)
   1371         {
   1372         ret = mBufProvider->freeBufferList(mPreviewBuffers);
   1373         mPreviewBuffers = NULL;
   1374         LOG_FUNCTION_NAME_EXIT;
   1375         return ret;
   1376         }
   1377     LOG_FUNCTION_NAME_EXIT;
   1378     return ret;
   1379 }
   1380 
   1381 
   1382 status_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
   1383 {
   1384     status_t ret = NO_ERROR;
   1385     int bytes;
   1386 
   1387     LOG_FUNCTION_NAME;
   1388 
   1389     bytes = size;
   1390 
   1391     if ( NO_ERROR == ret )
   1392         {
   1393         if( NULL != mPreviewDataBuffers )
   1394             {
   1395             ret = freePreviewDataBufs();
   1396             }
   1397         }
   1398 
   1399     if ( NO_ERROR == ret )
   1400         {
   1401         bytes = ((bytes+4095)/4096)*4096;
   1402         mPreviewDataBuffers = mMemoryManager->allocateBufferList(0, 0, NULL, bytes, bufferCount);
   1403 
   1404         CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
   1405         if( NULL == mPreviewDataBuffers )
   1406             {
   1407             CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
   1408             ret = -NO_MEMORY;
   1409             }
   1410         else
   1411             {
   1412             bytes = size;
   1413             }
   1414         }
   1415 
   1416     if ( NO_ERROR == ret )
   1417         {
   1418         mPreviewDataFd = mMemoryManager->getFd();
   1419         mPreviewDataLength = bytes;
   1420         mPreviewDataOffsets = mMemoryManager->getOffsets();
   1421         }
   1422     else
   1423         {
   1424         mPreviewDataFd = -1;
   1425         mPreviewDataLength = 0;
   1426         mPreviewDataOffsets = NULL;
   1427         }
   1428 
   1429     LOG_FUNCTION_NAME_EXIT;
   1430 
   1431     return ret;
   1432 }
   1433 
   1434 status_t CameraHal::freePreviewDataBufs()
   1435 {
   1436     status_t ret = NO_ERROR;
   1437 
   1438     LOG_FUNCTION_NAME;
   1439 
   1440     if ( NO_ERROR == ret )
   1441         {
   1442 
   1443         if( NULL != mPreviewDataBuffers )
   1444             {
   1445 
   1446             ret = mMemoryManager->freeBufferList(mPreviewDataBuffers);
   1447             mPreviewDataBuffers = NULL;
   1448 
   1449             }
   1450         }
   1451 
   1452     LOG_FUNCTION_NAME_EXIT;
   1453 
   1454     return ret;
   1455 }
   1456 
   1457 status_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size,
   1458                                    const char* previewFormat, unsigned int bufferCount)
   1459 {
   1460     status_t ret = NO_ERROR;
   1461     int bytes = size;
   1462 
   1463     LOG_FUNCTION_NAME;
   1464 
   1465     // allocate image buffers only if not already allocated
   1466     if(NULL != mImageBuffers) {
   1467         return NO_ERROR;
   1468     }
   1469 
   1470     if ( NO_ERROR == ret ) {
   1471         bytes = ((bytes+4095)/4096)*4096;
   1472         mImageBuffers = mMemoryManager->allocateBufferList(0, 0, previewFormat, bytes, bufferCount);
   1473         CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
   1474         if( NULL == mImageBuffers ) {
   1475             CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
   1476             ret = -NO_MEMORY;
   1477         } else {
   1478             bytes = size;
   1479         }
   1480     }
   1481 
   1482     if ( NO_ERROR == ret ) {
   1483         mImageFd = mMemoryManager->getFd();
   1484         mImageLength = bytes;
   1485         mImageOffsets = mMemoryManager->getOffsets();
   1486         mImageCount = bufferCount;
   1487     } else {
   1488         mImageFd = -1;
   1489         mImageLength = 0;
   1490         mImageOffsets = NULL;
   1491         mImageCount = 0;
   1492     }
   1493 
   1494     LOG_FUNCTION_NAME_EXIT;
   1495 
   1496     return ret;
   1497 }
   1498 
   1499 status_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
   1500 {
   1501   status_t ret = NO_ERROR;
   1502   LOG_FUNCTION_NAME;
   1503 
   1504   if( NULL != mVideoBuffers ){
   1505     ret = freeVideoBufs(mVideoBuffers);
   1506     mVideoBuffers = NULL;
   1507   }
   1508 
   1509   if ( NO_ERROR == ret ){
   1510     int32_t stride;
   1511     CameraBuffer *buffers = new CameraBuffer [bufferCount];
   1512 
   1513     memset (buffers, 0, sizeof(CameraBuffer) * bufferCount);
   1514 
   1515     if (buffers != NULL){
   1516       for (unsigned int i = 0; i< bufferCount; i++){
   1517         android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
   1518         buffer_handle_t handle;
   1519         ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &handle, &stride);
   1520         if (ret != NO_ERROR){
   1521           CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
   1522           ret = -NO_MEMORY;
   1523           for (unsigned int j=0; j< i; j++){
   1524             CAMHAL_LOGEB("Freeing Gralloc Buffer %p", buffers[i].opaque);
   1525             GrallocAlloc.free((buffer_handle_t)buffers[i].opaque);
   1526           }
   1527           delete [] buffers;
   1528           goto exit;
   1529         }
   1530         buffers[i].type = CAMERA_BUFFER_GRALLOC;
   1531         buffers[i].opaque = (void *)handle;
   1532         CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", handle);
   1533       }
   1534 
   1535       mVideoBuffers = buffers;
   1536     }
   1537     else{
   1538       CAMHAL_LOGEA("Couldn't allocate video buffers ");
   1539       ret = -NO_MEMORY;
   1540     }
   1541   }
   1542 
   1543  exit:
   1544   LOG_FUNCTION_NAME_EXIT;
   1545 
   1546   return ret;
   1547 }
   1548 
   1549 status_t CameraHal::allocRawBufs(int width, int height, const char* previewFormat, int bufferCount)
   1550 {
   1551    status_t ret = NO_ERROR;
   1552 
   1553     LOG_FUNCTION_NAME
   1554 
   1555 
   1556     ///@todo Enhance this method allocImageBufs() to take in a flag for burst capture
   1557     ///Always allocate the buffers for image capture using MemoryManager
   1558     if (NO_ERROR == ret) {
   1559         if(( NULL != mVideoBuffers )) {
   1560             // Re-use the buffer for raw capture.
   1561             return ret;
   1562         }
   1563     }
   1564 
   1565     if ( NO_ERROR == ret ) {
   1566         mVideoLength = 0;
   1567         mVideoLength = (((width * height * 2) + 4095)/4096)*4096;
   1568         mVideoBuffers = mMemoryManager->allocateBufferList(width, height, previewFormat,
   1569                                                            mVideoLength, bufferCount);
   1570 
   1571         CAMHAL_LOGDB("Size of Video cap buffer (used for RAW capture) %d", mVideoLength);
   1572         if( NULL == mVideoBuffers ) {
   1573             CAMHAL_LOGEA("Couldn't allocate Video buffers using memory manager");
   1574             ret = -NO_MEMORY;
   1575         }
   1576     }
   1577 
   1578     if ( NO_ERROR == ret ) {
   1579         mVideoFd = mMemoryManager->getFd();
   1580         mVideoOffsets = mMemoryManager->getOffsets();
   1581     } else {
   1582         mVideoFd = -1;
   1583         mVideoOffsets = NULL;
   1584     }
   1585 
   1586     LOG_FUNCTION_NAME_EXIT;
   1587 
   1588     return ret;
   1589 }
   1590 
   1591 void endImageCapture( void *userData)
   1592 {
   1593     LOG_FUNCTION_NAME;
   1594 
   1595     if ( NULL != userData )
   1596         {
   1597         CameraHal *c = reinterpret_cast<CameraHal *>(userData);
   1598         c->signalEndImageCapture();
   1599         }
   1600 
   1601     LOG_FUNCTION_NAME_EXIT;
   1602 }
   1603 
   1604 void releaseImageBuffers(void *userData)
   1605 {
   1606     LOG_FUNCTION_NAME;
   1607 
   1608     if (NULL != userData) {
   1609         CameraHal *c = reinterpret_cast<CameraHal *>(userData);
   1610         c->freeImageBufs();
   1611     }
   1612 
   1613     LOG_FUNCTION_NAME_EXIT;
   1614 }
   1615 
   1616 status_t CameraHal::signalEndImageCapture()
   1617 {
   1618     status_t ret = NO_ERROR;
   1619     int w,h;
   1620     android::AutoMutex lock(mLock);
   1621 
   1622     LOG_FUNCTION_NAME;
   1623 
   1624     if (mBufferSourceAdapter_Out.get()) {
   1625         mBufferSourceAdapter_Out->disableDisplay();
   1626     }
   1627 
   1628     if (mBufferSourceAdapter_In.get()) {
   1629         mBufferSourceAdapter_In->disableDisplay();
   1630     }
   1631 
   1632     if ( mBracketingRunning ) {
   1633         stopImageBracketing();
   1634     } else {
   1635         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
   1636     }
   1637 
   1638     LOG_FUNCTION_NAME_EXIT;
   1639 
   1640     return ret;
   1641 }
   1642 
   1643 status_t CameraHal::freeImageBufs()
   1644 {
   1645     status_t ret = NO_ERROR;
   1646 
   1647     LOG_FUNCTION_NAME;
   1648 
   1649     if (NULL == mImageBuffers) {
   1650         return -EINVAL;
   1651     }
   1652 
   1653     if (mBufferSourceAdapter_Out.get()) {
   1654         mBufferSourceAdapter_Out = 0;
   1655     } else {
   1656         ret = mMemoryManager->freeBufferList(mImageBuffers);
   1657     }
   1658 
   1659     mImageBuffers = NULL;
   1660 
   1661     LOG_FUNCTION_NAME_EXIT;
   1662 
   1663     return ret;
   1664 }
   1665 
   1666 status_t CameraHal::freeVideoBufs(CameraBuffer *bufs)
   1667 {
   1668   status_t ret = NO_ERROR;
   1669 
   1670   LOG_FUNCTION_NAME;
   1671 
   1672   int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
   1673   if(bufs == NULL)
   1674     {
   1675       CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
   1676       LOG_FUNCTION_NAME_EXIT;
   1677       return BAD_VALUE;
   1678     }
   1679 
   1680   android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get();
   1681 
   1682   for(int i = 0; i < count; i++){
   1683     CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", bufs[i].opaque);
   1684     GrallocAlloc.free((buffer_handle_t)bufs[i].opaque);
   1685   }
   1686 
   1687   LOG_FUNCTION_NAME_EXIT;
   1688 
   1689   return ret;
   1690 }
   1691 
   1692 status_t CameraHal::freeRawBufs()
   1693 {
   1694     status_t ret = NO_ERROR;
   1695 
   1696     LOG_FUNCTION_NAME
   1697 
   1698     if ( NO_ERROR == ret ) {
   1699         if( NULL != mVideoBuffers ) {
   1700             ///@todo Pluralise the name of this method to freeBuffers
   1701             ret = mMemoryManager->freeBufferList(mVideoBuffers);
   1702             mVideoBuffers = NULL;
   1703         } else {
   1704             ret = -EINVAL;
   1705         }
   1706     }
   1707 
   1708     LOG_FUNCTION_NAME_EXIT
   1709 
   1710     return ret;
   1711 }
   1712 
   1713 /**
   1714    @brief Start preview mode.
   1715 
   1716    @param none
   1717    @return NO_ERROR Camera switched to VF mode
   1718    @todo Update function header with the different errors that are possible
   1719 
   1720  */
   1721 status_t CameraHal::startPreview() {
   1722     LOG_FUNCTION_NAME;
   1723 
   1724     // When tunneling is enabled during VTC, startPreview happens in 2 steps:
   1725     // When the application sends the command CAMERA_CMD_PREVIEW_INITIALIZATION,
   1726     // cameraPreviewInitialization() is called, which in turn causes the CameraAdapter
   1727     // to move from loaded to idle state. And when the application calls startPreview,
   1728     // the CameraAdapter moves from idle to executing state.
   1729     //
   1730     // If the application calls startPreview() without sending the command
   1731     // CAMERA_CMD_PREVIEW_INITIALIZATION, then the function cameraPreviewInitialization()
   1732     // AND startPreview() are executed. In other words, if the application calls
   1733     // startPreview() without sending the command CAMERA_CMD_PREVIEW_INITIALIZATION,
   1734     // then the CameraAdapter moves from loaded to idle to executing state in one shot.
   1735     status_t ret = cameraPreviewInitialization();
   1736 
   1737     // The flag mPreviewInitializationDone is set to true at the end of the function
   1738     // cameraPreviewInitialization(). Therefore, if everything goes alright, then the
   1739     // flag will be set. Sometimes, the function cameraPreviewInitialization() may
   1740     // return prematurely if all the resources are not available for starting preview.
   1741     // For example, if the preview window is not set, then it would return NO_ERROR.
   1742     // Under such circumstances, one should return from startPreview as well and should
   1743     // not continue execution. That is why, we check the flag and not the return value.
   1744     if (!mPreviewInitializationDone) return ret;
   1745 
   1746     // Once startPreview is called, there is no need to continue to remember whether
   1747     // the function cameraPreviewInitialization() was called earlier or not. And so
   1748     // the flag mPreviewInitializationDone is reset here. Plus, this preserves the
   1749     // current behavior of startPreview under the circumstances where the application
   1750     // calls startPreview twice or more.
   1751     mPreviewInitializationDone = false;
   1752 
   1753     ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
   1754     if(mDisplayAdapter.get() != NULL) {
   1755         CAMHAL_LOGDA("Enabling display");
   1756         int width, height;
   1757         mParameters.getPreviewSize(&width, &height);
   1758 
   1759 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1760         ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview);
   1761 #else
   1762         ret = mDisplayAdapter->enableDisplay(width, height, NULL);
   1763 #endif
   1764 
   1765         if ( ret != NO_ERROR ) {
   1766             CAMHAL_LOGEA("Couldn't enable display");
   1767 
   1768             // FIXME: At this stage mStateSwitchLock is locked and unlock is supposed to be called
   1769             //        only from mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW)
   1770             //        below. But this will never happen because of goto error. Thus at next
   1771             //        startPreview() call CameraHAL will be deadlocked.
   1772             //        Need to revisit mStateSwitch lock, for now just abort the process.
   1773             CAMHAL_ASSERT_X(false,
   1774                 "At this stage mCameraAdapter->mStateSwitchLock is still locked, "
   1775                 "deadlock is guaranteed");
   1776 
   1777             goto error;
   1778         }
   1779 
   1780     }
   1781 
   1782     ///Send START_PREVIEW command to adapter
   1783     CAMHAL_LOGDA("Starting CameraAdapter preview mode");
   1784 
   1785     ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
   1786 
   1787     if(ret!=NO_ERROR) {
   1788         CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
   1789         goto error;
   1790     }
   1791     CAMHAL_LOGDA("Started preview");
   1792 
   1793     mPreviewEnabled = true;
   1794     mPreviewStartInProgress = false;
   1795     return ret;
   1796 
   1797     error:
   1798 
   1799         CAMHAL_LOGEA("Performing cleanup after error");
   1800 
   1801         //Do all the cleanup
   1802         freePreviewBufs();
   1803         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
   1804         if(mDisplayAdapter.get() != NULL) {
   1805             mDisplayAdapter->disableDisplay(false);
   1806         }
   1807         mAppCallbackNotifier->stop();
   1808         mPreviewStartInProgress = false;
   1809         mPreviewEnabled = false;
   1810         LOG_FUNCTION_NAME_EXIT;
   1811 
   1812         return ret;
   1813 }
   1814 
   1815 ////////////
   1816 /**
   1817    @brief Set preview mode related initialization
   1818           -> Camera Adapter set params
   1819           -> Allocate buffers
   1820           -> Set use buffers for preview
   1821    @param none
   1822    @return NO_ERROR
   1823    @todo Update function header with the different errors that are possible
   1824 
   1825  */
   1826 status_t CameraHal::cameraPreviewInitialization()
   1827 {
   1828 
   1829     status_t ret = NO_ERROR;
   1830     CameraAdapter::BuffersDescriptor desc;
   1831     CameraFrame frame;
   1832     unsigned int required_buffer_count;
   1833     unsigned int max_queueble_buffers;
   1834 
   1835 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1836         gettimeofday(&mStartPreview, NULL);
   1837 #endif
   1838 
   1839     LOG_FUNCTION_NAME;
   1840 
   1841     if (mPreviewInitializationDone) {
   1842         return NO_ERROR;
   1843     }
   1844 
   1845     if ( mPreviewEnabled ){
   1846       CAMHAL_LOGDA("Preview already running");
   1847       LOG_FUNCTION_NAME_EXIT;
   1848       return ALREADY_EXISTS;
   1849     }
   1850 
   1851     if ( NULL != mCameraAdapter ) {
   1852       ret = mCameraAdapter->setParameters(mParameters);
   1853     }
   1854 
   1855     if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
   1856       ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
   1857       if ( NO_ERROR != ret ){
   1858         CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
   1859         return ret;
   1860       }
   1861 
   1862       ///Update the current preview width and height
   1863       mPreviewWidth = frame.mWidth;
   1864       mPreviewHeight = frame.mHeight;
   1865     }
   1866 
   1867     ///If we don't have the preview callback enabled and display adapter,
   1868     if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
   1869       CAMHAL_LOGD("Preview not started. Preview in progress flag set");
   1870       mPreviewStartInProgress = true;
   1871       ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
   1872       if ( NO_ERROR != ret ){
   1873         CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
   1874         return ret;
   1875       }
   1876       return NO_ERROR;
   1877     }
   1878 
   1879     if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
   1880         {
   1881         CAMHAL_LOGDA("Preview is in paused state");
   1882 
   1883         mDisplayPaused = false;
   1884         mPreviewEnabled = true;
   1885         if ( NO_ERROR == ret )
   1886             {
   1887             ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
   1888 
   1889             if ( NO_ERROR != ret )
   1890                 {
   1891                 CAMHAL_LOGEB("Display adapter resume failed %x", ret);
   1892                 }
   1893             }
   1894         //restart preview callbacks
   1895         if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
   1896         {
   1897             mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
   1898         }
   1899 
   1900         signalEndImageCapture();
   1901         return ret;
   1902         }
   1903 
   1904     required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
   1905 
   1906     ///Allocate the preview buffers
   1907     ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
   1908 
   1909     if ( NO_ERROR != ret )
   1910         {
   1911         CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
   1912         goto error;
   1913         }
   1914 
   1915     if ( mMeasurementEnabled )
   1916         {
   1917 
   1918         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
   1919                                           ( int ) &frame,
   1920                                           required_buffer_count);
   1921         if ( NO_ERROR != ret )
   1922             {
   1923             return ret;
   1924             }
   1925 
   1926          ///Allocate the preview data buffers
   1927         ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
   1928         if ( NO_ERROR != ret ) {
   1929             CAMHAL_LOGEA("Couldn't allocate preview data buffers");
   1930             goto error;
   1931            }
   1932 
   1933         if ( NO_ERROR == ret )
   1934             {
   1935             desc.mBuffers = mPreviewDataBuffers;
   1936             desc.mOffsets = mPreviewDataOffsets;
   1937             desc.mFd = mPreviewDataFd;
   1938             desc.mLength = mPreviewDataLength;
   1939             desc.mCount = ( size_t ) required_buffer_count;
   1940             desc.mMaxQueueable = (size_t) required_buffer_count;
   1941 
   1942             mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
   1943                                         ( int ) &desc);
   1944             }
   1945 
   1946         }
   1947 
   1948     ///Pass the buffers to Camera Adapter
   1949     desc.mBuffers = mPreviewBuffers;
   1950     desc.mOffsets = mPreviewOffsets;
   1951     desc.mFd = mPreviewFd;
   1952     desc.mLength = mPreviewLength;
   1953     desc.mCount = ( size_t ) required_buffer_count;
   1954     desc.mMaxQueueable = (size_t) max_queueble_buffers;
   1955 
   1956     ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
   1957                                       ( int ) &desc);
   1958 
   1959     if ( NO_ERROR != ret )
   1960         {
   1961         CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
   1962         freePreviewBufs();
   1963         return ret;
   1964         }
   1965 
   1966     ///Start the callback notifier
   1967     ret = mAppCallbackNotifier->start();
   1968 
   1969     if( ALREADY_EXISTS == ret )
   1970         {
   1971         //Already running, do nothing
   1972         CAMHAL_LOGDA("AppCallbackNotifier already running");
   1973         ret = NO_ERROR;
   1974         }
   1975     else if ( NO_ERROR == ret ) {
   1976         CAMHAL_LOGDA("Started AppCallbackNotifier..");
   1977         mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
   1978         }
   1979     else
   1980         {
   1981         CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
   1982         goto error;
   1983         }
   1984 
   1985     if (ret == NO_ERROR) mPreviewInitializationDone = true;
   1986 
   1987     mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
   1988 
   1989     return ret;
   1990 
   1991     error:
   1992 
   1993         CAMHAL_LOGEA("Performing cleanup after error");
   1994 
   1995         //Do all the cleanup
   1996         freePreviewBufs();
   1997         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
   1998         if(mDisplayAdapter.get() != NULL)
   1999             {
   2000             mDisplayAdapter->disableDisplay(false);
   2001             }
   2002         mAppCallbackNotifier->stop();
   2003         mPreviewStartInProgress = false;
   2004         mPreviewEnabled = false;
   2005         LOG_FUNCTION_NAME_EXIT;
   2006 
   2007         return ret;
   2008 }
   2009 
   2010 /**
   2011    @brief Sets ANativeWindow object.
   2012 
   2013    Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
   2014    to render buffers to display.
   2015 
   2016    @param[in] window The ANativeWindow object created by Surface flinger
   2017    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2018    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2019 
   2020  */
   2021 status_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
   2022 {
   2023     status_t ret = NO_ERROR;
   2024     CameraAdapter::BuffersDescriptor desc;
   2025 
   2026     LOG_FUNCTION_NAME;
   2027     mSetPreviewWindowCalled = true;
   2028 
   2029    ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
   2030     if(!window)
   2031     {
   2032         if(mDisplayAdapter.get() != NULL)
   2033         {
   2034             ///NULL window passed, destroy the display adapter if present
   2035             CAMHAL_LOGD("NULL window passed, destroying display adapter");
   2036             mDisplayAdapter.clear();
   2037             ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
   2038             ///@remarks so, we will wait until it passes a valid window to begin the preview again
   2039             mSetPreviewWindowCalled = false;
   2040         }
   2041         CAMHAL_LOGD("NULL ANativeWindow passed to setPreviewWindow");
   2042         return NO_ERROR;
   2043     }else if(mDisplayAdapter.get() == NULL)
   2044     {
   2045         // Need to create the display adapter since it has not been created
   2046         // Create display adapter
   2047         mDisplayAdapter = new ANativeWindowDisplayAdapter();
   2048 #ifdef OMAP_ENHANCEMENT
   2049         mDisplayAdapter->setExtendedOps(mExtendedPreviewStreamOps);
   2050 #endif
   2051         ret = NO_ERROR;
   2052         if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
   2053         {
   2054             if(ret!=NO_ERROR)
   2055             {
   2056                 mDisplayAdapter.clear();
   2057                 CAMHAL_LOGEA("DisplayAdapter initialize failed");
   2058                 LOG_FUNCTION_NAME_EXIT;
   2059                 return ret;
   2060             }
   2061             else
   2062             {
   2063                 CAMHAL_LOGEA("Couldn't create DisplayAdapter");
   2064                 LOG_FUNCTION_NAME_EXIT;
   2065                 return NO_MEMORY;
   2066             }
   2067         }
   2068 
   2069         // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
   2070         // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
   2071         mDisplayAdapter->setFrameProvider(mCameraAdapter);
   2072 
   2073         // Any dynamic errors that happen during the camera use case has to be propagated back to the application
   2074         // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
   2075         // Set it as the error handler for the DisplayAdapter
   2076         mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
   2077 
   2078         // Update the display adapter with the new window that is passed from CameraService
   2079         ret  = mDisplayAdapter->setPreviewWindow(window);
   2080         if(ret!=NO_ERROR)
   2081             {
   2082             CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
   2083             }
   2084 
   2085         if(mPreviewStartInProgress)
   2086         {
   2087             CAMHAL_LOGDA("setPreviewWindow called when preview running");
   2088             // Start the preview since the window is now available
   2089             ret = startPreview();
   2090         }
   2091     } else {
   2092         // Update the display adapter with the new window that is passed from CameraService
   2093         ret = mDisplayAdapter->setPreviewWindow(window);
   2094         if ( (NO_ERROR == ret) && previewEnabled() ) {
   2095             restartPreview();
   2096         } else if (ret == ALREADY_EXISTS) {
   2097             // ALREADY_EXISTS should be treated as a noop in this case
   2098             ret = NO_ERROR;
   2099         }
   2100     }
   2101     LOG_FUNCTION_NAME_EXIT;
   2102 
   2103     return ret;
   2104 
   2105 }
   2106 
   2107 
   2108 #ifdef OMAP_ENHANCEMENT_CPCAM
   2109 void CameraHal::setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops)
   2110 {
   2111     mExtendedPreviewStreamOps = ops;
   2112 }
   2113 
   2114 /**
   2115    @brief Sets Tapout Surfaces.
   2116 
   2117    Buffers provided to CameraHal via this object for tap-out
   2118    functionality.
   2119 
   2120    @param[in] window The ANativeWindow object created by Surface flinger
   2121    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2122    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2123 
   2124  */
   2125 status_t CameraHal::setTapoutLocked(struct preview_stream_ops *tapout)
   2126 {
   2127     status_t ret = NO_ERROR;
   2128     int index = -1;
   2129 
   2130     LOG_FUNCTION_NAME;
   2131 
   2132     if (!tapout) {
   2133         CAMHAL_LOGD("Missing argument");
   2134         LOG_FUNCTION_NAME_EXIT;
   2135         return NO_ERROR;
   2136     }
   2137 
   2138     // Set tapout point
   2139     // 1. Check name of tap-out
   2140     // 2. If not already set, then create a new one
   2141     // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate
   2142     //    in case dimensions have changed
   2143 
   2144     for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
   2145         android::sp<DisplayAdapter> out;
   2146         out = mOutAdapters.itemAt(i);
   2147         ret = out->setPreviewWindow(tapout);
   2148         if (ret == ALREADY_EXISTS) {
   2149             CAMHAL_LOGD("Tap Out already set at index = %d", i);
   2150             index = i;
   2151             ret = NO_ERROR;
   2152         }
   2153     }
   2154 
   2155     if (index < 0) {
   2156         android::sp<DisplayAdapter> out  = new BufferSourceAdapter();
   2157 
   2158         ret = out->initialize();
   2159         if (ret != NO_ERROR) {
   2160             out.clear();
   2161             CAMHAL_LOGEA("DisplayAdapter initialize failed");
   2162             goto exit;
   2163         }
   2164 
   2165         // BufferSourceAdapter will be handler of the extended OPS
   2166         out->setExtendedOps(mExtendedPreviewStreamOps);
   2167 
   2168         // CameraAdapter will be the frame provider for BufferSourceAdapter
   2169         out->setFrameProvider(mCameraAdapter);
   2170 
   2171         // BufferSourceAdapter will use ErrorHandler to send errors back to
   2172         // the application
   2173         out->setErrorHandler(mAppCallbackNotifier.get());
   2174 
   2175         // Update the display adapter with the new window that is passed from CameraService
   2176         ret  = out->setPreviewWindow(tapout);
   2177         if(ret != NO_ERROR) {
   2178             CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
   2179             goto exit;
   2180         }
   2181 
   2182         if (NULL != mCameraAdapter) {
   2183             unsigned int bufferCount, max_queueable;
   2184             CameraFrame frame;
   2185 
   2186             bufferCount = out->getBufferCount();
   2187             if (bufferCount < 1) bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
   2188 
   2189             ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
   2190                                                   ( int ) &frame,
   2191                                                   bufferCount);
   2192             if (NO_ERROR != ret) {
   2193                 CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
   2194             }
   2195             if (NO_ERROR == ret) {
   2196                 CameraBuffer *bufs = NULL;
   2197                 unsigned int stride;
   2198                 unsigned int height = frame.mHeight;
   2199                 int size = frame.mLength;
   2200 
   2201                 stride = frame.mAlignment / getBPP(mParameters.getPictureFormat());
   2202                 bufs = out->allocateBufferList(stride,
   2203                                                height,
   2204                                                mParameters.getPictureFormat(),
   2205                                                size,
   2206                                                bufferCount);
   2207                 if (bufs == NULL){
   2208                     CAMHAL_LOGEB("error allocating buffer list");
   2209                     goto exit;
   2210                 }
   2211             }
   2212         }
   2213         mOutAdapters.add(out);
   2214     }
   2215 
   2216 exit:
   2217 
   2218     LOG_FUNCTION_NAME_EXIT;
   2219 
   2220     return ret;
   2221 }
   2222 
   2223 /**
   2224    @brief Releases Tapout Surfaces.
   2225 
   2226    @param[in] window The ANativeWindow object created by Surface flinger
   2227    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2228    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2229 
   2230  */
   2231 status_t CameraHal::releaseTapoutLocked(struct preview_stream_ops *tapout)
   2232 {
   2233     status_t ret = NO_ERROR;
   2234     char id[OP_STR_SIZE];
   2235 
   2236     LOG_FUNCTION_NAME;
   2237 
   2238     if (!tapout) {
   2239         CAMHAL_LOGD("Missing argument");
   2240         LOG_FUNCTION_NAME_EXIT;
   2241         return NO_ERROR;
   2242     }
   2243 
   2244     // Get the name of tapout
   2245     ret = mExtendedPreviewStreamOps->get_id(tapout, id, sizeof(id));
   2246     if (NO_ERROR != ret) {
   2247         CAMHAL_LOGEB("get_id OPS returned error %d", ret);
   2248         return ret;
   2249     }
   2250 
   2251     // 1. Check name of tap-out
   2252     // 2. If exist, then free buffers and then remove it
   2253     if (mBufferSourceAdapter_Out.get() && mBufferSourceAdapter_Out->match(id)) {
   2254         CAMHAL_LOGD("REMOVE tap out %p previously set as current", tapout);
   2255         mBufferSourceAdapter_Out.clear();
   2256     }
   2257     for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
   2258         android::sp<DisplayAdapter> out;
   2259         out = mOutAdapters.itemAt(i);
   2260         if (out->match(id)) {
   2261             CAMHAL_LOGD("REMOVE tap out %p \"%s\" at position %d", tapout, id, i);
   2262             mOutAdapters.removeAt(i);
   2263             break;
   2264         }
   2265     }
   2266 
   2267     LOG_FUNCTION_NAME_EXIT;
   2268 
   2269     return ret;
   2270 }
   2271 
   2272 /**
   2273    @brief Sets Tapin Surfaces.
   2274 
   2275    Buffers provided to CameraHal via this object for tap-in
   2276    functionality.
   2277 
   2278    @param[in] window The ANativeWindow object created by Surface flinger
   2279    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2280    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2281 
   2282  */
   2283 status_t CameraHal::setTapinLocked(struct preview_stream_ops *tapin)
   2284 {
   2285     status_t ret = NO_ERROR;
   2286     int index = -1;
   2287 
   2288     LOG_FUNCTION_NAME;
   2289 
   2290     if (!tapin) {
   2291         CAMHAL_LOGD("Missing argument");
   2292         LOG_FUNCTION_NAME_EXIT;
   2293         return NO_ERROR;
   2294     }
   2295 
   2296     // 1. Set tapin point
   2297     // 1. Check name of tap-in
   2298     // 2. If not already set, then create a new one
   2299     // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate
   2300     //    in case dimensions have changed
   2301     for (unsigned int i = 0; i < mInAdapters.size(); i++) {
   2302         android::sp<DisplayAdapter> in;
   2303         in = mInAdapters.itemAt(i);
   2304         ret = in->setPreviewWindow(tapin);
   2305         if (ret == ALREADY_EXISTS) {
   2306             CAMHAL_LOGD("Tap In already set at index = %d", i);
   2307             index = i;
   2308             ret = NO_ERROR;
   2309         }
   2310     }
   2311 
   2312     if (index < 0) {
   2313         android::sp<DisplayAdapter> in  = new BufferSourceAdapter();
   2314 
   2315         ret = in->initialize();
   2316         if (ret != NO_ERROR) {
   2317             in.clear();
   2318             CAMHAL_LOGEA("DisplayAdapter initialize failed");
   2319             goto exit;
   2320         }
   2321 
   2322         // BufferSourceAdapter will be handler of the extended OPS
   2323         in->setExtendedOps(mExtendedPreviewStreamOps);
   2324 
   2325         // CameraAdapter will be the frame provider for BufferSourceAdapter
   2326         in->setFrameProvider(mCameraAdapter);
   2327 
   2328         // BufferSourceAdapter will use ErrorHandler to send errors back to
   2329         // the application
   2330         in->setErrorHandler(mAppCallbackNotifier.get());
   2331 
   2332         // Update the display adapter with the new window that is passed from CameraService
   2333         ret  = in->setPreviewWindow(tapin);
   2334         if(ret != NO_ERROR) {
   2335             CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
   2336             goto exit;
   2337         }
   2338 
   2339         mInAdapters.add(in);
   2340     }
   2341 
   2342 exit:
   2343 
   2344     LOG_FUNCTION_NAME_EXIT;
   2345 
   2346     return ret;
   2347 }
   2348 
   2349 
   2350 /**
   2351    @brief Releases Tapin Surfaces.
   2352 
   2353    @param[in] window The ANativeWindow object created by Surface flinger
   2354    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2355    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2356 
   2357  */
   2358 status_t CameraHal::releaseTapinLocked(struct preview_stream_ops *tapin)
   2359 {
   2360     status_t ret = NO_ERROR;
   2361     char id[OP_STR_SIZE];
   2362 
   2363     LOG_FUNCTION_NAME;
   2364 
   2365     if (!tapin) {
   2366         CAMHAL_LOGD("Missing argument");
   2367         LOG_FUNCTION_NAME_EXIT;
   2368         return NO_ERROR;
   2369     }
   2370 
   2371     // Get the name of tapin
   2372     ret = mExtendedPreviewStreamOps->get_id(tapin, id, sizeof(id));
   2373     if (NO_ERROR != ret) {
   2374         CAMHAL_LOGEB("get_id OPS returned error %d", ret);
   2375         return ret;
   2376     }
   2377 
   2378     // 1. Check name of tap-in
   2379     // 2. If exist, then free buffers and then remove it
   2380     if (mBufferSourceAdapter_In.get() && mBufferSourceAdapter_In->match(id)) {
   2381         CAMHAL_LOGD("REMOVE tap in %p previously set as current", tapin);
   2382         mBufferSourceAdapter_In.clear();
   2383     }
   2384     for (unsigned int i = 0; i < mInAdapters.size(); i++) {
   2385         android::sp<DisplayAdapter> in;
   2386         in = mInAdapters.itemAt(i);
   2387         if (in->match(id)) {
   2388             CAMHAL_LOGD("REMOVE tap in %p \"%s\" at position %d", tapin, id, i);
   2389             mInAdapters.removeAt(i);
   2390             break;
   2391         }
   2392     }
   2393 
   2394     LOG_FUNCTION_NAME_EXIT;
   2395 
   2396     return ret;
   2397 }
   2398 
   2399 
   2400 /**
   2401    @brief Sets ANativeWindow object.
   2402 
   2403    Buffers provided to CameraHal via this object for tap-in/tap-out
   2404    functionality.
   2405 
   2406    TODO(XXX): this is just going to use preview_stream_ops for now, but we
   2407    most likely need to extend it when we want more functionality
   2408 
   2409    @param[in] window The ANativeWindow object created by Surface flinger
   2410    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2411    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2412 
   2413  */
   2414 status_t CameraHal::setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout)
   2415 {
   2416     status_t ret = NO_ERROR;
   2417     int index = -1;
   2418 
   2419     LOG_FUNCTION_NAME;
   2420 
   2421     android::AutoMutex lock(mLock);
   2422 
   2423     CAMHAL_LOGD ("setBufferSource(%p, %p)", tapin, tapout);
   2424 
   2425     ret = setTapoutLocked(tapout);
   2426     if (ret != NO_ERROR) {
   2427         CAMHAL_LOGE("setTapoutLocked returned error 0x%x", ret);
   2428         goto exit;
   2429     }
   2430 
   2431     ret = setTapinLocked(tapin);
   2432     if (ret != NO_ERROR) {
   2433         CAMHAL_LOGE("setTapinLocked returned error 0x%x", ret);
   2434         goto exit;
   2435     }
   2436 
   2437 exit:
   2438     LOG_FUNCTION_NAME_EXIT;
   2439 
   2440     return ret;
   2441 }
   2442 
   2443 
   2444 /**
   2445    @brief Releases ANativeWindow object.
   2446 
   2447    Release Buffers previously released with setBufferSource()
   2448 
   2449    TODO(XXX): this is just going to use preview_stream_ops for now, but we
   2450    most likely need to extend it when we want more functionality
   2451 
   2452    @param[in] window The ANativeWindow object created by Surface flinger
   2453    @return NO_ERROR If the ANativeWindow object passes validation criteria
   2454    @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
   2455 
   2456  */
   2457 status_t CameraHal::releaseBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout)
   2458 {
   2459     status_t ret = NO_ERROR;
   2460     int index = -1;
   2461 
   2462     LOG_FUNCTION_NAME;
   2463 
   2464     android::AutoMutex lock(mLock);
   2465     CAMHAL_LOGD ("releaseBufferSource(%p, %p)", tapin, tapout);
   2466     if (tapout) {
   2467         ret |= releaseTapoutLocked(tapout);
   2468         if (ret != NO_ERROR) {
   2469             CAMHAL_LOGE("Error %d to release tap out", ret);
   2470         }
   2471     }
   2472 
   2473     if (tapin) {
   2474         ret |= releaseTapinLocked(tapin);
   2475         if (ret != NO_ERROR) {
   2476             CAMHAL_LOGE("Error %d to release tap in", ret);
   2477         }
   2478     }
   2479 
   2480 exit:
   2481 
   2482     LOG_FUNCTION_NAME_EXIT;
   2483 
   2484     return ret;
   2485 }
   2486 #endif
   2487 
   2488 
   2489 /**
   2490    @brief Stop a previously started preview.
   2491 
   2492    @param none
   2493    @return none
   2494 
   2495  */
   2496 void CameraHal::stopPreview()
   2497 {
   2498     LOG_FUNCTION_NAME;
   2499 
   2500     if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
   2501         {
   2502         LOG_FUNCTION_NAME_EXIT;
   2503         return;
   2504         }
   2505 
   2506     bool imageCaptureRunning = (mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) &&
   2507                                     (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
   2508     if(mDisplayPaused && !imageCaptureRunning)
   2509         {
   2510         // Display is paused, which essentially means there is no preview active.
   2511         // Note: this is done so that when stopPreview is called by client after
   2512         // an image capture, we do not de-initialize the camera adapter and
   2513         // restart over again.
   2514 
   2515         return;
   2516         }
   2517 
   2518     forceStopPreview();
   2519 
   2520     // Reset Capture-Mode to default, so that when we switch from VideoRecording
   2521     // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
   2522     CAMHAL_LOGDA("Resetting Capture-Mode to default");
   2523     mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
   2524 
   2525     LOG_FUNCTION_NAME_EXIT;
   2526 }
   2527 
   2528 /**
   2529    @brief Returns true if preview is enabled
   2530 
   2531    @param none
   2532    @return true If preview is running currently
   2533          false If preview has been stopped
   2534 
   2535  */
   2536 bool CameraHal::previewEnabled()
   2537 {
   2538     LOG_FUNCTION_NAME;
   2539 
   2540     return (mPreviewEnabled || mPreviewStartInProgress);
   2541 }
   2542 
   2543 /**
   2544    @brief Start record mode.
   2545 
   2546   When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
   2547   the corresponding frame. Every record frame must be released by calling
   2548   releaseRecordingFrame().
   2549 
   2550    @param none
   2551    @return NO_ERROR If recording could be started without any issues
   2552    @todo Update the header with possible error values in failure scenarios
   2553 
   2554  */
   2555 status_t CameraHal::startRecording( )
   2556 {
   2557     int w, h;
   2558     const char *valstr = NULL;
   2559     bool restartPreviewRequired = false;
   2560     status_t ret = NO_ERROR;
   2561 
   2562     LOG_FUNCTION_NAME;
   2563 
   2564 
   2565 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   2566 
   2567             gettimeofday(&mStartPreview, NULL);
   2568 
   2569 #endif
   2570 
   2571     if(!previewEnabled())
   2572         {
   2573         return NO_INIT;
   2574         }
   2575 
   2576     // set internal recording hint in case camera adapter needs to make some
   2577     // decisions....(will only be sent to camera adapter if camera restart is required)
   2578     mParameters.set(TICameraParameters::KEY_RECORDING_HINT, android::CameraParameters::TRUE);
   2579 
   2580     // if application starts recording in continuous focus picture mode...
   2581     // then we need to force default capture mode (as opposed to video mode)
   2582     if ( ((valstr = mParameters.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
   2583          (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
   2584         restartPreviewRequired = resetVideoModeParameters();
   2585     }
   2586 
   2587     // only need to check recording hint if preview restart is not already needed
   2588     valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
   2589     if ( !restartPreviewRequired &&
   2590          (!valstr || (valstr && (strcmp(valstr, android::CameraParameters::TRUE) != 0))) ) {
   2591         restartPreviewRequired = setVideoModeParameters(mParameters);
   2592     }
   2593 
   2594     if (restartPreviewRequired) {
   2595         {
   2596             android::AutoMutex lock(mLock);
   2597             mCapModeBackup = mParameters.get(TICameraParameters::KEY_CAP_MODE);
   2598         }
   2599         ret = restartPreview();
   2600     }
   2601 
   2602     if ( NO_ERROR == ret )
   2603       {
   2604         int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
   2605         mParameters.getPreviewSize(&w, &h);
   2606         CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
   2607 
   2608         if ((w != mVideoWidth) && (h != mVideoHeight))
   2609           {
   2610             ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
   2611             if ( NO_ERROR != ret )
   2612               {
   2613                 CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
   2614                 mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
   2615                 return ret;
   2616               }
   2617 
   2618             mAppCallbackNotifier->useVideoBuffers(true);
   2619             mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
   2620             ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBuffers);
   2621           }
   2622         else
   2623           {
   2624             mAppCallbackNotifier->useVideoBuffers(false);
   2625             mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
   2626             ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
   2627           }
   2628       }
   2629 
   2630     if ( NO_ERROR == ret )
   2631         {
   2632          ret = mAppCallbackNotifier->startRecording();
   2633         }
   2634 
   2635     if ( NO_ERROR == ret )
   2636         {
   2637         ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
   2638          ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
   2639         }
   2640 
   2641     if ( NO_ERROR == ret )
   2642         {
   2643         mRecordingEnabled = true;
   2644         }
   2645 
   2646     LOG_FUNCTION_NAME_EXIT;
   2647 
   2648     return ret;
   2649 }
   2650 
   2651 /**
   2652    @brief Set the camera parameters specific to Video Recording.
   2653 
   2654    This function checks for the camera parameters which have to be set for recording.
   2655    Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
   2656    This function also enables Video Recording specific functions like VSTAB & VNF.
   2657 
   2658    @param none
   2659    @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
   2660    @todo Modify the policies for enabling VSTAB & VNF usecase based later.
   2661 
   2662  */
   2663 bool CameraHal::setVideoModeParameters(const android::CameraParameters& params)
   2664 {
   2665     const char *valstr = NULL;
   2666     const char *valstrRemote = NULL;
   2667     bool restartPreviewRequired = false;
   2668 
   2669     LOG_FUNCTION_NAME;
   2670 
   2671     // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
   2672     valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
   2673     if ( (valstr == NULL) ||
   2674         ( (valstr != NULL) && ( (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) &&
   2675                                 (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE_HQ ) != 0) ) ) ) {
   2676         CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
   2677         mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
   2678         restartPreviewRequired = true;
   2679     }
   2680 
   2681     // set VSTAB. restart is required if vstab value has changed
   2682     if ( (valstrRemote = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL ) {
   2683         // make sure we support vstab
   2684         if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
   2685                    android::CameraParameters::TRUE) == 0) {
   2686             valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
   2687             // vstab value has changed
   2688             if ((valstr != NULL) &&
   2689                  strcmp(valstr, valstrRemote) != 0) {
   2690                 restartPreviewRequired = true;
   2691             }
   2692             mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION,
   2693                             valstrRemote);
   2694         }
   2695     } else if (mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) {
   2696         // vstab was configured but now unset
   2697         restartPreviewRequired = true;
   2698         mParameters.remove(android::CameraParameters::KEY_VIDEO_STABILIZATION);
   2699     }
   2700 
   2701     // Set VNF
   2702     if ((valstrRemote = params.get(TICameraParameters::KEY_VNF)) == NULL) {
   2703         CAMHAL_LOGDA("Enable VNF");
   2704         mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
   2705         restartPreviewRequired = true;
   2706     } else {
   2707         valstr = mParameters.get(TICameraParameters::KEY_VNF);
   2708         if (valstr && strcmp(valstr, valstrRemote) != 0) {
   2709             restartPreviewRequired = true;
   2710         }
   2711         mParameters.set(TICameraParameters::KEY_VNF, valstrRemote);
   2712     }
   2713 
   2714 #if !defined(OMAP_ENHANCEMENT) && !defined(ENHANCED_DOMX)
   2715         // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
   2716         // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
   2717         // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
   2718         int w, h;
   2719         params.getPreviewSize(&w, &h);
   2720         valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION);
   2721         if (valstr && (strcmp(valstr, android::CameraParameters::TRUE) == 0) && (w == 1920)) {
   2722             CAMHAL_LOGDA("Force Enable VNF for 1080p");
   2723             const char *valKeyVnf = mParameters.get(TICameraParameters::KEY_VNF);
   2724             if(!valKeyVnf || (strcmp(valKeyVnf, android::CameraParameters::TRUE) != 0)) {
   2725                 mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE);
   2726                 restartPreviewRequired = true;
   2727             }
   2728         }
   2729 #endif
   2730 
   2731     LOG_FUNCTION_NAME_EXIT;
   2732 
   2733     return restartPreviewRequired;
   2734 }
   2735 
   2736 /**
   2737    @brief Reset the camera parameters specific to Video Recording.
   2738 
   2739    This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
   2740 
   2741    @param none
   2742    @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
   2743 
   2744  */
   2745 bool CameraHal::resetVideoModeParameters()
   2746 {
   2747     const char *valstr = NULL;
   2748     bool restartPreviewRequired = false;
   2749     status_t ret = NO_ERROR;
   2750 
   2751     LOG_FUNCTION_NAME;
   2752 
   2753     // ignore this if we are already recording
   2754     if (mRecordingEnabled) {
   2755         return false;
   2756     }
   2757 
   2758     // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
   2759     valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
   2760     if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
   2761         CAMHAL_LOGDA("Reset Capture-Mode to default");
   2762         mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
   2763         restartPreviewRequired = true;
   2764     }
   2765 
   2766     LOG_FUNCTION_NAME_EXIT;
   2767 
   2768     return restartPreviewRequired;
   2769 }
   2770 
   2771 /**
   2772    @brief Restart the preview with setParameter.
   2773 
   2774    This function restarts preview, for some VIDEO_MODE parameters to take effect.
   2775 
   2776    @param none
   2777    @return NO_ERROR If recording parameters could be set without any issues
   2778 
   2779  */
   2780 status_t CameraHal::restartPreview()
   2781 {
   2782     status_t ret = NO_ERROR;
   2783 
   2784     LOG_FUNCTION_NAME;
   2785 
   2786     // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
   2787 
   2788     forceStopPreview();
   2789 
   2790     {
   2791         android::AutoMutex lock(mLock);
   2792         if (!mCapModeBackup.isEmpty()) {
   2793             mParameters.set(TICameraParameters::KEY_CAP_MODE, mCapModeBackup.string());
   2794             mCapModeBackup = "";
   2795         } else {
   2796             mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
   2797         }
   2798         mCameraAdapter->setParameters(mParameters);
   2799     }
   2800 
   2801     ret = startPreview();
   2802 
   2803     LOG_FUNCTION_NAME_EXIT;
   2804 
   2805     return ret;
   2806 }
   2807 
   2808 /**
   2809    @brief Stop a previously started recording.
   2810 
   2811    @param none
   2812    @return none
   2813 
   2814  */
   2815 void CameraHal::stopRecording()
   2816 {
   2817     CameraAdapter::AdapterState currentState;
   2818 
   2819     LOG_FUNCTION_NAME;
   2820 
   2821     android::AutoMutex lock(mLock);
   2822 
   2823     if (!mRecordingEnabled )
   2824         {
   2825         return;
   2826         }
   2827 
   2828     currentState = mCameraAdapter->getState();
   2829     if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
   2830         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
   2831     }
   2832 
   2833     mAppCallbackNotifier->stopRecording();
   2834 
   2835     mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
   2836 
   2837     mRecordingEnabled = false;
   2838 
   2839     if ( mAppCallbackNotifier->getUesVideoBuffers() ){
   2840       freeVideoBufs(mVideoBuffers);
   2841       if (mVideoBuffers){
   2842         CAMHAL_LOGVB(" FREEING mVideoBuffers %p", mVideoBuffers);
   2843         delete [] mVideoBuffers;
   2844       }
   2845       mVideoBuffers = NULL;
   2846     }
   2847 
   2848     // reset internal recording hint in case camera adapter needs to make some
   2849     // decisions....(will only be sent to camera adapter if camera restart is required)
   2850     mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
   2851 
   2852     LOG_FUNCTION_NAME_EXIT;
   2853 }
   2854 
   2855 /**
   2856    @brief Returns true if recording is enabled.
   2857 
   2858    @param none
   2859    @return true If recording is currently running
   2860          false If recording has been stopped
   2861 
   2862  */
   2863 int CameraHal::recordingEnabled()
   2864 {
   2865     LOG_FUNCTION_NAME;
   2866 
   2867     LOG_FUNCTION_NAME_EXIT;
   2868 
   2869     return mRecordingEnabled;
   2870 }
   2871 
   2872 /**
   2873    @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
   2874 
   2875    @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
   2876                previously given by CameraHal
   2877    @return none
   2878 
   2879  */
   2880 void CameraHal::releaseRecordingFrame(const void* mem)
   2881 {
   2882     LOG_FUNCTION_NAME;
   2883 
   2884     //CAMHAL_LOGDB(" 0x%x", mem->pointer());
   2885 
   2886     if ( ( mRecordingEnabled ) && mem != NULL)
   2887     {
   2888         mAppCallbackNotifier->releaseRecordingFrame(mem);
   2889     }
   2890 
   2891     LOG_FUNCTION_NAME_EXIT;
   2892 
   2893     return;
   2894 }
   2895 
   2896 /**
   2897    @brief Start auto focus
   2898 
   2899    This call asynchronous.
   2900    The notification callback routine is called with CAMERA_MSG_FOCUS once when
   2901    focusing is complete. autoFocus() will be called again if another auto focus is
   2902    needed.
   2903 
   2904    @param none
   2905    @return NO_ERROR
   2906    @todo Define the error codes if the focus is not locked
   2907 
   2908  */
   2909 status_t CameraHal::autoFocus()
   2910 {
   2911     status_t ret = NO_ERROR;
   2912 
   2913 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   2914 
   2915     gettimeofday(&mStartFocus, NULL);
   2916 
   2917 #endif
   2918 
   2919     LOG_FUNCTION_NAME;
   2920 
   2921     android::AutoMutex lock(mLock);
   2922 
   2923     mMsgEnabled |= CAMERA_MSG_FOCUS;
   2924 
   2925     if ( NULL == mCameraAdapter )
   2926         {
   2927             ret = -1;
   2928             goto EXIT;
   2929         }
   2930 
   2931     CameraAdapter::AdapterState state;
   2932     ret = mCameraAdapter->getState(state);
   2933     if (ret != NO_ERROR)
   2934         {
   2935             goto EXIT;
   2936         }
   2937 
   2938     if (state == CameraAdapter::AF_STATE)
   2939         {
   2940             CAMHAL_LOGI("Ignoring start-AF (already in progress)");
   2941             goto EXIT;
   2942         }
   2943 
   2944 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   2945 
   2946     //pass the autoFocus timestamp along with the command to camera adapter
   2947     ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
   2948 
   2949 #else
   2950 
   2951     ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
   2952 
   2953 #endif
   2954 
   2955 EXIT:
   2956     LOG_FUNCTION_NAME_EXIT;
   2957 
   2958     return ret;
   2959 }
   2960 
   2961 /**
   2962    @brief Cancels auto-focus function.
   2963 
   2964    If the auto-focus is still in progress, this function will cancel it.
   2965    Whether the auto-focus is in progress or not, this function will return the
   2966    focus position to the default. If the camera does not support auto-focus, this is a no-op.
   2967 
   2968 
   2969    @param none
   2970    @return NO_ERROR If the cancel succeeded
   2971    @todo Define error codes if cancel didnt succeed
   2972 
   2973  */
   2974 status_t CameraHal::cancelAutoFocus()
   2975 {
   2976     LOG_FUNCTION_NAME;
   2977 
   2978     android::AutoMutex lock(mLock);
   2979     android::CameraParameters adapterParams = mParameters;
   2980     mMsgEnabled &= ~CAMERA_MSG_FOCUS;
   2981 
   2982     if( NULL != mCameraAdapter )
   2983     {
   2984         adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, android::CameraParameters::FALSE);
   2985         mCameraAdapter->setParameters(adapterParams);
   2986         mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
   2987         mAppCallbackNotifier->flushEventQueue();
   2988     }
   2989 
   2990     LOG_FUNCTION_NAME_EXIT;
   2991     return NO_ERROR;
   2992 }
   2993 
   2994 void CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
   2995 {
   2996 
   2997     LOG_FUNCTION_NAME;
   2998 
   2999     if ( NULL != mEventProvider )
   3000         {
   3001         mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
   3002         delete mEventProvider;
   3003         mEventProvider = NULL;
   3004         }
   3005 
   3006     mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
   3007     if ( NULL == mEventProvider )
   3008         {
   3009         CAMHAL_LOGEA("Error in creating EventProvider");
   3010         }
   3011     else
   3012         {
   3013         mEventProvider->enableEventNotification(eventMask);
   3014         }
   3015 
   3016     LOG_FUNCTION_NAME_EXIT;
   3017 }
   3018 
   3019 void CameraHal::eventCallbackRelay(CameraHalEvent* event)
   3020 {
   3021     LOG_FUNCTION_NAME;
   3022 
   3023     CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
   3024     appcbn->eventCallback(event );
   3025 
   3026     LOG_FUNCTION_NAME_EXIT;
   3027 }
   3028 
   3029 void CameraHal::eventCallback(CameraHalEvent* event)
   3030 {
   3031     LOG_FUNCTION_NAME;
   3032 
   3033     LOG_FUNCTION_NAME_EXIT;
   3034 }
   3035 
   3036 status_t CameraHal::startImageBracketing()
   3037 {
   3038     status_t ret = NO_ERROR;
   3039     CameraFrame frame;
   3040     CameraAdapter::BuffersDescriptor desc;
   3041     unsigned int max_queueable = 0;
   3042 
   3043 
   3044 
   3045 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3046 
   3047         gettimeofday(&mStartCapture, NULL);
   3048 
   3049 #endif
   3050 
   3051         LOG_FUNCTION_NAME;
   3052 
   3053         if(!previewEnabled() && !mDisplayPaused)
   3054             {
   3055             LOG_FUNCTION_NAME_EXIT;
   3056             return NO_INIT;
   3057             }
   3058 
   3059         if ( !mBracketingEnabled )
   3060             {
   3061             return ret;
   3062             }
   3063 
   3064         if ( NO_ERROR == ret )
   3065             {
   3066             mBracketingRunning = true;
   3067             }
   3068 
   3069         if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
   3070             {
   3071             ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
   3072                                               ( int ) &frame,
   3073                                               ( mBracketRangeNegative + 1 ));
   3074 
   3075             if ( NO_ERROR != ret )
   3076                 {
   3077                 CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
   3078                 }
   3079             }
   3080 
   3081         if ( NO_ERROR == ret )
   3082             {
   3083             if ( NULL != mAppCallbackNotifier.get() )
   3084                  {
   3085                  mAppCallbackNotifier->setBurst(true);
   3086                  }
   3087             }
   3088 
   3089         if ( NO_ERROR == ret )
   3090             {
   3091             mParameters.getPictureSize(( int * ) &frame.mWidth,
   3092                                        ( int * ) &frame.mHeight);
   3093 
   3094             ret = allocImageBufs(frame.mWidth,
   3095                                  frame.mHeight,
   3096                                  frame.mLength,
   3097                                  mParameters.getPictureFormat(),
   3098                                  ( mBracketRangeNegative + 1 ));
   3099             if ( NO_ERROR != ret )
   3100               {
   3101                 CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
   3102               }
   3103             }
   3104 
   3105         if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
   3106             {
   3107 
   3108             desc.mBuffers = mImageBuffers;
   3109             desc.mOffsets = mImageOffsets;
   3110             desc.mFd = mImageFd;
   3111             desc.mLength = mImageLength;
   3112             desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
   3113             desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
   3114 
   3115             ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
   3116                                               ( int ) &desc);
   3117 
   3118             if ( NO_ERROR == ret )
   3119                 {
   3120 
   3121 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3122 
   3123                  //pass capture timestamp along with the camera adapter command
   3124                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
   3125 
   3126 #else
   3127 
   3128                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
   3129 
   3130 #endif
   3131 
   3132                 }
   3133             }
   3134 
   3135         return ret;
   3136 }
   3137 
   3138 status_t CameraHal::stopImageBracketing()
   3139 {
   3140         status_t ret = NO_ERROR;
   3141 
   3142         LOG_FUNCTION_NAME;
   3143 
   3144         if( !previewEnabled() )
   3145             {
   3146             return NO_INIT;
   3147             }
   3148 
   3149         mBracketingRunning = false;
   3150 
   3151         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
   3152 
   3153         LOG_FUNCTION_NAME_EXIT;
   3154 
   3155         return ret;
   3156 }
   3157 
   3158 /**
   3159    @brief Take a picture.
   3160 
   3161    @param none
   3162    @return NO_ERROR If able to switch to image capture
   3163    @todo Define error codes if unable to switch to image capture
   3164 
   3165  */
   3166 status_t CameraHal::takePicture(const char *params)
   3167 {
   3168     android::AutoMutex lock(mLock);
   3169     return __takePicture(params);
   3170 }
   3171 
   3172 /**
   3173    @brief Internal function for getting a captured image.
   3174           shared by takePicture and reprocess.
   3175    @param none
   3176    @return NO_ERROR If able to switch to image capture
   3177    @todo Define error codes if unable to switch to image capture
   3178 
   3179  */
   3180 status_t CameraHal::__takePicture(const char *params, struct timeval *captureStart)
   3181 {
   3182     // cancel AF state if needed (before any operation and mutex lock)
   3183     if (mCameraAdapter->getState() == CameraAdapter::AF_STATE) {
   3184         cancelAutoFocus();
   3185     }
   3186 
   3187     status_t ret = NO_ERROR;
   3188     CameraFrame frame;
   3189     CameraAdapter::BuffersDescriptor desc;
   3190     int burst = -1;
   3191     const char *valstr = NULL;
   3192     unsigned int bufferCount = 1;
   3193     unsigned int max_queueable = 0;
   3194     unsigned int rawBufferCount = 1;
   3195     bool isCPCamMode = false;
   3196     android::sp<DisplayAdapter> outAdapter = 0;
   3197     bool reuseTapout = false;
   3198 
   3199 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3200 
   3201     if ( NULL == captureStart ) {
   3202         gettimeofday(&mStartCapture, NULL);
   3203     } else {
   3204         memcpy(&mStartCapture, captureStart, sizeof(struct timeval));
   3205     }
   3206 
   3207 #endif
   3208 
   3209     LOG_FUNCTION_NAME;
   3210 
   3211     if(!previewEnabled() && !mDisplayPaused)
   3212         {
   3213         LOG_FUNCTION_NAME_EXIT;
   3214         CAMHAL_LOGEA("Preview not started...");
   3215         return NO_INIT;
   3216         }
   3217 
   3218     valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
   3219 
   3220     isCPCamMode = valstr && !strcmp(valstr, TICameraParameters::CP_CAM_MODE);
   3221 
   3222     // return error if we are already capturing
   3223     // however, we can queue a capture when in cpcam mode
   3224     if ( ((mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
   3225           mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
   3226          (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
   3227           mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE)) &&
   3228          !isCPCamMode) {
   3229         CAMHAL_LOGEA("Already capturing an image...");
   3230         return NO_INIT;
   3231     }
   3232 
   3233     // we only support video snapshot if we are in video mode (recording hint is set)
   3234     if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
   3235          (valstr && ( strcmp(valstr, TICameraParameters::VIDEO_MODE) &&
   3236                       strcmp(valstr, TICameraParameters::VIDEO_MODE_HQ ) ) ) ) {
   3237         CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
   3238         return INVALID_OPERATION;
   3239     }
   3240 
   3241 #ifdef OMAP_ENHANCEMENT_CPCAM
   3242     // check if camera application is using shots parameters
   3243     // api. parameters set here override anything set using setParameters
   3244     // TODO(XXX): Just going to use legacy TI parameters for now. Need
   3245     // add new APIs in CameraHal to utilize android::ShotParameters later, so
   3246     // we don't have to parse through the whole set of parameters
   3247     // in camera adapter
   3248     if (strlen(params) > 0) {
   3249         android::ShotParameters shotParams;
   3250         const char *valStr;
   3251         const char *valExpComp, *valExpGain;
   3252         int valNum;
   3253 
   3254         android::String8 shotParams8(params);
   3255 
   3256         shotParams.unflatten(shotParams8);
   3257         mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE);
   3258         mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
   3259 
   3260         valExpGain = shotParams.get(android::ShotParameters::KEY_EXP_GAIN_PAIRS);
   3261         valExpComp = shotParams.get(android::ShotParameters::KEY_EXP_COMPENSATION);
   3262         if (NULL != valExpComp) {
   3263             mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valExpComp);
   3264         } else if (NULL != valExpGain) {
   3265             mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valExpGain);
   3266         }
   3267 
   3268         valNum = shotParams.getInt(android::ShotParameters::KEY_BURST);
   3269         if (valNum >= 0) {
   3270             mParameters.set(TICameraParameters::KEY_BURST, valNum);
   3271             burst = valNum;
   3272         }
   3273 
   3274         valStr = shotParams.get(android::ShotParameters::KEY_FLUSH_CONFIG);
   3275         if (valStr!= NULL) {
   3276             if ( 0 == strcmp(valStr, android::ShotParameters::TRUE) ) {
   3277                 mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
   3278                                 android::CameraParameters::TRUE);
   3279             } else if ( 0 == strcmp(valStr, android::ShotParameters::FALSE) ) {
   3280                 mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE,
   3281                                 android::CameraParameters::FALSE);
   3282             }
   3283         }
   3284 
   3285         valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_OUT);
   3286         if (valStr != NULL) {
   3287             int index = -1;
   3288             for (unsigned int i = 0; i < mOutAdapters.size(); i++) {
   3289                 if(mOutAdapters.itemAt(i)->match(valStr)) {
   3290                     index = i;
   3291                     break;
   3292                 }
   3293             }
   3294             if (index < 0) {
   3295                 CAMHAL_LOGE("Invalid tap out surface passed to camerahal");
   3296                 return BAD_VALUE;
   3297             }
   3298             CAMHAL_LOGD("Found matching out adapter at %d", index);
   3299             outAdapter = mOutAdapters.itemAt(index);
   3300             if ( outAdapter == mBufferSourceAdapter_Out ) {
   3301                 reuseTapout = true;
   3302             }
   3303         }
   3304 
   3305         mCameraAdapter->setParameters(mParameters);
   3306     } else
   3307 #endif
   3308     {
   3309         // TODO(XXX): Should probably reset burst and bracketing params
   3310         // when we remove legacy TI parameters implementation
   3311     }
   3312 
   3313 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3314 
   3315     CameraHal::PPM("Takepicture parameters set: ", &mStartCapture);
   3316 
   3317 #endif
   3318 
   3319     // if we are already in the middle of a capture and using the same
   3320     // tapout ST...then we just need setParameters and start image
   3321     // capture to queue more shots
   3322     if (((mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) ==
   3323               CameraAdapter::CAPTURE_STATE) &&
   3324          (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) &&
   3325          (reuseTapout) ) {
   3326 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3327         //pass capture timestamp along with the camera adapter command
   3328         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,
   3329                                           (int) &mStartCapture);
   3330 #else
   3331         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
   3332 #endif
   3333         return ret;
   3334     }
   3335 
   3336     if ( !mBracketingRunning )
   3337     {
   3338          // if application didn't set burst through android::ShotParameters
   3339          // then query from TICameraParameters
   3340          if ((burst == -1) && (NO_ERROR == ret)) {
   3341             burst = mParameters.getInt(TICameraParameters::KEY_BURST);
   3342          }
   3343 
   3344          //Allocate all buffers only in burst capture case
   3345          if ( burst > 0 ) {
   3346              // For CPCam mode...allocate for worst case burst
   3347              bufferCount = isCPCamMode || (burst > CameraHal::NO_BUFFERS_IMAGE_CAPTURE) ?
   3348                                CameraHal::NO_BUFFERS_IMAGE_CAPTURE : burst;
   3349 
   3350              if (outAdapter.get()) {
   3351                 if ( reuseTapout ) {
   3352                     bufferCount = mImageCount;
   3353                 } else {
   3354                     bufferCount = outAdapter->getBufferCount();
   3355                     if (bufferCount < 1) {
   3356                         bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP;
   3357                     }
   3358                 }
   3359              }
   3360 
   3361              if ( NULL != mAppCallbackNotifier.get() ) {
   3362                  mAppCallbackNotifier->setBurst(true);
   3363              }
   3364          } else if ( mBracketingEnabled ) {
   3365              bufferCount = mBracketRangeNegative + 1;
   3366              if ( NULL != mAppCallbackNotifier.get() ) {
   3367                  mAppCallbackNotifier->setBurst(false);
   3368              }
   3369          } else {
   3370              if ( NULL != mAppCallbackNotifier.get() ) {
   3371                  mAppCallbackNotifier->setBurst(false);
   3372              }
   3373          }
   3374 
   3375         // pause preview during normal image capture
   3376         // do not pause preview if recording (video state)
   3377         if ( (NO_ERROR == ret) && (NULL != mDisplayAdapter.get()) ) {
   3378             if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
   3379                 mDisplayPaused = true;
   3380                 mPreviewEnabled = false;
   3381                 ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
   3382                 // since preview is paused we should stop sending preview frames too
   3383                 if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
   3384                     mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
   3385                 }
   3386             }
   3387 
   3388 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3389             mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
   3390 #endif
   3391         }
   3392 
   3393         // if we taking video snapshot...
   3394         if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
   3395             // enable post view frames if not already enabled so we can internally
   3396             // save snapshot frames for generating thumbnail
   3397             if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
   3398                 mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
   3399             }
   3400         }
   3401 
   3402         if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
   3403             {
   3404             if ( NO_ERROR == ret )
   3405                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
   3406                                                   ( int ) &frame,
   3407                                                   bufferCount);
   3408 
   3409             if ( NO_ERROR != ret )
   3410                 {
   3411                 CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
   3412                 }
   3413             }
   3414 
   3415 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3416 
   3417     CameraHal::PPM("Takepicture buffer size queried: ", &mStartCapture);
   3418 
   3419 #endif
   3420 
   3421         if (outAdapter.get()) {
   3422             // Avoid locking the tapout again when reusing it
   3423             if (!reuseTapout) {
   3424                 // Need to reset buffers if we are switching adapters since we don't know
   3425                 // the state of the new buffer list
   3426                 ret = outAdapter->maxQueueableBuffers(max_queueable);
   3427                 if (NO_ERROR != ret) {
   3428                     CAMHAL_LOGE("Couldn't get max queuable");
   3429                     return ret;
   3430                 }
   3431                 mImageBuffers = outAdapter->getBuffers(true);
   3432                 mImageOffsets = outAdapter->getOffsets();
   3433                 mImageFd = outAdapter->getFd();
   3434                 mImageLength = outAdapter->getSize();
   3435                 mImageCount = bufferCount;
   3436                 mBufferSourceAdapter_Out = outAdapter;
   3437             }
   3438         } else {
   3439             mBufferSourceAdapter_Out.clear();
   3440             // allocImageBufs will only allocate new buffers if mImageBuffers is NULL
   3441             if ( NO_ERROR == ret ) {
   3442                 max_queueable = bufferCount;
   3443                 ret = allocImageBufs(frame.mAlignment / getBPP(mParameters.getPictureFormat()),
   3444                                      frame.mHeight,
   3445                                      frame.mLength,
   3446                                      mParameters.getPictureFormat(),
   3447                                      bufferCount);
   3448                 if ( NO_ERROR != ret ) {
   3449                     CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
   3450                 }
   3451             }
   3452         }
   3453 
   3454 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3455 
   3456     CameraHal::PPM("Takepicture buffers allocated: ", &mStartCapture);
   3457     memcpy(&mImageBuffers->ppmStamp, &mStartCapture, sizeof(struct timeval));
   3458 
   3459 #endif
   3460 
   3461     if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
   3462             {
   3463             desc.mBuffers = mImageBuffers;
   3464             desc.mOffsets = mImageOffsets;
   3465             desc.mFd = mImageFd;
   3466             desc.mLength = mImageLength;
   3467             desc.mCount = ( size_t ) bufferCount;
   3468             desc.mMaxQueueable = ( size_t ) max_queueable;
   3469 
   3470             ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
   3471                                               ( int ) &desc);
   3472             }
   3473         if (mRawCapture) {
   3474             if ( NO_ERROR == ret ) {
   3475                 CAMHAL_LOGDB("Raw capture buffers setup - %s", mParameters.getPictureFormat());
   3476                 ret = allocRawBufs(mParameters.getInt(TICameraParameters::RAW_WIDTH),
   3477                                    mParameters.getInt(TICameraParameters::RAW_HEIGHT),
   3478                                    android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB,
   3479                                    rawBufferCount);
   3480 
   3481                 if ( NO_ERROR != ret ) {
   3482                     CAMHAL_LOGEB("allocRawBufs (for RAW capture) returned error 0x%x", ret);
   3483                 }
   3484             }
   3485 
   3486             if ((NO_ERROR == ret) && ( NULL != mCameraAdapter )) {
   3487                 desc.mBuffers = mVideoBuffers;
   3488                 desc.mOffsets = mVideoOffsets;
   3489                 desc.mFd = mVideoFd;
   3490                 desc.mLength = mVideoLength;
   3491                 desc.mCount = ( size_t ) rawBufferCount;
   3492                 desc.mMaxQueueable = ( size_t ) rawBufferCount;
   3493 
   3494                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE,
   3495                         ( int ) &desc);
   3496             }
   3497         }
   3498     }
   3499 
   3500 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3501 
   3502         CameraHal::PPM("Takepicture buffers registered: ", &mStartCapture);
   3503 
   3504 #endif
   3505 
   3506     if ((ret == NO_ERROR) && mBufferSourceAdapter_Out.get()) {
   3507         mBufferSourceAdapter_Out->enableDisplay(0, 0, NULL);
   3508     }
   3509 
   3510     if ((NO_ERROR == ret) && (NULL != mCameraAdapter)) {
   3511 
   3512 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3513 
   3514          //pass capture timestamp along with the camera adapter command
   3515         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
   3516 
   3517         CameraHal::PPM("Takepicture capture started: ", &mStartCapture);
   3518 
   3519 #else
   3520 
   3521         ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
   3522 
   3523 #endif
   3524 
   3525     }
   3526 
   3527     return ret;
   3528 }
   3529 
   3530 /**
   3531    @brief Cancel a picture that was started with takePicture.
   3532 
   3533    Calling this method when no picture is being taken is a no-op.
   3534 
   3535    @param none
   3536    @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
   3537    @todo Define error codes
   3538 
   3539  */
   3540 status_t CameraHal::cancelPicture( )
   3541 {
   3542     LOG_FUNCTION_NAME;
   3543     status_t ret = NO_ERROR;
   3544 
   3545     ret = signalEndImageCapture();
   3546     return NO_ERROR;
   3547 }
   3548 
   3549 /**
   3550    @brief Return the camera parameters.
   3551 
   3552    @param none
   3553    @return Currently configured camera parameters
   3554 
   3555  */
   3556 char* CameraHal::getParameters()
   3557 {
   3558     android::String8 params_str8;
   3559     char* params_string;
   3560     const char * valstr = NULL;
   3561 
   3562     LOG_FUNCTION_NAME;
   3563 
   3564     if( NULL != mCameraAdapter )
   3565     {
   3566         mCameraAdapter->getParameters(mParameters);
   3567     }
   3568 
   3569     if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) {
   3570         if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
   3571             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
   3572         } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
   3573             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
   3574         } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
   3575             || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
   3576             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
   3577         }
   3578     }
   3579 
   3580     if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL ) {
   3581         if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) {
   3582             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
   3583         } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) {
   3584             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
   3585         } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr))
   3586                 || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) {
   3587             mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
   3588         }
   3589     }
   3590 
   3591     android::CameraParameters mParams = mParameters;
   3592 
   3593     // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
   3594     valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT);
   3595     if(valstr != NULL)
   3596       {
   3597         if(strcmp(valstr, android::CameraParameters::TRUE) == 0)
   3598           {
   3599             //HACK FOR MMS MODE
   3600             resetPreviewRes(&mParams);
   3601           }
   3602       }
   3603 
   3604     // do not send internal parameters to upper layers
   3605     mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
   3606     mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
   3607 
   3608     params_str8 = mParams.flatten();
   3609 
   3610     // camera service frees this string...
   3611     params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
   3612     strcpy(params_string, params_str8.string());
   3613 
   3614     LOG_FUNCTION_NAME_EXIT;
   3615 
   3616     ///Return the current set of parameters
   3617 
   3618     return params_string;
   3619 }
   3620 
   3621 
   3622 #ifdef OMAP_ENHANCEMENT_CPCAM
   3623 /**
   3624    @brief Starts reprocessing operation.
   3625  */
   3626 status_t CameraHal::reprocess(const char *params)
   3627 {
   3628     status_t ret = NO_ERROR;
   3629     int bufferCount = 0;
   3630     CameraAdapter::BuffersDescriptor desc;
   3631     CameraBuffer *reprocBuffers = NULL;
   3632     android::ShotParameters shotParams;
   3633     const char *valStr = NULL;
   3634     struct timeval startReprocess;
   3635 
   3636     android::AutoMutex lock(mLock);
   3637 
   3638     LOG_FUNCTION_NAME;
   3639 
   3640 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3641 
   3642     gettimeofday(&startReprocess, NULL);
   3643 
   3644 #endif
   3645 
   3646     // 0. Get tap in surface
   3647     if (strlen(params) > 0) {
   3648         android::String8 shotParams8(params);
   3649         shotParams.unflatten(shotParams8);
   3650     }
   3651 
   3652     valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_IN);
   3653     if (valStr != NULL) {
   3654         int index = -1;
   3655         for (unsigned int i = 0; i < mInAdapters.size(); i++) {
   3656             if(mInAdapters.itemAt(i)->match(valStr)) {
   3657                 index = i;
   3658                 break;
   3659             }
   3660         }
   3661         if (index < 0) {
   3662             CAMHAL_LOGE("Invalid tap in surface passed to camerahal");
   3663             return BAD_VALUE;
   3664         }
   3665         CAMHAL_LOGD("Found matching in adapter at %d", index);
   3666         mBufferSourceAdapter_In = mInAdapters.itemAt(index);
   3667     } else {
   3668         CAMHAL_LOGE("No tap in surface sent with shot config!");
   3669         return BAD_VALUE;
   3670     }
   3671 
   3672     // 1. Get buffers
   3673     if (mBufferSourceAdapter_In.get()) {
   3674         reprocBuffers = mBufferSourceAdapter_In->getBufferList(&bufferCount);
   3675     }
   3676 
   3677     if (!reprocBuffers) {
   3678         CAMHAL_LOGE("Error: couldn't get input buffers for reprocess()");
   3679         goto exit;
   3680     }
   3681 
   3682 
   3683 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3684 
   3685     CameraHal::PPM("Got reprocess buffers: ", &startReprocess);
   3686 
   3687 #endif
   3688 
   3689     // 2. Get buffer information and parse parameters
   3690     {
   3691         shotParams.setBurst(bufferCount);
   3692     }
   3693 
   3694 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3695 
   3696     memcpy(&reprocBuffers->ppmStamp, &startReprocess, sizeof(struct timeval));
   3697 
   3698 #endif
   3699 
   3700     // 3. Give buffer to camera adapter
   3701     desc.mBuffers = reprocBuffers;
   3702     desc.mOffsets = 0;
   3703     desc.mFd = 0;
   3704     desc.mLength = 0;
   3705     desc.mCount = (size_t) bufferCount;
   3706     desc.mMaxQueueable = (size_t) bufferCount;
   3707 
   3708     ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS, (int) &desc);
   3709     if (ret != NO_ERROR) {
   3710         CAMHAL_LOGE("Error calling camera use buffers");
   3711         goto exit;
   3712     }
   3713 
   3714 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3715 
   3716     CameraHal::PPM("Reprocess buffers registered: ", &startReprocess);
   3717 
   3718 #endif
   3719 
   3720     // 4. Start reprocessing
   3721     ret = mBufferSourceAdapter_In->enableDisplay(0, 0, NULL);
   3722     if (ret != NO_ERROR) {
   3723         CAMHAL_LOGE("Error enabling tap in point");
   3724         goto exit;
   3725     }
   3726 
   3727     // 5. Start capturing
   3728     ret = __takePicture(shotParams.flatten().string(), &startReprocess);
   3729 
   3730 exit:
   3731     return ret;
   3732 }
   3733 
   3734 /**
   3735    @brief Cancels current reprocessing operation
   3736 
   3737  */
   3738 status_t CameraHal::cancel_reprocess( )
   3739 {
   3740     LOG_FUNCTION_NAME;
   3741     status_t ret = NO_ERROR;
   3742 
   3743     ret = signalEndImageCapture();
   3744     return NO_ERROR;
   3745 }
   3746 #endif
   3747 
   3748 
   3749 void CameraHal::putParameters(char *parms)
   3750 {
   3751     free(parms);
   3752 }
   3753 
   3754 /**
   3755    @brief Send command to camera driver.
   3756 
   3757    @param none
   3758    @return NO_ERROR If the command succeeds
   3759    @todo Define the error codes that this function can return
   3760 
   3761  */
   3762 status_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
   3763 {
   3764     status_t ret = NO_ERROR;
   3765 
   3766     LOG_FUNCTION_NAME;
   3767 
   3768     if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
   3769         {
   3770         CAMHAL_LOGEA("No CameraAdapter instance");
   3771         return -EINVAL;
   3772         }
   3773 
   3774     ///////////////////////////////////////////////////////
   3775     // Following commands do NOT need preview to be started
   3776     ///////////////////////////////////////////////////////
   3777 
   3778     switch ( cmd ) {
   3779 #ifdef ANDROID_API_JB_OR_LATER
   3780     case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
   3781     {
   3782         const bool enable = static_cast<bool>(arg1);
   3783         android::AutoMutex lock(mLock);
   3784         if ( enable ) {
   3785             mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE;
   3786         } else {
   3787             mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE;
   3788         }
   3789     }
   3790         return OK;
   3791 #endif
   3792     }
   3793 
   3794     if ( ret == OK && !previewEnabled()
   3795 #ifdef OMAP_ENHANCEMENT_VTC
   3796             && (cmd != CAMERA_CMD_PREVIEW_INITIALIZATION)
   3797 #endif
   3798          ) {
   3799         CAMHAL_LOGEA("Preview is not running");
   3800         ret = -EINVAL;
   3801     }
   3802 
   3803     ///////////////////////////////////////////////////////
   3804     // Following commands NEED preview to be started
   3805     ///////////////////////////////////////////////////////
   3806 
   3807     if ( NO_ERROR == ret )
   3808         {
   3809         switch(cmd)
   3810             {
   3811             case CAMERA_CMD_START_SMOOTH_ZOOM:
   3812 
   3813                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
   3814 
   3815                 break;
   3816             case CAMERA_CMD_STOP_SMOOTH_ZOOM:
   3817 
   3818                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
   3819                 break;
   3820 
   3821             case CAMERA_CMD_START_FACE_DETECTION:
   3822 
   3823                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
   3824 
   3825                 break;
   3826 
   3827             case CAMERA_CMD_STOP_FACE_DETECTION:
   3828 
   3829                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
   3830 
   3831                 break;
   3832 
   3833 #ifdef OMAP_ENHANCEMENT_VTC
   3834             case CAMERA_CMD_PREVIEW_DEINITIALIZATION:
   3835                 if(mDisplayAdapter.get() != NULL) {
   3836                     ///Stop the buffer display first
   3837                     mDisplayAdapter->disableDisplay();
   3838                 }
   3839 
   3840                 if(mAppCallbackNotifier.get() != NULL) {
   3841                     //Stop the callback sending
   3842                     mAppCallbackNotifier->stop();
   3843                     mAppCallbackNotifier->flushAndReturnFrames();
   3844                     mAppCallbackNotifier->stopPreviewCallbacks();
   3845                 }
   3846 
   3847                 ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_DESTROY_TUNNEL);
   3848                 mTunnelSetup = false;
   3849 
   3850                 break;
   3851 
   3852             case CAMERA_CMD_PREVIEW_INITIALIZATION:
   3853                 ret = cameraPreviewInitialization();
   3854 
   3855                 break;
   3856 #endif
   3857 
   3858             default:
   3859                 break;
   3860             };
   3861         }
   3862 
   3863     LOG_FUNCTION_NAME_EXIT;
   3864 
   3865     return ret;
   3866 }
   3867 
   3868 /**
   3869    @brief Release the hardware resources owned by this object.
   3870 
   3871    Note that this is *not* done in the destructor.
   3872 
   3873    @param none
   3874    @return none
   3875 
   3876  */
   3877 void CameraHal::release()
   3878 {
   3879     LOG_FUNCTION_NAME;
   3880     ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
   3881     ///just before CameraHal object destruction
   3882     deinitialize();
   3883     LOG_FUNCTION_NAME_EXIT;
   3884 }
   3885 
   3886 
   3887 /**
   3888    @brief Dump state of the camera hardware
   3889 
   3890    @param[in] fd    File descriptor
   3891    @param[in] args  Arguments
   3892    @return NO_ERROR Dump succeeded
   3893    @todo  Error codes for dump fail
   3894 
   3895  */
   3896 status_t  CameraHal::dump(int fd) const
   3897 {
   3898     LOG_FUNCTION_NAME;
   3899     ///Implement this method when the h/w dump function is supported on Ducati side
   3900     return NO_ERROR;
   3901 }
   3902 
   3903 /*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
   3904 
   3905 
   3906 
   3907 
   3908 /*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
   3909 
   3910 /**
   3911    @brief Constructor of CameraHal
   3912 
   3913    Member variables are initialized here.  No allocations should be done here as we
   3914    don't use c++ exceptions in the code.
   3915 
   3916  */
   3917 CameraHal::CameraHal(int cameraId)
   3918 {
   3919     LOG_FUNCTION_NAME;
   3920 
   3921     ///Initialize all the member variables to their defaults
   3922     mPreviewEnabled = false;
   3923     mPreviewBuffers = NULL;
   3924     mImageBuffers = NULL;
   3925     mBufProvider = NULL;
   3926     mPreviewStartInProgress = false;
   3927     mVideoBuffers = NULL;
   3928     mVideoBufProvider = NULL;
   3929     mRecordingEnabled = false;
   3930     mDisplayPaused = false;
   3931     mSetPreviewWindowCalled = false;
   3932     mMsgEnabled = 0;
   3933     mAppCallbackNotifier = NULL;
   3934     mMemoryManager = NULL;
   3935     mCameraAdapter = NULL;
   3936     mBracketingEnabled = false;
   3937     mBracketingRunning = false;
   3938     mEventProvider = NULL;
   3939     mBracketRangePositive = 1;
   3940     mBracketRangeNegative = 1;
   3941     mMaxZoomSupported = 0;
   3942     mShutterEnabled = true;
   3943     mMeasurementEnabled = false;
   3944     mPreviewDataBuffers = NULL;
   3945     mCameraProperties = NULL;
   3946     mCurrentTime = 0;
   3947     mFalsePreview = 0;
   3948     mImageOffsets = NULL;
   3949     mImageLength = 0;
   3950     mImageFd = 0;
   3951     mImageCount = 0;
   3952     mVideoOffsets = NULL;
   3953     mVideoFd = 0;
   3954     mVideoLength = 0;
   3955     mPreviewDataOffsets = NULL;
   3956     mPreviewDataFd = 0;
   3957     mPreviewDataLength = 0;
   3958     mPreviewFd = 0;
   3959     mPreviewWidth = 0;
   3960     mPreviewHeight = 0;
   3961     mPreviewLength = 0;
   3962     mPreviewOffsets = NULL;
   3963     mPreviewRunning = 0;
   3964     mPreviewStateOld = 0;
   3965     mRecordingEnabled = 0;
   3966     mRecordEnabled = 0;
   3967     mSensorListener = NULL;
   3968     mVideoWidth = 0;
   3969     mVideoHeight = 0;
   3970 #ifdef OMAP_ENHANCEMENT_VTC
   3971     mVTCUseCase = false;
   3972     mTunnelSetup = false;
   3973 #endif
   3974     mPreviewInitializationDone = false;
   3975 
   3976 #ifdef OMAP_ENHANCEMENT_CPCAM
   3977     mExtendedPreviewStreamOps = 0;
   3978 #endif
   3979 
   3980     //These values depends on the sensor characteristics
   3981 
   3982     mRawCapture = false;
   3983 
   3984 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   3985 
   3986     //Initialize the CameraHAL constructor timestamp, which is used in the
   3987     // PPM() method as time reference if the user does not supply one.
   3988     gettimeofday(&ppm_start, NULL);
   3989 
   3990 #endif
   3991 
   3992     mCameraIndex = cameraId;
   3993 
   3994     LOG_FUNCTION_NAME_EXIT;
   3995 }
   3996 
   3997 /**
   3998    @brief Destructor of CameraHal
   3999 
   4000    This function simply calls deinitialize() to free up memory allocate during construct
   4001    phase
   4002  */
   4003 CameraHal::~CameraHal()
   4004 {
   4005     LOG_FUNCTION_NAME;
   4006 
   4007     ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
   4008     deinitialize();
   4009 
   4010     if ( NULL != mEventProvider )
   4011         {
   4012         mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
   4013         delete mEventProvider;
   4014         mEventProvider = NULL;
   4015         }
   4016 
   4017     /// Free the callback notifier
   4018     mAppCallbackNotifier.clear();
   4019 
   4020     /// Free the display adapter
   4021     mDisplayAdapter.clear();
   4022 
   4023     if ( NULL != mCameraAdapter ) {
   4024         int strongCount = mCameraAdapter->getStrongCount();
   4025 
   4026         mCameraAdapter->decStrong(mCameraAdapter);
   4027 
   4028         mCameraAdapter = NULL;
   4029     }
   4030 
   4031     freeImageBufs();
   4032     freeRawBufs();
   4033 
   4034     /// Free the memory manager
   4035     mMemoryManager.clear();
   4036 
   4037     LOG_FUNCTION_NAME_EXIT;
   4038 }
   4039 
   4040 /**
   4041    @brief Initialize the Camera HAL
   4042 
   4043    Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
   4044 
   4045    @param None
   4046    @return NO_ERROR - On success
   4047          NO_MEMORY - On failure to allocate memory for any of the objects
   4048    @remarks Camera Hal internal function
   4049 
   4050  */
   4051 
   4052 status_t CameraHal::initialize(CameraProperties::Properties* properties)
   4053 {
   4054     LOG_FUNCTION_NAME;
   4055 
   4056     int sensor_index = 0;
   4057     const char* sensor_name = NULL;
   4058 
   4059     ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
   4060     ///Currently, registering all events as to be coming from CameraAdapter
   4061     int32_t eventMask = CameraHalEvent::ALL_EVENTS;
   4062 
   4063     // Get my camera properties
   4064     mCameraProperties = properties;
   4065 
   4066     if(!mCameraProperties)
   4067     {
   4068         goto fail_loop;
   4069     }
   4070 
   4071     // Dump the properties of this Camera
   4072     // will only print if DEBUG macro is defined
   4073     mCameraProperties->dump();
   4074 
   4075     if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
   4076         {
   4077         sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
   4078         }
   4079 
   4080     if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_NAME)) != 0 ) {
   4081         sensor_name = mCameraProperties->get(CameraProperties::CAMERA_NAME);
   4082     }
   4083     CAMHAL_LOGDB("Sensor index= %d; Sensor name= %s", sensor_index, sensor_name);
   4084 
   4085     if (strcmp(sensor_name, V4L_CAMERA_NAME_USB) == 0) {
   4086 #ifdef V4L_CAMERA_ADAPTER
   4087         mCameraAdapter = V4LCameraAdapter_Factory(sensor_index);
   4088 #endif
   4089     }
   4090     else {
   4091 #ifdef OMX_CAMERA_ADAPTER
   4092         mCameraAdapter = OMXCameraAdapter_Factory(sensor_index);
   4093 #endif
   4094     }
   4095 
   4096     if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
   4097         {
   4098         CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
   4099         mCameraAdapter = NULL;
   4100         goto fail_loop;
   4101         }
   4102 
   4103     mCameraAdapter->incStrong(mCameraAdapter);
   4104     mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
   4105     mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
   4106 
   4107     if(!mAppCallbackNotifier.get())
   4108         {
   4109         /// Create the callback notifier
   4110         mAppCallbackNotifier = new AppCallbackNotifier();
   4111         if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
   4112             {
   4113             CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
   4114             goto fail_loop;
   4115             }
   4116         }
   4117 
   4118     if(!mMemoryManager.get())
   4119         {
   4120         /// Create Memory Manager
   4121         mMemoryManager = new MemoryManager();
   4122         if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
   4123             {
   4124             CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
   4125             goto fail_loop;
   4126             }
   4127         }
   4128 
   4129     ///Setup the class dependencies...
   4130 
   4131     ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
   4132     ///CameraAdapter is the one which provides those events
   4133     ///Set it as the frame and event providers for AppCallbackNotifier
   4134     ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
   4135     ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
   4136     ///         for any event
   4137     mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
   4138     mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
   4139 
   4140     ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
   4141     ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
   4142     ///Set it as the error handler for CameraAdapter
   4143     mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
   4144 
   4145     ///Start the callback notifier
   4146     if(mAppCallbackNotifier->start() != NO_ERROR)
   4147       {
   4148         CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
   4149         goto fail_loop;
   4150       }
   4151 
   4152     CAMHAL_LOGDA("Started AppCallbackNotifier..");
   4153     mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
   4154 
   4155     ///Initialize default parameters
   4156     initDefaultParameters();
   4157 
   4158 
   4159     if ( setParameters(mParameters) != NO_ERROR )
   4160         {
   4161         CAMHAL_LOGEA("Failed to set default parameters?!");
   4162         }
   4163 
   4164     // register for sensor events
   4165     mSensorListener = new SensorListener();
   4166     if (mSensorListener.get()) {
   4167         if (mSensorListener->initialize() == NO_ERROR) {
   4168             mSensorListener->setCallbacks(orientation_cb, this);
   4169             mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
   4170         } else {
   4171             CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
   4172             mSensorListener.clear();
   4173             mSensorListener = NULL;
   4174         }
   4175     }
   4176 
   4177     LOG_FUNCTION_NAME_EXIT;
   4178 
   4179     return NO_ERROR;
   4180 
   4181     fail_loop:
   4182 
   4183         ///Free up the resources because we failed somewhere up
   4184         deinitialize();
   4185         LOG_FUNCTION_NAME_EXIT;
   4186 
   4187         return NO_MEMORY;
   4188 
   4189 }
   4190 
   4191 bool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
   4192 {
   4193     bool ret = false;
   4194     status_t status = NO_ERROR;
   4195     char tmpBuffer[MAX_PROP_VALUE_LENGTH];
   4196     char *pos = NULL;
   4197 
   4198     LOG_FUNCTION_NAME;
   4199 
   4200     if (NULL == supportedResolutions) {
   4201         CAMHAL_LOGEA("Invalid supported resolutions string");
   4202         goto exit;
   4203     }
   4204 
   4205     status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%dx%d", width, height);
   4206     if (0 > status) {
   4207         CAMHAL_LOGEA("Error encountered while generating validation string");
   4208         goto exit;
   4209     }
   4210 
   4211     ret = isParameterValid(tmpBuffer, supportedResolutions);
   4212 
   4213 exit:
   4214     LOG_FUNCTION_NAME_EXIT;
   4215 
   4216     return ret;
   4217 }
   4218 
   4219 bool CameraHal::isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges)
   4220 {
   4221     bool ret = false;
   4222     char supported[MAX_PROP_VALUE_LENGTH];
   4223     char *pos;
   4224     int suppFpsRangeArray[2];
   4225     int i = 0;
   4226 
   4227     LOG_FUNCTION_NAME;
   4228 
   4229     if ( NULL == supportedFpsRanges ) {
   4230         CAMHAL_LOGEA("Invalid supported FPS ranges string");
   4231         return false;
   4232     }
   4233 
   4234     if (fpsMin <= 0 || fpsMax <= 0 || fpsMin > fpsMax) {
   4235         return false;
   4236     }
   4237 
   4238     strncpy(supported, supportedFpsRanges, MAX_PROP_VALUE_LENGTH);
   4239     pos = strtok(supported, " (,)");
   4240     while (pos != NULL) {
   4241         suppFpsRangeArray[i] = atoi(pos);
   4242         if (i++) {
   4243             if (fpsMin >= suppFpsRangeArray[0] && fpsMax <= suppFpsRangeArray[1]) {
   4244                 ret = true;
   4245                 break;
   4246             }
   4247             i = 0;
   4248         }
   4249         pos = strtok(NULL, " (,)");
   4250     }
   4251 
   4252     LOG_FUNCTION_NAME_EXIT;
   4253 
   4254     return ret;
   4255 }
   4256 
   4257 bool CameraHal::isParameterValid(const char *param, const char *supportedParams)
   4258 {
   4259     bool ret = false;
   4260     char *pos;
   4261     char supported[MAX_PROP_VALUE_LENGTH];
   4262 
   4263     LOG_FUNCTION_NAME;
   4264 
   4265     if (NULL == supportedParams) {
   4266         CAMHAL_LOGEA("Invalid supported parameters string");
   4267         goto exit;
   4268     }
   4269 
   4270     if (NULL == param) {
   4271         CAMHAL_LOGEA("Invalid parameter string");
   4272         goto exit;
   4273     }
   4274 
   4275     strncpy(supported, supportedParams, MAX_PROP_VALUE_LENGTH - 1);
   4276 
   4277     pos = strtok(supported, ",");
   4278     while (pos != NULL) {
   4279         if (!strcmp(pos, param)) {
   4280             ret = true;
   4281             break;
   4282         }
   4283         pos = strtok(NULL, ",");
   4284     }
   4285 
   4286 exit:
   4287     LOG_FUNCTION_NAME_EXIT;
   4288 
   4289     return ret;
   4290 }
   4291 
   4292 bool CameraHal::isParameterValid(int param, const char *supportedParams)
   4293 {
   4294     bool ret = false;
   4295     status_t status;
   4296     char tmpBuffer[MAX_PROP_VALUE_LENGTH];
   4297 
   4298     LOG_FUNCTION_NAME;
   4299 
   4300     if (NULL == supportedParams) {
   4301         CAMHAL_LOGEA("Invalid supported parameters string");
   4302         goto exit;
   4303     }
   4304 
   4305     status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%d", param);
   4306     if (0 > status) {
   4307         CAMHAL_LOGEA("Error encountered while generating validation string");
   4308         goto exit;
   4309     }
   4310 
   4311     ret = isParameterValid(tmpBuffer, supportedParams);
   4312 
   4313 exit:
   4314     LOG_FUNCTION_NAME_EXIT;
   4315 
   4316     return ret;
   4317 }
   4318 
   4319 status_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
   4320     if (!new_param || !old_param) {
   4321         return -EINVAL;
   4322     }
   4323 
   4324     // if params mismatch we should update parameters for camera adapter
   4325     if ((strcmp(new_param, old_param) != 0)) {
   4326        update = true;
   4327     }
   4328 
   4329    return NO_ERROR;
   4330 }
   4331 
   4332 status_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
   4333 {
   4334     status_t ret = NO_ERROR;
   4335     char *ctx, *pWidth, *pHeight;
   4336     const char *sep = "x";
   4337 
   4338     LOG_FUNCTION_NAME;
   4339 
   4340     if ( NULL == resStr )
   4341         {
   4342         return -EINVAL;
   4343         }
   4344 
   4345     //This fixes "Invalid input resolution"
   4346     char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
   4347     if ( NULL != resStr_copy )
   4348         {
   4349         strcpy(resStr_copy, resStr);
   4350         pWidth = strtok_r(resStr_copy, sep, &ctx);
   4351 
   4352         if ( NULL != pWidth )
   4353             {
   4354             width = atoi(pWidth);
   4355             }
   4356         else
   4357             {
   4358             CAMHAL_LOGEB("Invalid input resolution %s", resStr);
   4359             ret = -EINVAL;
   4360             }
   4361         }
   4362 
   4363     if ( NO_ERROR == ret )
   4364         {
   4365         pHeight = strtok_r(NULL, sep, &ctx);
   4366 
   4367         if ( NULL != pHeight )
   4368             {
   4369             height = atoi(pHeight);
   4370             }
   4371         else
   4372             {
   4373             CAMHAL_LOGEB("Invalid input resolution %s", resStr);
   4374             ret = -EINVAL;
   4375             }
   4376         }
   4377 
   4378     free(resStr_copy);
   4379     resStr_copy = NULL;
   4380 
   4381     LOG_FUNCTION_NAME_EXIT;
   4382 
   4383     return ret;
   4384 }
   4385 
   4386 void CameraHal::insertSupportedParams()
   4387 {
   4388     LOG_FUNCTION_NAME;
   4389 
   4390     android::CameraParameters &p = mParameters;
   4391 
   4392     ///Set the name of the camera
   4393     p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
   4394 
   4395     mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
   4396 
   4397     p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
   4398     p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
   4399     p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
   4400     p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
   4401     p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES));
   4402     p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES));
   4403     p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES));
   4404     p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES));
   4405     p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES));
   4406     p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES));
   4407     p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
   4408     p.set(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES_EXT));
   4409     p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
   4410     p.set(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_EXT_SUPPORTED));
   4411     p.set(android::CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
   4412     p.set(android::CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
   4413     p.set(android::CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
   4414     p.set(android::CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
   4415     p.set(android::CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
   4416     p.set(android::CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
   4417     p.set(android::CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
   4418     p.set(android::CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
   4419     p.set(android::CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
   4420     p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
   4421     p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
   4422     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
   4423     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX));
   4424     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP));
   4425     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
   4426     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX));
   4427     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP));
   4428     p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
   4429     p.set(android::CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
   4430     p.set(android::CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
   4431     p.set(android::CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
   4432     p.set(android::CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
   4433     p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
   4434     p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES));
   4435     p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES));
   4436     p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE_VALUES, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE_VALUES));
   4437     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN));
   4438     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX));
   4439     p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_STEP));
   4440     p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
   4441     p.set(TICameraParameters::KEY_VNF_SUPPORTED, mCameraProperties->get(CameraProperties::VNF_SUPPORTED));
   4442     p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
   4443     p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
   4444     p.set(android::CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
   4445     p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED));
   4446     p.set(TICameraParameters::KEY_CAP_MODE_VALUES, mCameraProperties->get(CameraProperties::CAP_MODE_VALUES));
   4447 
   4448     LOG_FUNCTION_NAME_EXIT;
   4449 
   4450 }
   4451 
   4452 void CameraHal::initDefaultParameters()
   4453 {
   4454     //Purpose of this function is to initialize the default current and supported parameters for the currently
   4455     //selected camera.
   4456 
   4457     android::CameraParameters &p = mParameters;
   4458     int currentRevision, adapterRevision;
   4459     status_t ret = NO_ERROR;
   4460     int width, height;
   4461     const char *valstr;
   4462 
   4463     LOG_FUNCTION_NAME;
   4464 
   4465     insertSupportedParams();
   4466 
   4467     ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
   4468 
   4469     if ( NO_ERROR == ret )
   4470         {
   4471         p.setPreviewSize(width, height);
   4472         }
   4473     else
   4474         {
   4475         p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
   4476         }
   4477 
   4478     ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
   4479 
   4480     if ( NO_ERROR == ret )
   4481         {
   4482         p.setPictureSize(width, height);
   4483         }
   4484     else
   4485         {
   4486         p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
   4487         }
   4488 
   4489     ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
   4490 
   4491     if ( NO_ERROR == ret )
   4492         {
   4493         p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
   4494         p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
   4495         }
   4496     else
   4497         {
   4498         p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
   4499         p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
   4500         }
   4501 
   4502     //Insert default values
   4503     p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
   4504     p.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
   4505     p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
   4506     p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
   4507     p.set(android::CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
   4508     p.set(android::CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
   4509     p.set(android::CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
   4510     p.set(android::CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
   4511     p.set(android::CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
   4512     p.set(android::CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
   4513     p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
   4514     p.set(android::CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
   4515     p.set(android::CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
   4516     p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
   4517     p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
   4518     p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
   4519     p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
   4520     p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
   4521     p.set(TICameraParameters::KEY_MANUAL_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
   4522     p.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN));
   4523     p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
   4524     p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN));
   4525     p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
   4526     p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
   4527     p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
   4528     p.set(TICameraParameters::KEY_GBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GBCE));
   4529     p.set(TICameraParameters::KEY_GLBCE, mCameraProperties->get(CameraProperties::GLBCE));
   4530     p.set(TICameraParameters::KEY_GLBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE));
   4531     p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT));
   4532     p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT));
   4533     p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
   4534     p.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, mCameraProperties->get(CameraProperties::MANUAL_CONVERGENCE));
   4535     p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
   4536     p.set(TICameraParameters::KEY_VNF, mCameraProperties->get(CameraProperties::VNF));
   4537     p.set(android::CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
   4538     p.set(android::CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
   4539     p.set(android::CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
   4540     p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
   4541     p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
   4542     p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
   4543     p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
   4544     p.set(android::CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
   4545     p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
   4546     p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
   4547     p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION));
   4548     // Only one area a.k.a Touch AF for now.
   4549     // TODO: Add support for multiple focus areas.
   4550     p.set(android::CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
   4551     p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
   4552     p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
   4553     p.set(android::CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
   4554     p.set(TICameraParameters::RAW_WIDTH, mCameraProperties->get(CameraProperties::RAW_WIDTH));
   4555     p.set(TICameraParameters::RAW_HEIGHT,mCameraProperties->get(CameraProperties::RAW_HEIGHT));
   4556 
   4557     // TI extensions for enable/disable algos
   4558     // Hadcoded for now
   4559     p.set(TICameraParameters::KEY_ALGO_EXTERNAL_GAMMA, android::CameraParameters::FALSE);
   4560     p.set(TICameraParameters::KEY_ALGO_NSF1, android::CameraParameters::TRUE);
   4561     p.set(TICameraParameters::KEY_ALGO_NSF2, android::CameraParameters::TRUE);
   4562     p.set(TICameraParameters::KEY_ALGO_SHARPENING, android::CameraParameters::TRUE);
   4563     p.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, android::CameraParameters::TRUE);
   4564     p.set(TICameraParameters::KEY_ALGO_GIC, android::CameraParameters::TRUE);
   4565 
   4566     LOG_FUNCTION_NAME_EXIT;
   4567 }
   4568 
   4569 /**
   4570    @brief Stop a previously started preview.
   4571    @param none
   4572    @return none
   4573 
   4574  */
   4575 void CameraHal::forceStopPreview()
   4576 {
   4577     LOG_FUNCTION_NAME;
   4578 
   4579     // stop bracketing if it is running
   4580     if ( mBracketingRunning ) {
   4581         stopImageBracketing();
   4582     }
   4583 
   4584     if(mDisplayAdapter.get() != NULL) {
   4585         ///Stop the buffer display first
   4586         mDisplayAdapter->disableDisplay();
   4587     }
   4588 
   4589     if(mAppCallbackNotifier.get() != NULL) {
   4590         //Stop the callback sending
   4591         mAppCallbackNotifier->stop();
   4592         mAppCallbackNotifier->flushAndReturnFrames();
   4593         mAppCallbackNotifier->stopPreviewCallbacks();
   4594     }
   4595 
   4596     if ( NULL != mCameraAdapter ) {
   4597         // only need to send these control commands to state machine if we are
   4598         // passed the LOADED_PREVIEW_STATE
   4599         if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) {
   4600            // according to javadoc...FD should be stopped in stopPreview
   4601            // and application needs to call startFaceDection again
   4602            // to restart FD
   4603            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
   4604         }
   4605 
   4606         mCameraAdapter->rollbackToInitializedState();
   4607 
   4608     }
   4609 
   4610     freePreviewBufs();
   4611     freePreviewDataBufs();
   4612 
   4613     mPreviewEnabled = false;
   4614     mDisplayPaused = false;
   4615     mPreviewStartInProgress = false;
   4616 
   4617     LOG_FUNCTION_NAME_EXIT;
   4618 }
   4619 
   4620 /**
   4621    @brief Deallocates memory for all the resources held by Camera HAL.
   4622 
   4623    Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
   4624    and Memory Manager
   4625 
   4626    @param none
   4627    @return none
   4628 
   4629  */
   4630 void CameraHal::deinitialize()
   4631 {
   4632     LOG_FUNCTION_NAME;
   4633 
   4634     if ( mPreviewEnabled || mDisplayPaused ) {
   4635         forceStopPreview();
   4636     }
   4637 
   4638     mSetPreviewWindowCalled = false;
   4639 
   4640     if (mSensorListener.get()) {
   4641         mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
   4642         mSensorListener.clear();
   4643         mSensorListener = NULL;
   4644     }
   4645 
   4646     mBufferSourceAdapter_Out.clear();
   4647     mBufferSourceAdapter_In.clear();
   4648     mOutAdapters.clear();
   4649     mInAdapters.clear();
   4650 
   4651     LOG_FUNCTION_NAME_EXIT;
   4652 
   4653 }
   4654 
   4655 status_t CameraHal::storeMetaDataInBuffers(bool enable)
   4656 {
   4657     LOG_FUNCTION_NAME;
   4658 
   4659     return mAppCallbackNotifier->useMetaDataBufferMode(enable);
   4660 
   4661     LOG_FUNCTION_NAME_EXIT;
   4662 }
   4663 
   4664 void CameraHal::getPreferredPreviewRes(int *width, int *height)
   4665 {
   4666     LOG_FUNCTION_NAME;
   4667 
   4668     // We request Ducati for a higher resolution so preview looks better and then downscale the frame before the callback.
   4669     // TODO: This should be moved to configuration constants and boolean flag whether to provide such optimization
   4670     // Also consider providing this configurability of the desired display resolution from the application
   4671     if ( ( *width == 320 ) && ( *height == 240 ) ) {
   4672         *width = 640;
   4673         *height = 480;
   4674     } else if ( ( *width == 176 ) && ( *height == 144 ) ) {
   4675         *width = 704;
   4676         *height = 576;
   4677     }
   4678 
   4679     LOG_FUNCTION_NAME_EXIT;
   4680 }
   4681 
   4682 void CameraHal::resetPreviewRes(android::CameraParameters *params)
   4683 {
   4684   LOG_FUNCTION_NAME;
   4685 
   4686   if ( (mVideoWidth <= 320) && (mVideoHeight <= 240)){
   4687     params->setPreviewSize(mVideoWidth, mVideoHeight);
   4688   }
   4689 
   4690   LOG_FUNCTION_NAME_EXIT;
   4691 }
   4692 
   4693 void *
   4694 camera_buffer_get_omx_ptr (CameraBuffer *buffer)
   4695 {
   4696     CAMHAL_LOGV("buffer_type %d opaque %p", buffer->type, buffer->opaque);
   4697 
   4698     if (buffer->type == CAMERA_BUFFER_ANW) {
   4699         buffer_handle_t *handle = (buffer_handle_t *)buffer->opaque;
   4700         CAMHAL_LOGV("anw %08x", *handle);
   4701         return (void *)*handle;
   4702     } else if (buffer->type == CAMERA_BUFFER_ION) {
   4703         return (void *)buffer->fd;
   4704     } else {
   4705         CAMHAL_LOGV("other %08x", buffer->opaque);
   4706         return (void *)buffer->opaque;
   4707     }
   4708 }
   4709 
   4710 } // namespace Camera
   4711 } // namespace Ti
   4712