1 /* 2 ** 3 ** Copyright 2008, The Android Open Source Project 4 ** Copyright 2010, Samsung Electronics Co. LTD 5 ** 6 ** Licensed under the Apache License, Version 2.0 (the "License"); 7 ** you may not use this file except in compliance with the License. 8 ** You may obtain a copy of the License at 9 ** 10 ** http://www.apache.org/licenses/LICENSE-2.0 11 ** 12 ** Unless required by applicable law or agreed to in writing, software 13 ** distributed under the License is distributed on an "AS IS" BASIS, 14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 ** See the License for the specific language governing permissions and 16 ** limitations under the License. 17 */ 18 19 //#define LOG_NDEBUG 0 20 #define LOG_TAG "CameraHardwareSec" 21 #include <utils/Log.h> 22 23 #include "SecCameraHWInterface.h" 24 #include <utils/threads.h> 25 #include <fcntl.h> 26 #include <sys/mman.h> 27 28 #if defined(BOARD_USES_OVERLAY) 29 #include <hardware/overlay.h> 30 #include <ui/Overlay.h> 31 #define CACHEABLE_BUFFERS 0x1 32 #define ALL_BUFFERS_FLUSHED -66 33 #endif 34 35 #ifdef SEND_YUV_RECORD_DATA 36 #define ALIGN_TO_32B(x) ((((x) + (1 << 5) - 1) >> 5) << 5) 37 #define ALIGN_TO_128B(x) ((((x) + (1 << 7) - 1) >> 7) << 7) 38 #define ALIGN_TO_8KB(x) ((((x) + (1 << 13) - 1) >> 13) << 13) 39 #define RECORD_HEAP_SIZE (ALIGN_TO_8KB(ALIGN_TO_128B(1280) * \ 40 ALIGN_TO_32B(720)) + ALIGN_TO_8KB(ALIGN_TO_128B(1280) * \ 41 ALIGN_TO_32B(720 / 2))) 42 #endif 43 44 #define VIDEO_COMMENT_MARKER_H 0xFFBE 45 #define VIDEO_COMMENT_MARKER_L 0xFFBF 46 #define VIDEO_COMMENT_MARKER_LENGTH 4 47 #define JPEG_EOI_MARKER 0xFFD9 48 #define HIBYTE(x) (((x) >> 8) & 0xFF) 49 #define LOBYTE(x) ((x) & 0xFF) 50 51 #define BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR "0.10,1.20,Infinity" 52 #define BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR "0.10,0.20,Infinity" 53 #define BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR "0.10,1.20,Infinity" 54 #define FRONT_CAMERA_FOCUS_DISTANCES_STR "0.20,0.25,Infinity" 55 56 namespace android { 57 58 struct addrs { 59 unsigned int addr_y; 60 unsigned int addr_cbcr; 61 unsigned int buf_index; 62 unsigned int reserved; 63 }; 64 65 struct addrs_cap { 66 unsigned int addr_y; 67 unsigned int width; 68 unsigned int height; 69 }; 70 71 static const int INITIAL_SKIP_FRAME = 3; 72 static const int EFFECT_SKIP_FRAME = 1; 73 74 CameraHardwareSec::CameraHardwareSec(int cameraId) 75 : 76 mPreviewRunning(false), 77 mCaptureInProgress(false), 78 mParameters(), 79 mPreviewHeap(0), 80 mRawHeap(0), 81 mRecordHeap(0), 82 mJpegHeap(0), 83 mSecCamera(NULL), 84 mPreviewFrameSize(0), 85 mRawFrameSize(0), 86 mPreviewFrameRateMicrosec(33000), 87 mCameraSensorName(NULL), 88 mSkipFrame(0), 89 #if defined(BOARD_USES_OVERLAY) 90 mUseOverlay(false), 91 mOverlayBufferIdx(0), 92 #endif 93 mNotifyCb(0), 94 mDataCb(0), 95 mDataCbTimestamp(0), 96 mCallbackCookie(0), 97 mMsgEnabled(0), 98 mCurrentPreviewFrame(0), 99 mRecordRunning(false) 100 #ifdef JPEG_FROM_SENSOR 101 , 102 mPostViewWidth(0), 103 mPostViewHeight(0), 104 mPostViewSize(0) 105 #endif 106 { 107 LOGV("%s :", __func__); 108 int ret = 0; 109 110 mSecCamera = SecCamera::createInstance(); 111 112 if (mSecCamera == NULL) { 113 LOGE("ERR(%s):Fail on mSecCamera object creation", __func__); 114 } 115 116 ret = mSecCamera->initCamera(cameraId); 117 if (ret < 0) { 118 LOGE("ERR(%s):Fail on mSecCamera init", __func__); 119 } 120 121 if (mSecCamera->flagCreate() == 0) { 122 LOGE("ERR(%s):Fail on mSecCamera->flagCreate()", __func__); 123 } 124 125 #ifndef PREVIEW_USING_MMAP 126 int previewHeapSize = sizeof(struct addrs) * kBufferCount; 127 128 LOGV("mPreviewHeap : MemoryHeapBase(previewHeapSize(%d))", previewHeapSize); 129 mPreviewHeap = new MemoryHeapBase(previewHeapSize); 130 if (mPreviewHeap->getHeapID() < 0) { 131 LOGE("ERR(%s): Preview heap creation fail", __func__); 132 mPreviewHeap.clear(); 133 } 134 #endif 135 136 #ifdef SEND_YUV_RECORD_DATA 137 int recordHeapSize = RECORD_HEAP_SIZE; 138 #else 139 int recordHeapSize = sizeof(struct addrs) * kBufferCount; 140 #endif 141 LOGV("mRecordHeap : MemoryHeapBase(recordHeapSize(%d))", recordHeapSize); 142 mRecordHeap = new MemoryHeapBase(recordHeapSize); 143 if (mRecordHeap->getHeapID() < 0) { 144 LOGE("ERR(%s): Record heap creation fail", __func__); 145 mRecordHeap.clear(); 146 } 147 148 #ifdef JPEG_FROM_SENSOR 149 mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize); 150 LOGV("mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d", 151 mPostViewWidth,mPostViewHeight,mPostViewSize); 152 #endif 153 154 #ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA 155 int rawHeapSize = mPostViewSize; 156 #else 157 int rawHeapSize = sizeof(struct addrs_cap); 158 #endif 159 LOGV("mRawHeap : MemoryHeapBase(previewHeapSize(%d))", rawHeapSize); 160 mRawHeap = new MemoryHeapBase(rawHeapSize); 161 if (mRawHeap->getHeapID() < 0) { 162 LOGE("ERR(%s): Raw heap creation fail", __func__); 163 mRawHeap.clear(); 164 } 165 166 initDefaultParameters(cameraId); 167 168 mExitAutoFocusThread = false; 169 mPreviewThread = new PreviewThread(this); 170 mAutoFocusThread = new AutoFocusThread(this); 171 mPictureThread = new PictureThread(this); 172 } 173 174 void CameraHardwareSec::initDefaultParameters(int cameraId) 175 { 176 if (mSecCamera == NULL) { 177 LOGE("ERR(%s):mSecCamera object is NULL", __func__); 178 return; 179 } 180 181 CameraParameters p; 182 CameraParameters ip; 183 184 mCameraSensorName = mSecCamera->getCameraSensorName(); 185 LOGV("CameraSensorName: %s", mCameraSensorName); 186 187 int preview_max_width = 0; 188 int preview_max_height = 0; 189 int snapshot_max_width = 0; 190 int snapshot_max_height = 0; 191 192 /* set camera ID & reset camera */ 193 mSecCamera->setCameraId(cameraId); 194 if (cameraId == SecCamera::CAMERA_ID_BACK) { 195 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 196 "720x480,640x480,352x288,176x144"); 197 p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 198 "2560x1920,2048x1536,1600x1200,1280x960,640x480"); 199 } else { 200 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, 201 "640x480"); 202 p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, 203 "640x480"); 204 } 205 206 // If these fail, then we are using an invalid cameraId and we'll leave the 207 // sizes at zero to catch the error. 208 if (mSecCamera->getPreviewMaxSize(&preview_max_width, 209 &preview_max_height) < 0) 210 LOGE("getPreviewMaxSize fail (%d / %d) \n", 211 preview_max_width, preview_max_height); 212 if (mSecCamera->getSnapshotMaxSize(&snapshot_max_width, 213 &snapshot_max_height) < 0) 214 LOGE("getSnapshotMaxSize fail (%d / %d) \n", 215 snapshot_max_width, snapshot_max_height); 216 217 #ifdef PREVIEW_USING_MMAP 218 p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP); 219 #else 220 p.setPreviewFormat("yuv420sp_custom"); 221 #endif 222 p.setPreviewSize(preview_max_width, preview_max_height); 223 224 p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG); 225 p.setPictureSize(snapshot_max_width, snapshot_max_height); 226 p.set(CameraParameters::KEY_JPEG_QUALITY, "100"); // maximum quality 227 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 228 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, 229 CameraParameters::PIXEL_FORMAT_YUV420SP); 230 p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, 231 CameraParameters::PIXEL_FORMAT_JPEG); 232 p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, 233 CameraParameters::PIXEL_FORMAT_YUV420SP); 234 235 String8 parameterString; 236 237 if (cameraId == SecCamera::CAMERA_ID_BACK) { 238 parameterString = CameraParameters::FOCUS_MODE_AUTO; 239 parameterString.append(","); 240 parameterString.append(CameraParameters::FOCUS_MODE_INFINITY); 241 parameterString.append(","); 242 parameterString.append(CameraParameters::FOCUS_MODE_MACRO); 243 p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 244 parameterString.string()); 245 p.set(CameraParameters::KEY_FOCUS_MODE, 246 CameraParameters::FOCUS_MODE_AUTO); 247 p.set(CameraParameters::KEY_FOCUS_DISTANCES, 248 BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR); 249 p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 250 "320x240,0x0"); 251 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, "320"); 252 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, "240"); 253 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, "30"); 254 p.setPreviewFrameRate(30); 255 } else { 256 parameterString = CameraParameters::FOCUS_MODE_FIXED; 257 p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, 258 parameterString.string()); 259 p.set(CameraParameters::KEY_FOCUS_MODE, 260 CameraParameters::FOCUS_MODE_FIXED); 261 p.set(CameraParameters::KEY_FOCUS_DISTANCES, 262 FRONT_CAMERA_FOCUS_DISTANCES_STR); 263 p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, 264 "160x120,0x0"); 265 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, "160"); 266 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, "120"); 267 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, "15"); 268 p.setPreviewFrameRate(15); 269 } 270 271 parameterString = CameraParameters::EFFECT_NONE; 272 parameterString.append(","); 273 parameterString.append(CameraParameters::EFFECT_MONO); 274 parameterString.append(","); 275 parameterString.append(CameraParameters::EFFECT_NEGATIVE); 276 parameterString.append(","); 277 parameterString.append(CameraParameters::EFFECT_SEPIA); 278 p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, parameterString.string()); 279 280 if (cameraId == SecCamera::CAMERA_ID_BACK) { 281 parameterString = CameraParameters::FLASH_MODE_ON; 282 parameterString.append(","); 283 parameterString.append(CameraParameters::FLASH_MODE_OFF); 284 parameterString.append(","); 285 parameterString.append(CameraParameters::FLASH_MODE_AUTO); 286 parameterString.append(","); 287 parameterString.append(CameraParameters::FLASH_MODE_TORCH); 288 p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, 289 parameterString.string()); 290 p.set(CameraParameters::KEY_FLASH_MODE, 291 CameraParameters::FLASH_MODE_OFF); 292 293 parameterString = CameraParameters::SCENE_MODE_AUTO; 294 parameterString.append(","); 295 parameterString.append(CameraParameters::SCENE_MODE_PORTRAIT); 296 parameterString.append(","); 297 parameterString.append(CameraParameters::SCENE_MODE_LANDSCAPE); 298 parameterString.append(","); 299 parameterString.append(CameraParameters::SCENE_MODE_NIGHT); 300 parameterString.append(","); 301 parameterString.append(CameraParameters::SCENE_MODE_BEACH); 302 parameterString.append(","); 303 parameterString.append(CameraParameters::SCENE_MODE_SNOW); 304 parameterString.append(","); 305 parameterString.append(CameraParameters::SCENE_MODE_SUNSET); 306 parameterString.append(","); 307 parameterString.append(CameraParameters::SCENE_MODE_FIREWORKS); 308 parameterString.append(","); 309 parameterString.append(CameraParameters::SCENE_MODE_SPORTS); 310 parameterString.append(","); 311 parameterString.append(CameraParameters::SCENE_MODE_PARTY); 312 parameterString.append(","); 313 parameterString.append(CameraParameters::SCENE_MODE_CANDLELIGHT); 314 p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, 315 parameterString.string()); 316 p.set(CameraParameters::KEY_SCENE_MODE, 317 CameraParameters::SCENE_MODE_AUTO); 318 319 /* we have two ranges, 4-30fps for night mode and 320 * 15-30fps for all others 321 */ 322 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)"); 323 p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "15000,30000"); 324 325 p.set(CameraParameters::KEY_FOCAL_LENGTH, "3.43"); 326 } else { 327 p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(7500,30000)"); 328 p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "7500,30000"); 329 330 p.set(CameraParameters::KEY_FOCAL_LENGTH, "0.9"); 331 } 332 333 parameterString = CameraParameters::WHITE_BALANCE_AUTO; 334 parameterString.append(","); 335 parameterString.append(CameraParameters::WHITE_BALANCE_INCANDESCENT); 336 parameterString.append(","); 337 parameterString.append(CameraParameters::WHITE_BALANCE_FLUORESCENT); 338 parameterString.append(","); 339 parameterString.append(CameraParameters::WHITE_BALANCE_DAYLIGHT); 340 parameterString.append(","); 341 parameterString.append(CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT); 342 p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, 343 parameterString.string()); 344 345 ip.set("sharpness-min", 0); 346 ip.set("sharpness-max", 4); 347 ip.set("saturation-min", 0); 348 ip.set("saturation-max", 4); 349 ip.set("contrast-min", 0); 350 ip.set("contrast-max", 4); 351 #endif 352 353 p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "100"); 354 355 p.set(CameraParameters::KEY_ROTATION, 0); 356 p.set(CameraParameters::KEY_WHITE_BALANCE, CameraParameters::WHITE_BALANCE_AUTO); 357 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 358 p.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_NONE); 359 360 ip.set("sharpness", SHARPNESS_DEFAULT); 361 ip.set("contrast", CONTRAST_DEFAULT); 362 ip.set("saturation", SATURATION_DEFAULT); 363 ip.set("iso", "auto"); 364 ip.set("metering", "center"); 365 366 ip.set("wdr", 0); 367 ip.set("chk_dataline", 0); 368 if (cameraId == SecCamera::CAMERA_ID_FRONT) { 369 ip.set("vtmode", 0); 370 ip.set("blur", 0); 371 } 372 #else 373 ip.set("image-effects", "original"); 374 #endif 375 376 377 p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, "51.2"); 378 p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, "39.4"); 379 380 p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, "0"); 381 p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, "4"); 382 p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, "-4"); 383 p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, "0.5"); 384 385 mParameters = p; 386 mInternalParameters = ip; 387 388 /* make sure mSecCamera has all the settings we do. applications 389 * aren't required to call setParameters themselves (only if they 390 * want to change something. 391 */ 392 setParameters(p); 393 mSecCamera->setISO(ISO_AUTO); 394 mSecCamera->setMetering(METERING_CENTER); 395 mSecCamera->setContrast(CONTRAST_DEFAULT); 396 mSecCamera->setSharpness(SHARPNESS_DEFAULT); 397 mSecCamera->setSaturation(SATURATION_DEFAULT); 398 if (cameraId == SecCamera::CAMERA_ID_BACK) 399 mSecCamera->setFrameRate(30); 400 else 401 mSecCamera->setFrameRate(15); 402 } 403 404 CameraHardwareSec::~CameraHardwareSec() 405 { 406 LOGV("%s :", __func__); 407 408 singleton.clear(); 409 } 410 411 sp<IMemoryHeap> CameraHardwareSec::getPreviewHeap() const 412 { 413 return mPreviewHeap; 414 } 415 416 sp<IMemoryHeap> CameraHardwareSec::getRawHeap() const 417 { 418 return mRawHeap; 419 } 420 421 void CameraHardwareSec::setCallbacks(notify_callback notify_cb, 422 data_callback data_cb, 423 data_callback_timestamp data_cb_timestamp, 424 void *user) 425 { 426 mNotifyCb = notify_cb; 427 mDataCb = data_cb; 428 mDataCbTimestamp = data_cb_timestamp; 429 mCallbackCookie = user; 430 } 431 432 void CameraHardwareSec::enableMsgType(int32_t msgType) 433 { 434 LOGV("%s : msgType = 0x%x, mMsgEnabled before = 0x%x", 435 __func__, msgType, mMsgEnabled); 436 mMsgEnabled |= msgType; 437 LOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled); 438 } 439 440 void CameraHardwareSec::disableMsgType(int32_t msgType) 441 { 442 LOGV("%s : msgType = 0x%x, mMsgEnabled before = 0x%x", 443 __func__, msgType, mMsgEnabled); 444 mMsgEnabled &= ~msgType; 445 LOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled); 446 } 447 448 bool CameraHardwareSec::msgTypeEnabled(int32_t msgType) 449 { 450 return (mMsgEnabled & msgType); 451 } 452 453 // --------------------------------------------------------------------------- 454 void CameraHardwareSec::setSkipFrame(int frame) 455 { 456 Mutex::Autolock lock(mSkipFrameLock); 457 if (frame < mSkipFrame) 458 return; 459 460 mSkipFrame = frame; 461 } 462 463 int CameraHardwareSec::previewThread() 464 { 465 int index; 466 467 index = mSecCamera->getPreview(); 468 if (index < 0) { 469 LOGE("ERR(%s):Fail on SecCamera->getPreview()", __func__); 470 return UNKNOWN_ERROR; 471 } 472 mSkipFrameLock.lock(); 473 if (mSkipFrame > 0) { 474 mSkipFrame--; 475 mSkipFrameLock.unlock(); 476 return NO_ERROR; 477 } 478 mSkipFrameLock.unlock(); 479 480 nsecs_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 481 482 #ifdef PREVIEW_USING_MMAP 483 int width, height, frame_size, offset; 484 485 mSecCamera->getPreviewSize(&width, &height, &frame_size); 486 487 offset = (frame_size + 16) * index; 488 sp<MemoryBase> buffer = new MemoryBase(mPreviewHeap, offset, frame_size); 489 490 unsigned int phyYAddr = mSecCamera->getPhyAddrY(index); 491 unsigned int phyCAddr = mSecCamera->getPhyAddrC(index); 492 493 if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { 494 LOGE("ERR(%s):Fail on SecCamera. Invalid PhyAddr, Y addr = %0x C addr = %0x", 495 __func__, phyYAddr, phyCAddr); 496 return UNKNOWN_ERROR; 497 } 498 memcpy(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size ), &phyYAddr, 4); 499 memcpy(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size + 4), &phyCAddr, 4); 500 501 #if defined(BOARD_USES_OVERLAY) 502 if (mUseOverlay) { 503 int ret; 504 mOverlayBufferIdx ^= 1; 505 memcpy(static_cast<unsigned char*>(mPreviewHeap->base()) + offset + frame_size + sizeof(phyYAddr) + sizeof(phyCAddr), 506 &mOverlayBufferIdx, sizeof(mOverlayBufferIdx)); 507 508 ret = mOverlay->queueBuffer((void*)(static_cast<unsigned char *>(mPreviewHeap->base()) + (offset + frame_size))); 509 510 if (ret == ALL_BUFFERS_FLUSHED) { 511 goto OverlayEnd; 512 } else if (ret == -1) { 513 LOGE("ERR(%s):overlay queueBuffer fail", __func__); 514 goto OverlayEnd; 515 } 516 517 overlay_buffer_t overlay_buffer; 518 ret = mOverlay->dequeueBuffer(&overlay_buffer); 519 520 if (ret == ALL_BUFFERS_FLUSHED) { 521 goto OverlayEnd; 522 } else if (ret == -1) { 523 LOGE("ERR(%s):overlay dequeueBuffer fail", __func__); 524 goto OverlayEnd; 525 } 526 } 527 528 OverlayEnd: 529 #endif 530 531 #else 532 unsigned int phyYAddr = mSecCamera->getPhyAddrY(index); 533 unsigned int phyCAddr = mSecCamera->getPhyAddrC(index); 534 535 if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { 536 LOGE("ERR(%s):Fail on SecCamera getPhyAddr Y addr = %0x C addr = %0x", __func__, phyYAddr, phyCAddr); 537 return UNKNOWN_ERROR; 538 } 539 struct addrs *addrs = (struct addrs *)mPreviewHeap->base(); 540 541 sp<MemoryBase> buffer = new MemoryBase(mPreviewHeap, index * sizeof(struct addrs), sizeof(struct addrs)); 542 addrs[index].addr_y = phyYAddr; 543 addrs[index].addr_cbcr = phyCAddr; 544 #endif //PREVIEW_USING_MMAP 545 546 // Notify the client of a new frame. 547 if (mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 548 mDataCb(CAMERA_MSG_PREVIEW_FRAME, buffer, mCallbackCookie); 549 } 550 551 if (mRecordRunning == true) { 552 #ifdef SEND_YUV_RECORD_DATA 553 int width, height, frame_size; 554 unsigned char *virYAddr; 555 unsigned char *virCAddr; 556 557 mSecCamera->getPreviewSize(&width, &height, &frame_size); 558 mSecCamera->getYUVBuffers(&virYAddr, &virCAddr, index); 559 sp<MemoryBase> buffer = new MemoryBase(mRecordHeap, 0, frame_size); 560 //memcpy(mRecordHeap->base(), (void*)virYAddr, width * height); 561 //memcpy(mRecordHeap->base() + (width*height),(void*)virCAddr, width * height * 0.5); 562 memcpy(mRecordHeap->base(), (void*)virYAddr, ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))); 563 memcpy(mRecordHeap->base() + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height)), 564 (void*)virCAddr, ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height / 2))); 565 #else 566 #ifdef DUAL_PORT_RECORDING 567 int index = mSecCamera->getRecord(); 568 569 if (index < 0) { 570 LOGE("ERR(%s):Fail on SecCamera->getRecord()", __func__); 571 return UNKNOWN_ERROR; 572 } 573 574 unsigned int phyYAddr = mSecCamera->getRecPhyAddrY(index); 575 unsigned int phyCAddr = mSecCamera->getRecPhyAddrC(index); 576 577 if (phyYAddr == 0xffffffff || phyCAddr == 0xffffffff) { 578 LOGE("ERR(%s):Fail on SecCamera getRectPhyAddr Y addr = %0x C addr = %0x", __func__, phyYAddr, phyCAddr); 579 return UNKNOWN_ERROR; 580 } 581 #endif//DUAL_PORT_RECORDING 582 struct addrs *addrs = (struct addrs *)mRecordHeap->base(); 583 584 sp<MemoryBase> buffer = new MemoryBase(mRecordHeap, index * sizeof(struct addrs), sizeof(struct addrs)); 585 addrs[index].addr_y = phyYAddr; 586 addrs[index].addr_cbcr = phyCAddr; 587 #endif 588 // Notify the client of a new frame. 589 if (mMsgEnabled & CAMERA_MSG_VIDEO_FRAME) { 590 //nsecs_t timestamp = systemTime(SYSTEM_TIME_MONOTONIC); 591 mDataCbTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, buffer, mCallbackCookie); 592 } 593 #ifdef DUAL_PORT_RECORDING 594 } else if (mRecordRunning == false) { 595 if (mSecCamera->stopRecord() < 0) { 596 LOGE("ERR(%s):Fail on mSecCamera->stopRecord()", __func__); 597 return UNKNOWN_ERROR; 598 } 599 #endif 600 } 601 602 // Wait for it... 603 if (mTimeStart.tv_sec == 0 && mTimeStart.tv_usec == 0) { 604 gettimeofday(&mTimeStart, NULL); 605 } else { 606 gettimeofday(&mTimeStop, NULL); 607 long time = measure_time(&mTimeStart, &mTimeStop); 608 int delay = (mPreviewFrameRateMicrosec > time) ? mPreviewFrameRateMicrosec - time : 0; 609 610 usleep(delay); 611 //LOG_CAMERA_PREVIEW("delay = %d time = %ld us\n ", delay, time); 612 gettimeofday(&mTimeStart, NULL); 613 } 614 615 return NO_ERROR; 616 } 617 618 status_t CameraHardwareSec::startPreview() 619 { 620 int ret = 0; //s1 [Apply factory standard] 621 622 LOGV("%s :", __func__); 623 624 Mutex::Autolock lock(mStateLock); 625 if (mPreviewRunning) { 626 // already running 627 LOGE("%s : preview thread already running", __func__); 628 return INVALID_OPERATION; 629 } 630 631 if (mCaptureInProgress) { 632 LOGE("%s : capture in progress, not allowed", __func__); 633 return INVALID_OPERATION; 634 } 635 636 memset(&mTimeStart, 0, sizeof(mTimeStart)); 637 memset(&mTimeStop, 0, sizeof(mTimeStop)); 638 639 mSecCamera->stopPreview(); 640 641 setSkipFrame(INITIAL_SKIP_FRAME); 642 643 ret = mSecCamera->startPreview(); 644 LOGV("%s : mSecCamera->startPreview() returned %d", __func__, ret); 645 646 if (ret < 0) { 647 LOGE("ERR(%s):Fail on mSecCamera->startPreview()", __func__); 648 return -1; //UNKNOWN_ERROR; 649 } 650 651 #ifdef PREVIEW_USING_MMAP 652 if (mPreviewHeap != NULL) 653 mPreviewHeap.clear(); 654 655 int width, height, frame_size; 656 657 mSecCamera->getPreviewSize(&width, &height, &frame_size); 658 659 int previewHeapSize = (frame_size + 16) * kBufferCount; 660 661 LOGD("MemoryHeapBase(fd(%d), size(%d), width(%d), height(%d))", (int)mSecCamera->getCameraFd(), (size_t)(previewHeapSize), width, height); 662 mPreviewHeap = new MemoryHeapBase((int)mSecCamera->getCameraFd(), (size_t)(previewHeapSize), (uint32_t)0); 663 #endif 664 665 #ifdef JPEG_FROM_SENSOR 666 mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize); 667 LOGV("CameraHardwareSec: mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",mPostViewWidth,mPostViewHeight,mPostViewSize); 668 #endif 669 670 #ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA 671 int rawHeapSize = mPostViewSize; 672 #else 673 int rawHeapSize = sizeof(struct addrs_cap); 674 #endif 675 LOGV("CameraHardwareSec: mRawHeap : MemoryHeapBase(previewHeapSize(%d))", rawHeapSize); 676 mRawHeap = new MemoryHeapBase(rawHeapSize); 677 if (mRawHeap->getHeapID() < 0) { 678 LOGE("ERR(%s): Raw heap creation fail", __func__); 679 mRawHeap.clear(); 680 } 681 682 mPreviewRunning = true; 683 mPreviewThread->run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY); 684 685 return NO_ERROR; 686 } 687 688 #if defined(BOARD_USES_OVERLAY) 689 bool CameraHardwareSec::useOverlay() 690 { 691 LOGV("%s: returning true", __func__); 692 return true; 693 } 694 695 status_t CameraHardwareSec::setOverlay(const sp<Overlay> &overlay) 696 { 697 LOGV("%s :", __func__); 698 699 int overlayWidth = 0; 700 int overlayHeight = 0; 701 int overlayFrameSize = 0; 702 703 if (overlay == NULL) { 704 LOGV("%s : overlay == NULL", __func__); 705 goto setOverlayFail; 706 } 707 LOGV("%s : overlay = %p", __func__, overlay->getHandleRef()); 708 709 if (overlay->getHandleRef()== NULL && mUseOverlay == true) { 710 if (mOverlay != 0) 711 mOverlay->destroy(); 712 713 mOverlay = NULL; 714 mUseOverlay = false; 715 716 return NO_ERROR; 717 } 718 719 if (overlay->getStatus() != NO_ERROR) { 720 LOGE("ERR(%s):overlay->getStatus() fail", __func__); 721 goto setOverlayFail; 722 } 723 724 mSecCamera->getPreviewSize(&overlayWidth, &overlayHeight, &overlayFrameSize); 725 726 if (overlay->setCrop(0, 0, overlayWidth, overlayHeight) != NO_ERROR) { 727 LOGE("ERR(%s)::(mOverlay->setCrop(0, 0, %d, %d) fail", __func__, overlayWidth, overlayHeight); 728 goto setOverlayFail; 729 } 730 731 mOverlay = overlay; 732 mUseOverlay = true; 733 734 return NO_ERROR; 735 736 setOverlayFail : 737 if (mOverlay != 0) 738 mOverlay->destroy(); 739 mOverlay = 0; 740 741 mUseOverlay = false; 742 743 return UNKNOWN_ERROR; 744 } 745 #endif 746 747 void CameraHardwareSec::stopPreview() 748 { 749 LOGV("%s :", __func__); 750 751 if (!previewEnabled()) 752 return; 753 754 /* request that the preview thread exit. we can wait because we're 755 * called by CameraServices with a lock but it has disabled all preview 756 * related callbacks so previewThread should not invoke any callbacks. 757 */ 758 mPreviewThread->requestExitAndWait(); 759 760 if (mSecCamera->stopPreview() < 0) 761 LOGE("ERR(%s):Fail on mSecCamera->stopPreview()", __func__); 762 763 mPreviewRunning = false; 764 } 765 766 bool CameraHardwareSec::previewEnabled() 767 { 768 Mutex::Autolock lock(mStateLock); 769 LOGV("%s : %d", __func__, mPreviewRunning); 770 return mPreviewRunning; 771 } 772 773 // --------------------------------------------------------------------------- 774 775 status_t CameraHardwareSec::startRecording() 776 { 777 LOGV("%s :", __func__); 778 779 #ifdef DUAL_PORT_RECORDING 780 if (mSecCamera->startRecord() < 0) { 781 LOGE("ERR(%s):Fail on mSecCamera->startRecord()", __func__); 782 return UNKNOWN_ERROR; 783 } 784 #endif 785 786 mRecordRunning = true; 787 return NO_ERROR; 788 } 789 790 void CameraHardwareSec::stopRecording() 791 { 792 LOGV("%s :", __func__); 793 794 mRecordRunning = false; 795 } 796 797 bool CameraHardwareSec::recordingEnabled() 798 { 799 LOGV("%s :", __func__); 800 801 return mRecordRunning; 802 } 803 804 void CameraHardwareSec::releaseRecordingFrame(const sp<IMemory>& mem) 805 { 806 LOG_CAMERA_PREVIEW("%s :", __func__); 807 808 // ssize_t offset; size_t size; 809 // sp<MemoryBase> mem1 = mem; 810 // sp<MemoryHeapBase> heap = mem->getMemory(&offset, &size); 811 // sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 812 813 // mem1.clear(); 814 // heap.clear(); 815 } 816 817 // --------------------------------------------------------------------------- 818 819 int CameraHardwareSec::autoFocusThread() 820 { 821 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 822 int count =0; 823 int af_status =0 ; 824 #endif 825 826 LOGV("%s : starting", __func__); 827 828 /* block until we're told to start. we don't want to use 829 * a restartable thread and requestExitAndWait() in cancelAutoFocus() 830 * because it would cause deadlock between our callbacks and the 831 * caller of cancelAutoFocus() which both want to grab the same lock 832 * in CameraServices layer. 833 */ 834 mFocusLock.lock(); 835 mCondition.wait(mFocusLock); 836 mFocusLock.unlock(); 837 838 /* check early exit request */ 839 if (mExitAutoFocusThread) 840 return NO_ERROR; 841 842 LOGV("%s : calling setAutoFocus", __func__); 843 if (mSecCamera->setAutofocus() < 0) { 844 LOGE("ERR(%s):Fail on mSecCamera->setAutofocus()", __func__); 845 return UNKNOWN_ERROR; 846 } 847 848 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 849 af_status = mSecCamera->getAutoFocusResult(); 850 851 if (af_status == 0x01) { 852 LOGV("%s : AF Success!!", __func__); 853 if (mMsgEnabled & CAMERA_MSG_FOCUS) 854 mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); 855 } else if (af_status == 0x02) { 856 LOGV("%s : AF Cancelled !!", __func__); 857 if (mMsgEnabled & CAMERA_MSG_FOCUS) { 858 /* CAMERA_MSG_FOCUS only takes a bool. true for 859 * finished and false for failure. cancel is still 860 * considered a true result. 861 */ 862 mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); 863 } 864 } else { 865 LOGV("%s : AF Fail !!", __func__); 866 LOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled); 867 if (mMsgEnabled & CAMERA_MSG_FOCUS) 868 mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); 869 } 870 #else 871 if (mMsgEnabled & CAMERA_MSG_FOCUS) 872 mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); 873 #endif 874 875 return NO_ERROR; 876 } 877 878 status_t CameraHardwareSec::autoFocus() 879 { 880 LOGV("%s :", __func__); 881 /* signal autoFocusThread to run once */ 882 mCondition.signal(); 883 return NO_ERROR; 884 } 885 886 /* 2009.10.14 by icarus for added interface */ 887 status_t CameraHardwareSec::cancelAutoFocus() 888 { 889 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 890 LOGV("%s :", __func__); 891 892 if (mSecCamera->cancelAutofocus() < 0) { 893 LOGE("ERR(%s):Fail on mSecCamera->cancelAutofocus()", __func__); 894 return UNKNOWN_ERROR; 895 } 896 #endif 897 898 return NO_ERROR; 899 } 900 901 int CameraHardwareSec::save_jpeg( unsigned char *real_jpeg, int jpeg_size) 902 { 903 FILE *yuv_fp = NULL; 904 char filename[100], *buffer = NULL; 905 906 /* file create/open, note to "wb" */ 907 yuv_fp = fopen("/data/camera_dump.jpeg", "wb"); 908 if (yuv_fp == NULL) { 909 LOGE("Save jpeg file open error"); 910 return -1; 911 } 912 913 LOGV("[BestIQ] real_jpeg size ========> %d\n", jpeg_size); 914 buffer = (char *) malloc(jpeg_size); 915 if (buffer == NULL) { 916 LOGE("Save YUV] buffer alloc failed"); 917 if (yuv_fp) 918 fclose(yuv_fp); 919 920 return -1; 921 } 922 923 memcpy(buffer, real_jpeg, jpeg_size); 924 925 fflush(stdout); 926 927 fwrite(buffer, 1, jpeg_size, yuv_fp); 928 929 fflush(yuv_fp); 930 931 if (yuv_fp) 932 fclose(yuv_fp); 933 if (buffer) 934 free(buffer); 935 936 return 0; 937 } 938 939 void CameraHardwareSec::save_postview(const char *fname, uint8_t *buf, uint32_t size) 940 { 941 int nw; 942 int cnt = 0; 943 uint32_t written = 0; 944 945 LOGD("opening file [%s]\n", fname); 946 int fd = open(fname, O_RDWR | O_CREAT); 947 if (fd < 0) { 948 LOGE("failed to create file [%s]: %s", fname, strerror(errno)); 949 return; 950 } 951 952 LOGD("writing %d bytes to file [%s]\n", size, fname); 953 while (written < size) { 954 nw = ::write(fd, buf + written, size - written); 955 if (nw < 0) { 956 LOGE("failed to write to file %d [%s]: %s",written,fname, strerror(errno)); 957 break; 958 } 959 written += nw; 960 cnt++; 961 } 962 LOGD("done writing %d bytes to file [%s] in %d passes\n",size, fname, cnt); 963 ::close(fd); 964 } 965 966 bool CameraHardwareSec::scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHeight, 967 char *dstBuf, uint32_t dstWidth, uint32_t dstHeight) 968 { 969 int32_t step_x, step_y; 970 int32_t iXsrc, iXdst; 971 int32_t x, y, src_y_start_pos, dst_pos, src_pos; 972 973 if (dstWidth % 2 != 0 || dstHeight % 2 != 0){ 974 LOGE("scale_down_yuv422: invalid width, height for scaling"); 975 return false; 976 } 977 978 step_x = srcWidth / dstWidth; 979 step_y = srcHeight / dstHeight; 980 981 dst_pos = 0; 982 for (uint32_t y = 0; y < dstHeight; y++) { 983 src_y_start_pos = (y * step_y * (srcWidth * 2)); 984 985 for (uint32_t x = 0; x < dstWidth; x += 2) { 986 src_pos = src_y_start_pos + (x * (step_x * 2)); 987 988 dstBuf[dst_pos++] = srcBuf[src_pos ]; 989 dstBuf[dst_pos++] = srcBuf[src_pos + 1]; 990 dstBuf[dst_pos++] = srcBuf[src_pos + 2]; 991 dstBuf[dst_pos++] = srcBuf[src_pos + 3]; 992 } 993 } 994 995 return true; 996 } 997 998 bool CameraHardwareSec::YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight) 999 { 1000 int32_t x, y, src_y_start_pos, dst_cbcr_pos, dst_pos, src_pos; 1001 unsigned char *srcBufPointer = (unsigned char *)srcBuf; 1002 unsigned char *dstBufPointer = (unsigned char *)dstBuf; 1003 1004 dst_pos = 0; 1005 dst_cbcr_pos = srcWidth*srcHeight; 1006 for (uint32_t y = 0; y < srcHeight; y++) { 1007 src_y_start_pos = (y * (srcWidth * 2)); 1008 1009 for (uint32_t x = 0; x < (srcWidth * 2); x += 2) { 1010 src_pos = src_y_start_pos + x; 1011 1012 dstBufPointer[dst_pos++] = srcBufPointer[src_pos]; 1013 } 1014 } 1015 for (uint32_t y = 0; y < srcHeight; y += 2) { 1016 src_y_start_pos = (y * (srcWidth * 2)); 1017 1018 for (uint32_t x = 0; x < (srcWidth * 2); x += 4) { 1019 src_pos = src_y_start_pos + x; 1020 1021 dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 3]; 1022 dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 1]; 1023 } 1024 } 1025 1026 return true; 1027 } 1028 1029 int CameraHardwareSec::pictureThread() 1030 { 1031 LOGV("%s :", __func__); 1032 1033 int jpeg_size = 0; 1034 int ret = NO_ERROR; 1035 unsigned char *jpeg_data = NULL; 1036 int postview_offset = 0; 1037 unsigned char *postview_data = NULL; 1038 1039 unsigned char *addr = NULL; 1040 int mPostViewWidth, mPostViewHeight, mPostViewSize; 1041 int mThumbWidth, mThumbHeight, mThumbSize; 1042 int cap_width, cap_height, cap_frame_size; 1043 1044 unsigned int output_size = 0; 1045 1046 mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize); 1047 mSecCamera->getThumbnailConfig(&mThumbWidth, &mThumbHeight, &mThumbSize); 1048 int postviewHeapSize = mPostViewSize; 1049 mSecCamera->getSnapshotSize(&cap_width, &cap_height, &cap_frame_size); 1050 int mJpegHeapSize; 1051 if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) 1052 mJpegHeapSize = cap_frame_size * SecCamera::getJpegRatio(); 1053 else 1054 mJpegHeapSize = cap_frame_size; 1055 1056 LOG_TIME_DEFINE(0) 1057 LOG_TIME_START(0) 1058 #ifdef DIRECT_DELIVERY_OF_POSTVIEW_DATA 1059 sp<MemoryBase> buffer = new MemoryBase(mRawHeap, 0, mPostViewSize + 8); 1060 #else 1061 sp<MemoryBase> buffer = new MemoryBase(mRawHeap, 0, sizeof(struct addrs_cap)); 1062 #endif 1063 1064 struct addrs_cap *addrs = (struct addrs_cap *)mRawHeap->base(); 1065 1066 #ifdef JPEG_FROM_SENSOR 1067 addrs[0].width = mPostViewWidth; 1068 addrs[0].height = mPostViewHeight; 1069 LOGV("[5B] mPostViewWidth = %d mPostViewHeight = %d\n",mPostViewWidth,mPostViewHeight); 1070 #else 1071 mParameters.getPictureSize((int*)&addrs[0].width, (int*)&addrs[0].height); 1072 #endif 1073 1074 sp<MemoryHeapBase> JpegHeap = new MemoryHeapBase(mJpegHeapSize); 1075 sp<MemoryHeapBase> PostviewHeap = new MemoryHeapBase(mPostViewSize); 1076 sp<MemoryHeapBase> ThumbnailHeap = new MemoryHeapBase(mThumbSize); 1077 1078 if (mMsgEnabled & CAMERA_MSG_RAW_IMAGE) { 1079 LOG_TIME_DEFINE(1) 1080 LOG_TIME_START(1) 1081 1082 int picture_size, picture_width, picture_height; 1083 mSecCamera->getSnapshotSize(&picture_width, &picture_height, &picture_size); 1084 int picture_format = mSecCamera->getSnapshotPixelFormat(); 1085 1086 unsigned int phyAddr; 1087 #ifdef JPEG_FROM_SENSOR 1088 // Modified the shutter sound timing for Jpeg capture 1089 if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) 1090 mSecCamera->setSnapshotCmd(); 1091 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 1092 if (mMsgEnabled & CAMERA_MSG_SHUTTER) { 1093 mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie); 1094 } 1095 #endif 1096 1097 if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK){ 1098 jpeg_data = mSecCamera->getJpeg(&jpeg_size, &phyAddr); 1099 if (jpeg_data == NULL) { 1100 LOGE("ERR(%s):Fail on SecCamera->getSnapshot()", __func__); 1101 ret = UNKNOWN_ERROR; 1102 } 1103 } else { 1104 if (mSecCamera->getSnapshotAndJpeg((unsigned char*)PostviewHeap->base(), 1105 (unsigned char*)JpegHeap->base(), &output_size) < 0) { 1106 mStateLock.lock(); 1107 mCaptureInProgress = false; 1108 mStateLock.unlock(); 1109 return UNKNOWN_ERROR; 1110 } 1111 LOGI("snapshotandjpeg done\n"); 1112 } 1113 #else 1114 phyAddr = mSecCamera->getSnapshotAndJpeg(); 1115 if (phyAddr < 0) { 1116 mStateLock.lock(); 1117 mCaptureInProgress = false; 1118 mStateLock.unlock(); 1119 return UNKNOWN_ERROR; 1120 } 1121 1122 jpeg_data = mSecCamera->yuv2Jpeg((unsigned char*)phyAddr, 0, &jpeg_size, 1123 picture_width, picture_height, picture_format); 1124 #endif 1125 1126 #ifndef DIRECT_DELIVERY_OF_POSTVIEW_DATA 1127 1128 addrs[0].addr_y = phyAddr; 1129 #endif 1130 1131 LOG_TIME_END(1) 1132 LOG_CAMERA("getSnapshotAndJpeg interval: %lu us", LOG_TIME(1)); 1133 } 1134 1135 /* the capture is done at this point so we can allow sensor commands 1136 * again, we still need to do jpeg and thumbnail processing, but the 1137 * sensor is available for something else 1138 */ 1139 mStateLock.lock(); 1140 mCaptureInProgress = false; 1141 mStateLock.unlock(); 1142 1143 int JpegImageSize, JpegExifSize; 1144 bool isLSISensor = false; 1145 1146 if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) { 1147 isLSISensor = !strncmp((const char*)mCameraSensorName, "S5K4ECGX", 8); 1148 if(isLSISensor) { 1149 LOGI("== Camera Sensor Detect %s - Samsung LSI SOC 5M ==\n", mCameraSensorName); 1150 // LSI 5M SOC 1151 if (!SplitFrame(jpeg_data, SecCamera::getInterleaveDataSize(), 1152 SecCamera::getJpegLineLength(), 1153 mPostViewWidth * 2, mPostViewWidth, 1154 JpegHeap->base(), &JpegImageSize, 1155 PostviewHeap->base(), &mPostViewSize)) 1156 return UNKNOWN_ERROR; 1157 } else { 1158 LOGI("== Camera Sensor Detect %s Sony SOC 5M ==\n", mCameraSensorName); 1159 decodeInterleaveData(jpeg_data, SecCamera::getInterleaveDataSize(), mPostViewWidth, mPostViewHeight, 1160 &JpegImageSize, JpegHeap->base(), PostviewHeap->base()); 1161 1162 } 1163 } else { 1164 JpegImageSize = static_cast<int>(output_size); 1165 } 1166 scaleDownYuv422((char *)PostviewHeap->base(), mPostViewWidth, mPostViewHeight, 1167 (char *)ThumbnailHeap->base(), mThumbWidth, mThumbHeight); 1168 1169 #ifdef POSTVIEW_CALLBACK 1170 sp<MemoryBase> postview = new MemoryBase(PostviewHeap, 0, postviewHeapSize); 1171 #endif 1172 memcpy(mRawHeap->base(),PostviewHeap->base(), postviewHeapSize); 1173 1174 #if defined(BOARD_USES_OVERLAY) 1175 /* Put postview image to Overlay */ 1176 unsigned int index = 0; 1177 unsigned int offset = ((mPostViewWidth*mPostViewHeight*3/2) + 16) * index; 1178 unsigned int overlay_header[4]; 1179 1180 // Only show postview image if size is VGA since sensor cannot deliver 1181 // any other sizes. 1182 int previewWidth, previewHeight, previewSize; 1183 mSecCamera->getPreviewSize(&previewWidth, &previewHeight, &previewSize); 1184 if ((previewWidth != 640) || (previewHeight != 480)) 1185 goto PostviewOverlayEnd; 1186 1187 mOverlayBufferIdx ^= 1; 1188 overlay_header[0]= mSecCamera->getPhyAddrY(index); 1189 overlay_header[1]= overlay_header[0] + mPostViewWidth*mPostViewHeight; 1190 overlay_header[2]= mOverlayBufferIdx; 1191 1192 YUY2toNV21(mRawHeap->base(), (void*)(static_cast<unsigned char *>(mPreviewHeap->base()) + offset), 1193 mPostViewWidth, mPostViewHeight); 1194 1195 memcpy(static_cast<unsigned char*>(mPreviewHeap->base()) + offset + (mPostViewWidth*mPostViewHeight * 3 / 2), 1196 overlay_header, 16); 1197 1198 ret = mOverlay->queueBuffer((void*)(static_cast<unsigned char *>(mPreviewHeap->base()) + offset + 1199 (mPostViewWidth*mPostViewHeight * 3 / 2))); 1200 1201 if (ret == ALL_BUFFERS_FLUSHED) { 1202 goto PostviewOverlayEnd; 1203 } else if (ret == -1) { 1204 LOGE("ERR(%s):overlay queueBuffer fail", __func__); 1205 goto PostviewOverlayEnd; 1206 } 1207 1208 overlay_buffer_t overlay_buffer; 1209 ret = mOverlay->dequeueBuffer(&overlay_buffer); 1210 1211 if (ret == ALL_BUFFERS_FLUSHED) { 1212 goto PostviewOverlayEnd; 1213 } else if (ret == -1) { 1214 LOGE("ERR(%s):overlay dequeueBuffer fail", __func__); 1215 goto PostviewOverlayEnd; 1216 } 1217 1218 PostviewOverlayEnd: 1219 #endif 1220 if (mMsgEnabled & CAMERA_MSG_RAW_IMAGE) { 1221 mDataCb(CAMERA_MSG_RAW_IMAGE, buffer, mCallbackCookie); 1222 } 1223 #ifdef POSTVIEW_CALLBACK 1224 if (mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) { 1225 int postviewHeapSize = mPostViewSize; 1226 sp<MemoryHeapBase> mPostviewHeap = new MemoryHeapBase(postviewHeapSize); 1227 1228 postview_data = jpeg_data + postview_offset; 1229 sp<MemoryBase> postview = new MemoryBase(mPostviewHeap, 0, postviewHeapSize); 1230 1231 if (postview_data != NULL) 1232 memcpy(mPostviewHeap->base(), postview_data, postviewHeapSize); 1233 1234 mDataCb(CAMERA_MSG_POSTVIEW_FRAME, postview, mCallbackCookie); 1235 } 1236 #endif 1237 if (mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) { 1238 sp<MemoryHeapBase> ExifHeap = new MemoryHeapBase(EXIF_FILE_SIZE + JPG_STREAM_BUF_SIZE); 1239 JpegExifSize = mSecCamera->getExif((unsigned char *)ExifHeap->base(), 1240 (unsigned char *)ThumbnailHeap->base()); 1241 1242 LOGV("JpegExifSize=%d", JpegExifSize); 1243 1244 if (JpegExifSize < 0) { 1245 return UNKNOWN_ERROR; 1246 } 1247 1248 unsigned char *ExifStart = (unsigned char *)JpegHeap->base() + 2; 1249 unsigned char *ImageStart = ExifStart + JpegExifSize; 1250 1251 memmove(ImageStart, ExifStart, JpegImageSize - 2); 1252 memcpy(ExifStart, ExifHeap->base(), JpegExifSize); 1253 sp<MemoryBase> mem = new MemoryBase(JpegHeap, 0, JpegImageSize + JpegExifSize); 1254 1255 mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, mem, mCallbackCookie); 1256 } 1257 1258 LOG_TIME_END(0) 1259 LOG_CAMERA("pictureThread interval: %lu us", LOG_TIME(0)); 1260 1261 LOGV("%s : pictureThread end", __func__); 1262 return ret; 1263 } 1264 1265 status_t CameraHardwareSec::takePicture() 1266 { 1267 LOGV("%s :", __func__); 1268 1269 stopPreview(); 1270 1271 Mutex::Autolock lock(mStateLock); 1272 if (mCaptureInProgress) { 1273 LOGE("%s : capture already in progress", __func__); 1274 return INVALID_OPERATION; 1275 } 1276 1277 if (mPictureThread->run("CameraPictureThread", PRIORITY_DEFAULT) != NO_ERROR) { 1278 LOGE("%s : couldn't run picture thread", __func__); 1279 return INVALID_OPERATION; 1280 } 1281 mCaptureInProgress = true; 1282 1283 return NO_ERROR; 1284 } 1285 1286 status_t CameraHardwareSec::cancelPicture() 1287 { 1288 mPictureThread->requestExitAndWait(); 1289 1290 mSecCamera->cancelPicture(); 1291 1292 LOGW("%s : not supported, just returning NO_ERROR", __func__); 1293 return NO_ERROR; 1294 } 1295 1296 bool CameraHardwareSec::CheckVideoStartMarker(unsigned char *pBuf) 1297 { 1298 if (!pBuf) { 1299 LOGE("CheckVideoStartMarker() => pBuf is NULL\n"); 1300 return false; 1301 } 1302 1303 if (HIBYTE(VIDEO_COMMENT_MARKER_H) == * pBuf && LOBYTE(VIDEO_COMMENT_MARKER_H) == *(pBuf + 1) && 1304 HIBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 2) && LOBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 3)) 1305 return true; 1306 1307 return false; 1308 } 1309 1310 bool CameraHardwareSec::CheckEOIMarker(unsigned char *pBuf) 1311 { 1312 if (!pBuf) { 1313 LOGE("CheckEOIMarker() => pBuf is NULL\n"); 1314 return false; 1315 } 1316 1317 // EOI marker [FF D9] 1318 if (HIBYTE(JPEG_EOI_MARKER) == *pBuf && LOBYTE(JPEG_EOI_MARKER) == *(pBuf + 1)) 1319 return true; 1320 1321 return false; 1322 } 1323 1324 bool CameraHardwareSec::FindEOIMarkerInJPEG(unsigned char *pBuf, int dwBufSize, int *pnJPEGsize) 1325 { 1326 if (NULL == pBuf || 0 >= dwBufSize) { 1327 LOGE("FindEOIMarkerInJPEG() => There is no contents."); 1328 return false; 1329 } 1330 1331 unsigned char *pBufEnd = pBuf + dwBufSize; 1332 1333 while (pBuf < pBufEnd) { 1334 if (CheckEOIMarker(pBuf++)) 1335 return true; 1336 1337 (*pnJPEGsize)++; 1338 } 1339 1340 return false; 1341 } 1342 1343 bool CameraHardwareSec::SplitFrame(unsigned char *pFrame, int dwSize, 1344 int dwJPEGLineLength, int dwVideoLineLength, int dwVideoHeight, 1345 void *pJPEG, int *pdwJPEGSize, 1346 void *pVideo, int *pdwVideoSize) 1347 { 1348 LOGV("===========SplitFrame Start=============="); 1349 1350 if (NULL == pFrame || 0 >= dwSize) { 1351 LOGE("There is no contents.\r\n"); 1352 return false; 1353 } 1354 1355 if (0 == dwJPEGLineLength || 0 == dwVideoLineLength) { 1356 LOGE("There in no input information for decoding interleaved jpeg"); 1357 return false; 1358 } 1359 1360 unsigned char *pSrc = pFrame; 1361 unsigned char *pSrcEnd = pFrame + dwSize; 1362 1363 unsigned char *pJ = (unsigned char *)pJPEG; 1364 int dwJSize = 0; 1365 unsigned char *pV = (unsigned char *)pVideo; 1366 int dwVSize = 0; 1367 1368 bool bRet = false; 1369 bool isFinishJpeg = false; 1370 1371 while (pSrc < pSrcEnd) { 1372 // Check video start marker 1373 if (CheckVideoStartMarker(pSrc)) { 1374 int copyLength; 1375 1376 if (pSrc + dwVideoLineLength <= pSrcEnd) 1377 copyLength = dwVideoLineLength; 1378 else 1379 copyLength = pSrcEnd - pSrc - VIDEO_COMMENT_MARKER_LENGTH; 1380 1381 // Copy video data 1382 if (pV) { 1383 memcpy(pV, pSrc + VIDEO_COMMENT_MARKER_LENGTH, copyLength); 1384 pV += copyLength; 1385 dwVSize += copyLength; 1386 } 1387 1388 pSrc += copyLength + VIDEO_COMMENT_MARKER_LENGTH; 1389 } else { 1390 // Copy pure JPEG data 1391 int size = 0; 1392 int dwCopyBufLen = dwJPEGLineLength <= pSrcEnd-pSrc ? dwJPEGLineLength : pSrcEnd - pSrc; 1393 1394 if (FindEOIMarkerInJPEG((unsigned char *)pSrc, dwCopyBufLen, &size)) { 1395 isFinishJpeg = true; 1396 size += 2; // to count EOF marker size 1397 } else { 1398 if ((dwCopyBufLen == 1) && (pJPEG < pJ)) { 1399 unsigned char checkBuf[2] = { *(pJ - 1), *pSrc }; 1400 1401 if (CheckEOIMarker(checkBuf)) 1402 isFinishJpeg = true; 1403 } 1404 size = dwCopyBufLen; 1405 } 1406 1407 memcpy(pJ, pSrc, size); 1408 1409 dwJSize += size; 1410 1411 pJ += dwCopyBufLen; 1412 pSrc += dwCopyBufLen; 1413 } 1414 if (isFinishJpeg) 1415 break; 1416 } 1417 1418 if (isFinishJpeg) { 1419 bRet = true; 1420 if(pdwJPEGSize) 1421 *pdwJPEGSize = dwJSize; 1422 if(pdwVideoSize) 1423 *pdwVideoSize = dwVSize; 1424 } else { 1425 LOGE("DecodeInterleaveJPEG_WithOutDT() => Can not find EOI"); 1426 bRet = false; 1427 if(pdwJPEGSize) 1428 *pdwJPEGSize = 0; 1429 if(pdwVideoSize) 1430 *pdwVideoSize = 0; 1431 } 1432 LOGV("===========SplitFrame end=============="); 1433 1434 return bRet; 1435 } 1436 1437 int CameraHardwareSec::decodeInterleaveData(unsigned char *pInterleaveData, 1438 int interleaveDataSize, 1439 int yuvWidth, 1440 int yuvHeight, 1441 int *pJpegSize, 1442 void *pJpegData, 1443 void *pYuvData) 1444 { 1445 if (pInterleaveData == NULL) 1446 return false; 1447 1448 bool ret = true; 1449 unsigned int *interleave_ptr = (unsigned int *)pInterleaveData; 1450 unsigned char *jpeg_ptr = (unsigned char *)pJpegData; 1451 unsigned char *yuv_ptr = (unsigned char *)pYuvData; 1452 unsigned char *p; 1453 int jpeg_size = 0; 1454 int yuv_size = 0; 1455 1456 int i = 0; 1457 1458 LOGV("decodeInterleaveData Start~~~"); 1459 while (i < interleaveDataSize) { 1460 if ((*interleave_ptr == 0xFFFFFFFF) || (*interleave_ptr == 0x02FFFFFF) || 1461 (*interleave_ptr == 0xFF02FFFF)) { 1462 // Padding Data 1463 // LOGE("%d(%x) padding data\n", i, *interleave_ptr); 1464 interleave_ptr++; 1465 i += 4; 1466 } 1467 else if ((*interleave_ptr & 0xFFFF) == 0x05FF) { 1468 // Start-code of YUV Data 1469 // LOGE("%d(%x) yuv data\n", i, *interleave_ptr); 1470 p = (unsigned char *)interleave_ptr; 1471 p += 2; 1472 i += 2; 1473 1474 // Extract YUV Data 1475 if (pYuvData != NULL) { 1476 memcpy(yuv_ptr, p, yuvWidth * 2); 1477 yuv_ptr += yuvWidth * 2; 1478 yuv_size += yuvWidth * 2; 1479 } 1480 p += yuvWidth * 2; 1481 i += yuvWidth * 2; 1482 1483 // Check End-code of YUV Data 1484 if ((*p == 0xFF) && (*(p + 1) == 0x06)) { 1485 interleave_ptr = (unsigned int *)(p + 2); 1486 i += 2; 1487 } else { 1488 ret = false; 1489 break; 1490 } 1491 } else { 1492 // Extract JPEG Data 1493 // LOGE("%d(%x) jpg data, jpeg_size = %d bytes\n", i, *interleave_ptr, jpeg_size); 1494 if (pJpegData != NULL) { 1495 memcpy(jpeg_ptr, interleave_ptr, 4); 1496 jpeg_ptr += 4; 1497 jpeg_size += 4; 1498 } 1499 interleave_ptr++; 1500 i += 4; 1501 } 1502 } 1503 if (ret) { 1504 if (pJpegData != NULL) { 1505 // Remove Padding after EOI 1506 for (i = 0; i < 3; i++) { 1507 if (*(--jpeg_ptr) != 0xFF) { 1508 break; 1509 } 1510 jpeg_size--; 1511 } 1512 *pJpegSize = jpeg_size; 1513 1514 } 1515 // Check YUV Data Size 1516 if (pYuvData != NULL) { 1517 if (yuv_size != (yuvWidth * yuvHeight * 2)) { 1518 ret = false; 1519 } 1520 } 1521 } 1522 LOGV("decodeInterleaveData End~~~"); 1523 return ret; 1524 } 1525 1526 status_t CameraHardwareSec::dump(int fd, const Vector<String16>& args) const 1527 { 1528 const size_t SIZE = 256; 1529 char buffer[SIZE]; 1530 String8 result; 1531 1532 if (mSecCamera != 0) { 1533 mSecCamera->dump(fd, args); 1534 mParameters.dump(fd, args); 1535 mInternalParameters.dump(fd, args); 1536 snprintf(buffer, 255, " preview frame(%d), size (%d), running(%s)\n", mCurrentPreviewFrame, mPreviewFrameSize, mPreviewRunning?"true": "false"); 1537 result.append(buffer); 1538 } else { 1539 result.append("No camera client yet.\n"); 1540 } 1541 write(fd, result.string(), result.size()); 1542 return NO_ERROR; 1543 } 1544 1545 status_t CameraHardwareSec::setParameters(const CameraParameters& params) 1546 { 1547 LOGV("%s :", __func__); 1548 1549 status_t ret = NO_ERROR; 1550 1551 /* if someone calls us while picture thread is running, it could screw 1552 * up the sensor quite a bit so return error. we can't wait because 1553 * that would cause deadlock with the callbacks 1554 */ 1555 mStateLock.lock(); 1556 if (mCaptureInProgress) { 1557 mStateLock.unlock(); 1558 LOGE("%s : capture in progress, not allowed", __func__); 1559 return UNKNOWN_ERROR; 1560 } 1561 mStateLock.unlock(); 1562 1563 // preview size 1564 int new_preview_width = 0; 1565 int new_preview_height = 0; 1566 params.getPreviewSize(&new_preview_width, &new_preview_height); 1567 const char *new_str_preview_format = params.getPreviewFormat(); 1568 LOGV("%s : new_preview_width x new_preview_height = %dx%d, format = %s", 1569 __func__, new_preview_width, new_preview_height, new_str_preview_format); 1570 1571 if (0 < new_preview_width && 0 < new_preview_height && new_str_preview_format != NULL) { 1572 int new_preview_format = 0; 1573 1574 if (!strcmp(new_str_preview_format, 1575 CameraParameters::PIXEL_FORMAT_RGB565)) 1576 new_preview_format = V4L2_PIX_FMT_RGB565; 1577 else if (!strcmp(new_str_preview_format, 1578 CameraParameters::PIXEL_FORMAT_YUV420SP)) 1579 new_preview_format = V4L2_PIX_FMT_NV21; 1580 else if (!strcmp(new_str_preview_format, "yuv420sp_custom")) 1581 new_preview_format = V4L2_PIX_FMT_NV12T; 1582 else if (!strcmp(new_str_preview_format, "yuv420p")) 1583 new_preview_format = V4L2_PIX_FMT_YUV420; 1584 else if (!strcmp(new_str_preview_format, "yuv422i")) 1585 new_preview_format = V4L2_PIX_FMT_YUYV; 1586 else if (!strcmp(new_str_preview_format, "yuv422p")) 1587 new_preview_format = V4L2_PIX_FMT_YUV422P; 1588 else 1589 new_preview_format = V4L2_PIX_FMT_NV21; //for 3rd party 1590 1591 if (mSecCamera->setPreviewSize(new_preview_width, new_preview_height, new_preview_format) < 0) { 1592 LOGE("ERR(%s):Fail on mSecCamera->setPreviewSize(width(%d), height(%d), format(%d))", 1593 __func__, new_preview_width, new_preview_height, new_preview_format); 1594 ret = UNKNOWN_ERROR; 1595 } else { 1596 mParameters.setPreviewSize(new_preview_width, new_preview_height); 1597 mParameters.setPreviewFormat(new_str_preview_format); 1598 } 1599 #if defined(BOARD_USES_OVERLAY) 1600 if (mUseOverlay == true && mOverlay != 0) { 1601 if (mOverlay->setCrop(0, 0, new_preview_width, new_preview_height) != NO_ERROR) { 1602 LOGE("ERR(%s)::(mOverlay->setCrop(0, 0, %d, %d) fail", 1603 __func__, new_preview_width, new_preview_height); 1604 } 1605 } 1606 #endif 1607 } 1608 1609 int new_picture_width = 0; 1610 int new_picture_height = 0; 1611 1612 params.getPictureSize(&new_picture_width, &new_picture_height); 1613 LOGV("%s : new_picture_width x new_picture_height = %dx%d", __func__, new_picture_width, new_picture_height); 1614 if (0 < new_picture_width && 0 < new_picture_height) { 1615 if (mSecCamera->setSnapshotSize(new_picture_width, new_picture_height) < 0) { 1616 LOGE("ERR(%s):Fail on mSecCamera->setSnapshotSize(width(%d), height(%d))", 1617 __func__, new_picture_width, new_picture_height); 1618 ret = UNKNOWN_ERROR; 1619 } else { 1620 mParameters.setPictureSize(new_picture_width, new_picture_height); 1621 } 1622 } 1623 1624 // picture format 1625 const char *new_str_picture_format = params.getPictureFormat(); 1626 LOGV("%s : new_str_picture_format %s", __func__, new_str_picture_format); 1627 if (new_str_picture_format != NULL) { 1628 int new_picture_format = 0; 1629 1630 if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_RGB565)) 1631 new_picture_format = V4L2_PIX_FMT_RGB565; 1632 else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_YUV420SP)) 1633 new_picture_format = V4L2_PIX_FMT_NV21; 1634 else if (!strcmp(new_str_picture_format, "yuv420sp_custom")) 1635 new_picture_format = V4L2_PIX_FMT_NV12T; 1636 else if (!strcmp(new_str_picture_format, "yuv420p")) 1637 new_picture_format = V4L2_PIX_FMT_YUV420; 1638 else if (!strcmp(new_str_picture_format, "yuv422i")) 1639 new_picture_format = V4L2_PIX_FMT_YUYV; 1640 else if (!strcmp(new_str_picture_format, "uyv422i_custom")) //Zero copy UYVY format 1641 new_picture_format = V4L2_PIX_FMT_UYVY; 1642 else if (!strcmp(new_str_picture_format, "uyv422i")) //Non-zero copy UYVY format 1643 new_picture_format = V4L2_PIX_FMT_UYVY; 1644 else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_JPEG)) 1645 #ifdef JPEG_FROM_SENSOR 1646 new_picture_format = V4L2_PIX_FMT_YUYV; 1647 #endif 1648 else if (!strcmp(new_str_picture_format, "yuv422p")) 1649 new_picture_format = V4L2_PIX_FMT_YUV422P; 1650 else 1651 new_picture_format = V4L2_PIX_FMT_NV21; //for 3rd party 1652 1653 if (mSecCamera->setSnapshotPixelFormat(new_picture_format) < 0) { 1654 LOGE("ERR(%s):Fail on mSecCamera->setSnapshotPixelFormat(format(%d))", __func__, new_picture_format); 1655 ret = UNKNOWN_ERROR; 1656 } else { 1657 mParameters.setPictureFormat(new_str_picture_format); 1658 } 1659 } 1660 1661 #ifdef SWP1_CAMERA_ADD_ADVANCED_FUNCTION 1662 //JPEG image quality 1663 int new_jpeg_quality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); 1664 LOGV("%s : new_jpeg_quality %d", __func__, new_jpeg_quality); 1665 /* we ignore bad values */ 1666 if (new_jpeg_quality >=1 && new_jpeg_quality <= 100) { 1667 if (mSecCamera->setJpegQuality(new_jpeg_quality) < 0) { 1668 LOGE("ERR(%s):Fail on mSecCamera->setJpegQuality(quality(%d))", __func__, new_jpeg_quality); 1669 ret = UNKNOWN_ERROR; 1670 } else { 1671 mParameters.set(CameraParameters::KEY_JPEG_QUALITY, new_jpeg_quality); 1672 } 1673 } 1674 #else 1675 //JPEG image quality 1676 int new_jpeg_quality = params.getInt(CameraParameters::KEY_JPEG_QUALITY); 1677 LOGV("%s : new_jpeg_quality %d", __func__, new_jpeg_quality); 1678 if (new_jpeg_quality < 0) { 1679 LOGW("JPEG-image quality is not specified or is negative, defaulting to 100"); 1680 new_jpeg_quality = 100; 1681 mParameters.set(CameraParameters::KEY_JPEG_QUALITY, "100"); 1682 } 1683 mSecCamera->setJpegQuality(new_jpeg_quality); 1684 #endif 1685 1686 // JPEG thumbnail size 1687 int new_jpeg_thumbnail_width = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 1688 int new_jpeg_thumbnail_height= params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 1689 if (0 <= new_jpeg_thumbnail_width && 0 <= new_jpeg_thumbnail_height) { 1690 if (mSecCamera->setJpegThumbnailSize(new_jpeg_thumbnail_width, new_jpeg_thumbnail_height) < 0) { 1691 LOGE("ERR(%s):Fail on mSecCamera->setJpegThumbnailSize(width(%d), height(%d))", __func__, new_jpeg_thumbnail_width, new_jpeg_thumbnail_height); 1692 ret = UNKNOWN_ERROR; 1693 } else { 1694 mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, new_jpeg_thumbnail_width); 1695 mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, new_jpeg_thumbnail_height); 1696 } 1697 } 1698 1699 // frame rate 1700 int new_frame_rate = params.getPreviewFrameRate(); 1701 /* ignore any fps request, we're determine fps automatically based 1702 * on scene mode. don't return an error because it causes CTS failure. 1703 */ 1704 if (new_frame_rate != mParameters.getPreviewFrameRate()) { 1705 LOGW("WARN(%s): request for preview frame %d not allowed, != %d\n", 1706 __func__, new_frame_rate, mParameters.getPreviewFrameRate()); 1707 } 1708 1709 // rotation 1710 int new_rotation = params.getInt(CameraParameters::KEY_ROTATION); 1711 LOGV("%s : new_rotation %d", __func__, new_rotation); 1712 if (0 <= new_rotation) { 1713 LOGV("%s : set orientation:%d\n", __func__, new_rotation); 1714 if (mSecCamera->setExifOrientationInfo(new_rotation) < 0) { 1715 LOGE("ERR(%s):Fail on mSecCamera->setExifOrientationInfo(%d)", __func__, new_rotation); 1716 ret = UNKNOWN_ERROR; 1717 } else { 1718 mParameters.set(CameraParameters::KEY_ROTATION, new_rotation); 1719 } 1720 } 1721 1722 // brightness 1723 int new_exposure_compensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION); 1724 int max_exposure_compensation = params.getInt(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION); 1725 int min_exposure_compensation = params.getInt(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION); 1726 LOGV("%s : new_exposure_compensation %d", __func__, new_exposure_compensation); 1727 if ((min_exposure_compensation <= new_exposure_compensation) && 1728 (max_exposure_compensation >= new_exposure_compensation)) { 1729 if (mSecCamera->setBrightness(new_exposure_compensation) < 0) { 1730 LOGE("ERR(%s):Fail on mSecCamera->setBrightness(brightness(%d))", __func__, new_exposure_compensation); 1731 ret = UNKNOWN_ERROR; 1732 } else { 1733 mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, new_exposure_compensation); 1734 } 1735 } 1736 1737 // whitebalance 1738 const char *new_white_str = params.get(CameraParameters::KEY_WHITE_BALANCE); 1739 LOGV("%s : new_white_str %s", __func__, new_white_str); 1740 if (new_white_str != NULL) { 1741 int new_white = -1; 1742 1743 if (!strcmp(new_white_str, CameraParameters::WHITE_BALANCE_AUTO)) 1744 new_white = WHITE_BALANCE_AUTO; 1745 else if (!strcmp(new_white_str, 1746 CameraParameters::WHITE_BALANCE_DAYLIGHT)) 1747 new_white = WHITE_BALANCE_SUNNY; 1748 else if (!strcmp(new_white_str, 1749 CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT)) 1750 new_white = WHITE_BALANCE_CLOUDY; 1751 else if (!strcmp(new_white_str, 1752 CameraParameters::WHITE_BALANCE_FLUORESCENT)) 1753 new_white = WHITE_BALANCE_FLUORESCENT; 1754 else if (!strcmp(new_white_str, 1755 CameraParameters::WHITE_BALANCE_INCANDESCENT)) 1756 new_white = WHITE_BALANCE_TUNGSTEN; 1757 else { 1758 LOGE("ERR(%s):Invalid white balance(%s)", __func__, new_white_str); //twilight, shade, warm_flourescent 1759 ret = UNKNOWN_ERROR; 1760 } 1761 1762 if (0 <= new_white) { 1763 if (mSecCamera->setWhiteBalance(new_white) < 0) { 1764 LOGE("ERR(%s):Fail on mSecCamera->setWhiteBalance(white(%d))", __func__, new_white); 1765 ret = UNKNOWN_ERROR; 1766 } else { 1767 mParameters.set(CameraParameters::KEY_WHITE_BALANCE, new_white_str); 1768 } 1769 } 1770 } 1771 1772 // scene mode 1773 const char *new_scene_mode_str = params.get(CameraParameters::KEY_SCENE_MODE); 1774 const char *current_scene_mode_str = mParameters.get(CameraParameters::KEY_SCENE_MODE); 1775 1776 // fps range 1777 int new_min_fps = 0; 1778 int new_max_fps = 0; 1779 int current_min_fps, current_max_fps; 1780 params.getPreviewFpsRange(&new_min_fps, &new_max_fps); 1781 mParameters.getPreviewFpsRange(¤t_min_fps, ¤t_max_fps); 1782 /* our fps range is determined by the sensor, reject any request 1783 * that isn't exactly what we're already at. 1784 * but the check is performed when requesting only changing fps range 1785 */ 1786 if (new_scene_mode_str && current_scene_mode_str) { 1787 if (!strcmp(new_scene_mode_str, current_scene_mode_str)) { 1788 if ((new_min_fps != current_min_fps) || (new_max_fps != current_max_fps)) { 1789 LOGW("%s : requested new_min_fps = %d, new_max_fps = %d not allowed", 1790 __func__, new_min_fps, new_max_fps); 1791 LOGE("%s : current_min_fps = %d, current_max_fps = %d", 1792 __func__, current_min_fps, current_max_fps); 1793 ret = UNKNOWN_ERROR; 1794 } 1795 } 1796 } else { 1797 /* Check basic validation if scene mode is different */ 1798 if ((new_min_fps > new_max_fps) || 1799 (new_min_fps < 0) || (new_max_fps < 0)) 1800 ret = UNKNOWN_ERROR; 1801 } 1802 1803 if (new_scene_mode_str != NULL) { 1804 int new_scene_mode = -1; 1805 1806 const char *new_flash_mode_str = params.get(CameraParameters::KEY_FLASH_MODE); 1807 const char *new_focus_mode_str; 1808 1809 new_focus_mode_str = params.get(CameraParameters::KEY_FOCUS_MODE); 1810 // fps range is (15000,30000) by default. 1811 mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)"); 1812 mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1813 "15000,30000"); 1814 1815 if (!strcmp(new_scene_mode_str, CameraParameters::SCENE_MODE_AUTO)) { 1816 new_scene_mode = SCENE_MODE_NONE; 1817 } else { 1818 // defaults for non-auto scene modes 1819 if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) { 1820 new_focus_mode_str = CameraParameters::FOCUS_MODE_AUTO; 1821 } 1822 new_flash_mode_str = CameraParameters::FLASH_MODE_OFF; 1823 1824 if (!strcmp(new_scene_mode_str, 1825 CameraParameters::SCENE_MODE_PORTRAIT)) { 1826 new_scene_mode = SCENE_MODE_PORTRAIT; 1827 new_flash_mode_str = CameraParameters::FLASH_MODE_AUTO; 1828 } else if (!strcmp(new_scene_mode_str, 1829 CameraParameters::SCENE_MODE_LANDSCAPE)) { 1830 new_scene_mode = SCENE_MODE_LANDSCAPE; 1831 } else if (!strcmp(new_scene_mode_str, 1832 CameraParameters::SCENE_MODE_SPORTS)) { 1833 new_scene_mode = SCENE_MODE_SPORTS; 1834 } else if (!strcmp(new_scene_mode_str, 1835 CameraParameters::SCENE_MODE_PARTY)) { 1836 new_scene_mode = SCENE_MODE_PARTY_INDOOR; 1837 new_flash_mode_str = CameraParameters::FLASH_MODE_AUTO; 1838 } else if ((!strcmp(new_scene_mode_str, 1839 CameraParameters::SCENE_MODE_BEACH)) || 1840 (!strcmp(new_scene_mode_str, 1841 CameraParameters::SCENE_MODE_SNOW))) { 1842 new_scene_mode = SCENE_MODE_BEACH_SNOW; 1843 } else if (!strcmp(new_scene_mode_str, 1844 CameraParameters::SCENE_MODE_SUNSET)) { 1845 new_scene_mode = SCENE_MODE_SUNSET; 1846 } else if (!strcmp(new_scene_mode_str, 1847 CameraParameters::SCENE_MODE_NIGHT)) { 1848 new_scene_mode = SCENE_MODE_NIGHTSHOT; 1849 mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(4000,30000)"); 1850 mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, 1851 "4000,30000"); 1852 } else if (!strcmp(new_scene_mode_str, 1853 CameraParameters::SCENE_MODE_FIREWORKS)) { 1854 new_scene_mode = SCENE_MODE_FIREWORKS; 1855 } else if (!strcmp(new_scene_mode_str, 1856 CameraParameters::SCENE_MODE_CANDLELIGHT)) { 1857 new_scene_mode = SCENE_MODE_CANDLE_LIGHT; 1858 } else { 1859 LOGE("%s::unmatched scene_mode(%s)", 1860 __func__, new_scene_mode_str); //action, night-portrait, theatre, steadyphoto 1861 ret = UNKNOWN_ERROR; 1862 } 1863 } 1864 1865 // focus mode 1866 if (new_focus_mode_str != NULL) { 1867 int new_focus_mode = -1; 1868 1869 if (!strcmp(new_focus_mode_str, 1870 CameraParameters::FOCUS_MODE_AUTO)) { 1871 new_focus_mode = FOCUS_MODE_AUTO; 1872 mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES, 1873 BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR); 1874 } 1875 else if (!strcmp(new_focus_mode_str, 1876 CameraParameters::FOCUS_MODE_MACRO)) { 1877 new_focus_mode = FOCUS_MODE_MACRO; 1878 mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES, 1879 BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR); 1880 } 1881 else if (!strcmp(new_focus_mode_str, 1882 CameraParameters::FOCUS_MODE_INFINITY)) { 1883 new_focus_mode = FOCUS_MODE_INFINITY; 1884 mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES, 1885 BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR); 1886 } 1887 else { 1888 LOGE("%s::unmatched focus_mode(%s)", __func__, new_focus_mode_str); 1889 ret = UNKNOWN_ERROR; 1890 } 1891 1892 if (0 <= new_focus_mode) { 1893 if (mSecCamera->setFocusMode(new_focus_mode) < 0) { 1894 LOGE("%s::mSecCamera->setFocusMode(%d) fail", __func__, new_focus_mode); 1895 ret = UNKNOWN_ERROR; 1896 } else { 1897 mParameters.set(CameraParameters::KEY_FOCUS_MODE, new_focus_mode_str); 1898 } 1899 } 1900 } 1901 1902 // flash.. 1903 if (new_flash_mode_str != NULL) { 1904 int new_flash_mode = -1; 1905 1906 if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_OFF)) 1907 new_flash_mode = FLASH_MODE_OFF; 1908 else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_AUTO)) 1909 new_flash_mode = FLASH_MODE_AUTO; 1910 else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_ON)) 1911 new_flash_mode = FLASH_MODE_ON; 1912 else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_TORCH)) 1913 new_flash_mode = FLASH_MODE_TORCH; 1914 else { 1915 LOGE("%s::unmatched flash_mode(%s)", __func__, new_flash_mode_str); //red-eye 1916 ret = UNKNOWN_ERROR; 1917 } 1918 if (0 <= new_flash_mode) { 1919 if (mSecCamera->setFlashMode(new_flash_mode) < 0) { 1920 LOGE("%s::mSecCamera->setFlashMode(%d) fail", __func__, new_flash_mode); 1921 ret = UNKNOWN_ERROR; 1922 } else { 1923 mParameters.set(CameraParameters::KEY_FLASH_MODE, new_flash_mode_str); 1924 } 1925 } 1926 } 1927 1928 // scene.. 1929 if (0 <= new_scene_mode) { 1930 if (mSecCamera->setSceneMode(new_scene_mode) < 0) { 1931 LOGE("%s::mSecCamera->setSceneMode(%d) fail", __func__, new_scene_mode); 1932 ret = UNKNOWN_ERROR; 1933 } else { 1934 mParameters.set(CameraParameters::KEY_SCENE_MODE, new_scene_mode_str); 1935 } 1936 } 1937 } 1938 1939 // --------------------------------------------------------------------------- 1940 1941 // image effect 1942 const char *new_image_effect_str = params.get(CameraParameters::KEY_EFFECT); 1943 if (new_image_effect_str != NULL) { 1944 1945 int new_image_effect = -1; 1946 1947 if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_NONE)) 1948 new_image_effect = IMAGE_EFFECT_NONE; 1949 else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_MONO)) 1950 new_image_effect = IMAGE_EFFECT_BNW; 1951 else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_SEPIA)) 1952 new_image_effect = IMAGE_EFFECT_SEPIA; 1953 else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_AQUA)) 1954 new_image_effect = IMAGE_EFFECT_AQUA; 1955 else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_NEGATIVE)) 1956 new_image_effect = IMAGE_EFFECT_NEGATIVE; 1957 else { 1958 //posterize, whiteboard, blackboard, solarize 1959 LOGE("ERR(%s):Invalid effect(%s)", __func__, new_image_effect_str); 1960 ret = UNKNOWN_ERROR; 1961 } 1962 1963 if (new_image_effect >= 0) { 1964 if (mSecCamera->setImageEffect(new_image_effect) < 0) { 1965 LOGE("ERR(%s):Fail on mSecCamera->setImageEffect(effect(%d))", __func__, new_image_effect); 1966 ret = UNKNOWN_ERROR; 1967 } else { 1968 const char *old_image_effect_str = mParameters.get(CameraParameters::KEY_EFFECT); 1969 1970 if (old_image_effect_str) { 1971 if (strcmp(old_image_effect_str, new_image_effect_str)) { 1972 setSkipFrame(EFFECT_SKIP_FRAME); 1973 } 1974 } 1975 1976 mParameters.set(CameraParameters::KEY_EFFECT, new_image_effect_str); 1977 } 1978 } 1979 } 1980 1981 //vt mode 1982 int new_vtmode = mInternalParameters.getInt("vtmode"); 1983 if (0 <= new_vtmode) { 1984 if (mSecCamera->setVTmode(new_vtmode) < 0) { 1985 LOGE("ERR(%s):Fail on mSecCamera->setVTMode(%d)", __func__, new_vtmode); 1986 ret = UNKNOWN_ERROR; 1987 } 1988 } 1989 1990 //contrast 1991 int new_contrast = mInternalParameters.getInt("contrast"); 1992 1993 if (0 <= new_contrast) { 1994 if (mSecCamera->setContrast(new_contrast) < 0) { 1995 LOGE("ERR(%s):Fail on mSecCamera->setContrast(%d)", __func__, new_contrast); 1996 ret = UNKNOWN_ERROR; 1997 } 1998 } 1999 2000 //WDR 2001 int new_wdr = mInternalParameters.getInt("wdr"); 2002 2003 if (0 <= new_wdr) { 2004 if (mSecCamera->setWDR(new_wdr) < 0) { 2005 LOGE("ERR(%s):Fail on mSecCamera->setWDR(%d)", __func__, new_wdr); 2006 ret = UNKNOWN_ERROR; 2007 } 2008 } 2009 2010 //anti shake 2011 int new_anti_shake = mInternalParameters.getInt("anti-shake"); 2012 2013 if (0 <= new_anti_shake) { 2014 if (mSecCamera->setAntiShake(new_anti_shake) < 0) { 2015 LOGE("ERR(%s):Fail on mSecCamera->setWDR(%d)", __func__, new_anti_shake); 2016 ret = UNKNOWN_ERROR; 2017 } 2018 } 2019 2020 // gps latitude 2021 const char *new_gps_latitude_str = params.get(CameraParameters::KEY_GPS_LATITUDE); 2022 if (mSecCamera->setGPSLatitude(new_gps_latitude_str) < 0) { 2023 LOGE("%s::mSecCamera->setGPSLatitude(%s) fail", __func__, new_gps_latitude_str); 2024 ret = UNKNOWN_ERROR; 2025 } else { 2026 if (new_gps_latitude_str) { 2027 mParameters.set(CameraParameters::KEY_GPS_LATITUDE, new_gps_latitude_str); 2028 } else { 2029 mParameters.remove(CameraParameters::KEY_GPS_LATITUDE); 2030 } 2031 } 2032 2033 // gps longitude 2034 const char *new_gps_longitude_str = params.get(CameraParameters::KEY_GPS_LONGITUDE); 2035 2036 if (mSecCamera->setGPSLongitude(new_gps_longitude_str) < 0) { 2037 LOGE("%s::mSecCamera->setGPSLongitude(%s) fail", __func__, new_gps_longitude_str); 2038 ret = UNKNOWN_ERROR; 2039 } else { 2040 if (new_gps_longitude_str) { 2041 mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, new_gps_longitude_str); 2042 } else { 2043 mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE); 2044 } 2045 } 2046 2047 // gps altitude 2048 const char *new_gps_altitude_str = params.get(CameraParameters::KEY_GPS_ALTITUDE); 2049 2050 if (mSecCamera->setGPSAltitude(new_gps_altitude_str) < 0) { 2051 LOGE("%s::mSecCamera->setGPSAltitude(%s) fail", __func__, new_gps_altitude_str); 2052 ret = UNKNOWN_ERROR; 2053 } else { 2054 if (new_gps_altitude_str) { 2055 mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, new_gps_altitude_str); 2056 } else { 2057 mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE); 2058 } 2059 } 2060 2061 // gps timestamp 2062 const char *new_gps_timestamp_str = params.get(CameraParameters::KEY_GPS_TIMESTAMP); 2063 2064 if (mSecCamera->setGPSTimeStamp(new_gps_timestamp_str) < 0) { 2065 LOGE("%s::mSecCamera->setGPSTimeStamp(%s) fail", __func__, new_gps_timestamp_str); 2066 ret = UNKNOWN_ERROR; 2067 } else { 2068 if (new_gps_timestamp_str) { 2069 mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, new_gps_timestamp_str); 2070 } else { 2071 mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP); 2072 } 2073 } 2074 2075 // gps processing method 2076 const char *new_gps_processing_method_str = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD); 2077 2078 if (mSecCamera->setGPSProcessingMethod(new_gps_processing_method_str) < 0) { 2079 LOGE("%s::mSecCamera->setGPSProcessingMethod(%s) fail", __func__, new_gps_processing_method_str); 2080 ret = UNKNOWN_ERROR; 2081 } else { 2082 if (new_gps_processing_method_str) { 2083 mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, new_gps_processing_method_str); 2084 } else { 2085 mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD); 2086 } 2087 } 2088 2089 // Recording size 2090 int new_recording_width = mInternalParameters.getInt("recording-size-width"); 2091 int new_recording_height= mInternalParameters.getInt("recording-size-height"); 2092 2093 if (0 < new_recording_width && 0 < new_recording_height) { 2094 if (mSecCamera->setRecordingSize(new_recording_width, new_recording_height) < 0) { 2095 LOGE("ERR(%s):Fail on mSecCamera->setRecordingSize(width(%d), height(%d))", __func__, new_recording_width, new_recording_height); 2096 ret = UNKNOWN_ERROR; 2097 } 2098 } else { 2099 if (mSecCamera->setRecordingSize(new_preview_width, new_preview_height) < 0) { 2100 LOGE("ERR(%s):Fail on mSecCamera->setRecordingSize(width(%d), height(%d))", __func__, new_preview_width, new_preview_height); 2101 ret = UNKNOWN_ERROR; 2102 } 2103 } 2104 2105 //gamma 2106 const char *new_gamma_str = mInternalParameters.get("video_recording_gamma"); 2107 2108 if (new_gamma_str != NULL) { 2109 int new_gamma = -1; 2110 if (!strcmp(new_gamma_str, "off")) 2111 new_gamma = GAMMA_OFF; 2112 else if (!strcmp(new_gamma_str, "on")) 2113 new_gamma = GAMMA_ON; 2114 else { 2115 LOGE("%s::unmatched gamma(%s)", __func__, new_gamma_str); 2116 ret = UNKNOWN_ERROR; 2117 } 2118 2119 if (0 <= new_gamma) { 2120 if (mSecCamera->setGamma(new_gamma) < 0) { 2121 LOGE("%s::mSecCamera->setGamma(%d) fail", __func__, new_gamma); 2122 ret = UNKNOWN_ERROR; 2123 } 2124 } 2125 } 2126 2127 //slow ae 2128 const char *new_slow_ae_str = mInternalParameters.get("slow_ae"); 2129 2130 if (new_slow_ae_str != NULL) { 2131 int new_slow_ae = -1; 2132 2133 if (!strcmp(new_slow_ae_str, "off")) 2134 new_slow_ae = SLOW_AE_OFF; 2135 else if (!strcmp(new_slow_ae_str, "on")) 2136 new_slow_ae = SLOW_AE_ON; 2137 else { 2138 LOGE("%s::unmatched slow_ae(%s)", __func__, new_slow_ae_str); 2139 ret = UNKNOWN_ERROR; 2140 } 2141 2142 if (0 <= new_slow_ae) { 2143 if (mSecCamera->setSlowAE(new_slow_ae) < 0) { 2144 LOGE("%s::mSecCamera->setSlowAE(%d) fail", __func__, new_slow_ae); 2145 ret = UNKNOWN_ERROR; 2146 } 2147 } 2148 } 2149 2150 /*Camcorder fix fps*/ 2151 int new_sensor_mode = mInternalParameters.getInt("cam_mode"); 2152 2153 if (0 <= new_sensor_mode) { 2154 if (mSecCamera->setSensorMode(new_sensor_mode) < 0) { 2155 LOGE("ERR(%s):Fail on mSecCamera->setSensorMode(%d)", __func__, new_sensor_mode); 2156 ret = UNKNOWN_ERROR; 2157 } 2158 } else { 2159 new_sensor_mode=0; 2160 } 2161 2162 /*Shot mode*/ 2163 int new_shot_mode = mInternalParameters.getInt("shot_mode"); 2164 2165 if (0 <= new_shot_mode) { 2166 if (mSecCamera->setShotMode(new_shot_mode) < 0) { 2167 LOGE("ERR(%s):Fail on mSecCamera->setShotMode(%d)", __func__, new_shot_mode); 2168 ret = UNKNOWN_ERROR; 2169 } 2170 } else { 2171 new_shot_mode=0; 2172 } 2173 2174 //blur for Video call 2175 int new_blur_level = mInternalParameters.getInt("blur"); 2176 2177 if (0 <= new_blur_level) { 2178 if (mSecCamera->setBlur(new_blur_level) < 0) { 2179 LOGE("ERR(%s):Fail on mSecCamera->setBlur(%d)", __func__, new_blur_level); 2180 ret = UNKNOWN_ERROR; 2181 } 2182 } 2183 2184 2185 // chk_dataline 2186 int new_dataline = mInternalParameters.getInt("chk_dataline"); 2187 2188 if (0 <= new_dataline) { 2189 if (mSecCamera->setDataLineCheck(new_dataline) < 0) { 2190 LOGE("ERR(%s):Fail on mSecCamera->setDataLineCheck(%d)", __func__, new_dataline); 2191 ret = UNKNOWN_ERROR; 2192 } 2193 } 2194 LOGV("%s return ret = %d", __func__, ret); 2195 2196 return ret; 2197 } 2198 2199 CameraParameters CameraHardwareSec::getParameters() const 2200 { 2201 LOGV("%s :", __func__); 2202 return mParameters; 2203 } 2204 2205 status_t CameraHardwareSec::sendCommand(int32_t command, int32_t arg1, int32_t arg2) 2206 { 2207 return BAD_VALUE; 2208 } 2209 2210 void CameraHardwareSec::release() 2211 { 2212 LOGV("%s :", __func__); 2213 2214 /* shut down any threads we have that might be running. do it here 2215 * instead of the destructor. we're guaranteed to be on another thread 2216 * than the ones below. if we used the destructor, since the threads 2217 * have a reference to this object, we could wind up trying to wait 2218 * for ourself to exit, which is a deadlock. 2219 */ 2220 if (mPreviewThread != NULL) { 2221 mPreviewThread->requestExitAndWait(); 2222 mPreviewThread.clear(); 2223 } 2224 if (mAutoFocusThread != NULL) { 2225 /* this thread is normally already in it's threadLoop but blocked 2226 * on the condition variable. signal it so it wakes up and can exit. 2227 */ 2228 mAutoFocusThread->requestExit(); 2229 mExitAutoFocusThread = true; 2230 mCondition.signal(); 2231 mAutoFocusThread->requestExitAndWait(); 2232 mAutoFocusThread.clear(); 2233 } 2234 if (mPictureThread != NULL) { 2235 mPictureThread->requestExitAndWait(); 2236 mPictureThread.clear(); 2237 } 2238 if (mRawHeap != NULL) 2239 mRawHeap.clear(); 2240 2241 if (mJpegHeap != NULL) 2242 mJpegHeap.clear(); 2243 2244 if (mPreviewHeap != NULL) 2245 mPreviewHeap.clear(); 2246 2247 if (mRecordHeap != NULL) 2248 mRecordHeap.clear(); 2249 2250 #if defined(BOARD_USES_OVERLAY) 2251 if (mUseOverlay) { 2252 mOverlay->destroy(); 2253 mUseOverlay = false; 2254 mOverlay = NULL; 2255 } 2256 #endif 2257 2258 /* close after all the heaps are cleared since those 2259 * could have dup'd our file descriptor. 2260 */ 2261 mSecCamera->DeinitCamera(); 2262 mSecCamera = NULL; 2263 2264 } 2265 2266 wp<CameraHardwareInterface> CameraHardwareSec::singleton; 2267 2268 sp<CameraHardwareInterface> CameraHardwareSec::createInstance(int cameraId) 2269 { 2270 LOGV("%s :", __func__); 2271 if (singleton != 0) { 2272 sp<CameraHardwareInterface> hardware = singleton.promote(); 2273 if (hardware != 0) { 2274 return hardware; 2275 } 2276 } 2277 sp<CameraHardwareInterface> hardware(new CameraHardwareSec(cameraId)); 2278 singleton = hardware; 2279 return hardware; 2280 } 2281 2282 static CameraInfo sCameraInfo[] = { 2283 { 2284 CAMERA_FACING_BACK, 2285 90, /* orientation */ 2286 }, 2287 { 2288 CAMERA_FACING_FRONT, 2289 270, /* orientation */ 2290 } 2291 }; 2292 2293 extern "C" int HAL_getNumberOfCameras() 2294 { 2295 return sizeof(sCameraInfo) / sizeof(sCameraInfo[0]); 2296 } 2297 2298 extern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo *cameraInfo) 2299 { 2300 memcpy(cameraInfo, &sCameraInfo[cameraId], sizeof(CameraInfo)); 2301 } 2302 2303 extern "C" sp<CameraHardwareInterface> HAL_openCameraHardware(int cameraId) 2304 { 2305 return CameraHardwareSec::createInstance(cameraId); 2306 } 2307 2308 }; // namespace android 2309