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