BaseCameraAdapter.cpp revision 524cc0cda6ed8cb07e0469fc931657ac60335aa1
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
23namespace android {
24
25/*--------------------Camera Adapter Class STARTS here-----------------------------*/
26
27BaseCameraAdapter::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
63BaseCameraAdapter::~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
81status_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
95status_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
109status_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
131void 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
172void 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
223void BaseCameraAdapter::returnFrame(void* frameBuf, CameraFrame::FrameType frameType)
224{
225    status_t res = NO_ERROR;
226    size_t subscriberCount = 0;
227    int refCount = -1;
228
229    Mutex::Autolock lock(mReturnFrameLock);
230
231    if ( NULL == frameBuf )
232        {
233        CAMHAL_LOGEA("Invalid frameBuf");
234        return;
235        }
236
237    if ( NO_ERROR == res)
238        {
239
240        refCount = getFrameRefCount(frameBuf,  frameType);
241
242        if ( 0 < refCount )
243            {
244
245            refCount--;
246            setFrameRefCount(frameBuf, frameType, refCount);
247
248            if ( ( mRecording ) && (  CameraFrame::VIDEO_FRAME_SYNC == frameType ) )
249                {
250                refCount += getFrameRefCount(frameBuf, CameraFrame::PREVIEW_FRAME_SYNC);
251                }
252            else if ( ( mRecording ) && (  CameraFrame::PREVIEW_FRAME_SYNC == frameType ) )
253                {
254                refCount += getFrameRefCount(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
255                }
256
257            }
258        else
259            {
260            return;
261            }
262        }
263
264    if ( NO_ERROR == res )
265        {
266        //check if someone is holding this buffer
267        if ( 0 == refCount )
268            {
269            res = fillThisBuffer(frameBuf, frameType);
270            }
271        }
272
273}
274
275status_t BaseCameraAdapter::sendCommand(CameraCommands operation, int value1, int value2, int value3)
276{
277    status_t ret = NO_ERROR;
278    struct timeval *refTimestamp;
279    BuffersDescriptor *desc = NULL;
280    CameraFrame *frame = NULL;
281
282    LOG_FUNCTION_NAME;
283
284    switch ( operation ) {
285        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW:
286                CAMHAL_LOGDA("Use buffers for preview");
287                desc = ( BuffersDescriptor * ) value1;
288
289                if ( NULL == desc )
290                    {
291                    CAMHAL_LOGEA("Invalid preview buffers!");
292                    return -EINVAL;
293                    }
294
295                if ( ret == NO_ERROR )
296                    {
297                    ret = setState(operation);
298                    }
299
300                if ( ret == NO_ERROR )
301                    {
302                    Mutex::Autolock lock(mPreviewBufferLock);
303                    mPreviewBuffers = (int *) desc->mBuffers;
304                    mPreviewBuffersLength = desc->mLength;
305                    mPreviewBuffersAvailable.clear();
306                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
307                        {
308                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 0);
309                        }
310                    // initial ref count for undeqeueued buffers is 1 since buffer provider
311                    // is still holding on to it
312                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
313                        {
314                        mPreviewBuffersAvailable.add(mPreviewBuffers[i], 1);
315                        }
316                    }
317
318                if ( NULL != desc )
319                    {
320                    ret = useBuffers(CameraAdapter::CAMERA_PREVIEW,
321                                     desc->mBuffers,
322                                     desc->mCount,
323                                     desc->mLength,
324                                     desc->mMaxQueueable);
325                    }
326
327                if ( ret == NO_ERROR )
328                    {
329                    ret = commitState();
330                    }
331                else
332                    {
333                    ret |= rollbackState();
334                    }
335
336                break;
337
338        case CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA:
339                    CAMHAL_LOGDA("Use buffers for preview data");
340                    desc = ( BuffersDescriptor * ) value1;
341
342                    if ( NULL == desc )
343                        {
344                        CAMHAL_LOGEA("Invalid preview data buffers!");
345                        return -EINVAL;
346                        }
347
348                    if ( ret == NO_ERROR )
349                        {
350                        ret = setState(operation);
351                        }
352
353                    if ( ret == NO_ERROR )
354                        {
355                        Mutex::Autolock lock(mPreviewDataBufferLock);
356                        mPreviewDataBuffers = (int *) desc->mBuffers;
357                        mPreviewDataBuffersLength = desc->mLength;
358                        mPreviewDataBuffersAvailable.clear();
359                        for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
360                            {
361                            mPreviewDataBuffersAvailable.add(mPreviewDataBuffers[i], true);
362                            }
363                        // initial ref count for undeqeueued buffers is 1 since buffer provider
364                        // is still holding on to it
365                        for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
366                            {
367                            mPreviewDataBuffersAvailable.add(mPreviewBuffers[i], 1);
368                            }
369                        }
370
371                    if ( NULL != desc )
372                        {
373                        ret = useBuffers(CameraAdapter::CAMERA_MEASUREMENT,
374                                         desc->mBuffers,
375                                         desc->mCount,
376                                         desc->mLength,
377                                         desc->mMaxQueueable);
378                        }
379
380                    if ( ret == NO_ERROR )
381                        {
382                        ret = commitState();
383                        }
384                    else
385                        {
386                        ret |= rollbackState();
387                        }
388
389                    break;
390
391        case CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
392                CAMHAL_LOGDA("Use buffers for image capture");
393                desc = ( BuffersDescriptor * ) value1;
394
395                if ( NULL == desc )
396                    {
397                    CAMHAL_LOGEA("Invalid capture buffers!");
398                    return -EINVAL;
399                    }
400
401                if ( ret == NO_ERROR )
402                    {
403                    ret = setState(operation);
404                    }
405
406                if ( ret == NO_ERROR )
407                    {
408                    Mutex::Autolock lock(mCaptureBufferLock);
409                    mCaptureBuffers = (int *) desc->mBuffers;
410                    mCaptureBuffersLength = desc->mLength;
411                    mCaptureBuffersAvailable.clear();
412                    for ( uint32_t i = 0 ; i < desc->mMaxQueueable ; i++ )
413                        {
414                        mCaptureBuffersAvailable.add(mCaptureBuffers[i], true);
415                        }
416                    // initial ref count for undeqeueued buffers is 1 since buffer provider
417                    // is still holding on to it
418                    for ( uint32_t i = desc->mMaxQueueable ; i < desc->mCount ; i++ )
419                        {
420                        mCaptureBuffersAvailable.add(mPreviewBuffers[i], 1);
421                        }
422                    }
423
424                if ( NULL != desc )
425                    {
426                    ret = useBuffers(CameraAdapter::CAMERA_IMAGE_CAPTURE,
427                                     desc->mBuffers,
428                                     desc->mCount,
429                                     desc->mLength,
430                                     desc->mMaxQueueable);
431                    }
432
433                if ( ret == NO_ERROR )
434                    {
435                    ret = commitState();
436                    }
437                else
438                    {
439                    ret |= rollbackState();
440                    }
441
442                break;
443
444        case CameraAdapter::CAMERA_START_SMOOTH_ZOOM:
445            {
446
447            if ( ret == NO_ERROR )
448                {
449                ret = setState(operation);
450                }
451
452            if ( ret == NO_ERROR )
453                {
454                ret = startSmoothZoom(value1);
455                }
456
457            if ( ret == NO_ERROR )
458                {
459                ret = commitState();
460                }
461            else
462                {
463                ret |= rollbackState();
464                }
465
466            break;
467
468            }
469
470        case CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM:
471            {
472
473            if ( ret == NO_ERROR )
474                {
475                ret = setState(operation);
476                }
477
478            if ( ret == NO_ERROR )
479                {
480                ret = stopSmoothZoom();
481                }
482
483            if ( ret == NO_ERROR )
484                {
485                ret = commitState();
486                }
487            else
488                {
489                ret |= rollbackState();
490                }
491
492            break;
493
494            }
495
496        case CameraAdapter::CAMERA_START_PREVIEW:
497            {
498
499                CAMHAL_LOGDA("Start Preview");
500
501            if ( ret == NO_ERROR )
502                {
503                ret = setState(operation);
504                }
505
506            if ( ret == NO_ERROR )
507                {
508                ret = startPreview();
509                }
510
511            if ( ret == NO_ERROR )
512                {
513                ret = commitState();
514                }
515            else
516                {
517                ret |= rollbackState();
518                }
519
520            break;
521
522            }
523
524        case CameraAdapter::CAMERA_STOP_PREVIEW:
525            {
526
527            CAMHAL_LOGDA("Stop Preview");
528
529            if ( ret == NO_ERROR )
530                {
531                ret = setState(operation);
532                }
533
534            if ( ret == NO_ERROR )
535                {
536                ret = stopPreview();
537                }
538
539            if ( ret == NO_ERROR )
540                {
541                ret = commitState();
542                }
543            else
544                {
545                ret |= rollbackState();
546                }
547
548            break;
549
550            }
551
552        case CameraAdapter::CAMERA_START_VIDEO:
553            {
554
555            CAMHAL_LOGDA("Start video recording");
556
557            if ( ret == NO_ERROR )
558                {
559                ret = setState(operation);
560                }
561
562            if ( ret == NO_ERROR )
563                {
564                ret = startVideoCapture();
565                }
566
567            if ( ret == NO_ERROR )
568                {
569                ret = commitState();
570                }
571            else
572                {
573                ret |= rollbackState();
574                }
575
576            break;
577
578            }
579
580        case CameraAdapter::CAMERA_STOP_VIDEO:
581            {
582
583            CAMHAL_LOGDA("Stop video recording");
584
585            if ( ret == NO_ERROR )
586                {
587                ret = setState(operation);
588                }
589
590            if ( ret == NO_ERROR )
591                {
592                ret = stopVideoCapture();
593                }
594
595            if ( ret == NO_ERROR )
596                {
597                ret = commitState();
598                }
599            else
600                {
601                ret |= rollbackState();
602                }
603
604            break;
605
606            }
607
608        case CameraAdapter::CAMERA_PREVIEW_FLUSH_BUFFERS:
609            {
610
611            if ( ret == NO_ERROR )
612                {
613                ret = setState(operation);
614                }
615
616            if ( ret == NO_ERROR )
617                {
618                ret = flushBuffers();
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_START_IMAGE_CAPTURE:
635            {
636
637#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
638
639            refTimestamp = ( struct timeval * ) value1;
640            if ( NULL != refTimestamp )
641                {
642                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
643                }
644
645#endif
646
647            if ( ret == NO_ERROR )
648                {
649                ret = setState(operation);
650                }
651
652            if ( ret == NO_ERROR )
653                {
654                ret = takePicture();
655                }
656
657            if ( ret == NO_ERROR )
658                {
659                ret = commitState();
660                }
661            else
662                {
663                ret |= rollbackState();
664                }
665
666            break;
667
668            }
669
670        case CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE:
671            {
672
673            if ( ret == NO_ERROR )
674                {
675                ret = setState(operation);
676                }
677
678            if ( ret == NO_ERROR )
679                {
680                ret = stopImageCapture();
681                }
682
683            if ( ret == NO_ERROR )
684                {
685                ret = commitState();
686                }
687            else
688                {
689                ret |= rollbackState();
690                }
691
692            break;
693
694            }
695
696        case CameraAdapter::CAMERA_START_BRACKET_CAPTURE:
697            {
698
699#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
700
701            refTimestamp = ( struct timeval * ) value2;
702            if ( NULL != refTimestamp )
703                {
704                memcpy( &mStartCapture, refTimestamp, sizeof( struct timeval ));
705                }
706
707#endif
708
709            if ( ret == NO_ERROR )
710                {
711                ret = setState(operation);
712                }
713
714            if ( ret == NO_ERROR )
715                {
716                ret = startBracketing(value1);
717                }
718
719            if ( ret == NO_ERROR )
720                {
721                ret = commitState();
722                }
723            else
724                {
725                ret |= rollbackState();
726                }
727
728            break;
729
730            }
731
732        case CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE:
733            {
734
735            if ( ret == NO_ERROR )
736                {
737                ret = setState(operation);
738                }
739
740            if ( ret == NO_ERROR )
741                {
742                ret = stopBracketing();
743                }
744
745            if ( ret == NO_ERROR )
746                {
747                ret = commitState();
748                }
749            else
750                {
751                ret |= rollbackState();
752                }
753
754            break;
755
756            }
757
758        case CameraAdapter::CAMERA_PERFORM_AUTOFOCUS:
759
760#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
761
762            refTimestamp = ( struct timeval * ) value1;
763            if ( NULL != refTimestamp )
764                {
765                memcpy( &mStartFocus, refTimestamp, sizeof( struct timeval ));
766                }
767
768#endif
769
770            if ( ret == NO_ERROR )
771                {
772                ret = setState(operation);
773                }
774
775            if ( ret == NO_ERROR )
776                {
777                ret = autoFocus();
778                }
779
780            if ( ret == NO_ERROR )
781                {
782                ret = commitState();
783                }
784            else
785                {
786                ret |= rollbackState();
787                }
788
789            break;
790
791        case CameraAdapter::CAMERA_CANCEL_AUTOFOCUS:
792
793            if ( ret == NO_ERROR )
794                {
795                ret = setState(operation);
796                }
797
798            if ( ret == NO_ERROR )
799                {
800                ret = cancelAutoFocus();
801                }
802
803            if ( ret == NO_ERROR )
804                {
805                ret = commitState();
806                }
807            else
808                {
809                ret |= rollbackState();
810                }
811
812            break;
813
814        case CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW:
815
816             if ( ret == NO_ERROR )
817                 {
818                 ret = setState(operation);
819                 }
820
821             if ( ret == NO_ERROR )
822                 {
823                 frame = ( CameraFrame * ) value1;
824
825                 if ( NULL != frame )
826                     {
827                     ret = getFrameSize(frame->mWidth, frame->mHeight);
828                     }
829                 else
830                     {
831                     ret = -EINVAL;
832                     }
833                 }
834
835             if ( ret == NO_ERROR )
836                 {
837                 ret = commitState();
838                 }
839             else
840                 {
841                 ret |= rollbackState();
842                 }
843
844             break;
845
846         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
847
848             if ( ret == NO_ERROR )
849                 {
850                 ret = setState(operation);
851                 }
852
853             if ( ret == NO_ERROR )
854                 {
855                 frame = ( CameraFrame * ) value1;
856
857                 if ( NULL != frame )
858                     {
859                     ret = getPictureBufferSize(frame->mLength, value2);
860                     }
861                 else
862                     {
863                     ret = -EINVAL;
864                     }
865                 }
866
867             if ( ret == NO_ERROR )
868                 {
869                 ret = commitState();
870                 }
871             else
872                 {
873                 ret |= rollbackState();
874                 }
875
876             break;
877
878         case CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
879
880             if ( ret == NO_ERROR )
881                 {
882                 ret = setState(operation);
883                 }
884
885             if ( ret == NO_ERROR )
886                 {
887                 frame = ( CameraFrame * ) value1;
888
889                 if ( NULL != frame )
890                     {
891                     ret = getFrameDataSize(frame->mLength, value2);
892                     }
893                 else
894                     {
895                     ret = -EINVAL;
896                     }
897                 }
898
899             if ( ret == NO_ERROR )
900                 {
901                 ret = commitState();
902                 }
903             else
904                 {
905                 ret |= rollbackState();
906                 }
907
908             break;
909
910         case CameraAdapter::CAMERA_START_FD:
911
912             ret = startFaceDetection();
913
914             break;
915
916         case CameraAdapter::CAMERA_STOP_FD:
917
918             ret = stopFaceDetection();
919
920             break;
921
922        default:
923            CAMHAL_LOGEB("Command 0x%x unsupported!", operation);
924            break;
925    };
926
927    LOG_FUNCTION_NAME_EXIT;
928    return ret;
929}
930
931status_t BaseCameraAdapter::notifyFocusSubscribers(bool status)
932{
933    event_callback eventCb;
934    CameraHalEvent focusEvent;
935    status_t ret = NO_ERROR;
936
937    LOG_FUNCTION_NAME;
938
939    if ( mFocusSubscribers.size() == 0 ) {
940        CAMHAL_LOGDA("No Focus Subscribers!");
941        return NO_INIT;
942    }
943
944#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
945
946     //dump the AF latency
947     CameraHal::PPM("Focus finished in: ", &mStartFocus);
948
949#endif
950
951    focusEvent.mEventData = new CameraHalEvent::CameraHalEventData();
952    if ( NULL == focusEvent.mEventData.get() ) {
953        return -ENOMEM;
954    }
955
956    focusEvent.mEventType = CameraHalEvent::EVENT_FOCUS_LOCKED;
957    focusEvent.mEventData->focusEvent.focusLocked = status;
958    focusEvent.mEventData->focusEvent.focusError = !status;
959
960    for (unsigned int i = 0 ; i < mFocusSubscribers.size(); i++ )
961        {
962        focusEvent.mCookie = (void *) mFocusSubscribers.keyAt(i);
963        eventCb = (event_callback) mFocusSubscribers.valueAt(i);
964        eventCb ( &focusEvent );
965        }
966
967    focusEvent.mEventData.clear();
968
969    LOG_FUNCTION_NAME_EXIT;
970
971    return ret;
972}
973
974status_t BaseCameraAdapter::notifyShutterSubscribers()
975{
976    CameraHalEvent shutterEvent;
977    event_callback eventCb;
978    status_t ret = NO_ERROR;
979
980    LOG_FUNCTION_NAME;
981
982    if ( mShutterSubscribers.size() == 0 )
983        {
984        CAMHAL_LOGEA("No shutter Subscribers!");
985        return NO_INIT;
986        }
987
988    shutterEvent.mEventData = new CameraHalEvent::CameraHalEventData();
989    if ( NULL == shutterEvent.mEventData.get() ) {
990        return -ENOMEM;
991    }
992
993    shutterEvent.mEventType = CameraHalEvent::EVENT_SHUTTER;
994    shutterEvent.mEventData->shutterEvent.shutterClosed = true;
995
996    for (unsigned int i = 0 ; i < mShutterSubscribers.size() ; i++ ) {
997        shutterEvent.mCookie = ( void * ) mShutterSubscribers.keyAt(i);
998        eventCb = ( event_callback ) mShutterSubscribers.valueAt(i);
999
1000        CAMHAL_LOGEA("Sending shutter callback");
1001
1002        eventCb ( &shutterEvent );
1003    }
1004
1005    shutterEvent.mEventData.clear();
1006
1007    LOG_FUNCTION_NAME;
1008
1009    return ret;
1010}
1011
1012status_t BaseCameraAdapter::notifyZoomSubscribers(int zoomIdx, bool targetReached)
1013{
1014    event_callback eventCb;
1015    CameraHalEvent zoomEvent;
1016    status_t ret = NO_ERROR;
1017
1018    LOG_FUNCTION_NAME;
1019
1020    if ( mZoomSubscribers.size() == 0 ) {
1021        CAMHAL_LOGDA("No zoom Subscribers!");
1022        return NO_INIT;
1023    }
1024
1025    zoomEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1026    if ( NULL == zoomEvent.mEventData.get() ) {
1027        return -ENOMEM;
1028    }
1029
1030    zoomEvent.mEventType = CameraHalEvent::EVENT_ZOOM_INDEX_REACHED;
1031    zoomEvent.mEventData->zoomEvent.currentZoomIndex = zoomIdx;
1032    zoomEvent.mEventData->zoomEvent.targetZoomIndexReached = targetReached;
1033
1034    for (unsigned int i = 0 ; i < mZoomSubscribers.size(); i++ ) {
1035        zoomEvent.mCookie = (void *) mZoomSubscribers.keyAt(i);
1036        eventCb = (event_callback) mZoomSubscribers.valueAt(i);
1037
1038        eventCb ( &zoomEvent );
1039    }
1040
1041    zoomEvent.mEventData.clear();
1042
1043    LOG_FUNCTION_NAME_EXIT;
1044
1045    return ret;
1046}
1047
1048status_t BaseCameraAdapter::notifyFaceSubscribers(sp<CameraFDResult> &faces)
1049{
1050    event_callback eventCb;
1051    CameraHalEvent faceEvent;
1052    status_t ret = NO_ERROR;
1053
1054    LOG_FUNCTION_NAME;
1055
1056    if ( mFaceSubscribers.size() == 0 ) {
1057        CAMHAL_LOGDA("No face detection subscribers!");
1058        return NO_INIT;
1059    }
1060
1061    faceEvent.mEventData = new CameraHalEvent::CameraHalEventData();
1062    if ( NULL == faceEvent.mEventData.get() ) {
1063        return -ENOMEM;
1064    }
1065
1066    faceEvent.mEventType = CameraHalEvent::EVENT_FACE;
1067    faceEvent.mEventData->faceEvent = faces;
1068
1069    for (unsigned int i = 0 ; i < mFaceSubscribers.size(); i++ ) {
1070        faceEvent.mCookie = (void *) mFaceSubscribers.keyAt(i);
1071        eventCb = (event_callback) mFaceSubscribers.valueAt(i);
1072
1073        eventCb ( &faceEvent );
1074    }
1075
1076    faceEvent.mEventData.clear();
1077
1078    LOG_FUNCTION_NAME_EXIT;
1079
1080    return ret;
1081}
1082
1083status_t BaseCameraAdapter::sendFrameToSubscribers(CameraFrame *frame)
1084{
1085    status_t ret = NO_ERROR;
1086    unsigned int mask;
1087
1088    if ( NULL == frame )
1089        {
1090        CAMHAL_LOGEA("Invalid CameraFrame");
1091        return -EINVAL;
1092        }
1093
1094    for( mask = 1; mask < CameraFrame::ALL_FRAMES; mask <<= 1){
1095      if( mask & frame->mFrameMask ){
1096        switch( mask ){
1097
1098        case CameraFrame::IMAGE_FRAME:
1099          {
1100#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1101            CameraHal::PPM("Shot to Jpeg: ", &mStartCapture);
1102#endif
1103            ret = __sendFrameToSubscribers(frame, &mImageSubscribers, CameraFrame::IMAGE_FRAME);
1104          }
1105          break;
1106        case CameraFrame::RAW_FRAME:
1107          {
1108            ret = __sendFrameToSubscribers(frame, &mRawSubscribers, CameraFrame::RAW_FRAME);
1109          }
1110          break;
1111        case CameraFrame::PREVIEW_FRAME_SYNC:
1112          {
1113            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::PREVIEW_FRAME_SYNC);
1114          }
1115          break;
1116        case CameraFrame::SNAPSHOT_FRAME:
1117          {
1118            ret = __sendFrameToSubscribers(frame, &mFrameSubscribers, CameraFrame::SNAPSHOT_FRAME);
1119          }
1120          break;
1121        case CameraFrame::VIDEO_FRAME_SYNC:
1122          {
1123            ret = __sendFrameToSubscribers(frame, &mVideoSubscribers, CameraFrame::VIDEO_FRAME_SYNC);
1124          }
1125          break;
1126        case CameraFrame::FRAME_DATA_SYNC:
1127          {
1128            ret = __sendFrameToSubscribers(frame, &mFrameDataSubscribers, CameraFrame::FRAME_DATA_SYNC);
1129          }
1130          break;
1131        default:
1132          CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", mask);
1133        break;
1134        }//SWITCH
1135        frame->mFrameMask &= ~mask;
1136
1137        if (ret != NO_ERROR) {
1138            goto EXIT;
1139        }
1140      }//IF
1141    }//FOR
1142
1143 EXIT:
1144    return ret;
1145}
1146
1147status_t BaseCameraAdapter::__sendFrameToSubscribers(CameraFrame* frame,
1148                                                     KeyedVector<int, frame_callback> *subscribers,
1149                                                     CameraFrame::FrameType frameType)
1150{
1151    size_t refCount = 0;
1152    status_t ret = NO_ERROR;
1153    frame_callback callback = NULL;
1154
1155    frame->mFrameType = frameType;
1156
1157    if (NULL != subscribers) {
1158        refCount = getFrameRefCount(frame->mBuffer, frameType);
1159
1160        if (refCount == 0) {
1161            CAMHAL_LOGEB("Invalid ref count of 0");
1162            return -EINVAL;
1163        }
1164
1165        if (refCount > subscribers->size()) {
1166            CAMHAL_LOGEB("Invalid ref count for frame type: 0x%x", frameType);
1167            return -EINVAL;
1168        }
1169
1170        CAMHAL_LOGVB("Type of Frame: 0x%x address: 0x%x refCount start %d",
1171                     frame->mFrameType,
1172                     ( uint32_t ) frame->mBuffer,
1173                     refCount);
1174
1175        for ( unsigned int i = 0 ; i < refCount; i++ ) {
1176            frame->mCookie = ( void * ) subscribers->keyAt(i);
1177            callback = (frame_callback) subscribers->valueAt(i);
1178
1179            if (!callback) {
1180                CAMHAL_LOGEB("callback not set for frame type: 0x%x", frameType);
1181                return -EINVAL;
1182            }
1183
1184            callback(frame);
1185        }
1186    } else {
1187        CAMHAL_LOGEB("Subscribers is null??");
1188        return -EINVAL;
1189    }
1190
1191    return ret;
1192}
1193
1194int BaseCameraAdapter::setInitFrameRefCount(void* buf, unsigned int mask)
1195{
1196  int ret = NO_ERROR;
1197  unsigned int lmask;
1198
1199  LOG_FUNCTION_NAME;
1200
1201  if (buf == NULL)
1202    {
1203      return -EINVAL;
1204    }
1205
1206  for( lmask = 1; lmask < CameraFrame::ALL_FRAMES; lmask <<= 1){
1207    if( lmask & mask ){
1208      switch( lmask ){
1209
1210      case CameraFrame::IMAGE_FRAME:
1211        {
1212          setFrameRefCount(buf, CameraFrame::IMAGE_FRAME, (int) mImageSubscribers.size());
1213        }
1214        break;
1215      case CameraFrame::RAW_FRAME:
1216        {
1217          setFrameRefCount(buf, CameraFrame::RAW_FRAME, mRawSubscribers.size());
1218        }
1219        break;
1220      case CameraFrame::PREVIEW_FRAME_SYNC:
1221        {
1222          setFrameRefCount(buf, CameraFrame::PREVIEW_FRAME_SYNC, mFrameSubscribers.size());
1223        }
1224        break;
1225      case CameraFrame::SNAPSHOT_FRAME:
1226        {
1227          setFrameRefCount(buf, CameraFrame::SNAPSHOT_FRAME, mFrameSubscribers.size());
1228        }
1229        break;
1230      case CameraFrame::VIDEO_FRAME_SYNC:
1231        {
1232          setFrameRefCount(buf,CameraFrame::VIDEO_FRAME_SYNC, mVideoSubscribers.size());
1233        }
1234        break;
1235      case CameraFrame::FRAME_DATA_SYNC:
1236        {
1237          setFrameRefCount(buf, CameraFrame::FRAME_DATA_SYNC, mFrameDataSubscribers.size());
1238        }
1239        break;
1240      default:
1241        CAMHAL_LOGEB("FRAMETYPE NOT SUPPORTED 0x%x", lmask);
1242        break;
1243      }//SWITCH
1244      mask &= ~lmask;
1245    }//IF
1246  }//FOR
1247  LOG_FUNCTION_NAME_EXIT;
1248  return ret;
1249}
1250
1251int BaseCameraAdapter::getFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType)
1252{
1253    int res = -1;
1254
1255    LOG_FUNCTION_NAME;
1256
1257    switch ( frameType )
1258        {
1259        case CameraFrame::IMAGE_FRAME:
1260        case CameraFrame::RAW_FRAME:
1261                {
1262                Mutex::Autolock lock(mCaptureBufferLock);
1263                res = mCaptureBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1264                }
1265            break;
1266        case CameraFrame::PREVIEW_FRAME_SYNC:
1267        case CameraFrame::SNAPSHOT_FRAME:
1268                {
1269                Mutex::Autolock lock(mPreviewBufferLock);
1270                res = mPreviewBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1271                }
1272            break;
1273        case CameraFrame::FRAME_DATA_SYNC:
1274                {
1275                Mutex::Autolock lock(mPreviewDataBufferLock);
1276                res = mPreviewDataBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1277                }
1278            break;
1279        case CameraFrame::VIDEO_FRAME_SYNC:
1280                {
1281                Mutex::Autolock lock(mVideoBufferLock);
1282                res = mVideoBuffersAvailable.valueFor( ( unsigned int ) frameBuf );
1283                }
1284            break;
1285        default:
1286            break;
1287        };
1288
1289    LOG_FUNCTION_NAME_EXIT;
1290
1291    return res;
1292}
1293
1294void BaseCameraAdapter::setFrameRefCount(void* frameBuf, CameraFrame::FrameType frameType, int refCount)
1295{
1296
1297    LOG_FUNCTION_NAME;
1298
1299    switch ( frameType )
1300        {
1301        case CameraFrame::IMAGE_FRAME:
1302        case CameraFrame::RAW_FRAME:
1303                {
1304                Mutex::Autolock lock(mCaptureBufferLock);
1305                mCaptureBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1306                }
1307            break;
1308        case CameraFrame::PREVIEW_FRAME_SYNC:
1309        case CameraFrame::SNAPSHOT_FRAME:
1310                {
1311                Mutex::Autolock lock(mPreviewBufferLock);
1312                mPreviewBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1313                }
1314            break;
1315        case CameraFrame::FRAME_DATA_SYNC:
1316                {
1317                Mutex::Autolock lock(mPreviewDataBufferLock);
1318                mPreviewDataBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1319                }
1320            break;
1321        case CameraFrame::VIDEO_FRAME_SYNC:
1322                {
1323                Mutex::Autolock lock(mVideoBufferLock);
1324                mVideoBuffersAvailable.replaceValueFor(  ( unsigned int ) frameBuf, refCount);
1325                }
1326            break;
1327        default:
1328            break;
1329        };
1330
1331    LOG_FUNCTION_NAME_EXIT;
1332
1333}
1334
1335status_t BaseCameraAdapter::startVideoCapture()
1336{
1337    status_t ret = NO_ERROR;
1338
1339    LOG_FUNCTION_NAME;
1340
1341    Mutex::Autolock lock(mVideoBufferLock);
1342
1343    //If the capture is already ongoing, return from here.
1344    if ( mRecording )
1345        {
1346        ret = NO_INIT;
1347        }
1348
1349
1350    if ( NO_ERROR == ret )
1351        {
1352
1353        for ( unsigned int i = 0 ; i < mPreviewBuffersAvailable.size() ; i++ )
1354            {
1355            mVideoBuffersAvailable.add(mPreviewBuffersAvailable.keyAt(i), 0);
1356            }
1357
1358        mRecording = true;
1359        }
1360
1361    LOG_FUNCTION_NAME_EXIT;
1362
1363    return ret;
1364}
1365
1366status_t BaseCameraAdapter::stopVideoCapture()
1367{
1368    status_t ret = NO_ERROR;
1369
1370    LOG_FUNCTION_NAME;
1371
1372    if ( !mRecording )
1373        {
1374        ret = NO_INIT;
1375        }
1376
1377    if ( NO_ERROR == ret )
1378        {
1379        for ( unsigned int i = 0 ; i < mVideoBuffersAvailable.size() ; i++ )
1380            {
1381            void *frameBuf = ( void * ) mVideoBuffersAvailable.keyAt(i);
1382            if( getFrameRefCount(frameBuf,  CameraFrame::VIDEO_FRAME_SYNC) > 0)
1383                {
1384                returnFrame(frameBuf, CameraFrame::VIDEO_FRAME_SYNC);
1385                }
1386            }
1387
1388        mVideoBuffersAvailable.clear();
1389
1390        mRecording = false;
1391        }
1392
1393    LOG_FUNCTION_NAME_EXIT;
1394
1395    return ret;
1396}
1397
1398//-----------------Stub implementation of the interface ------------------------------
1399
1400status_t BaseCameraAdapter::takePicture()
1401{
1402    status_t ret = NO_ERROR;
1403
1404    LOG_FUNCTION_NAME;
1405
1406    LOG_FUNCTION_NAME_EXIT;
1407
1408    return ret;
1409}
1410
1411status_t BaseCameraAdapter::stopImageCapture()
1412{
1413    status_t ret = NO_ERROR;
1414
1415    LOG_FUNCTION_NAME;
1416
1417    LOG_FUNCTION_NAME_EXIT;
1418
1419    return ret;
1420}
1421
1422status_t BaseCameraAdapter::startBracketing(int range)
1423{
1424    status_t ret = NO_ERROR;
1425
1426    LOG_FUNCTION_NAME;
1427
1428    LOG_FUNCTION_NAME_EXIT;
1429
1430    return ret;
1431}
1432
1433status_t BaseCameraAdapter::stopBracketing()
1434{
1435    status_t ret = NO_ERROR;
1436
1437    LOG_FUNCTION_NAME;
1438
1439    LOG_FUNCTION_NAME_EXIT;
1440
1441    return ret;
1442}
1443
1444status_t BaseCameraAdapter::autoFocus()
1445{
1446    status_t ret = NO_ERROR;
1447
1448    LOG_FUNCTION_NAME;
1449
1450    notifyFocusSubscribers(false);
1451
1452    LOG_FUNCTION_NAME_EXIT;
1453
1454    return ret;
1455}
1456
1457status_t BaseCameraAdapter::cancelAutoFocus()
1458{
1459    status_t ret = NO_ERROR;
1460
1461    LOG_FUNCTION_NAME;
1462
1463    LOG_FUNCTION_NAME_EXIT;
1464
1465    return ret;
1466}
1467
1468status_t BaseCameraAdapter::startSmoothZoom(int targetIdx)
1469{
1470    status_t ret = NO_ERROR;
1471
1472    LOG_FUNCTION_NAME;
1473
1474    LOG_FUNCTION_NAME_EXIT;
1475
1476    return ret;
1477}
1478
1479status_t BaseCameraAdapter::stopSmoothZoom()
1480{
1481    status_t ret = NO_ERROR;
1482
1483    LOG_FUNCTION_NAME;
1484
1485    LOG_FUNCTION_NAME_EXIT;
1486
1487    return ret;
1488}
1489
1490status_t BaseCameraAdapter::startPreview()
1491{
1492    status_t ret = NO_ERROR;
1493
1494    LOG_FUNCTION_NAME;
1495
1496    LOG_FUNCTION_NAME_EXIT;
1497
1498    return ret;
1499}
1500
1501status_t BaseCameraAdapter::stopPreview()
1502{
1503    status_t ret = NO_ERROR;
1504
1505    LOG_FUNCTION_NAME;
1506
1507    LOG_FUNCTION_NAME_EXIT;
1508
1509    return ret;
1510}
1511
1512status_t BaseCameraAdapter::useBuffers(CameraMode mode, void* bufArr, int num, size_t length, unsigned int queueable)
1513{
1514    status_t ret = NO_ERROR;
1515
1516    LOG_FUNCTION_NAME;
1517
1518    LOG_FUNCTION_NAME_EXIT;
1519
1520    return ret;
1521}
1522
1523status_t BaseCameraAdapter::fillThisBuffer(void* frameBuf, CameraFrame::FrameType frameType)
1524{
1525    status_t ret = NO_ERROR;
1526
1527    LOG_FUNCTION_NAME;
1528
1529    LOG_FUNCTION_NAME_EXIT;
1530
1531    return ret;
1532}
1533
1534status_t BaseCameraAdapter::getFrameSize(size_t &width, size_t &height)
1535{
1536    status_t ret = NO_ERROR;
1537
1538    LOG_FUNCTION_NAME;
1539
1540    LOG_FUNCTION_NAME_EXIT;
1541
1542    return ret;
1543}
1544
1545status_t BaseCameraAdapter::getFrameDataSize(size_t &dataFrameSize, size_t bufferCount)
1546{
1547    status_t ret = NO_ERROR;
1548
1549    LOG_FUNCTION_NAME;
1550
1551    LOG_FUNCTION_NAME_EXIT;
1552
1553    return ret;
1554}
1555
1556status_t BaseCameraAdapter::getPictureBufferSize(size_t &length, size_t bufferCount)
1557{
1558    status_t ret = NO_ERROR;
1559
1560    LOG_FUNCTION_NAME;
1561
1562    LOG_FUNCTION_NAME_EXIT;
1563
1564    return ret;
1565}
1566
1567status_t BaseCameraAdapter::startFaceDetection()
1568{
1569    status_t ret = NO_ERROR;
1570
1571    LOG_FUNCTION_NAME;
1572
1573    LOG_FUNCTION_NAME_EXIT;
1574
1575    return ret;
1576}
1577
1578status_t BaseCameraAdapter::stopFaceDetection()
1579{
1580    status_t ret = NO_ERROR;
1581
1582    LOG_FUNCTION_NAME;
1583
1584    LOG_FUNCTION_NAME_EXIT;
1585
1586    return ret;
1587}
1588
1589status_t BaseCameraAdapter::setState(CameraCommands operation)
1590{
1591    status_t ret = NO_ERROR;
1592
1593    LOG_FUNCTION_NAME;
1594
1595    mLock.lock();
1596
1597    switch ( mAdapterState )
1598        {
1599
1600        case INTIALIZED_STATE:
1601
1602            switch ( operation )
1603                {
1604
1605                case CAMERA_USE_BUFFERS_PREVIEW:
1606                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1607                                 operation);
1608                    mNextState = LOADED_PREVIEW_STATE;
1609                    break;
1610
1611                //These events don't change the current state
1612                case CAMERA_QUERY_RESOLUTION_PREVIEW:
1613                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1614                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1615                    CAMHAL_LOGDB("Adapter state switch INTIALIZED_STATE->INTIALIZED_STATE event = 0x%x",
1616                                 operation);
1617                    mNextState = INTIALIZED_STATE;
1618                    break;
1619
1620                default:
1621                    CAMHAL_LOGEB("Adapter state switch INTIALIZED_STATE Invalid Op! event = 0x%x",
1622                                 operation);
1623                    ret = INVALID_OPERATION;
1624                    break;
1625
1626                }
1627
1628            break;
1629
1630        case LOADED_PREVIEW_STATE:
1631
1632            switch ( operation )
1633                {
1634
1635                case CAMERA_START_PREVIEW:
1636                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->PREVIEW_STATE event = 0x%x",
1637                                 operation);
1638                    mNextState = PREVIEW_STATE;
1639                    break;
1640
1641                //These events don't change the current state
1642                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1643                case CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA:
1644                case CAMERA_USE_BUFFERS_PREVIEW_DATA:
1645                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW_STATE->LOADED_PREVIEW_STATE event = 0x%x",
1646                                 operation);
1647                    mNextState = LOADED_PREVIEW_STATE;
1648                    break;
1649
1650                default:
1651                    CAMHAL_LOGDB("Adapter state switch LOADED_PREVIEW Invalid Op! event = 0x%x",
1652                                 operation);
1653                    ret = INVALID_OPERATION;
1654                    break;
1655
1656                }
1657
1658            break;
1659
1660        case PREVIEW_STATE:
1661
1662            switch ( operation )
1663                {
1664
1665                case CAMERA_STOP_PREVIEW:
1666                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->INTIALIZED_STATE event = 0x%x",
1667                                 operation);
1668                    mNextState = INTIALIZED_STATE;
1669                    break;
1670
1671                case CAMERA_PERFORM_AUTOFOCUS:
1672                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->AF_STATE event = 0x%x",
1673                                 operation);
1674                    mNextState = AF_STATE;
1675                    break;
1676
1677                case CAMERA_START_SMOOTH_ZOOM:
1678                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->ZOOM_STATE event = 0x%x",
1679                                 operation);
1680                    mNextState = ZOOM_STATE;
1681                    break;
1682
1683                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1684                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->LOADED_CAPTURE_STATE event = 0x%x",
1685                                 operation);
1686                    mNextState = LOADED_CAPTURE_STATE;
1687                    break;
1688
1689                case CAMERA_START_VIDEO:
1690                    CAMHAL_LOGDB("Adapter state switch PREVIEW_STATE->VIDEO_STATE event = 0x%x",
1691                                 operation);
1692                    mNextState = VIDEO_STATE;
1693                    break;
1694
1695                case CAMERA_CANCEL_AUTOFOCUS:
1696                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1697                case CAMERA_STOP_SMOOTH_ZOOM:
1698                    CAMHAL_LOGDB("Adapter state switch PREVIEW_ACTIVE->PREVIEW_ACTIVE event = 0x%x",
1699                                 operation);
1700                    mNextState = PREVIEW_STATE;
1701                    break;
1702
1703                default:
1704                    CAMHAL_LOGEB("Adapter state switch PREVIEW_ACTIVE Invalid Op! event = 0x%x",
1705                                 operation);
1706                    ret = INVALID_OPERATION;
1707                    break;
1708
1709                }
1710
1711            break;
1712
1713        case LOADED_CAPTURE_STATE:
1714
1715            switch ( operation )
1716                {
1717
1718                case CAMERA_START_IMAGE_CAPTURE:
1719                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1720                                 operation);
1721                    mNextState = CAPTURE_STATE;
1722                    break;
1723
1724                case CAMERA_START_BRACKET_CAPTURE:
1725                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->BRACKETING_STATE event = 0x%x",
1726                                 operation);
1727                    mNextState = BRACKETING_STATE;
1728                    break;
1729
1730                default:
1731                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1732                                 operation);
1733                    ret = INVALID_OPERATION;
1734                    break;
1735
1736                }
1737
1738            break;
1739
1740        case CAPTURE_STATE:
1741
1742            switch ( operation )
1743                {
1744                case CAMERA_STOP_IMAGE_CAPTURE:
1745                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1746                                 operation);
1747                    mNextState = PREVIEW_STATE;
1748                    break;
1749
1750                default:
1751                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1752                                 operation);
1753                    ret = INVALID_OPERATION;
1754                    break;
1755
1756                }
1757
1758            break;
1759
1760        case BRACKETING_STATE:
1761
1762            switch ( operation )
1763                {
1764
1765                case CAMERA_STOP_BRACKET_CAPTURE:
1766                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->PREVIEW_STATE event = 0x%x",
1767                                 operation);
1768                    mNextState = PREVIEW_STATE;
1769                    break;
1770
1771                case CAMERA_START_IMAGE_CAPTURE:
1772                    CAMHAL_LOGDB("Adapter state switch BRACKETING_STATE->CAPTURE_STATE event = 0x%x",
1773                                 operation);
1774                    mNextState = CAPTURE_STATE;
1775                    break;
1776
1777                default:
1778                    CAMHAL_LOGEB("Adapter state switch BRACKETING_STATE Invalid Op! event = 0x%x",
1779                                 operation);
1780                    ret = INVALID_OPERATION;
1781                    break;
1782
1783                }
1784
1785            break;
1786
1787        case AF_STATE:
1788
1789            switch ( operation )
1790                {
1791
1792                case CAMERA_CANCEL_AUTOFOCUS:
1793                    CAMHAL_LOGDB("Adapter state switch AF_STATE->PREVIEW_STATE event = 0x%x",
1794                                 operation);
1795                    mNextState = PREVIEW_STATE;
1796                    break;
1797
1798                case CAMERA_START_SMOOTH_ZOOM:
1799                    CAMHAL_LOGDB("Adapter state switch AF_STATE->AF_ZOOM_STATE event = 0x%x",
1800                                 operation);
1801                    mNextState = AF_ZOOM_STATE;
1802                    break;
1803
1804                default:
1805                    CAMHAL_LOGEB("Adapter state switch AF_STATE Invalid Op! event = 0x%x",
1806                                 operation);
1807                    ret = INVALID_OPERATION;
1808                    break;
1809
1810                }
1811
1812            break;
1813
1814        case ZOOM_STATE:
1815
1816            switch ( operation )
1817                {
1818
1819                case CAMERA_STOP_SMOOTH_ZOOM:
1820                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->PREVIEW_STATE event = 0x%x",
1821                                 operation);
1822                    mNextState = PREVIEW_STATE;
1823                    break;
1824
1825                case CAMERA_PERFORM_AUTOFOCUS:
1826                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->AF_ZOOM_STATE event = 0x%x",
1827                                 operation);
1828                    mNextState = AF_ZOOM_STATE;
1829                    break;
1830
1831                case CAMERA_START_VIDEO:
1832                    CAMHAL_LOGDB("Adapter state switch ZOOM_STATE->VIDEO_ZOOM_STATE event = 0x%x",
1833                                 operation);
1834                    mNextState = VIDEO_ZOOM_STATE;
1835                    break;
1836
1837                default:
1838                    CAMHAL_LOGEB("Adapter state switch ZOOM_STATE Invalid Op! event = 0x%x",
1839                                 operation);
1840                    ret = INVALID_OPERATION;
1841                    break;
1842
1843                }
1844
1845            break;
1846
1847        case VIDEO_STATE:
1848
1849            switch ( operation )
1850                {
1851
1852                case CAMERA_STOP_VIDEO:
1853                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->PREVIEW_STATE event = 0x%x",
1854                                 operation);
1855                    mNextState = PREVIEW_STATE;
1856                    break;
1857
1858                case CAMERA_START_SMOOTH_ZOOM:
1859                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_ZOOM_STATE event = 0x%x",
1860                                 operation);
1861                    mNextState = VIDEO_ZOOM_STATE;
1862                    break;
1863
1864                case CAMERA_USE_BUFFERS_IMAGE_CAPTURE:
1865                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_LOADED_CAPTURE_STATE event = 0x%x",
1866                                 operation);
1867                    mNextState = VIDEO_LOADED_CAPTURE_STATE;
1868                    break;
1869
1870                case CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE:
1871                    CAMHAL_LOGDB("Adapter state switch VIDEO_STATE->VIDEO_STATE event = 0x%x",
1872                                 operation);
1873                    mNextState = VIDEO_STATE;
1874                    break;
1875
1876                default:
1877                    CAMHAL_LOGEB("Adapter state switch VIDEO_STATE Invalid Op! event = 0x%x",
1878                                 operation);
1879                    ret = INVALID_OPERATION;
1880                    break;
1881
1882                }
1883
1884            break;
1885
1886        case VIDEO_LOADED_CAPTURE_STATE:
1887
1888            switch ( operation )
1889                {
1890
1891                case CAMERA_START_IMAGE_CAPTURE:
1892                    CAMHAL_LOGDB("Adapter state switch LOADED_CAPTURE_STATE->CAPTURE_STATE event = 0x%x",
1893                                 operation);
1894                    mNextState = VIDEO_CAPTURE_STATE;
1895                    break;
1896
1897                default:
1898                    CAMHAL_LOGEB("Adapter state switch LOADED_CAPTURE_STATE Invalid Op! event = 0x%x",
1899                                 operation);
1900                    ret = INVALID_OPERATION;
1901                    break;
1902
1903                }
1904
1905            break;
1906
1907        case VIDEO_CAPTURE_STATE:
1908
1909            switch ( operation )
1910                {
1911                case CAMERA_STOP_IMAGE_CAPTURE:
1912                    CAMHAL_LOGDB("Adapter state switch CAPTURE_STATE->PREVIEW_STATE event = 0x%x",
1913                                 operation);
1914                    mNextState = VIDEO_STATE;
1915                    break;
1916
1917                default:
1918                    CAMHAL_LOGEB("Adapter state switch CAPTURE_STATE Invalid Op! event = 0x%x",
1919                                 operation);
1920                    ret = INVALID_OPERATION;
1921                    break;
1922
1923                }
1924
1925            break;
1926
1927        case AF_ZOOM_STATE:
1928
1929            switch ( operation )
1930                {
1931
1932                case CAMERA_STOP_SMOOTH_ZOOM:
1933                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->AF_STATE event = 0x%x",
1934                                 operation);
1935                    mNextState = AF_STATE;
1936                    break;
1937
1938                case CAMERA_CANCEL_AUTOFOCUS:
1939                    CAMHAL_LOGDB("Adapter state switch AF_ZOOM_STATE->ZOOM_STATE event = 0x%x",
1940                                 operation);
1941                    mNextState = ZOOM_STATE;
1942                    break;
1943
1944                default:
1945                    CAMHAL_LOGEB("Adapter state switch AF_ZOOM_STATE Invalid Op! event = 0x%x",
1946                                 operation);
1947                    ret = INVALID_OPERATION;
1948                    break;
1949
1950                }
1951
1952            break;
1953
1954        case VIDEO_ZOOM_STATE:
1955
1956            switch ( operation )
1957                {
1958
1959                case CAMERA_STOP_SMOOTH_ZOOM:
1960                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->VIDEO_STATE event = 0x%x",
1961                                 operation);
1962                    mNextState = VIDEO_STATE;
1963                    break;
1964
1965                case CAMERA_STOP_VIDEO:
1966                    CAMHAL_LOGDB("Adapter state switch VIDEO_ZOOM_STATE->ZOOM_STATE event = 0x%x",
1967                                 operation);
1968                    mNextState = ZOOM_STATE;
1969                    break;
1970
1971                default:
1972                    CAMHAL_LOGEB("Adapter state switch VIDEO_ZOOM_STATE Invalid Op! event = 0x%x",
1973                                 operation);
1974                    ret = INVALID_OPERATION;
1975                    break;
1976
1977                }
1978
1979            break;
1980
1981        case BRACKETING_ZOOM_STATE:
1982
1983            switch ( operation )
1984                {
1985
1986                case CAMERA_STOP_SMOOTH_ZOOM:
1987                    CAMHAL_LOGDB("Adapter state switch BRACKETING_ZOOM_STATE->BRACKETING_STATE event = 0x%x",
1988                                 operation);
1989                    mNextState = BRACKETING_STATE;
1990                    break;
1991
1992                default:
1993                    CAMHAL_LOGEB("Adapter state switch BRACKETING_ZOOM_STATE Invalid Op! event = 0x%x",
1994                                 operation);
1995                    ret = INVALID_OPERATION;
1996                    break;
1997
1998                }
1999
2000            break;
2001
2002        default:
2003            CAMHAL_LOGEA("Invalid Adapter state!");
2004            ret = INVALID_OPERATION;
2005        }
2006
2007    LOG_FUNCTION_NAME_EXIT;
2008
2009    return ret;
2010}
2011
2012//State transition finished successfully.
2013//Commit the state and unlock the adapter state.
2014status_t BaseCameraAdapter::commitState()
2015{
2016    status_t ret = NO_ERROR;
2017
2018    LOG_FUNCTION_NAME;
2019
2020    mAdapterState = mNextState;
2021
2022    mLock.unlock();
2023
2024    LOG_FUNCTION_NAME_EXIT;
2025
2026    return ret;
2027}
2028
2029status_t BaseCameraAdapter::rollbackState()
2030{
2031    status_t ret = NO_ERROR;
2032
2033    LOG_FUNCTION_NAME;
2034
2035    mNextState = mAdapterState;
2036
2037    mLock.unlock();
2038
2039    LOG_FUNCTION_NAME_EXIT;
2040
2041    return ret;
2042}
2043
2044// getNextState() and getState()
2045// publicly exposed functions to retrieve the adapter states
2046// please notice that these functions are locked
2047CameraAdapter::AdapterState BaseCameraAdapter::getState()
2048{
2049    status_t ret = NO_ERROR;
2050
2051    LOG_FUNCTION_NAME;
2052
2053    Mutex::Autolock lock(mLock);
2054
2055    LOG_FUNCTION_NAME_EXIT;
2056
2057    return mAdapterState;
2058}
2059
2060CameraAdapter::AdapterState BaseCameraAdapter::getNextState()
2061{
2062    status_t ret = NO_ERROR;
2063
2064    LOG_FUNCTION_NAME;
2065
2066    Mutex::Autolock lock(mLock);
2067
2068    LOG_FUNCTION_NAME_EXIT;
2069
2070    return mNextState;
2071}
2072
2073// getNextState() and getState()
2074// internal protected functions to retrieve the adapter states
2075// please notice that these functions are NOT locked to help
2076// internal functions query state in the middle of state
2077// transition
2078status_t BaseCameraAdapter::getState(AdapterState &state)
2079{
2080    status_t ret = NO_ERROR;
2081
2082    LOG_FUNCTION_NAME;
2083
2084    state = mAdapterState;
2085
2086    LOG_FUNCTION_NAME_EXIT;
2087
2088    return ret;
2089}
2090
2091status_t BaseCameraAdapter::getNextState(AdapterState &state)
2092{
2093    status_t ret = NO_ERROR;
2094
2095    LOG_FUNCTION_NAME;
2096
2097    state = mNextState;
2098
2099    LOG_FUNCTION_NAME_EXIT;
2100
2101    return ret;
2102}
2103
2104void BaseCameraAdapter::onOrientationEvent(uint32_t orientation, uint32_t tilt)
2105{
2106    LOG_FUNCTION_NAME;
2107    LOG_FUNCTION_NAME_EXIT;
2108}
2109//-----------------------------------------------------------------------------
2110
2111
2112
2113};
2114
2115/*--------------------Camera Adapter Class ENDS here-----------------------------*/
2116
2117