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