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 #include "BaseCameraAdapter.h"
     18 
     19 const int EVENT_MASK = 0xffff;
     20 
     21 namespace Ti {
     22 namespace Camera {
     23 
     24 const LUT cameraCommandsUserToHAL[] = {
     25     { "CAMERA_START_PREVIEW",                   CameraAdapter::CAMERA_START_PREVIEW },
     26     { "CAMERA_STOP_PREVIEW",                    CameraAdapter::CAMERA_STOP_PREVIEW },
     27     { "CAMERA_START_VIDEO",                     CameraAdapter::CAMERA_START_VIDEO },
     28     { "CAMERA_STOP_VIDEO",                      CameraAdapter::CAMERA_STOP_VIDEO },
     29     { "CAMERA_START_IMAGE_CAPTURE",             CameraAdapter::CAMERA_START_IMAGE_CAPTURE },
     30     { "CAMERA_STOP_IMAGE_CAPTURE",              CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE },
     31     { "CAMERA_PERFORM_AUTOFOCUS",               CameraAdapter::CAMERA_PERFORM_AUTOFOCUS },
     32     { "CAMERA_CANCEL_AUTOFOCUS",                CameraAdapter::CAMERA_CANCEL_AUTOFOCUS },
     33     { "CAMERA_PREVIEW_FLUSH_BUFFERS",           CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS },
     34     { "CAMERA_START_SMOOTH_ZOOM",               CameraAdapter::CAMERA_START_SMOOTH_ZOOM },
     35     { "CAMERA_STOP_SMOOTH_ZOOM",                CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM },
     36     { "CAMERA_USE_BUFFERS_PREVIEW",             CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW },
     37     { "CAMERA_SET_TIMEOUT",                     CameraAdapter::CAMERA_SET_TIMEOUT },
     38     { "CAMERA_CANCEL_TIMEOUT",                  CameraAdapter::CAMERA_CANCEL_TIMEOUT },
     39     { "CAMERA_START_BRACKET_CAPTURE",           CameraAdapter::CAMERA_START_BRACKET_CAPTURE },
     40     { "CAMERA_STOP_BRACKET_CAPTURE",            CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE },
     41     { "CAMERA_QUERY_RESOLUTION_PREVIEW",        CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW },
     42     { "CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE", CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE },
     43     { "CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA",  CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA },
     44     { "CAMERA_USE_BUFFERS_IMAGE_CAPTURE",       CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE },
     45     { "CAMERA_USE_BUFFERS_PREVIEW_DATA",        CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA },
     46     { "CAMERA_TIMEOUT_EXPIRED",                 CameraAdapter::CAMERA_TIMEOUT_EXPIRED },
     47     { "CAMERA_START_FD",                        CameraAdapter::CAMERA_START_FD },
     48     { "CAMERA_STOP_FD",                         CameraAdapter::CAMERA_STOP_FD },
     49     { "CAMERA_SWITCH_TO_EXECUTING",             CameraAdapter::CAMERA_SWITCH_TO_EXECUTING },
     50     { "CAMERA_USE_BUFFERS_VIDEO_CAPTURE",       CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE },
     51 #ifdef OMAP_ENHANCEMENT_CPCAM
     52     { "CAMERA_USE_BUFFERS_REPROCESS",           CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS },
     53     { "CAMERA_START_REPROCESS",                 CameraAdapter::CAMERA_START_REPROCESS },
     54 #endif
     55 };
     56 
     57 const LUTtypeHAL CamCommandsLUT = {
     58     sizeof(cameraCommandsUserToHAL)/sizeof(cameraCommandsUserToHAL[0]),
     59     cameraCommandsUserToHAL
     60 };
     61 
     62 /*--------------------Camera Adapter Class STARTS here-----------------------------*/
     63 
     64 BaseCameraAdapter::BaseCameraAdapter()
     65 {
     66     mReleaseImageBuffersCallback = NULL;
     67     mEndImageCaptureCallback = NULL;
     68     mErrorNotifier = NULL;
     69     mEndCaptureData = NULL;
     70     mReleaseData = NULL;
     71     mRecording = false;
     72 
     73     mPreviewBuffers = NULL;
     74     mPreviewBufferCount = 0;
     75     mPreviewBuffersLength = 0;
     76 
     77     mVideoBuffers = NULL;
     78     mVideoBuffersCount = 0;
     79     mVideoBuffersLength = 0;
     80 
     81     mCaptureBuffers = NULL;
     82     mCaptureBuffersCount = 0;
     83     mCaptureBuffersLength = 0;
     84 
     85     mPreviewDataBuffers = NULL;
     86     mPreviewDataBuffersCount = 0;
     87     mPreviewDataBuffersLength = 0;
     88 
     89     mAdapterState = INTIALIZED_STATE;
     90 
     91     mSharedAllocator = NULL;
     92 
     93 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
     94     mStartFocus.tv_sec = 0;
     95     mStartFocus.tv_usec = 0;
     96     mStartCapture.tv_sec = 0;
     97     mStartCapture.tv_usec = 0;
     98 #endif
     99 
    100 }
    101 
    102 BaseCameraAdapter::~BaseCameraAdapter()
    103 {
    104      LOG_FUNCTION_NAME;
    105 
    106      android::AutoMutex lock(mSubscriberLock);
    107 
    108      mFrameSubscribers.clear();
    109      mImageSubscribers.clear();
    110      mRawSubscribers.clear();
    111      mVideoSubscribers.clear();
    112      mVideoInSubscribers.clear();
    113      mFocusSubscribers.clear();
    114      mShutterSubscribers.clear();
    115      mZoomSubscribers.clear();
    116      mSnapshotSubscribers.clear();
    117      mMetadataSubscribers.clear();
    118 
    119      LOG_FUNCTION_NAME_EXIT;
    120 }
    121 
    122 status_t BaseCameraAdapter::registerImageReleaseCallback(release_image_buffers_callback callback, void *user_data)
    123 {
    124     status_t ret = NO_ERROR;
    125 
    126     LOG_FUNCTION_NAME;
    127 
    128     mReleaseImageBuffersCallback = callback;
    129     mReleaseData = user_data;
    130 
    131     LOG_FUNCTION_NAME_EXIT;
    132 
    133     return ret;
    134 }
    135 
    136 status_t BaseCameraAdapter::registerEndCaptureCallback(end_image_capture_callback callback, void *user_data)
    137 {
    138     status_t ret = NO_ERROR;
    139 
    140     LOG_FUNCTION_NAME;
    141 
    142     mEndImageCaptureCallback= callback;
    143     mEndCaptureData = user_data;
    144 
    145     LOG_FUNCTION_NAME_EXIT;
    146 
    147     return ret;
    148 }
    149 
    150 status_t BaseCameraAdapter::setErrorHandler(ErrorNotifier *errorNotifier)
    151 {
    152     status_t ret = NO_ERROR;
    153 
    154     LOG_FUNCTION_NAME;
    155 
    156     if ( NULL == errorNotifier )
    157         {
    158         CAMHAL_LOGEA("Invalid Error Notifier reference");
    159         ret = -EINVAL;
    160         }
    161 
    162     if ( NO_ERROR == ret )
    163         {
    164         mErrorNotifier = errorNotifier;
    165         }
    166 
    167     LOG_FUNCTION_NAME_EXIT;
    168 
    169     return ret;
    170 }
    171 
    172 void BaseCameraAdapter::enableMsgType(int32_t msgs, frame_callback callback, event_callback eventCb, void* cookie)
    173 {
    174     android::AutoMutex lock(mSubscriberLock);
    175 
    176     LOG_FUNCTION_NAME;
    177 
    178     int32_t frameMsg = ((msgs >> MessageNotifier::FRAME_BIT_FIELD_POSITION) & EVENT_MASK);
    179     int32_t eventMsg = ((msgs >> MessageNotifier::EVENT_BIT_FIELD_POSITION) & EVENT_MASK);
    180 
    181     if ( frameMsg != 0 )
    182         {
    183         CAMHAL_LOGVB("Frame message type id=0x%x subscription request", frameMsg);
    184         switch ( frameMsg )
    185             {
    186             case CameraFrame::PREVIEW_FRAME_SYNC:
    187                 mFrameSubscribers.add((int) cookie, callback);
    188                 break;
    189             case CameraFrame::FRAME_DATA_SYNC:
    190                 mFrameDataSubscribers.add((int) cookie, callback);
    191                 break;
    192             case CameraFrame::SNAPSHOT_FRAME:
    193                 mSnapshotSubscribers.add((int) cookie, callback);
    194                 break;
    195             case CameraFrame::IMAGE_FRAME:
    196                 mImageSubscribers.add((int) cookie, callback);
    197                 break;
    198             case CameraFrame::RAW_FRAME:
    199                 mRawSubscribers.add((int) cookie, callback);
    200                 break;
    201             case CameraFrame::VIDEO_FRAME_SYNC:
    202                 mVideoSubscribers.add((int) cookie, callback);
    203                 break;
    204             case CameraFrame::REPROCESS_INPUT_FRAME:
    205                 mVideoInSubscribers.add((int) cookie, callback);
    206                 break;
    207             default:
    208                 CAMHAL_LOGEA("Frame message type id=0x%x subscription no supported yet!", frameMsg);
    209                 break;
    210             }
    211         }
    212 
    213     if ( eventMsg != 0)
    214         {
    215         CAMHAL_LOGVB("Event message type id=0x%x subscription request", eventMsg);
    216         if ( CameraHalEvent::ALL_EVENTS == eventMsg )
    217             {
    218             mFocusSubscribers.add((int) cookie, eventCb);
    219             mShutterSubscribers.add((int) cookie, eventCb);
    220             mZoomSubscribers.add((int) cookie, eventCb);
    221             mMetadataSubscribers.add((int) cookie, eventCb);
    222             }
    223         else
    224             {
    225             CAMHAL_LOGEA("Event message type id=0x%x subscription no supported yet!", eventMsg);
    226             }
    227         }
    228 
    229     LOG_FUNCTION_NAME_EXIT;
    230 }
    231 
    232 void BaseCameraAdapter::disableMsgType(int32_t msgs, void* cookie)
    233 {
    234     android::AutoMutex lock(mSubscriberLock);
    235 
    236     LOG_FUNCTION_NAME;
    237 
    238     int32_t frameMsg = ((msgs >> MessageNotifier::FRAME_BIT_FIELD_POSITION) & EVENT_MASK);
    239     int32_t eventMsg = ((msgs >> MessageNotifier::EVENT_BIT_FIELD_POSITION) & EVENT_MASK);
    240 
    241     if ( frameMsg != 0 )
    242         {
    243         CAMHAL_LOGVB("Frame message type id=0x%x remove subscription request", frameMsg);
    244         switch ( frameMsg )
    245             {
    246             case CameraFrame::PREVIEW_FRAME_SYNC:
    247                 mFrameSubscribers.removeItem((int) cookie);
    248                 break;
    249             case CameraFrame::FRAME_DATA_SYNC:
    250                 mFrameDataSubscribers.removeItem((int) cookie);
    251                 break;
    252             case CameraFrame::SNAPSHOT_FRAME:
    253                 mSnapshotSubscribers.removeItem((int) cookie);
    254                 break;
    255             case CameraFrame::IMAGE_FRAME:
    256                 mImageSubscribers.removeItem((int) cookie);
    257                 break;
    258             case CameraFrame::RAW_FRAME:
    259                 mRawSubscribers.removeItem((int) cookie);
    260                 break;
    261             case CameraFrame::VIDEO_FRAME_SYNC:
    262                 mVideoSubscribers.removeItem((int) cookie);
    263                 break;
    264             case CameraFrame::REPROCESS_INPUT_FRAME:
    265                 mVideoInSubscribers.removeItem((int) cookie);
    266                 break;
    267             case CameraFrame::ALL_FRAMES:
    268                 mFrameSubscribers.removeItem((int) cookie);
    269                 mFrameDataSubscribers.removeItem((int) cookie);
    270                 mSnapshotSubscribers.removeItem((int) cookie);
    271                 mImageSubscribers.removeItem((int) cookie);
    272                 mRawSubscribers.removeItem((int) cookie);
    273                 mVideoSubscribers.removeItem((int) cookie);
    274                 mVideoInSubscribers.removeItem((int) cookie);
    275                 break;
    276             default:
    277                 CAMHAL_LOGEA("Frame message type id=0x%x subscription remove not supported yet!", frameMsg);
    278                 break;
    279             }
    280         }
    281 
    282     if ( eventMsg != 0 )
    283         {
    284         CAMHAL_LOGVB("Event message type id=0x%x remove subscription request", eventMsg);
    285         if ( CameraHalEvent::ALL_EVENTS == eventMsg)
    286             {
    287             //TODO: Process case by case
    288             mFocusSubscribers.removeItem((int) cookie);
    289             mShutterSubscribers.removeItem((int) cookie);
    290             mZoomSubscribers.removeItem((int) cookie);
    291             mMetadataSubscribers.removeItem((int) cookie);
    292             }
    293         else
    294             {
    295             CAMHAL_LOGEA("Event message type id=0x%x subscription remove not supported yet!", eventMsg);
    296             }
    297         }
    298 
    299     LOG_FUNCTION_NAME_EXIT;
    300 }
    301 
    302 void BaseCameraAdapter::addFramePointers(CameraBuffer *frameBuf, void *buf)
    303 {
    304   unsigned int *pBuf = (unsigned int *)buf;
    305   android::AutoMutex lock(mSubscriberLock);
    306 
    307   if ((frameBuf != NULL) && ( pBuf != NULL) )
    308     {
    309       CameraFrame *frame = new CameraFrame;
    310       frame->mBuffer = frameBuf;
    311       frame->mYuv[0] = pBuf[0];
    312       frame->mYuv[1] = pBuf[1];
    313       mFrameQueue.add(frameBuf, frame);
    314 
    315       CAMHAL_LOGVB("Adding Frame=0x%x Y=0x%x UV=0x%x", frame->mBuffer, frame->mYuv[0], frame->mYuv[1]);
    316     }
    317 }
    318 
    319 void BaseCameraAdapter::removeFramePointers()
    320 {
    321   android::AutoMutex lock(mSubscriberLock);
    322 
    323   int size = mFrameQueue.size();
    324   CAMHAL_LOGVB("Removing %d Frames = ", size);
    325   for (int i = 0; i < size; i++)
    326     {
    327       CameraFrame *frame = (CameraFrame *)mFrameQueue.valueAt(i);
    328       CAMHAL_LOGVB("Free Frame=0x%x Y=0x%x UV=0x%x", frame->mBuffer, frame->mYuv[0], frame->mYuv[1]);
    329       delete frame;
    330     }
    331   mFrameQueue.clear();
    332 }
    333 
    334 void BaseCameraAdapter::returnFrame(CameraBuffer * frameBuf, CameraFrame::FrameType frameType)
    335 {
    336     status_t res = NO_ERROR;
    337     size_t subscriberCount = 0;
    338     int refCount = -1;
    339 
    340     if ( NULL == frameBuf )
    341         {
    342         CAMHAL_LOGEA("Invalid frameBuf");
    343         return;
    344         }
    345 
    346     if ( NO_ERROR == res)
    347         {
    348         android::AutoMutex lock(mReturnFrameLock);
    349 
    350         refCount = getFrameRefCount(frameBuf,  frameType);
    351 
    352         if(frameType == CameraFrame::PREVIEW_FRAME_SYNC)
    353             {
    354             mFramesWithDisplay--;
    355             }
    356         else if(frameType == CameraFrame::VIDEO_FRAME_SYNC)
    357             {
    358             mFramesWithEncoder--;
    359             }
    360 
    361         if ( 0 < refCount )
    362             {
    363 
    364             refCount--;
    365             setFrameRefCount(frameBuf, frameType, refCount);
    366 
    367 
    368             if ( mRecording && (CameraFrame::VIDEO_FRAME_SYNC == frameType) ) {
    369                 refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
    370             } else if ( mRecording && (CameraFrame::PREVIEW_FRAME_SYNC == frameType) ) {
    371                 refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
    372             } else if ( mRecording && (CameraFrame::SNAPSHOT_FRAME == frameType) ) {
    373                 refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
    374             }
    375 
    376 
    377             }
    378         else
    379             {
    380             CAMHAL_LOGDA("Frame returned when ref count is already zero!!");
    381             return;
    382             }
    383         }
    384 
    385     CAMHAL_LOGVB("REFCOUNT 0x%x %d", frameBuf, refCount);
    386 
    387     if ( NO_ERROR == res )
    388         {
    389         //check if someone is holding this buffer
    390         if ( 0 == refCount )
    391             {
    392 #ifdef CAMERAHAL_DEBUG
    393             if((mBuffersWithDucati.indexOfKey((int)camera_buffer_get_omx_ptr(frameBuf)) >= 0) &&
    394                ((CameraFrame::PREVIEW_FRAME_SYNC == frameType) ||
    395                  (CameraFrame::SNAPSHOT_FRAME == frameType)))
    396                 {
    397                 CAMHAL_LOGE("Buffer already with Ducati!! 0x%x", frameBuf);
    398                 for(int i=0;i<mBuffersWithDucati.size();i++) CAMHAL_LOGE("0x%x", mBuffersWithDucati.keyAt(i));
    399                 }
    400             mBuffersWithDucati.add((int)camera_buffer_get_omx_ptr(frameBuf),1);
    401 #endif
    402             res = fillThisBuffer(frameBuf, frameType);
    403             }
    404         }
    405 
    406 }
    407 
    408 status_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3, int value4) {
    409     status_t ret = NO_ERROR;
    410     struct timeval *refTimestamp;
    411     BuffersDescriptor *desc = NULL;
    412     CameraFrame *frame = NULL;
    413 
    414     LOG_FUNCTION_NAME;
    415 
    416     switch ( operation ) {
    417         case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW:
    418                 CAMHAL_LOGDA("Use buffers for preview");
    419                 desc = ( BuffersDescriptor * ) value1;
    420 
    421                 if ( NULL == desc )
    422                     {
    423                     CAMHAL_LOGEA("Invalid preview buffers!");
    424                     return -EINVAL;
    425                     }
    426 
    427                 if ( ret == NO_ERROR )
    428                     {
    429                     ret = setState(operation);
    430                     }
    431 
    432                 if ( ret == NO_ERROR )
    433                     {
    434                     android::AutoMutex lock(mPreviewBufferLock);
    435                     mPreviewBuffers = desc->mBuffers;
    436                     mPreviewBuffersLength = desc->mLength;
    437                     mPreviewBuffersAvailable.clear();
    438                     mSnapshotBuffersAvailable.clear();
    439                     for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
    440                         {
    441                         mPreviewBuffersAvailable.add(&mPreviewBuffers[i], 0);
    442                         }
    443                     // initial ref count for undeqeueued buffers is 1 since buffer provider
    444                     // is still holding on to it
    445                     for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
    446                         {
    447                         mPreviewBuffersAvailable.add(&mPreviewBuffers[i], 1);
    448                         }
    449                     }
    450 
    451                 if ( NULL != desc )
    452                     {
    453                     ret = useBuffers(CameraAdapter::CAMERA_PREVIEW,
    454                                      desc->mBuffers,
    455                                      desc->mCount,
    456                                      desc->mLength,
    457                                      desc->mMaxQueueable);
    458                     }
    459 
    460                 if ( ret == NO_ERROR )
    461                     {
    462                     ret = commitState();
    463                     }
    464                 else
    465                     {
    466                     ret |= rollbackState();
    467                     }
    468 
    469                 break;
    470 
    471         case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA:
    472                     CAMHAL_LOGDA("Use buffers for preview data");
    473                     desc = ( BuffersDescriptor * ) value1;
    474 
    475                     if ( NULL == desc )
    476                         {
    477                         CAMHAL_LOGEA("Invalid preview data buffers!");
    478                         return -EINVAL;
    479                         }
    480 
    481                     if ( ret == NO_ERROR )
    482                         {
    483                         ret = setState(operation);
    484                         }
    485 
    486                     if ( ret == NO_ERROR )
    487                         {
    488                         android::AutoMutex lock(mPreviewDataBufferLock);
    489                         mPreviewDataBuffers = desc->mBuffers;
    490                         mPreviewDataBuffersLength = desc->mLength;
    491                         mPreviewDataBuffersAvailable.clear();
    492                         for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
    493                             {
    494                             mPreviewDataBuffersAvailable.add(&mPreviewDataBuffers[i], 0);
    495                             }
    496                         // initial ref count for undeqeueued buffers is 1 since buffer provider
    497                         // is still holding on to it
    498                         for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
    499                             {
    500                             mPreviewDataBuffersAvailable.add(&mPreviewDataBuffers[i], 1);
    501                             }
    502                         }
    503 
    504                     if ( NULL != desc )
    505                         {
    506                         ret = useBuffers(CameraAdapter::CAMERA_MEASUREMENT,
    507                                          desc->mBuffers,
    508                                          desc->mCount,
    509                                          desc->mLength,
    510                                          desc->mMaxQueueable);
    511                         }
    512 
    513                     if ( ret == NO_ERROR )
    514                         {
    515                         ret = commitState();
    516                         }
    517                     else
    518                         {
    519                         ret |= rollbackState();
    520                         }
    521 
    522                     break;
    523 
    524         case CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
    525                 CAMHAL_LOGDA("Use buffers for image capture");
    526                 desc = ( BuffersDescriptor * ) value1;
    527 
    528                 if ( NULL == desc )
    529                     {
    530                     CAMHAL_LOGEA("Invalid capture buffers!");
    531                     return -EINVAL;
    532                     }
    533 
    534                 if ( ret == NO_ERROR )
    535                     {
    536                     ret = setState(operation);
    537                     }
    538 
    539                 if ( ret == NO_ERROR )
    540                     {
    541                     android::AutoMutex lock(mCaptureBufferLock);
    542                     mCaptureBuffers = desc->mBuffers;
    543                     mCaptureBuffersLength = desc->mLength;
    544                     }
    545 
    546                 if ( NULL != desc )
    547                     {
    548                     ret = useBuffers(CameraAdapter::CAMERA_IMAGE_CAPTURE,
    549                                      desc->mBuffers,
    550                                      desc->mCount,
    551                                      desc->mLength,
    552                                      desc->mMaxQueueable);
    553                     }
    554 
    555                 if ( ret == NO_ERROR )
    556                     {
    557                     ret = commitState();
    558                     }
    559                 else
    560                     {
    561                     ret |= rollbackState();
    562                     }
    563 
    564                 break;
    565 
    566 #ifdef OMAP_ENHANCEMENT_CPCAM
    567         case CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS:
    568             CAMHAL_LOGDA("Use buffers for reprocessing");
    569             desc = (BuffersDescriptor *) value1;
    570 
    571             if (NULL == desc) {
    572                 CAMHAL_LOGEA("Invalid capture buffers!");
    573                 return -EINVAL;
    574             }
    575 
    576             if (ret == NO_ERROR) {
    577                 ret = setState(operation);
    578             }
    579 
    580             if (ret == NO_ERROR) {
    581                 android::AutoMutex lock(mVideoInBufferLock);
    582                 mVideoInBuffers = desc->mBuffers;
    583                 mVideoInBuffersAvailable.clear();
    584                 for (uint32_t i = 0 ; i < desc->mMaxQueueable ; i++) {
    585                     mVideoInBuffersAvailable.add(&mVideoInBuffers[i], 0);
    586                 }
    587                 // initial ref count for undeqeueued buffers is 1 since buffer provider
    588                 // is still holding on to it
    589                 for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ ) {
    590                     mVideoInBuffersAvailable.add(&mVideoInBuffers[i], 1);
    591                 }
    592                 ret = useBuffers(CameraAdapter::CAMERA_REPROCESS,
    593                                  desc->mBuffers,
    594                                  desc->mCount,
    595                                  desc->mLength,
    596                                  desc->mMaxQueueable);
    597             }
    598 
    599             if ( ret == NO_ERROR ) {
    600                 ret = commitState();
    601             } else {
    602                 ret |= rollbackState();
    603             }
    604 
    605             break;
    606 #endif
    607 
    608         case CameraAdapter::CAMERA_START_SMOOTH_ZOOM:
    609             {
    610 
    611             if ( ret == NO_ERROR )
    612                 {
    613                 ret = setState(operation);
    614                 }
    615 
    616             if ( ret == NO_ERROR )
    617                 {
    618                 ret = startSmoothZoom(value1);
    619                 }
    620 
    621             if ( ret == NO_ERROR )
    622                 {
    623                 ret = commitState();
    624                 }
    625             else
    626                 {
    627                 ret |= rollbackState();
    628                 }
    629 
    630             break;
    631 
    632             }
    633 
    634         case CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM:
    635             {
    636 
    637             if ( ret == NO_ERROR )
    638                 {
    639                 ret = setState(operation);
    640                 }
    641 
    642             if ( ret == NO_ERROR )
    643                 {
    644                 ret = stopSmoothZoom();
    645                 }
    646 
    647             if ( ret == NO_ERROR )
    648                 {
    649                 ret = commitState();
    650                 }
    651             else
    652                 {
    653                 ret |= rollbackState();
    654                 }
    655 
    656             break;
    657 
    658             }
    659 
    660         case CameraAdapter::CAMERA_START_PREVIEW:
    661             {
    662 
    663                 CAMHAL_LOGDA("Start Preview");
    664 
    665             if ( ret == NO_ERROR )
    666                 {
    667                 ret = setState(operation);
    668                 }
    669 
    670             if ( ret == NO_ERROR )
    671                 {
    672                 ret = startPreview();
    673                 }
    674 
    675             if ( ret == NO_ERROR )
    676                 {
    677                 ret = commitState();
    678                 }
    679             else
    680                 {
    681                 ret |= rollbackState();
    682                 }
    683 
    684             break;
    685 
    686             }
    687 
    688         case CameraAdapter::CAMERA_STOP_PREVIEW:
    689             {
    690 
    691             CAMHAL_LOGDA("Stop Preview");
    692 
    693             if ( ret == NO_ERROR )
    694                 {
    695                 ret = setState(operation);
    696                 }
    697 
    698             if ( ret == NO_ERROR )
    699                 {
    700                 ret = stopPreview();
    701                 }
    702 
    703             if ( ret == NO_ERROR )
    704                 {
    705                 ret = commitState();
    706                 }
    707             else
    708                 {
    709                 ret |= rollbackState();
    710                 }
    711 
    712             break;
    713 
    714             }
    715 
    716         case CameraAdapter::CAMERA_START_VIDEO:
    717             {
    718 
    719             CAMHAL_LOGDA("Start video recording");
    720 
    721             if ( ret == NO_ERROR )
    722                 {
    723                 ret = setState(operation);
    724                 }
    725 
    726             if ( ret == NO_ERROR )
    727                 {
    728                 ret = startVideoCapture();
    729                 }
    730 
    731             if ( ret == NO_ERROR )
    732                 {
    733                 ret = commitState();
    734                 }
    735             else
    736                 {
    737                 ret |= rollbackState();
    738                 }
    739 
    740             break;
    741 
    742             }
    743 
    744         case CameraAdapter::CAMERA_STOP_VIDEO:
    745             {
    746 
    747             CAMHAL_LOGDA("Stop video recording");
    748 
    749             if ( ret == NO_ERROR )
    750                 {
    751                 ret = setState(operation);
    752                 }
    753 
    754             if ( ret == NO_ERROR )
    755                 {
    756                 ret = stopVideoCapture();
    757                 }
    758 
    759             if ( ret == NO_ERROR )
    760                 {
    761                 ret = commitState();
    762                 }
    763             else
    764                 {
    765                 ret |= rollbackState();
    766                 }
    767 
    768             break;
    769 
    770             }
    771 
    772         case CameraAdapter::CAMERA_START_IMAGE_CAPTURE:
    773             {
    774 
    775 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    776 
    777             refTimestamp = ( struct timeval * ) value1;
    778             if ( NULL != refTimestamp )
    779                 {
    780                 memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
    781                 }
    782 
    783 #endif
    784 
    785             if ( ret == NO_ERROR )
    786                 {
    787                 ret = setState(operation);
    788                 }
    789 
    790             if ( ret == NO_ERROR )
    791                 {
    792                 ret = takePicture();
    793                 }
    794 
    795             if ( ret == NO_ERROR )
    796                 {
    797                 ret = commitState();
    798                 }
    799             else
    800                 {
    801                 ret |= rollbackState();
    802                 }
    803 
    804             break;
    805 
    806             }
    807 
    808         case CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE:
    809             {
    810 
    811             if ( ret == NO_ERROR )
    812                 {
    813                 ret = setState(operation);
    814                 }
    815 
    816             if ( ret == NO_ERROR )
    817                 {
    818                 ret = stopImageCapture();
    819                 }
    820 
    821             if ( ret == NO_ERROR )
    822                 {
    823                 ret = commitState();
    824                 }
    825             else
    826                 {
    827                 ret |= rollbackState();
    828                 }
    829 
    830             break;
    831 
    832             }
    833 
    834         case CameraAdapter::CAMERA_START_BRACKET_CAPTURE:
    835             {
    836 
    837 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    838 
    839             refTimestamp = ( struct timeval * ) value2;
    840             if ( NULL != refTimestamp )
    841                 {
    842                 memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
    843                 }
    844 
    845 #endif
    846 
    847             if ( ret == NO_ERROR )
    848                 {
    849                 ret = setState(operation);
    850                 }
    851 
    852             if ( ret == NO_ERROR )
    853                 {
    854                 ret = startBracketing(value1);
    855                 }
    856 
    857             if ( ret == NO_ERROR )
    858                 {
    859                 ret = commitState();
    860                 }
    861             else
    862                 {
    863                 ret |= rollbackState();
    864                 }
    865 
    866             break;
    867 
    868             }
    869 
    870         case CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE:
    871             {
    872 
    873             if ( ret == NO_ERROR )
    874                 {
    875                 ret = setState(operation);
    876                 }
    877 
    878             if ( ret == NO_ERROR )
    879                 {
    880                 ret = stopBracketing();
    881                 }
    882 
    883             if ( ret == NO_ERROR )
    884                 {
    885                 ret = commitState();
    886                 }
    887             else
    888                 {
    889                 ret |= rollbackState();
    890                 }
    891 
    892             break;
    893 
    894             }
    895 
    896         case CameraAdapter::CAMERA_PERFORM_AUTOFOCUS:
    897 
    898 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
    899 
    900             refTimestamp = ( struct timeval * ) value1;
    901             if ( NULL != refTimestamp )
    902                 {
    903                 memcpy( &mStartFocus, refTimestamp, sizeof( struct timeval ));
    904                 }
    905 
    906 #endif
    907 
    908             if ( ret == NO_ERROR )
    909                 {
    910                 ret = setState(operation);
    911                 }
    912 
    913             if ( ret == NO_ERROR )
    914                 {
    915                 ret = autoFocus();
    916                 }
    917 
    918             if ( ret == NO_ERROR )
    919                 {
    920                 ret = commitState();
    921                 }
    922             else
    923                 {
    924                 ret |= rollbackState();
    925                 }
    926 
    927             break;
    928 
    929         case CameraAdapter::CAMERA_CANCEL_AUTOFOCUS:
    930 
    931             if ( ret == NO_ERROR )
    932                 {
    933                 ret = setState(operation);
    934                 }
    935 
    936             if ( ret == NO_ERROR )
    937                 {
    938                 ret = cancelAutoFocus();
    939                 }
    940 
    941             if ( ret == NO_ERROR )
    942                 {
    943                 ret = commitState();
    944                 }
    945             else
    946                 {
    947                 ret |= rollbackState();
    948                 }
    949 
    950             break;
    951 
    952         case CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW:
    953 
    954              if ( ret == NO_ERROR )
    955                  {
    956                  ret = setState(operation);
    957                  }
    958 
    959              if ( ret == NO_ERROR )
    960                  {
    961                  frame = ( CameraFrame * ) value1;
    962 
    963                  if ( NULL != frame )
    964                      {
    965                      ret = getFrameSize(frame->mWidth, frame->mHeight);
    966                      }
    967                  else
    968                      {
    969                      ret = -EINVAL;
    970                      }
    971                  }
    972 
    973              if ( ret == NO_ERROR )
    974                  {
    975                  ret = commitState();
    976                  }
    977              else
    978                  {
    979                  ret |= rollbackState();
    980                  }
    981 
    982              break;
    983 
    984          case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
    985 
    986              if ( ret == NO_ERROR )
    987                  {
    988                  ret = setState(operation);
    989                  }
    990 
    991              if ( ret == NO_ERROR )
    992                  {
    993                  frame = ( CameraFrame * ) value1;
    994 
    995                  if ( NULL != frame )
    996                      {
    997                      ret = getPictureBufferSize(*frame, value2);
    998                      }
    999                  else
   1000                      {
   1001                      ret = -EINVAL;
   1002                      }
   1003                  }
   1004 
   1005              if ( ret == NO_ERROR )
   1006                  {
   1007                  ret = commitState();
   1008                  }
   1009              else
   1010                  {
   1011                  ret |= rollbackState();
   1012                  }
   1013 
   1014              break;
   1015 
   1016          case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
   1017 
   1018              if ( ret == NO_ERROR )
   1019                  {
   1020                  ret = setState(operation);
   1021                  }
   1022 
   1023              if ( ret == NO_ERROR )
   1024                  {
   1025                  frame = ( CameraFrame * ) value1;
   1026 
   1027                  if ( NULL != frame )
   1028                      {
   1029                      ret = getFrameDataSize(frame->mLength, value2);
   1030                      }
   1031                  else
   1032                      {
   1033                      ret = -EINVAL;
   1034                      }
   1035                  }
   1036 
   1037              if ( ret == NO_ERROR )
   1038                  {
   1039                  ret = commitState();
   1040                  }
   1041              else
   1042                  {
   1043                  ret |= rollbackState();
   1044                  }
   1045 
   1046              break;
   1047 
   1048          case CameraAdapter::CAMERA_START_FD:
   1049 
   1050              ret = startFaceDetection();
   1051 
   1052              break;
   1053 
   1054          case CameraAdapter::CAMERA_STOP_FD:
   1055 
   1056              ret = stopFaceDetection();
   1057 
   1058              break;
   1059 
   1060          case CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE:
   1061 
   1062              CAMHAL_LOGDA("Use buffers for video (RAW + JPEG) capture");
   1063              desc = ( BuffersDescriptor * ) value1;
   1064 
   1065              if ( NULL == desc ) {
   1066                  CAMHAL_LOGEA("Invalid capture buffers!");
   1067                  return -EINVAL;
   1068              }
   1069 
   1070              if ( ret == NO_ERROR ) {
   1071                  ret = setState(operation);
   1072              }
   1073 
   1074              if ( ret == NO_ERROR ) {
   1075                  android::AutoMutex lock(mVideoBufferLock);
   1076                  mVideoBuffers = desc->mBuffers;
   1077                  mVideoBuffersLength = desc->mLength;
   1078                  mVideoBuffersAvailable.clear();
   1079                  for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ ) {
   1080                      mVideoBuffersAvailable.add(&mVideoBuffers[i], 1);
   1081                  }
   1082                  // initial ref count for undeqeueued buffers is 1 since buffer provider
   1083                  // is still holding on to it
   1084                  for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ ) {
   1085                      mVideoBuffersAvailable.add(&mVideoBuffers[i], 1);
   1086                  }
   1087              }
   1088 
   1089              if ( NULL != desc ) {
   1090                  ret = useBuffers(CameraAdapter::CAMERA_VIDEO,
   1091                          desc->mBuffers,
   1092                          desc->mCount,
   1093                          desc->mLength,
   1094                          desc->mMaxQueueable);
   1095              }
   1096 
   1097              if ( ret == NO_ERROR ) {
   1098                  ret = commitState();
   1099              } else {
   1100                  ret |= rollbackState();
   1101              }
   1102 
   1103              break;
   1104 
   1105         case CameraAdapter::CAMERA_SWITCH_TO_EXECUTING:
   1106             ret = switchToExecuting();
   1107             break;
   1108 
   1109 #ifdef OMAP_ENHANCEMENT_VTC
   1110         case CameraAdapter::CAMERA_SETUP_TUNNEL:
   1111             ret = setupTunnel(value1, value2, value3, value4);
   1112             break;
   1113 
   1114         case CameraAdapter::CAMERA_DESTROY_TUNNEL:
   1115             ret = destroyTunnel();
   1116             break;
   1117 #endif
   1118 
   1119         case CameraAdapter::CAMERA_PREVIEW_INITIALIZATION:
   1120             ret = cameraPreviewInitialization();
   1121             break;
   1122 
   1123         default:
   1124             CAMHAL_LOGEB("Command 0x%x unsupported!", operation);
   1125             break;
   1126     };
   1127 
   1128     LOG_FUNCTION_NAME_EXIT;
   1129     return ret;
   1130 }
   1131 
   1132 status_t BaseCameraAdapter::notifyFocusSubscribers(CameraHalEvent::FocusStatus status)
   1133 {
   1134     event_callback eventCb;
   1135     CameraHalEvent focusEvent;
   1136     status_t ret = NO_ERROR;
   1137 
   1138     LOG_FUNCTION_NAME;
   1139 
   1140     if ( mFocusSubscribers.size() == 0 ) {
   1141         CAMHAL_LOGDA("No Focus Subscribers!");
   1142         return NO_INIT;
   1143     }
   1144 
   1145 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1146     if (status == CameraHalEvent::FOCUS_STATUS_PENDING) {
   1147         gettimeofday(&mStartFocus, NULL);
   1148     } else {
   1149         //dump the AF latency
   1150         CameraHal::PPM("Focus finished in: ", &mStartFocus);
   1151     }
   1152 #endif
   1153 
   1154     focusEvent.mEventData = new CameraHalEvent::CameraHalEventData();
   1155     if ( NULL == focusEvent.mEventData.get() ) {
   1156         return -ENOMEM;
   1157     }
   1158 
   1159     focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED;
   1160     focusEvent.mEventData->focusEvent.focusStatus = status;
   1161 
   1162     for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ )
   1163         {
   1164         focusEvent.mCookie = (void *) mFocusSubscribers.keyAt(i);
   1165         eventCb = (event_callback) mFocusSubscribers.valueAt(i);
   1166         eventCb ( &focusEvent );
   1167         }
   1168 
   1169     focusEvent.mEventData.clear();
   1170 
   1171     LOG_FUNCTION_NAME_EXIT;
   1172 
   1173     return ret;
   1174 }
   1175 
   1176 status_t BaseCameraAdapter::notifyShutterSubscribers()
   1177 {
   1178     CameraHalEvent shutterEvent;
   1179     event_callback eventCb;
   1180     status_t ret = NO_ERROR;
   1181 
   1182     LOG_FUNCTION_NAME;
   1183 
   1184     if ( mShutterSubscribers.size() == 0 )
   1185         {
   1186         CAMHAL_LOGEA("No shutter Subscribers!");
   1187         return NO_INIT;
   1188         }
   1189 
   1190     shutterEvent.mEventData = new CameraHalEvent::CameraHalEventData();
   1191     if ( NULL == shutterEvent.mEventData.get() ) {
   1192         return -ENOMEM;
   1193     }
   1194 
   1195     shutterEvent.mEventType = CameraHalEvent::EVENT_SHUTTER;
   1196     shutterEvent.mEventData->shutterEvent.shutterClosed = true;
   1197 
   1198     for (unsigned int i = 0 ; i < mShutterSubscribers.size() ; i++ ) {
   1199         shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i);
   1200         eventCb = ( event_callback ) mShutterSubscribers.valueAt(i);
   1201 
   1202         CAMHAL_LOGD("Sending shutter callback");
   1203 
   1204         eventCb ( &shutterEvent );
   1205     }
   1206 
   1207     shutterEvent.mEventData.clear();
   1208 
   1209     LOG_FUNCTION_NAME_EXIT;
   1210 
   1211     return ret;
   1212 }
   1213 
   1214 status_t BaseCameraAdapter::notifyZoomSubscribers(int zoomIdx, bool targetReached)
   1215 {
   1216     event_callback eventCb;
   1217     CameraHalEvent zoomEvent;
   1218     status_t ret = NO_ERROR;
   1219 
   1220     LOG_FUNCTION_NAME;
   1221 
   1222     if ( mZoomSubscribers.size() == 0 ) {
   1223         CAMHAL_LOGDA("No zoom Subscribers!");
   1224         return NO_INIT;
   1225     }
   1226 
   1227     zoomEvent.mEventData = new CameraHalEvent::CameraHalEventData();
   1228     if ( NULL == zoomEvent.mEventData.get() ) {
   1229         return -ENOMEM;
   1230     }
   1231 
   1232     zoomEvent.mEventType = CameraHalEvent::EVENT_ZOOM_INDEX_REACHED;
   1233     zoomEvent.mEventData->zoomEvent.currentZoomIndex = zoomIdx;
   1234     zoomEvent.mEventData->zoomEvent.targetZoomIndexReached = targetReached;
   1235 
   1236     for (unsigned int i = 0 ; i < mZoomSubscribers.size(); i++ ) {
   1237         zoomEvent.mCookie = (void *) mZoomSubscribers.keyAt(i);
   1238         eventCb = (event_callback) mZoomSubscribers.valueAt(i);
   1239 
   1240         eventCb ( &zoomEvent );
   1241     }
   1242 
   1243     zoomEvent.mEventData.clear();
   1244 
   1245     LOG_FUNCTION_NAME_EXIT;
   1246 
   1247     return ret;
   1248 }
   1249 
   1250 status_t BaseCameraAdapter::notifyMetadataSubscribers(android::sp<CameraMetadataResult> &meta)
   1251 {
   1252     event_callback eventCb;
   1253     CameraHalEvent metaEvent;
   1254     status_t ret = NO_ERROR;
   1255 
   1256     LOG_FUNCTION_NAME;
   1257 
   1258     if ( mMetadataSubscribers.size() == 0 ) {
   1259         CAMHAL_LOGDA("No preview metadata subscribers!");
   1260         return NO_INIT;
   1261     }
   1262 
   1263     metaEvent.mEventData = new CameraHalEvent::CameraHalEventData();
   1264     if ( NULL == metaEvent.mEventData.get() ) {
   1265         return -ENOMEM;
   1266     }
   1267 
   1268     metaEvent.mEventType = CameraHalEvent::EVENT_METADATA;
   1269     metaEvent.mEventData->metadataEvent = meta;
   1270 
   1271     for (unsigned int i = 0 ; i < mMetadataSubscribers.size(); i++ ) {
   1272         metaEvent.mCookie = (void *) mMetadataSubscribers.keyAt(i);
   1273         eventCb = (event_callback) mMetadataSubscribers.valueAt(i);
   1274 
   1275         eventCb ( &metaEvent );
   1276     }
   1277 
   1278     metaEvent.mEventData.clear();
   1279 
   1280     LOG_FUNCTION_NAME_EXIT;
   1281 
   1282     return ret;
   1283 }
   1284 
   1285 status_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame)
   1286 {
   1287     status_t ret = NO_ERROR;
   1288     unsigned int mask;
   1289 
   1290     if ( NULL == frame )
   1291         {
   1292         CAMHAL_LOGEA("Invalid CameraFrame");
   1293         return -EINVAL;
   1294         }
   1295 
   1296     for( mask = 1; mask < CameraFrame::ALL_FRAMES; mask <<= 1){
   1297       if( mask & frame->mFrameMask ){
   1298         switch( mask ){
   1299 
   1300         case CameraFrame::IMAGE_FRAME:
   1301           {
   1302 #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
   1303             CameraHal::PPM("Shot to Jpeg: ", &mStartCapture);
   1304 #endif
   1305             ret = __sendFrameToSubscribers(frame, &mImageSubscribers, CameraFrame::IMAGE_FRAME);
   1306           }
   1307           break;
   1308         case CameraFrame::RAW_FRAME:
   1309           {
   1310             ret = __sendFrameToSubscribers(frame, &mRawSubscribers, CameraFrame::RAW_FRAME);
   1311           }
   1312           break;
   1313         case CameraFrame::PREVIEW_FRAME_SYNC:
   1314           {
   1315             ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
   1316           }
   1317           break;
   1318         case CameraFrame::SNAPSHOT_FRAME:
   1319           {
   1320             ret = __sendFrameToSubscribers(frame, &mSnapshotSubscribers, CameraFrame::SNAPSHOT_FRAME);
   1321           }
   1322           break;
   1323         case CameraFrame::VIDEO_FRAME_SYNC:
   1324           {
   1325             ret = __sendFrameToSubscribers(frame, &mVideoSubscribers, CameraFrame::VIDEO_FRAME_SYNC);
   1326           }
   1327           break;
   1328         case CameraFrame::FRAME_DATA_SYNC:
   1329           {
   1330             ret = __sendFrameToSubscribers(frame, &mFrameDataSubscribers, CameraFrame::FRAME_DATA_SYNC);
   1331           }
   1332           break;
   1333         case CameraFrame::REPROCESS_INPUT_FRAME:
   1334           {
   1335             ret = __sendFrameToSubscribers(frame, &mVideoInSubscribers, CameraFrame::REPROCESS_INPUT_FRAME);
   1336           }
   1337           break;
   1338         default:
   1339           CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", mask);
   1340         break;
   1341         }//SWITCH
   1342         frame->mFrameMask &= ~mask;
   1343 
   1344         if (ret != NO_ERROR) {
   1345             goto EXIT;
   1346         }
   1347       }//IF
   1348     }//FOR
   1349 
   1350  EXIT:
   1351     return ret;
   1352 }
   1353 
   1354 status_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
   1355                                                      android::KeyedVector<int, frame_callback> *subscribers,
   1356                                                      CameraFrame::FrameType frameType)
   1357 {
   1358     size_t refCount = 0;
   1359     status_t ret = NO_ERROR;
   1360     frame_callback callback = NULL;
   1361 
   1362     frame->mFrameType = frameType;
   1363 
   1364     if ( (frameType == CameraFrame::PREVIEW_FRAME_SYNC) ||
   1365          (frameType == CameraFrame::VIDEO_FRAME_SYNC) ||
   1366          (frameType == CameraFrame::SNAPSHOT_FRAME) ){
   1367         if (mFrameQueue.size() > 0){
   1368           CameraFrame *lframe = (CameraFrame *)mFrameQueue.valueFor(frame->mBuffer);
   1369           frame->mYuv[0] = lframe->mYuv[0];
   1370           frame->mYuv[1] = frame->mYuv[0] + (frame->mLength + frame->mOffset)*2/3;
   1371         }
   1372         else{
   1373           CAMHAL_LOGDA("Empty Frame Queue");
   1374           return -EINVAL;
   1375         }
   1376       }
   1377 
   1378     if (NULL != subscribers) {
   1379         refCount = getFrameRefCount(frame->mBuffer, frameType);
   1380 
   1381         if (refCount == 0) {
   1382             CAMHAL_LOGDA("Invalid ref count of 0");
   1383             return -EINVAL;
   1384         }
   1385 
   1386         if (refCount > subscribers->size()) {
   1387             CAMHAL_LOGEB("Invalid ref count for frame type: 0x%x", frameType);
   1388             return -EINVAL;
   1389         }
   1390 
   1391         CAMHAL_LOGVB("Type of Frame: 0x%x address: 0x%x refCount start %d",
   1392                      frame->mFrameType,
   1393                      ( uint32_t ) frame->mBuffer,
   1394                      refCount);
   1395 
   1396         for ( unsigned int i = 0 ; i < refCount; i++ ) {
   1397             frame->mCookie = ( void * ) subscribers->keyAt(i);
   1398             callback = (frame_callback) subscribers->valueAt(i);
   1399 
   1400             if (!callback) {
   1401                 CAMHAL_LOGEB("callback not set for frame type: 0x%x", frameType);
   1402                 return -EINVAL;
   1403             }
   1404 
   1405             callback(frame);
   1406         }
   1407     } else {
   1408         CAMHAL_LOGEA("Subscribers is null??");
   1409         return -EINVAL;
   1410     }
   1411 
   1412     return ret;
   1413 }
   1414 
   1415 int BaseCameraAdapter::setInitFrameRefCount(CameraBuffer * buf, unsigned int mask)
   1416 {
   1417   int ret = NO_ERROR;
   1418   unsigned int lmask;
   1419 
   1420   LOG_FUNCTION_NAME;
   1421 
   1422   if (buf == NULL)
   1423     {
   1424       return -EINVAL;
   1425     }
   1426 
   1427   for( lmask = 1; lmask < CameraFrame::ALL_FRAMES; lmask <<= 1){
   1428     if( lmask & mask ){
   1429       switch( lmask ){
   1430 
   1431       case CameraFrame::IMAGE_FRAME:
   1432         {
   1433           setFrameRefCount(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
   1434         }
   1435         break;
   1436       case CameraFrame::RAW_FRAME:
   1437         {
   1438           setFrameRefCount(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
   1439         }
   1440         break;
   1441       case CameraFrame::PREVIEW_FRAME_SYNC:
   1442         {
   1443           setFrameRefCount(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
   1444         }
   1445         break;
   1446       case CameraFrame::SNAPSHOT_FRAME:
   1447         {
   1448           setFrameRefCount(buf, CameraFrame::SNAPSHOT_FRAME, mSnapshotSubscribers.size());
   1449         }
   1450         break;
   1451       case CameraFrame::VIDEO_FRAME_SYNC:
   1452         {
   1453           setFrameRefCount(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
   1454         }
   1455         break;
   1456       case CameraFrame::FRAME_DATA_SYNC:
   1457         {
   1458           setFrameRefCount(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
   1459         }
   1460         break;
   1461       case CameraFrame::REPROCESS_INPUT_FRAME:
   1462         {
   1463           setFrameRefCount(buf,CameraFrame::REPROCESS_INPUT_FRAME, mVideoInSubscribers.size());
   1464         }
   1465         break;
   1466       default:
   1467         CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", lmask);
   1468         break;
   1469       }//SWITCH
   1470       mask &= ~lmask;
   1471     }//IF
   1472   }//FOR
   1473   LOG_FUNCTION_NAME_EXIT;
   1474   return ret;
   1475 }
   1476 
   1477 int BaseCameraAdapter::getFrameRefCount(CameraBuffer * frameBuf, CameraFrame::FrameType frameType)
   1478 {
   1479     int res = -1;
   1480 
   1481     LOG_FUNCTION_NAME;
   1482 
   1483     switch ( frameType )
   1484         {
   1485         case CameraFrame::IMAGE_FRAME:
   1486         case CameraFrame::RAW_FRAME:
   1487                 {
   1488                 android::AutoMutex lock(mCaptureBufferLock);
   1489                 res = mCaptureBuffersAvailable.valueFor(frameBuf );
   1490                 }
   1491             break;
   1492         case CameraFrame::SNAPSHOT_FRAME:
   1493                 {
   1494                 android::AutoMutex lock(mSnapshotBufferLock);
   1495                 res = mSnapshotBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
   1496                 }
   1497             break;
   1498         case CameraFrame::PREVIEW_FRAME_SYNC:
   1499                 {
   1500                 android::AutoMutex lock(mPreviewBufferLock);
   1501                 res = mPreviewBuffersAvailable.valueFor(frameBuf );
   1502                 }
   1503             break;
   1504         case CameraFrame::FRAME_DATA_SYNC:
   1505                 {
   1506                 android::AutoMutex lock(mPreviewDataBufferLock);
   1507                 res = mPreviewDataBuffersAvailable.valueFor(frameBuf );
   1508                 }
   1509             break;
   1510         case CameraFrame::VIDEO_FRAME_SYNC:
   1511                 {
   1512                 android::AutoMutex lock(mVideoBufferLock);
   1513                 res = mVideoBuffersAvailable.valueFor(frameBuf );
   1514                 }
   1515             break;
   1516         case CameraFrame::REPROCESS_INPUT_FRAME: {
   1517             android::AutoMutex lock(mVideoInBufferLock);
   1518             res = mVideoInBuffersAvailable.valueFor(frameBuf );
   1519         }
   1520             break;
   1521         default:
   1522             break;
   1523         };
   1524 
   1525     LOG_FUNCTION_NAME_EXIT;
   1526 
   1527     return res;
   1528 }
   1529 
   1530 void BaseCameraAdapter::setFrameRefCount(CameraBuffer * frameBuf, CameraFrame::FrameType frameType, int refCount)
   1531 {
   1532 
   1533     LOG_FUNCTION_NAME;
   1534 
   1535     switch ( frameType )
   1536         {
   1537         case CameraFrame::IMAGE_FRAME:
   1538         case CameraFrame::RAW_FRAME:
   1539                 {
   1540                 android::AutoMutex lock(mCaptureBufferLock);
   1541                 mCaptureBuffersAvailable.replaceValueFor(frameBuf, refCount);
   1542                 }
   1543             break;
   1544         case CameraFrame::SNAPSHOT_FRAME:
   1545                 {
   1546                 android::AutoMutex lock(mSnapshotBufferLock);
   1547                 mSnapshotBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
   1548                 }
   1549             break;
   1550         case CameraFrame::PREVIEW_FRAME_SYNC:
   1551                 {
   1552                 android::AutoMutex lock(mPreviewBufferLock);
   1553                 mPreviewBuffersAvailable.replaceValueFor(frameBuf, refCount);
   1554                 }
   1555             break;
   1556         case CameraFrame::FRAME_DATA_SYNC:
   1557                 {
   1558                 android::AutoMutex lock(mPreviewDataBufferLock);
   1559                 mPreviewDataBuffersAvailable.replaceValueFor(frameBuf, refCount);
   1560                 }
   1561             break;
   1562         case CameraFrame::VIDEO_FRAME_SYNC:
   1563                 {
   1564                 android::AutoMutex lock(mVideoBufferLock);
   1565                 mVideoBuffersAvailable.replaceValueFor(frameBuf, refCount);
   1566                 }
   1567             break;
   1568         case CameraFrame::REPROCESS_INPUT_FRAME: {
   1569             android::AutoMutex lock(mVideoInBufferLock);
   1570             mVideoInBuffersAvailable.replaceValueFor(frameBuf, refCount);
   1571         }
   1572             break;
   1573         default:
   1574             break;
   1575         };
   1576 
   1577     LOG_FUNCTION_NAME_EXIT;
   1578 
   1579 }
   1580 
   1581 status_t BaseCameraAdapter::startVideoCapture()
   1582 {
   1583     status_t ret = NO_ERROR;
   1584 
   1585     LOG_FUNCTION_NAME;
   1586 
   1587     android::AutoMutex lock(mVideoBufferLock);
   1588 
   1589     //If the capture is already ongoing, return from here.
   1590     if ( mRecording )
   1591         {
   1592         ret = NO_INIT;
   1593         }
   1594 
   1595 
   1596     if ( NO_ERROR == ret )
   1597         {
   1598 
   1599         for ( unsigned int i = 0 ; i < mPreviewBuffersAvailable.size() ; i++ )
   1600             {
   1601             mVideoBuffersAvailable.add(mPreviewBuffersAvailable.keyAt(i), 0);
   1602             }
   1603 
   1604         mRecording = true;
   1605         }
   1606 
   1607     LOG_FUNCTION_NAME_EXIT;
   1608 
   1609     return ret;
   1610 }
   1611 
   1612 status_t BaseCameraAdapter::stopVideoCapture()
   1613 {
   1614     status_t ret = NO_ERROR;
   1615 
   1616     LOG_FUNCTION_NAME;
   1617 
   1618     if ( !mRecording )
   1619         {
   1620         ret = NO_INIT;
   1621         }
   1622 
   1623     if ( NO_ERROR == ret )
   1624         {
   1625         for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
   1626             {
   1627             CameraBuffer *frameBuf = mVideoBuffersAvailable.keyAt(i);
   1628             if( getFrameRefCount(frameBuf,  CameraFrame::VIDEO_FRAME_SYNC) > 0)
   1629                 {
   1630                 returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
   1631                 }
   1632             }
   1633 
   1634         mVideoBuffersAvailable.clear();
   1635 
   1636         mRecording = false;
   1637         }
   1638 
   1639     LOG_FUNCTION_NAME_EXIT;
   1640 
   1641     return ret;
   1642 }
   1643 
   1644 //-----------------Stub implementation of the interface ------------------------------
   1645 
   1646 status_t BaseCameraAdapter::takePicture()
   1647 {
   1648     status_t ret = NO_ERROR;
   1649 
   1650     LOG_FUNCTION_NAME;
   1651 
   1652     LOG_FUNCTION_NAME_EXIT;
   1653 
   1654     return ret;
   1655 }
   1656 
   1657 status_t BaseCameraAdapter::stopImageCapture()
   1658 {
   1659     status_t ret = NO_ERROR;
   1660 
   1661     LOG_FUNCTION_NAME;
   1662 
   1663     LOG_FUNCTION_NAME_EXIT;
   1664 
   1665     return ret;
   1666 }
   1667 
   1668 status_t BaseCameraAdapter::startBracketing(int range)
   1669 {
   1670     status_t ret = NO_ERROR;
   1671 
   1672     LOG_FUNCTION_NAME;
   1673 
   1674     LOG_FUNCTION_NAME_EXIT;
   1675 
   1676     return ret;
   1677 }
   1678 
   1679 status_t BaseCameraAdapter::stopBracketing()
   1680 {
   1681     status_t ret = NO_ERROR;
   1682 
   1683     LOG_FUNCTION_NAME;
   1684 
   1685     LOG_FUNCTION_NAME_EXIT;
   1686 
   1687     return ret;
   1688 }
   1689 
   1690 status_t BaseCameraAdapter::autoFocus()
   1691 {
   1692     status_t ret = NO_ERROR;
   1693 
   1694     LOG_FUNCTION_NAME;
   1695 
   1696     notifyFocusSubscribers(CameraHalEvent::FOCUS_STATUS_FAIL);
   1697 
   1698     LOG_FUNCTION_NAME_EXIT;
   1699 
   1700     return ret;
   1701 }
   1702 
   1703 status_t BaseCameraAdapter::cancelAutoFocus()
   1704 {
   1705     status_t ret = NO_ERROR;
   1706 
   1707     LOG_FUNCTION_NAME;
   1708 
   1709     LOG_FUNCTION_NAME_EXIT;
   1710 
   1711     return ret;
   1712 }
   1713 
   1714 status_t BaseCameraAdapter::startSmoothZoom(int targetIdx)
   1715 {
   1716     status_t ret = NO_ERROR;
   1717 
   1718     LOG_FUNCTION_NAME;
   1719 
   1720     LOG_FUNCTION_NAME_EXIT;
   1721 
   1722     return ret;
   1723 }
   1724 
   1725 status_t BaseCameraAdapter::stopSmoothZoom()
   1726 {
   1727     status_t ret = NO_ERROR;
   1728 
   1729     LOG_FUNCTION_NAME;
   1730 
   1731     LOG_FUNCTION_NAME_EXIT;
   1732 
   1733     return ret;
   1734 }
   1735 
   1736 status_t BaseCameraAdapter::startPreview()
   1737 {
   1738     status_t ret = NO_ERROR;
   1739 
   1740     LOG_FUNCTION_NAME;
   1741 
   1742     LOG_FUNCTION_NAME_EXIT;
   1743 
   1744     return ret;
   1745 }
   1746 
   1747 status_t BaseCameraAdapter::stopPreview()
   1748 {
   1749     status_t ret = NO_ERROR;
   1750 
   1751     LOG_FUNCTION_NAME;
   1752 
   1753     LOG_FUNCTION_NAME_EXIT;
   1754 
   1755     return ret;
   1756 }
   1757 
   1758 status_t BaseCameraAdapter::useBuffers(CameraMode mode, CameraBuffer* bufArr, int num, size_t length, unsigned int queueable)
   1759 {
   1760     status_t ret = NO_ERROR;
   1761 
   1762     LOG_FUNCTION_NAME;
   1763 
   1764     LOG_FUNCTION_NAME_EXIT;
   1765 
   1766     return ret;
   1767 }
   1768 
   1769 status_t BaseCameraAdapter::fillThisBuffer(CameraBuffer * frameBuf, CameraFrame::FrameType frameType)
   1770 {
   1771     status_t ret = NO_ERROR;
   1772 
   1773     LOG_FUNCTION_NAME;
   1774 
   1775     LOG_FUNCTION_NAME_EXIT;
   1776 
   1777     return ret;
   1778 }
   1779 
   1780 status_t BaseCameraAdapter::getFrameSize(size_t &width, size_t &height)
   1781 {
   1782     status_t ret = NO_ERROR;
   1783 
   1784     LOG_FUNCTION_NAME;
   1785 
   1786     LOG_FUNCTION_NAME_EXIT;
   1787 
   1788     return ret;
   1789 }
   1790 
   1791 status_t BaseCameraAdapter::getFrameDataSize(size_t &dataFrameSize, size_t bufferCount)
   1792 {
   1793     status_t ret = NO_ERROR;
   1794 
   1795     LOG_FUNCTION_NAME;
   1796 
   1797     LOG_FUNCTION_NAME_EXIT;
   1798 
   1799     return ret;
   1800 }
   1801 
   1802 status_t BaseCameraAdapter::getPictureBufferSize(CameraFrame &frame, size_t bufferCount)
   1803 {
   1804     status_t ret = NO_ERROR;
   1805 
   1806     LOG_FUNCTION_NAME;
   1807 
   1808     LOG_FUNCTION_NAME_EXIT;
   1809 
   1810     return ret;
   1811 }
   1812 
   1813 status_t BaseCameraAdapter::startFaceDetection()
   1814 {
   1815     status_t ret = NO_ERROR;
   1816 
   1817     LOG_FUNCTION_NAME;
   1818 
   1819     LOG_FUNCTION_NAME_EXIT;
   1820 
   1821     return ret;
   1822 }
   1823 
   1824 status_t BaseCameraAdapter::stopFaceDetection()
   1825 {
   1826     status_t ret = NO_ERROR;
   1827 
   1828     LOG_FUNCTION_NAME;
   1829 
   1830     LOG_FUNCTION_NAME_EXIT;
   1831 
   1832     return ret;
   1833 }
   1834 
   1835 status_t BaseCameraAdapter::switchToExecuting()
   1836 {
   1837   status_t ret = NO_ERROR;
   1838   LOG_FUNCTION_NAME;
   1839   LOG_FUNCTION_NAME_EXIT;
   1840   return ret;
   1841 }
   1842 
   1843 const char* BaseCameraAdapter::getLUTvalue_translateHAL(int Value, LUTtypeHAL LUT) {
   1844     int LUTsize = LUT.size;
   1845     for(int i = 0; i < LUTsize; i++)
   1846         if( LUT.Table[i].halDefinition == Value )
   1847             return LUT.Table[i].userDefinition;
   1848 
   1849     return NULL;
   1850 }
   1851 
   1852 status_t BaseCameraAdapter::setupTunnel(uint32_t SliceHeight, uint32_t EncoderHandle, uint32_t width, uint32_t height) {
   1853   status_t ret = NO_ERROR;
   1854   LOG_FUNCTION_NAME;
   1855   LOG_FUNCTION_NAME_EXIT;
   1856   return ret;
   1857 }
   1858 
   1859 status_t BaseCameraAdapter::destroyTunnel() {
   1860   status_t ret = NO_ERROR;
   1861   LOG_FUNCTION_NAME;
   1862   LOG_FUNCTION_NAME_EXIT;
   1863   return ret;
   1864 }
   1865 
   1866 status_t BaseCameraAdapter::cameraPreviewInitialization() {
   1867   status_t ret = NO_ERROR;
   1868   LOG_FUNCTION_NAME;
   1869   LOG_FUNCTION_NAME_EXIT;
   1870   return ret;
   1871 }
   1872 
   1873 status_t BaseCameraAdapter::setState(CameraCommands operation)
   1874 {
   1875     status_t ret = NO_ERROR;
   1876 
   1877     LOG_FUNCTION_NAME;
   1878 
   1879     const char *printState = getLUTvalue_translateHAL(operation, CamCommandsLUT);
   1880 
   1881     mLock.lock();
   1882 
   1883     switch ( mAdapterState )
   1884         {
   1885 
   1886         case INTIALIZED_STATE:
   1887 
   1888             switch ( operation )
   1889                 {
   1890 
   1891                 case CAMERA_USE_BUFFERS_PREVIEW:
   1892                     CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->LOADED_PREVIEW_STATE event = %s",
   1893                             printState);
   1894                     mNextState = LOADED_PREVIEW_STATE;
   1895                     break;
   1896 
   1897                 //These events don't change the current state
   1898                 case CAMERA_QUERY_RESOLUTION_PREVIEW:
   1899                 case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
   1900                     CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->INTIALIZED_STATE event  = %s",
   1901                             printState);
   1902                     mNextState = INTIALIZED_STATE;
   1903                     break;
   1904                 case CAMERA_STOP_BRACKET_CAPTURE:
   1905                 case CAMERA_STOP_IMAGE_CAPTURE:
   1906                     ret = INVALID_OPERATION;
   1907                     break;
   1908                 case CAMERA_CANCEL_AUTOFOCUS:
   1909                     ret = INVALID_OPERATION;
   1910                     break;
   1911 
   1912                 default:
   1913                     CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event  = %s",
   1914                             printState);
   1915                     ret = INVALID_OPERATION;
   1916                     break;
   1917 
   1918                 }
   1919 
   1920             break;
   1921 
   1922         case LOADED_PREVIEW_STATE:
   1923 
   1924             switch ( operation )
   1925                 {
   1926 
   1927                 case CAMERA_START_PREVIEW:
   1928                     CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->PREVIEW_STATE event = %s",
   1929                             printState);
   1930                     mNextState = PREVIEW_STATE;
   1931                     break;
   1932 
   1933                 case CAMERA_STOP_PREVIEW:
   1934                     CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
   1935                                  operation);
   1936                     mNextState = INTIALIZED_STATE;
   1937                     break;
   1938 
   1939                 //These events don't change the current state
   1940                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   1941                 case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
   1942                 case CAMERA_USE_BUFFERS_PREVIEW_DATA:
   1943                     CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->LOADED_PREVIEW_STATE event = %s",
   1944                             printState);
   1945                     mNextState = LOADED_PREVIEW_STATE;
   1946                     break;
   1947 
   1948                 default:
   1949                     CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW Invalid Op! event = %s",
   1950                             printState);
   1951                     ret = INVALID_OPERATION;
   1952                     break;
   1953 
   1954                 }
   1955 
   1956             break;
   1957 
   1958         case PREVIEW_STATE:
   1959 
   1960             switch ( operation )
   1961                 {
   1962 
   1963                 case CAMERA_STOP_PREVIEW:
   1964                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->INTIALIZED_STATE event = %s",
   1965                             printState);
   1966                     mNextState = INTIALIZED_STATE;
   1967                     break;
   1968 
   1969                 case CAMERA_PERFORM_AUTOFOCUS:
   1970                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->AF_STATE event = %s",
   1971                             printState);
   1972                     mNextState = AF_STATE;
   1973                     break;
   1974 
   1975                 case CAMERA_START_SMOOTH_ZOOM:
   1976                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->ZOOM_STATE event = %s",
   1977                             printState);
   1978                     mNextState = ZOOM_STATE;
   1979                     break;
   1980 
   1981                 case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
   1982                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_CAPTURE_STATE event = %s",
   1983                             printState);
   1984                     mNextState = LOADED_CAPTURE_STATE;
   1985                     break;
   1986 
   1987 #ifdef OMAP_ENHANCEMENT_CPCAM
   1988                 case CAMERA_USE_BUFFERS_REPROCESS:
   1989                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_REPROCESS_STATE event = %s",
   1990                                  printState);
   1991                     mNextState = LOADED_REPROCESS_STATE;
   1992                     break;
   1993 #endif
   1994 
   1995                 case CAMERA_START_VIDEO:
   1996                     CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->VIDEO_STATE event = %s",
   1997                             printState);
   1998                     mNextState = VIDEO_STATE;
   1999                     break;
   2000 
   2001                 case CAMERA_CANCEL_AUTOFOCUS:
   2002                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   2003                 case CAMERA_STOP_SMOOTH_ZOOM:
   2004                     CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = %s",
   2005                             printState);
   2006                     mNextState = PREVIEW_STATE;
   2007                     break;
   2008 
   2009                 case CAMERA_STOP_IMAGE_CAPTURE:
   2010                 case CAMERA_STOP_BRACKET_CAPTURE:
   2011                     CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = %s",
   2012                                  printState);
   2013                     ret = INVALID_OPERATION;
   2014                     break;
   2015 
   2016                 default:
   2017                     CAMHAL_LOGEB("Adapter state switch PREVIEW_ACTIVE Invalid Op! event = %s",
   2018                             printState);
   2019                     ret = INVALID_OPERATION;
   2020                     break;
   2021 
   2022                 }
   2023 
   2024             break;
   2025 
   2026 #ifdef OMAP_ENHANCEMENT_CPCAM
   2027         case LOADED_REPROCESS_STATE:
   2028             switch (operation) {
   2029                 case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
   2030                     CAMHAL_LOGDB("Adapter state switch LOADED_REPROCESS_STATE->LOADED_REPROCESS_CAPTURE_STATE event = %s",
   2031                                  printState);
   2032                     mNextState = LOADED_REPROCESS_CAPTURE_STATE;
   2033                     break;
   2034                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   2035                     CAMHAL_LOGDB("Adapter state switch LOADED_REPROCESS_STATE->LOADED_REPROCESS_STATE event = %s",
   2036                                  printState);
   2037                     mNextState = LOADED_REPROCESS_STATE;
   2038                     break;
   2039                 default:
   2040                     CAMHAL_LOGEB("Adapter state switch LOADED_REPROCESS_STATE Invalid Op! event = %s",
   2041                                  printState);
   2042                     ret = INVALID_OPERATION;
   2043                     break;
   2044                 }
   2045 
   2046             break;
   2047 
   2048         case LOADED_REPROCESS_CAPTURE_STATE:
   2049             switch (operation) {
   2050                 case CAMERA_START_IMAGE_CAPTURE:
   2051                     CAMHAL_LOGDB("Adapter state switch LOADED_REPROCESS_CAPTURE_STATE->REPROCESS_STATE event = %s",
   2052                                  printState);
   2053                     mNextState = REPROCESS_STATE;
   2054                     break;
   2055                 default:
   2056                     CAMHAL_LOGEB("Adapter state switch LOADED_REPROCESS_CAPTURE_STATE Invalid Op! event = %s",
   2057                                  printState);
   2058                     ret = INVALID_OPERATION;
   2059                     break;
   2060             }
   2061             break;
   2062 #endif
   2063 
   2064         case LOADED_CAPTURE_STATE:
   2065 
   2066             switch ( operation )
   2067                 {
   2068 
   2069                 case CAMERA_START_IMAGE_CAPTURE:
   2070                     CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = %s",
   2071                             printState);
   2072                     mNextState = CAPTURE_STATE;
   2073                     break;
   2074 
   2075                 case CAMERA_START_BRACKET_CAPTURE:
   2076                     CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->BRACKETING_STATE event = %s",
   2077                             printState);
   2078                     mNextState = BRACKETING_STATE;
   2079                     break;
   2080 
   2081                 case CAMERA_USE_BUFFERS_VIDEO_CAPTURE:
   2082                     //Hadnle this state for raw capture path.
   2083                     //Just need to keep the same state.
   2084                     //The next CAMERA_START_IMAGE_CAPTURE command will assign the mNextState.
   2085                     CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->LOADED_CAPTURE_STATE event = %s",
   2086                             printState);
   2087                     break;
   2088 
   2089                 default:
   2090                     CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = %s",
   2091                             printState);
   2092                     ret = INVALID_OPERATION;
   2093                     break;
   2094 
   2095                 }
   2096 
   2097             break;
   2098 
   2099         case CAPTURE_STATE:
   2100 
   2101             switch ( operation )
   2102                 {
   2103                 case CAMERA_STOP_IMAGE_CAPTURE:
   2104                 case CAMERA_STOP_BRACKET_CAPTURE:
   2105                     CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = %s",
   2106                             printState);
   2107                     mNextState = PREVIEW_STATE;
   2108                     break;
   2109 
   2110                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   2111                 case CAMERA_START_IMAGE_CAPTURE:
   2112                      CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->CAPTURE_STATE event = %s",
   2113                                  printState);
   2114                     mNextState = CAPTURE_STATE;
   2115                     break;
   2116 
   2117 #ifdef OMAP_ENHANCEMENT_CPCAM
   2118                 case CAMERA_USE_BUFFERS_REPROCESS:
   2119                     CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->->LOADED_REPROCESS_STATE event = %s",
   2120                                  printState);
   2121                     mNextState = LOADED_REPROCESS_STATE;
   2122                     break;
   2123 #endif
   2124 
   2125                 default:
   2126                     CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = %s",
   2127                             printState);
   2128                     ret = INVALID_OPERATION;
   2129                     break;
   2130 
   2131                 }
   2132 
   2133             break;
   2134 
   2135         case BRACKETING_STATE:
   2136 
   2137             switch ( operation )
   2138                 {
   2139 
   2140                 case CAMERA_STOP_IMAGE_CAPTURE:
   2141                 case CAMERA_STOP_BRACKET_CAPTURE:
   2142                     CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->PREVIEW_STATE event = %s",
   2143                             printState);
   2144                     mNextState = PREVIEW_STATE;
   2145                     break;
   2146 
   2147                 case CAMERA_START_IMAGE_CAPTURE:
   2148                     CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->CAPTURE_STATE event = %s",
   2149                             printState);
   2150                     mNextState = CAPTURE_STATE;
   2151                     break;
   2152 
   2153                 default:
   2154                     CAMHAL_LOGEB("Adapter state switch BRACKETING_STATE Invalid Op! event = %s",
   2155                             printState);
   2156                     ret = INVALID_OPERATION;
   2157                     break;
   2158 
   2159                 }
   2160 
   2161             break;
   2162 
   2163         case AF_STATE:
   2164 
   2165             switch ( operation )
   2166                 {
   2167 
   2168                 case CAMERA_CANCEL_AUTOFOCUS:
   2169                     CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = %s",
   2170                             printState);
   2171                     mNextState = PREVIEW_STATE;
   2172                     break;
   2173 
   2174                 case CAMERA_START_SMOOTH_ZOOM:
   2175                     CAMHAL_LOGDB("Adapter state switch AF_STATE->AF_ZOOM_STATE event = %s",
   2176                             printState);
   2177                     mNextState = AF_ZOOM_STATE;
   2178                     break;
   2179 
   2180                 default:
   2181                     CAMHAL_LOGEB("Adapter state switch AF_STATE Invalid Op! event = %s",
   2182                             printState);
   2183                     ret = INVALID_OPERATION;
   2184                     break;
   2185 
   2186                 }
   2187 
   2188             break;
   2189 
   2190         case ZOOM_STATE:
   2191 
   2192             switch ( operation )
   2193                 {
   2194 
   2195                 case CAMERA_CANCEL_AUTOFOCUS:
   2196                     CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = %s",
   2197                             printState);
   2198                     mNextState = ZOOM_STATE;
   2199                     break;
   2200 
   2201                 case CAMERA_STOP_SMOOTH_ZOOM:
   2202                     CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->PREVIEW_STATE event = %s",
   2203                             printState);
   2204                     mNextState = PREVIEW_STATE;
   2205                     break;
   2206 
   2207                 case CAMERA_PERFORM_AUTOFOCUS:
   2208                     CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->AF_ZOOM_STATE event = %s",
   2209                             printState);
   2210                     mNextState = AF_ZOOM_STATE;
   2211                     break;
   2212 
   2213                 case CAMERA_START_VIDEO:
   2214                     CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->VIDEO_ZOOM_STATE event = %s",
   2215                             printState);
   2216                     mNextState = VIDEO_ZOOM_STATE;
   2217                     break;
   2218 
   2219                 default:
   2220                     CAMHAL_LOGEB("Adapter state switch ZOOM_STATE Invalid Op! event = %s",
   2221                             printState);
   2222                     ret = INVALID_OPERATION;
   2223                     break;
   2224 
   2225                 }
   2226 
   2227             break;
   2228 
   2229         case VIDEO_STATE:
   2230 
   2231             switch ( operation )
   2232                 {
   2233 
   2234                 case CAMERA_STOP_VIDEO:
   2235                     CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->PREVIEW_STATE event = %s",
   2236                             printState);
   2237                     mNextState = PREVIEW_STATE;
   2238                     break;
   2239 
   2240                 case CAMERA_PERFORM_AUTOFOCUS:
   2241                     CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_AF_STATE event = %s",
   2242                             printState);
   2243                     mNextState = VIDEO_AF_STATE;
   2244                     break;
   2245 
   2246                 case CAMERA_START_SMOOTH_ZOOM:
   2247                     CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_ZOOM_STATE event = %s",
   2248                             printState);
   2249                     mNextState = VIDEO_ZOOM_STATE;
   2250                     break;
   2251 
   2252                 case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
   2253                     CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_LOADED_CAPTURE_STATE event = %s",
   2254                             printState);
   2255                     mNextState = VIDEO_LOADED_CAPTURE_STATE;
   2256                     break;
   2257 
   2258                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   2259                     CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_STATE event = %s",
   2260                             printState);
   2261                     mNextState = VIDEO_STATE;
   2262                     break;
   2263 
   2264                 default:
   2265                     CAMHAL_LOGEB("Adapter state switch VIDEO_STATE Invalid Op! event = %s",
   2266                             printState);
   2267                     ret = INVALID_OPERATION;
   2268                     break;
   2269 
   2270                 }
   2271 
   2272             break;
   2273 
   2274         case VIDEO_AF_STATE:
   2275 
   2276             switch ( operation )
   2277                 {
   2278 
   2279                 case CAMERA_CANCEL_AUTOFOCUS:
   2280                     CAMHAL_LOGDB("Adapter state switch VIDEO_AF_STATE->VIDEO_STATE event = %s",
   2281                             printState);
   2282                     mNextState = VIDEO_STATE;
   2283                     break;
   2284 
   2285                 default:
   2286                     CAMHAL_LOGEB("Adapter state switch VIDEO_AF_STATE Invalid Op! event = %s",
   2287                             printState);
   2288                     ret = INVALID_OPERATION;
   2289                     break;
   2290 
   2291                 }
   2292 
   2293             break;
   2294 
   2295         case VIDEO_LOADED_CAPTURE_STATE:
   2296 
   2297             switch ( operation )
   2298                 {
   2299 
   2300                 case CAMERA_START_IMAGE_CAPTURE:
   2301                     CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = %s",
   2302                             printState);
   2303                     mNextState = VIDEO_CAPTURE_STATE;
   2304                     break;
   2305 
   2306                 default:
   2307                     CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = %s",
   2308                             printState);
   2309                     ret = INVALID_OPERATION;
   2310                     break;
   2311 
   2312                 }
   2313 
   2314             break;
   2315 
   2316         case VIDEO_CAPTURE_STATE:
   2317 
   2318             switch ( operation )
   2319                 {
   2320                 case CAMERA_STOP_IMAGE_CAPTURE:
   2321                     CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = %s",
   2322                             printState);
   2323                     mNextState = VIDEO_STATE;
   2324                     break;
   2325 
   2326                 default:
   2327                     CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = %s",
   2328                             printState);
   2329                     ret = INVALID_OPERATION;
   2330                     break;
   2331 
   2332                 }
   2333 
   2334             break;
   2335 
   2336         case AF_ZOOM_STATE:
   2337 
   2338             switch ( operation )
   2339                 {
   2340 
   2341                 case CAMERA_STOP_SMOOTH_ZOOM:
   2342                     CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->AF_STATE event = %s",
   2343                             printState);
   2344                     mNextState = AF_STATE;
   2345                     break;
   2346 
   2347                 case CAMERA_CANCEL_AUTOFOCUS:
   2348                     CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->ZOOM_STATE event = %s",
   2349                             printState);
   2350                     mNextState = ZOOM_STATE;
   2351                     break;
   2352 
   2353                 default:
   2354                     CAMHAL_LOGEB("Adapter state switch AF_ZOOM_STATE Invalid Op! event = %s",
   2355                             printState);
   2356                     ret = INVALID_OPERATION;
   2357                     break;
   2358 
   2359                 }
   2360 
   2361             break;
   2362 
   2363         case VIDEO_ZOOM_STATE:
   2364 
   2365             switch ( operation )
   2366                 {
   2367 
   2368                 case CAMERA_STOP_SMOOTH_ZOOM:
   2369                     CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->VIDEO_STATE event = %s",
   2370                             printState);
   2371                     mNextState = VIDEO_STATE;
   2372                     break;
   2373 
   2374                 case CAMERA_STOP_VIDEO:
   2375                     CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->ZOOM_STATE event = %s",
   2376                             printState);
   2377                     mNextState = ZOOM_STATE;
   2378                     break;
   2379 
   2380                 default:
   2381                     CAMHAL_LOGEB("Adapter state switch VIDEO_ZOOM_STATE Invalid Op! event = %s",
   2382                             printState);
   2383                     ret = INVALID_OPERATION;
   2384                     break;
   2385 
   2386                 }
   2387 
   2388             break;
   2389 
   2390         case BRACKETING_ZOOM_STATE:
   2391 
   2392             switch ( operation )
   2393                 {
   2394 
   2395                 case CAMERA_STOP_SMOOTH_ZOOM:
   2396                     CAMHAL_LOGDB("Adapter state switch BRACKETING_ZOOM_STATE->BRACKETING_STATE event = %s",
   2397                             printState);
   2398                     mNextState = BRACKETING_STATE;
   2399                     break;
   2400 
   2401                 default:
   2402                     CAMHAL_LOGEB("Adapter state switch BRACKETING_ZOOM_STATE Invalid Op! event = %s",
   2403                             printState);
   2404                     ret = INVALID_OPERATION;
   2405                     break;
   2406 
   2407                 }
   2408 
   2409             break;
   2410 
   2411 #ifdef OMAP_ENHANCEMENT_CPCAM
   2412         case REPROCESS_STATE:
   2413             switch (operation) {
   2414                 case CAMERA_STOP_IMAGE_CAPTURE:
   2415                     CAMHAL_LOGDB("Adapter state switch REPROCESS_STATE->PREVIEW_STATE event = %s",
   2416                                  printState);
   2417                     mNextState = PREVIEW_STATE;
   2418                     break;
   2419                 case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
   2420                 case CAMERA_START_IMAGE_CAPTURE:
   2421                      CAMHAL_LOGDB("Adapter state switch REPROCESS_STATE->REPROCESS_STATE event = %s",
   2422                                  printState);
   2423                     mNextState = REPROCESS_STATE;
   2424                     break;
   2425                 case CAMERA_USE_BUFFERS_REPROCESS:
   2426                      CAMHAL_LOGDB("Adapter state switch REPROCESS_STATE->REPROCESS_STATE event = %s",
   2427                                  printState);
   2428                     mNextState = LOADED_REPROCESS_STATE;
   2429                     break;
   2430 
   2431                 case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
   2432                     CAMHAL_LOGDB("Adapter state switch REPROCESS_STATE->LOADED_CAPTURE_STATE event = %s",
   2433                             printState);
   2434                     mNextState = LOADED_CAPTURE_STATE;
   2435                     break;
   2436                 default:
   2437                     CAMHAL_LOGEB("Adapter state switch REPROCESS_STATE Invalid Op! event = %s",
   2438                                  printState);
   2439                     ret = INVALID_OPERATION;
   2440                     break;
   2441 
   2442                 }
   2443 
   2444             break;
   2445 #endif
   2446 
   2447 
   2448         default:
   2449             CAMHAL_LOGEA("Invalid Adapter state!");
   2450             ret = INVALID_OPERATION;
   2451         }
   2452 
   2453     LOG_FUNCTION_NAME_EXIT;
   2454 
   2455     return ret;
   2456 }
   2457 
   2458 status_t BaseCameraAdapter::rollbackToInitializedState()
   2459 {
   2460     status_t ret = NO_ERROR;
   2461 
   2462     LOG_FUNCTION_NAME;
   2463 
   2464     while ((getState() != INTIALIZED_STATE) && (ret == NO_ERROR)) {
   2465         ret = rollbackToPreviousState();
   2466     }
   2467 
   2468     LOG_FUNCTION_NAME_EXIT;
   2469 
   2470     return ret;
   2471 }
   2472 
   2473 status_t BaseCameraAdapter::rollbackToPreviousState()
   2474 {
   2475     status_t ret = NO_ERROR;
   2476 
   2477     LOG_FUNCTION_NAME;
   2478 
   2479     CameraAdapter::AdapterState currentState = getState();
   2480 
   2481     switch (currentState) {
   2482         case INTIALIZED_STATE:
   2483             return NO_ERROR;
   2484 
   2485         case PREVIEW_STATE:
   2486             ret = sendCommand(CAMERA_STOP_PREVIEW);
   2487             break;
   2488 
   2489         case CAPTURE_STATE:
   2490 #ifdef OMAP_ENHANCEMENT_CPCAM
   2491         case REPROCESS_STATE:
   2492 #endif
   2493             ret = sendCommand(CAMERA_STOP_IMAGE_CAPTURE);
   2494             break;
   2495 
   2496         case BRACKETING_STATE:
   2497             ret = sendCommand(CAMERA_STOP_BRACKET_CAPTURE);
   2498             break;
   2499 
   2500         case AF_STATE:
   2501             ret = sendCommand(CAMERA_CANCEL_AUTOFOCUS);
   2502             break;
   2503 
   2504         case ZOOM_STATE:
   2505             ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
   2506             break;
   2507 
   2508         case VIDEO_STATE:
   2509             ret = sendCommand(CAMERA_STOP_VIDEO);
   2510             break;
   2511 
   2512         case VIDEO_AF_STATE:
   2513             ret = sendCommand(CAMERA_CANCEL_AUTOFOCUS);
   2514             break;
   2515 
   2516         case VIDEO_CAPTURE_STATE:
   2517             ret = sendCommand(CAMERA_STOP_IMAGE_CAPTURE);
   2518             break;
   2519 
   2520         case AF_ZOOM_STATE:
   2521             ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
   2522             break;
   2523 
   2524         case VIDEO_ZOOM_STATE:
   2525             ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
   2526             break;
   2527 
   2528         case BRACKETING_ZOOM_STATE:
   2529             ret = sendCommand(CAMERA_STOP_SMOOTH_ZOOM);
   2530             break;
   2531 
   2532         default:
   2533             CAMHAL_LOGEA("Invalid Adapter state!");
   2534             ret = INVALID_OPERATION;
   2535     }
   2536 
   2537     LOG_FUNCTION_NAME_EXIT;
   2538 
   2539     return ret;
   2540 }
   2541 
   2542 //State transition finished successfully.
   2543 //Commit the state and unlock the adapter state.
   2544 status_t BaseCameraAdapter::commitState()
   2545 {
   2546     status_t ret = NO_ERROR;
   2547 
   2548     LOG_FUNCTION_NAME;
   2549 
   2550     mAdapterState = mNextState;
   2551 
   2552     mLock.unlock();
   2553 
   2554     LOG_FUNCTION_NAME_EXIT;
   2555 
   2556     return ret;
   2557 }
   2558 
   2559 status_t BaseCameraAdapter::rollbackState()
   2560 {
   2561     status_t ret = NO_ERROR;
   2562 
   2563     LOG_FUNCTION_NAME;
   2564 
   2565     mNextState = mAdapterState;
   2566 
   2567     mLock.unlock();
   2568 
   2569     LOG_FUNCTION_NAME_EXIT;
   2570 
   2571     return ret;
   2572 }
   2573 
   2574 // getNextState() and getState()
   2575 // publicly exposed functions to retrieve the adapter states
   2576 // please notice that these functions are locked
   2577 CameraAdapter::AdapterState BaseCameraAdapter::getState()
   2578 {
   2579     status_t ret = NO_ERROR;
   2580 
   2581     LOG_FUNCTION_NAME;
   2582 
   2583     android::AutoMutex lock(mLock);
   2584 
   2585     LOG_FUNCTION_NAME_EXIT;
   2586 
   2587     return mAdapterState;
   2588 }
   2589 
   2590 CameraAdapter::AdapterState BaseCameraAdapter::getNextState()
   2591 {
   2592     status_t ret = NO_ERROR;
   2593 
   2594     LOG_FUNCTION_NAME;
   2595 
   2596     android::AutoMutex lock(mLock);
   2597 
   2598     LOG_FUNCTION_NAME_EXIT;
   2599 
   2600     return mNextState;
   2601 }
   2602 
   2603 // getNextState() and getState()
   2604 // internal protected functions to retrieve the adapter states
   2605 // please notice that these functions are NOT locked to help
   2606 // internal functions query state in the middle of state
   2607 // transition
   2608 status_t BaseCameraAdapter::getState(AdapterState &state)
   2609 {
   2610     status_t ret = NO_ERROR;
   2611 
   2612     LOG_FUNCTION_NAME;
   2613 
   2614     state = mAdapterState;
   2615 
   2616     LOG_FUNCTION_NAME_EXIT;
   2617 
   2618     return ret;
   2619 }
   2620 
   2621 status_t BaseCameraAdapter::getNextState(AdapterState &state)
   2622 {
   2623     status_t ret = NO_ERROR;
   2624 
   2625     LOG_FUNCTION_NAME;
   2626 
   2627     state = mNextState;
   2628 
   2629     LOG_FUNCTION_NAME_EXIT;
   2630 
   2631     return ret;
   2632 }
   2633 
   2634 void BaseCameraAdapter::onOrientationEvent(uint32_t orientation, uint32_t tilt)
   2635 {
   2636     LOG_FUNCTION_NAME;
   2637     LOG_FUNCTION_NAME_EXIT;
   2638 }
   2639 
   2640 //-----------------------------------------------------------------------------
   2641 
   2642 extern "C" status_t OMXCameraAdapter_Capabilities(
   2643         CameraProperties::Properties * const properties_array,
   2644         const int starting_camera, const int max_camera, int & supportedCameras);
   2645 extern "C" status_t V4LCameraAdapter_Capabilities(
   2646         CameraProperties::Properties * const properties_array,
   2647         const int starting_camera, const int max_camera, int & supportedCameras);
   2648 
   2649 extern "C" status_t CameraAdapter_Capabilities(
   2650         CameraProperties::Properties * const properties_array,
   2651         const int starting_camera, const int max_camera, int & supportedCameras)
   2652 {
   2653 
   2654     status_t ret = NO_ERROR;
   2655     status_t err = NO_ERROR;
   2656     int num_cameras_supported = 0;
   2657 
   2658     LOG_FUNCTION_NAME;
   2659 
   2660     supportedCameras = 0;
   2661 #ifdef OMX_CAMERA_ADAPTER
   2662     //Query OMX cameras
   2663     err = OMXCameraAdapter_Capabilities( properties_array, starting_camera,
   2664                                          max_camera, supportedCameras);
   2665     if(err != NO_ERROR) {
   2666         CAMHAL_LOGEA("error while getting OMXCameraAdapter capabilities");
   2667         ret = UNKNOWN_ERROR;
   2668     }
   2669 #endif
   2670 #ifdef V4L_CAMERA_ADAPTER
   2671     //Query V4L cameras
   2672     err = V4LCameraAdapter_Capabilities( properties_array, (const int) supportedCameras,
   2673                                          max_camera, num_cameras_supported);
   2674     if(err != NO_ERROR) {
   2675         CAMHAL_LOGEA("error while getting V4LCameraAdapter capabilities");
   2676         ret = UNKNOWN_ERROR;
   2677     }
   2678 #endif
   2679 
   2680     supportedCameras += num_cameras_supported;
   2681     CAMHAL_LOGEB("supportedCameras= %d\n", supportedCameras);
   2682     LOG_FUNCTION_NAME_EXIT;
   2683     return ret;
   2684 }
   2685 
   2686 //-----------------------------------------------------------------------------
   2687 
   2688 } // namespace Camera
   2689 } // namespace Ti
   2690 
   2691 /*--------------------Camera Adapter Class ENDS here-----------------------------*/
   2692 
   2693