Camera2Client.cpp revision b075252349a4b40ddda791f2e1221ae0ce7e4cd1
1/* 2 * Copyright (C) 2012 The Android Open Source Project 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#define LOG_TAG "Camera2Client" 18#define ATRACE_TAG ATRACE_TAG_CAMERA 19//#define LOG_NDEBUG 0 20 21#include <utils/Log.h> 22#include <utils/Trace.h> 23 24#include <cutils/properties.h> 25#include <gui/SurfaceTextureClient.h> 26#include <gui/Surface.h> 27#include <media/hardware/MetadataBufferType.h> 28#include "camera2/Parameters.h" 29#include "Camera2Client.h" 30 31#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); 32#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); 33 34namespace android { 35using namespace camera2; 36 37static int getCallingPid() { 38 return IPCThreadState::self()->getCallingPid(); 39} 40 41static int getCallingUid() { 42 return IPCThreadState::self()->getCallingUid(); 43} 44 45// Interface used by CameraService 46 47Camera2Client::Camera2Client(const sp<CameraService>& cameraService, 48 const sp<ICameraClient>& cameraClient, 49 int cameraId, 50 int cameraFacing, 51 int clientPid): 52 Client(cameraService, cameraClient, 53 cameraId, cameraFacing, clientPid), 54 mSharedCameraClient(cameraClient), 55 mParameters(cameraId, cameraFacing), 56 mPreviewStreamId(NO_STREAM), 57 mRecordingStreamId(NO_STREAM), 58 mRecordingHeapCount(kDefaultRecordingHeapCount) 59{ 60 ATRACE_CALL(); 61 ALOGI("Camera %d: Opened", cameraId); 62 63 mDevice = new Camera2Device(cameraId); 64 65 SharedParameters::Lock l(mParameters); 66 l.mParameters.state = Parameters::DISCONNECTED; 67} 68 69status_t Camera2Client::checkPid(const char* checkLocation) const { 70 int callingPid = getCallingPid(); 71 if (callingPid == mClientPid) return NO_ERROR; 72 73 ALOGE("%s: attempt to use a locked camera from a different process" 74 " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid); 75 return PERMISSION_DENIED; 76} 77 78status_t Camera2Client::initialize(camera_module_t *module) 79{ 80 ATRACE_CALL(); 81 ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId); 82 status_t res; 83 84 res = mDevice->initialize(module); 85 if (res != OK) { 86 ALOGE("%s: Camera %d: unable to initialize device: %s (%d)", 87 __FUNCTION__, mCameraId, strerror(-res), res); 88 return NO_INIT; 89 } 90 91 res = mDevice->setNotifyCallback(this); 92 93 SharedParameters::Lock l(mParameters); 94 95 res = l.mParameters.initialize(&(mDevice->info())); 96 if (res != OK) { 97 ALOGE("%s: Camera %d: unable to build defaults: %s (%d)", 98 __FUNCTION__, mCameraId, strerror(-res), res); 99 return NO_INIT; 100 } 101 102 String8 threadName; 103 104 mFrameProcessor = new FrameProcessor(this); 105 threadName = String8::format("Camera2Client[%d]::FrameProcessor", 106 mCameraId); 107 mFrameProcessor->run(threadName.string()); 108 109 mCaptureSequencer = new CaptureSequencer(this); 110 threadName = String8::format("Camera2Client[%d]::CaptureSequencer", 111 mCameraId); 112 mCaptureSequencer->run(threadName.string()); 113 114 mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); 115 threadName = String8::format("Camera2Client[%d]::JpegProcessor", 116 mCameraId); 117 mJpegProcessor->run(threadName.string()); 118 119 mZslProcessor = new ZslProcessor(this, mCaptureSequencer); 120 threadName = String8::format("Camera2Client[%d]::ZslProcessor", 121 mCameraId); 122 mZslProcessor->run(threadName.string()); 123 124 mCallbackProcessor = new CallbackProcessor(this); 125 threadName = String8::format("Camera2Client[%d]::CallbackProcessor", 126 mCameraId); 127 mCallbackProcessor->run(threadName.string()); 128 129 if (gLogLevel >= 1) { 130 ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__, 131 mCameraId); 132 ALOGD("%s", l.mParameters.paramsFlattened.string()); 133 } 134 135 return OK; 136} 137 138Camera2Client::~Camera2Client() { 139 ATRACE_CALL(); 140 ALOGV("Camera %d: Shutting down", mCameraId); 141 142 mDestructionStarted = true; 143 144 // Rewrite mClientPid to allow shutdown by CameraService 145 mClientPid = getCallingPid(); 146 disconnect(); 147 148 mFrameProcessor->requestExit(); 149 mCaptureSequencer->requestExit(); 150 mJpegProcessor->requestExit(); 151 mZslProcessor->requestExit(); 152 mCallbackProcessor->requestExit(); 153 154 ALOGI("Camera %d: Closed", mCameraId); 155} 156 157status_t Camera2Client::dump(int fd, const Vector<String16>& args) { 158 String8 result; 159 result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", 160 mCameraId, 161 getCameraClient()->asBinder().get(), 162 mClientPid); 163 result.append(" State: "); 164#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break; 165 166 const Parameters& p = mParameters.unsafeAccess(); 167 168 result.append(Parameters::getStateName(p.state)); 169 170 result.append("\n Current parameters:\n"); 171 result.appendFormat(" Preview size: %d x %d\n", 172 p.previewWidth, p.previewHeight); 173 result.appendFormat(" Preview FPS range: %d - %d\n", 174 p.previewFpsRange[0], p.previewFpsRange[1]); 175 result.appendFormat(" Preview HAL pixel format: 0x%x\n", 176 p.previewFormat); 177 result.appendFormat(" Preview transform: %x\n", 178 p.previewTransform); 179 result.appendFormat(" Picture size: %d x %d\n", 180 p.pictureWidth, p.pictureHeight); 181 result.appendFormat(" Jpeg thumbnail size: %d x %d\n", 182 p.jpegThumbSize[0], p.jpegThumbSize[1]); 183 result.appendFormat(" Jpeg quality: %d, thumbnail quality: %d\n", 184 p.jpegQuality, p.jpegThumbQuality); 185 result.appendFormat(" Jpeg rotation: %d\n", p.jpegRotation); 186 result.appendFormat(" GPS tags %s\n", 187 p.gpsEnabled ? "enabled" : "disabled"); 188 if (p.gpsEnabled) { 189 result.appendFormat(" GPS lat x long x alt: %f x %f x %f\n", 190 p.gpsCoordinates[0], p.gpsCoordinates[1], 191 p.gpsCoordinates[2]); 192 result.appendFormat(" GPS timestamp: %lld\n", 193 p.gpsTimestamp); 194 result.appendFormat(" GPS processing method: %s\n", 195 p.gpsProcessingMethod.string()); 196 } 197 198 result.append(" White balance mode: "); 199 switch (p.wbMode) { 200 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO) 201 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT) 202 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT) 203 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT) 204 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT) 205 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT) 206 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT) 207 CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE) 208 default: result.append("UNKNOWN\n"); 209 } 210 211 result.append(" Effect mode: "); 212 switch (p.effectMode) { 213 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF) 214 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO) 215 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE) 216 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE) 217 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA) 218 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE) 219 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD) 220 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD) 221 CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA) 222 default: result.append("UNKNOWN\n"); 223 } 224 225 result.append(" Antibanding mode: "); 226 switch (p.antibandingMode) { 227 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO) 228 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF) 229 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ) 230 CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ) 231 default: result.append("UNKNOWN\n"); 232 } 233 234 result.append(" Scene mode: "); 235 switch (p.sceneMode) { 236 case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED: 237 result.append("AUTO\n"); break; 238 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) 239 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) 240 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) 241 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT) 242 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT) 243 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE) 244 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH) 245 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW) 246 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET) 247 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO) 248 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS) 249 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS) 250 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY) 251 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT) 252 CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE) 253 default: result.append("UNKNOWN\n"); 254 } 255 256 result.append(" Flash mode: "); 257 switch (p.flashMode) { 258 CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF) 259 CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO) 260 CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON) 261 CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH) 262 CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE) 263 CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID) 264 default: result.append("UNKNOWN\n"); 265 } 266 267 result.append(" Focus mode: "); 268 switch (p.focusMode) { 269 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO) 270 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO) 271 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) 272 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE) 273 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF) 274 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY) 275 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED) 276 CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID) 277 default: result.append("UNKNOWN\n"); 278 } 279 280 result.append(" Focusing areas:\n"); 281 for (size_t i = 0; i < p.focusingAreas.size(); i++) { 282 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 283 p.focusingAreas[i].left, 284 p.focusingAreas[i].top, 285 p.focusingAreas[i].right, 286 p.focusingAreas[i].bottom, 287 p.focusingAreas[i].weight); 288 } 289 290 result.appendFormat(" Exposure compensation index: %d\n", 291 p.exposureCompensation); 292 293 result.appendFormat(" AE lock %s, AWB lock %s\n", 294 p.autoExposureLock ? "enabled" : "disabled", 295 p.autoWhiteBalanceLock ? "enabled" : "disabled" ); 296 297 result.appendFormat(" Metering areas:\n"); 298 for (size_t i = 0; i < p.meteringAreas.size(); i++) { 299 result.appendFormat(" [ (%d, %d, %d, %d), weight %d ]\n", 300 p.meteringAreas[i].left, 301 p.meteringAreas[i].top, 302 p.meteringAreas[i].right, 303 p.meteringAreas[i].bottom, 304 p.meteringAreas[i].weight); 305 } 306 307 result.appendFormat(" Zoom index: %d\n", p.zoom); 308 result.appendFormat(" Video size: %d x %d\n", p.videoWidth, 309 p.videoHeight); 310 311 result.appendFormat(" Recording hint is %s\n", 312 p.recordingHint ? "set" : "not set"); 313 314 result.appendFormat(" Video stabilization is %s\n", 315 p.videoStabilization ? "enabled" : "disabled"); 316 317 result.append(" Current streams:\n"); 318 result.appendFormat(" Preview stream ID: %d\n", 319 getPreviewStreamId()); 320 result.appendFormat(" Capture stream ID: %d\n", 321 getCaptureStreamId()); 322 result.appendFormat(" Recording stream ID: %d\n", 323 getRecordingStreamId()); 324 325 result.append(" Current requests:\n"); 326 if (mPreviewRequest.entryCount() != 0) { 327 result.append(" Preview request:\n"); 328 write(fd, result.string(), result.size()); 329 mPreviewRequest.dump(fd, 2, 6); 330 } else { 331 result.append(" Preview request: undefined\n"); 332 write(fd, result.string(), result.size()); 333 } 334 335 if (mRecordingRequest.entryCount() != 0) { 336 result = " Recording request:\n"; 337 write(fd, result.string(), result.size()); 338 mRecordingRequest.dump(fd, 2, 6); 339 } else { 340 result = " Recording request: undefined\n"; 341 write(fd, result.string(), result.size()); 342 } 343 344 mCaptureSequencer->dump(fd, args); 345 346 mFrameProcessor->dump(fd, args); 347 348 result = " Device dump:\n"; 349 write(fd, result.string(), result.size()); 350 351 status_t res = mDevice->dump(fd, args); 352 if (res != OK) { 353 result = String8::format(" Error dumping device: %s (%d)", 354 strerror(-res), res); 355 write(fd, result.string(), result.size()); 356 } 357 358#undef CASE_APPEND_ENUM 359 return NO_ERROR; 360} 361 362// ICamera interface 363 364void Camera2Client::disconnect() { 365 ATRACE_CALL(); 366 ALOGV("%s: E", __FUNCTION__); 367 Mutex::Autolock icl(mICameraLock); 368 status_t res; 369 if ( (res = checkPid(__FUNCTION__) ) != OK) return; 370 371 if (mDevice == 0) return; 372 373 stopPreviewL(); 374 375 if (mPreviewStreamId != NO_STREAM) { 376 mDevice->deleteStream(mPreviewStreamId); 377 mPreviewStreamId = NO_STREAM; 378 } 379 380 mJpegProcessor->deleteStream(); 381 382 if (mRecordingStreamId != NO_STREAM) { 383 mDevice->deleteStream(mRecordingStreamId); 384 mRecordingStreamId = NO_STREAM; 385 } 386 387 mCallbackProcessor->deleteStream(); 388 389 mZslProcessor->deleteStream(); 390 391 mDevice.clear(); 392 SharedParameters::Lock l(mParameters); 393 l.mParameters.state = Parameters::DISCONNECTED; 394 395 CameraService::Client::disconnect(); 396} 397 398status_t Camera2Client::connect(const sp<ICameraClient>& client) { 399 ATRACE_CALL(); 400 ALOGV("%s: E", __FUNCTION__); 401 Mutex::Autolock icl(mICameraLock); 402 403 if (mClientPid != 0 && getCallingPid() != mClientPid) { 404 ALOGE("%s: Camera %d: Connection attempt from pid %d; " 405 "current locked to pid %d", __FUNCTION__, 406 mCameraId, getCallingPid(), mClientPid); 407 return BAD_VALUE; 408 } 409 410 mClientPid = getCallingPid(); 411 412 mCameraClient = client; 413 mSharedCameraClient = client; 414 415 SharedParameters::Lock l(mParameters); 416 l.mParameters.state = Parameters::STOPPED; 417 418 return OK; 419} 420 421status_t Camera2Client::lock() { 422 ATRACE_CALL(); 423 ALOGV("%s: E", __FUNCTION__); 424 Mutex::Autolock icl(mICameraLock); 425 ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d", 426 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 427 428 if (mClientPid == 0) { 429 mClientPid = getCallingPid(); 430 return OK; 431 } 432 433 if (mClientPid != getCallingPid()) { 434 ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d", 435 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 436 return EBUSY; 437 } 438 439 return OK; 440} 441 442status_t Camera2Client::unlock() { 443 ATRACE_CALL(); 444 ALOGV("%s: E", __FUNCTION__); 445 Mutex::Autolock icl(mICameraLock); 446 ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d", 447 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 448 449 // TODO: Check for uninterruptable conditions 450 451 if (mClientPid == getCallingPid()) { 452 mClientPid = 0; 453 mCameraClient.clear(); 454 mSharedCameraClient.clear(); 455 return OK; 456 } 457 458 ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d", 459 __FUNCTION__, mCameraId, getCallingPid(), mClientPid); 460 return EBUSY; 461} 462 463status_t Camera2Client::setPreviewDisplay( 464 const sp<Surface>& surface) { 465 ATRACE_CALL(); 466 ALOGV("%s: E", __FUNCTION__); 467 Mutex::Autolock icl(mICameraLock); 468 status_t res; 469 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 470 471 sp<IBinder> binder; 472 sp<ANativeWindow> window; 473 if (surface != 0) { 474 binder = surface->asBinder(); 475 window = surface; 476 } 477 478 return setPreviewWindowL(binder,window); 479} 480 481status_t Camera2Client::setPreviewTexture( 482 const sp<ISurfaceTexture>& surfaceTexture) { 483 ATRACE_CALL(); 484 ALOGV("%s: E", __FUNCTION__); 485 Mutex::Autolock icl(mICameraLock); 486 status_t res; 487 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 488 489 sp<IBinder> binder; 490 sp<ANativeWindow> window; 491 if (surfaceTexture != 0) { 492 binder = surfaceTexture->asBinder(); 493 window = new SurfaceTextureClient(surfaceTexture); 494 } 495 return setPreviewWindowL(binder, window); 496} 497 498status_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder, 499 sp<ANativeWindow> window) { 500 ATRACE_CALL(); 501 status_t res; 502 503 if (binder == mPreviewSurface) { 504 ALOGV("%s: Camera %d: New window is same as old window", 505 __FUNCTION__, mCameraId); 506 return NO_ERROR; 507 } 508 509 SharedParameters::Lock l(mParameters); 510 switch (l.mParameters.state) { 511 case Parameters::DISCONNECTED: 512 case Parameters::RECORD: 513 case Parameters::STILL_CAPTURE: 514 case Parameters::VIDEO_SNAPSHOT: 515 ALOGE("%s: Camera %d: Cannot set preview display while in state %s", 516 __FUNCTION__, mCameraId, 517 Parameters::getStateName(l.mParameters.state)); 518 return INVALID_OPERATION; 519 case Parameters::STOPPED: 520 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 521 // OK 522 break; 523 case Parameters::PREVIEW: 524 // Already running preview - need to stop and create a new stream 525 // TODO: Optimize this so that we don't wait for old stream to drain 526 // before spinning up new stream 527 mDevice->clearStreamingRequest(); 528 l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 529 break; 530 } 531 532 if (mPreviewStreamId != NO_STREAM) { 533 res = mDevice->waitUntilDrained(); 534 if (res != OK) { 535 ALOGE("%s: Error waiting for preview to drain: %s (%d)", 536 __FUNCTION__, strerror(-res), res); 537 return res; 538 } 539 res = mDevice->deleteStream(mPreviewStreamId); 540 if (res != OK) { 541 ALOGE("%s: Unable to delete old preview stream: %s (%d)", 542 __FUNCTION__, strerror(-res), res); 543 return res; 544 } 545 mPreviewStreamId = NO_STREAM; 546 } 547 548 mPreviewSurface = binder; 549 mPreviewWindow = window; 550 551 if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) { 552 return startPreviewL(l.mParameters, false); 553 } 554 555 return OK; 556} 557 558void Camera2Client::setPreviewCallbackFlag(int flag) { 559 ATRACE_CALL(); 560 ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag); 561 Mutex::Autolock icl(mICameraLock); 562 status_t res; 563 if ( checkPid(__FUNCTION__) != OK) return; 564 565 SharedParameters::Lock l(mParameters); 566 setPreviewCallbackFlagL(l.mParameters, flag); 567} 568 569void Camera2Client::setPreviewCallbackFlagL(Parameters ¶ms, int flag) { 570 status_t res = OK; 571 if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) { 572 ALOGV("%s: setting oneshot", __FUNCTION__); 573 params.previewCallbackOneShot = true; 574 } 575 if (params.previewCallbackFlags != (uint32_t)flag) { 576 params.previewCallbackFlags = flag; 577 switch(params.state) { 578 case Parameters::PREVIEW: 579 res = startPreviewL(params, true); 580 break; 581 case Parameters::RECORD: 582 case Parameters::VIDEO_SNAPSHOT: 583 res = startRecordingL(params, true); 584 break; 585 default: 586 break; 587 } 588 if (res != OK) { 589 ALOGE("%s: Camera %d: Unable to refresh request in state %s", 590 __FUNCTION__, mCameraId, 591 Parameters::getStateName(params.state)); 592 } 593 } 594 595} 596 597status_t Camera2Client::startPreview() { 598 ATRACE_CALL(); 599 ALOGV("%s: E", __FUNCTION__); 600 Mutex::Autolock icl(mICameraLock); 601 status_t res; 602 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 603 SharedParameters::Lock l(mParameters); 604 return startPreviewL(l.mParameters, false); 605} 606 607status_t Camera2Client::startPreviewL(Parameters ¶ms, bool restart) { 608 ATRACE_CALL(); 609 status_t res; 610 if (params.state >= Parameters::PREVIEW && !restart) { 611 ALOGE("%s: Can't start preview in state %s", 612 __FUNCTION__, 613 Parameters::getStateName(params.state)); 614 return INVALID_OPERATION; 615 } 616 617 if (mPreviewWindow == 0) { 618 params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW; 619 return OK; 620 } 621 params.state = Parameters::STOPPED; 622 623 res = updatePreviewStream(params); 624 if (res != OK) { 625 ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)", 626 __FUNCTION__, mCameraId, strerror(-res), res); 627 return res; 628 } 629 bool callbacksEnabled = params.previewCallbackFlags & 630 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 631 if (callbacksEnabled) { 632 res = mCallbackProcessor->updateStream(params); 633 if (res != OK) { 634 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 635 __FUNCTION__, mCameraId, strerror(-res), res); 636 return res; 637 } 638 } 639 if (params.zslMode && !params.recordingHint) { 640 res = mZslProcessor->updateStream(params); 641 if (res != OK) { 642 ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)", 643 __FUNCTION__, mCameraId, strerror(-res), res); 644 return res; 645 } 646 } 647 648 CameraMetadata *request; 649 if (!params.recordingHint) { 650 if (mPreviewRequest.entryCount() == 0) { 651 res = updatePreviewRequest(params); 652 if (res != OK) { 653 ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)", 654 __FUNCTION__, mCameraId, strerror(-res), res); 655 return res; 656 } 657 } 658 request = &mPreviewRequest; 659 } else { 660 // With recording hint set, we're going to be operating under the 661 // assumption that the user will record video. To optimize recording 662 // startup time, create the necessary output streams for recording and 663 // video snapshot now if they don't already exist. 664 if (mRecordingRequest.entryCount() == 0) { 665 res = updateRecordingRequest(params); 666 if (res != OK) { 667 ALOGE("%s: Camera %d: Unable to create recording preview " 668 "request: %s (%d)", 669 __FUNCTION__, mCameraId, strerror(-res), res); 670 return res; 671 } 672 } 673 request = &mRecordingRequest; 674 675 // TODO: Re-enable recording stream creation/update here once issues are 676 // resolved 677 678 res = mJpegProcessor->updateStream(params); 679 if (res != OK) { 680 ALOGE("%s: Camera %d: Can't pre-configure still image " 681 "stream: %s (%d)", 682 __FUNCTION__, mCameraId, strerror(-res), res); 683 return res; 684 } 685 } 686 687 Vector<uint8_t> outputStreams; 688 outputStreams.push(getPreviewStreamId()); 689 690 if (callbacksEnabled) { 691 outputStreams.push(getCallbackStreamId()); 692 } 693 if (params.zslMode && !params.recordingHint) { 694 outputStreams.push(getZslStreamId()); 695 } 696 697 res = request->update( 698 ANDROID_REQUEST_OUTPUT_STREAMS, 699 outputStreams); 700 701 if (res != OK) { 702 ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)", 703 __FUNCTION__, mCameraId, strerror(-res), res); 704 return res; 705 } 706 res = request->sort(); 707 if (res != OK) { 708 ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)", 709 __FUNCTION__, mCameraId, strerror(-res), res); 710 return res; 711 } 712 713 res = mDevice->setStreamingRequest(*request); 714 if (res != OK) { 715 ALOGE("%s: Camera %d: Unable to set preview request to start preview: " 716 "%s (%d)", 717 __FUNCTION__, mCameraId, strerror(-res), res); 718 return res; 719 } 720 params.state = Parameters::PREVIEW; 721 722 return OK; 723} 724 725void Camera2Client::stopPreview() { 726 ATRACE_CALL(); 727 ALOGV("%s: E", __FUNCTION__); 728 Mutex::Autolock icl(mICameraLock); 729 status_t res; 730 if ( (res = checkPid(__FUNCTION__) ) != OK) return; 731 stopPreviewL(); 732} 733 734void Camera2Client::stopPreviewL() { 735 ATRACE_CALL(); 736 Parameters::State state; 737 { 738 SharedParameters::Lock l(mParameters); 739 state = l.mParameters.state; 740 } 741 742 switch (state) { 743 case Parameters::DISCONNECTED: 744 ALOGE("%s: Camera %d: Call before initialized", 745 __FUNCTION__, mCameraId); 746 break; 747 case Parameters::STOPPED: 748 break; 749 case Parameters::STILL_CAPTURE: 750 ALOGE("%s: Camera %d: Cannot stop preview during still capture.", 751 __FUNCTION__, mCameraId); 752 break; 753 case Parameters::RECORD: 754 // no break - identical to preview 755 case Parameters::PREVIEW: 756 mDevice->clearStreamingRequest(); 757 mDevice->waitUntilDrained(); 758 // no break 759 case Parameters::WAITING_FOR_PREVIEW_WINDOW: { 760 SharedParameters::Lock l(mParameters); 761 l.mParameters.state = Parameters::STOPPED; 762 commandStopFaceDetectionL(l.mParameters); 763 break; 764 } 765 default: 766 ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId, 767 state); 768 } 769} 770 771bool Camera2Client::previewEnabled() { 772 ATRACE_CALL(); 773 Mutex::Autolock icl(mICameraLock); 774 status_t res; 775 if ( (res = checkPid(__FUNCTION__) ) != OK) return false; 776 777 SharedParameters::Lock l(mParameters); 778 return l.mParameters.state == Parameters::PREVIEW; 779} 780 781status_t Camera2Client::storeMetaDataInBuffers(bool enabled) { 782 ATRACE_CALL(); 783 Mutex::Autolock icl(mICameraLock); 784 status_t res; 785 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 786 787 SharedParameters::Lock l(mParameters); 788 switch (l.mParameters.state) { 789 case Parameters::RECORD: 790 case Parameters::VIDEO_SNAPSHOT: 791 ALOGE("%s: Camera %d: Can't be called in state %s", 792 __FUNCTION__, mCameraId, 793 Parameters::getStateName(l.mParameters.state)); 794 return INVALID_OPERATION; 795 default: 796 // OK 797 break; 798 } 799 800 l.mParameters.storeMetadataInBuffers = enabled; 801 802 return OK; 803} 804 805status_t Camera2Client::startRecording() { 806 ATRACE_CALL(); 807 ALOGV("%s: E", __FUNCTION__); 808 Mutex::Autolock icl(mICameraLock); 809 status_t res; 810 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 811 SharedParameters::Lock l(mParameters); 812 813 return startRecordingL(l.mParameters, false); 814} 815 816status_t Camera2Client::startRecordingL(Parameters ¶ms, bool restart) { 817 status_t res; 818 switch (params.state) { 819 case Parameters::STOPPED: 820 res = startPreviewL(params, false); 821 if (res != OK) return res; 822 break; 823 case Parameters::PREVIEW: 824 // Ready to go 825 break; 826 case Parameters::RECORD: 827 case Parameters::VIDEO_SNAPSHOT: 828 // OK to call this when recording is already on, just skip unless 829 // we're looking to restart 830 if (!restart) return OK; 831 break; 832 default: 833 ALOGE("%s: Camera %d: Can't start recording in state %s", 834 __FUNCTION__, mCameraId, 835 Parameters::getStateName(params.state)); 836 return INVALID_OPERATION; 837 }; 838 839 if (!params.storeMetadataInBuffers) { 840 ALOGE("%s: Camera %d: Recording only supported in metadata mode, but " 841 "non-metadata recording mode requested!", __FUNCTION__, 842 mCameraId); 843 return INVALID_OPERATION; 844 } 845 846 mCameraService->playSound(CameraService::SOUND_RECORDING); 847 848 res = updateRecordingStream(params); 849 if (res != OK) { 850 ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)", 851 __FUNCTION__, mCameraId, strerror(-res), res); 852 return res; 853 } 854 bool callbacksEnabled = params.previewCallbackFlags & 855 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK; 856 if (callbacksEnabled) { 857 res = mCallbackProcessor->updateStream(params); 858 if (res != OK) { 859 ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)", 860 __FUNCTION__, mCameraId, strerror(-res), res); 861 return res; 862 } 863 } 864 865 if (mRecordingRequest.entryCount() == 0) { 866 res = updateRecordingRequest(params); 867 if (res != OK) { 868 ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)", 869 __FUNCTION__, mCameraId, strerror(-res), res); 870 return res; 871 } 872 } 873 874 if (callbacksEnabled) { 875 uint8_t outputStreams[3] ={ 876 getPreviewStreamId(), 877 getRecordingStreamId(), 878 getCallbackStreamId() 879 }; 880 res = mRecordingRequest.update( 881 ANDROID_REQUEST_OUTPUT_STREAMS, 882 outputStreams, 3); 883 } else { 884 uint8_t outputStreams[2] = { 885 getPreviewStreamId(), 886 getRecordingStreamId() 887 }; 888 res = mRecordingRequest.update( 889 ANDROID_REQUEST_OUTPUT_STREAMS, 890 outputStreams, 2); 891 } 892 if (res != OK) { 893 ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)", 894 __FUNCTION__, mCameraId, strerror(-res), res); 895 return res; 896 } 897 res = mRecordingRequest.sort(); 898 if (res != OK) { 899 ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)", 900 __FUNCTION__, mCameraId, strerror(-res), res); 901 return res; 902 } 903 904 res = mDevice->setStreamingRequest(mRecordingRequest); 905 if (res != OK) { 906 ALOGE("%s: Camera %d: Unable to set recording request to start " 907 "recording: %s (%d)", __FUNCTION__, mCameraId, 908 strerror(-res), res); 909 return res; 910 } 911 if (params.state < Parameters::RECORD) { 912 params.state = Parameters::RECORD; 913 } 914 915 return OK; 916} 917 918void Camera2Client::stopRecording() { 919 ATRACE_CALL(); 920 ALOGV("%s: E", __FUNCTION__); 921 Mutex::Autolock icl(mICameraLock); 922 SharedParameters::Lock l(mParameters); 923 924 status_t res; 925 if ( (res = checkPid(__FUNCTION__) ) != OK) return; 926 927 switch (l.mParameters.state) { 928 case Parameters::RECORD: 929 // OK to stop 930 break; 931 case Parameters::STOPPED: 932 case Parameters::PREVIEW: 933 case Parameters::STILL_CAPTURE: 934 case Parameters::VIDEO_SNAPSHOT: 935 default: 936 ALOGE("%s: Camera %d: Can't stop recording in state %s", 937 __FUNCTION__, mCameraId, 938 Parameters::getStateName(l.mParameters.state)); 939 return; 940 }; 941 942 mCameraService->playSound(CameraService::SOUND_RECORDING); 943 944 res = startPreviewL(l.mParameters, true); 945 if (res != OK) { 946 ALOGE("%s: Camera %d: Unable to return to preview", 947 __FUNCTION__, mCameraId); 948 } 949} 950 951bool Camera2Client::recordingEnabled() { 952 ATRACE_CALL(); 953 Mutex::Autolock icl(mICameraLock); 954 955 if ( checkPid(__FUNCTION__) != OK) return false; 956 957 return recordingEnabledL(); 958} 959 960bool Camera2Client::recordingEnabledL() { 961 ATRACE_CALL(); 962 SharedParameters::Lock l(mParameters); 963 964 return (l.mParameters.state == Parameters::RECORD 965 || l.mParameters.state == Parameters::VIDEO_SNAPSHOT); 966} 967 968void Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) { 969 ATRACE_CALL(); 970 Mutex::Autolock icl(mICameraLock); 971 status_t res; 972 if ( checkPid(__FUNCTION__) != OK) return; 973 974 SharedParameters::Lock l(mParameters); 975 976 // Make sure this is for the current heap 977 ssize_t offset; 978 size_t size; 979 sp<IMemoryHeap> heap = mem->getMemory(&offset, &size); 980 if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) { 981 ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release " 982 "(got %x, expected %x)", __FUNCTION__, mCameraId, 983 heap->getHeapID(), mRecordingHeap->mHeap->getHeapID()); 984 return; 985 } 986 uint8_t *data = (uint8_t*)heap->getBase() + offset; 987 uint32_t type = *(uint32_t*)data; 988 if (type != kMetadataBufferTypeGrallocSource) { 989 ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)", 990 __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource); 991 return; 992 } 993 994 // Release the buffer back to the recording queue 995 996 buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4); 997 998 size_t itemIndex; 999 for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) { 1000 const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex]; 1001 if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT && 1002 item.mGraphicBuffer->handle == imgHandle) { 1003 break; 1004 } 1005 } 1006 if (itemIndex == mRecordingBuffers.size()) { 1007 ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of " 1008 "outstanding buffers", __FUNCTION__, mCameraId, imgHandle); 1009 return; 1010 } 1011 1012 ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId, 1013 imgHandle); 1014 1015 res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]); 1016 if (res != OK) { 1017 ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):" 1018 "%s (%d)", 1019 __FUNCTION__, mCameraId, imgHandle, strerror(-res), res); 1020 return; 1021 } 1022 mRecordingBuffers.replaceAt(itemIndex); 1023 1024 mRecordingHeapFree++; 1025} 1026 1027status_t Camera2Client::autoFocus() { 1028 ATRACE_CALL(); 1029 Mutex::Autolock icl(mICameraLock); 1030 status_t res; 1031 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1032 1033 int triggerId; 1034 { 1035 SharedParameters::Lock l(mParameters); 1036 l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter; 1037 triggerId = l.mParameters.currentAfTriggerId; 1038 } 1039 1040 mDevice->triggerAutofocus(triggerId); 1041 1042 return OK; 1043} 1044 1045status_t Camera2Client::cancelAutoFocus() { 1046 ATRACE_CALL(); 1047 Mutex::Autolock icl(mICameraLock); 1048 status_t res; 1049 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1050 1051 int triggerId; 1052 { 1053 SharedParameters::Lock l(mParameters); 1054 triggerId = ++l.mParameters.afTriggerCounter; 1055 } 1056 1057 mDevice->triggerCancelAutofocus(triggerId); 1058 1059 return OK; 1060} 1061 1062status_t Camera2Client::takePicture(int msgType) { 1063 ATRACE_CALL(); 1064 Mutex::Autolock icl(mICameraLock); 1065 status_t res; 1066 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1067 1068 SharedParameters::Lock l(mParameters); 1069 switch (l.mParameters.state) { 1070 case Parameters::DISCONNECTED: 1071 case Parameters::STOPPED: 1072 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1073 ALOGE("%s: Camera %d: Cannot take picture without preview enabled", 1074 __FUNCTION__, mCameraId); 1075 return INVALID_OPERATION; 1076 case Parameters::PREVIEW: 1077 // Good to go for takePicture 1078 res = commandStopFaceDetectionL(l.mParameters); 1079 if (res != OK) { 1080 ALOGE("%s: Camera %d: Unable to stop face detection for still capture", 1081 __FUNCTION__, mCameraId); 1082 return res; 1083 } 1084 l.mParameters.state = Parameters::STILL_CAPTURE; 1085 break; 1086 case Parameters::RECORD: 1087 // Good to go for video snapshot 1088 l.mParameters.state = Parameters::VIDEO_SNAPSHOT; 1089 break; 1090 case Parameters::STILL_CAPTURE: 1091 case Parameters::VIDEO_SNAPSHOT: 1092 ALOGE("%s: Camera %d: Already taking a picture", 1093 __FUNCTION__, mCameraId); 1094 return INVALID_OPERATION; 1095 } 1096 1097 ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId); 1098 1099 res = mJpegProcessor->updateStream(l.mParameters); 1100 if (res != OK) { 1101 ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)", 1102 __FUNCTION__, mCameraId, strerror(-res), res); 1103 return res; 1104 } 1105 1106 res = mCaptureSequencer->startCapture(); 1107 if (res != OK) { 1108 ALOGE("%s: Camera %d: Unable to start capture: %s (%d)", 1109 __FUNCTION__, mCameraId, strerror(-res), res); 1110 } 1111 1112 return res; 1113} 1114 1115status_t Camera2Client::setParameters(const String8& params) { 1116 ATRACE_CALL(); 1117 ALOGV("%s: E", __FUNCTION__); 1118 Mutex::Autolock icl(mICameraLock); 1119 status_t res; 1120 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1121 1122 SharedParameters::Lock l(mParameters); 1123 1124 res = l.mParameters.set(params); 1125 if (res != OK) return res; 1126 1127 res = updateRequests(l.mParameters); 1128 1129 return res; 1130} 1131 1132String8 Camera2Client::getParameters() const { 1133 ATRACE_CALL(); 1134 Mutex::Autolock icl(mICameraLock); 1135 if ( checkPid(__FUNCTION__) != OK) return String8(); 1136 1137 SharedParameters::ReadLock l(mParameters); 1138 1139 // TODO: Deal with focus distances 1140 return l.mParameters.paramsFlattened; 1141} 1142 1143status_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) { 1144 ATRACE_CALL(); 1145 Mutex::Autolock icl(mICameraLock); 1146 status_t res; 1147 if ( (res = checkPid(__FUNCTION__) ) != OK) return res; 1148 1149 ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId, 1150 cmd, arg1, arg2); 1151 1152 switch (cmd) { 1153 case CAMERA_CMD_START_SMOOTH_ZOOM: 1154 return commandStartSmoothZoomL(); 1155 case CAMERA_CMD_STOP_SMOOTH_ZOOM: 1156 return commandStopSmoothZoomL(); 1157 case CAMERA_CMD_SET_DISPLAY_ORIENTATION: 1158 return commandSetDisplayOrientationL(arg1); 1159 case CAMERA_CMD_ENABLE_SHUTTER_SOUND: 1160 return commandEnableShutterSoundL(arg1 == 1); 1161 case CAMERA_CMD_PLAY_RECORDING_SOUND: 1162 return commandPlayRecordingSoundL(); 1163 case CAMERA_CMD_START_FACE_DETECTION: 1164 return commandStartFaceDetectionL(arg1); 1165 case CAMERA_CMD_STOP_FACE_DETECTION: { 1166 SharedParameters::Lock l(mParameters); 1167 return commandStopFaceDetectionL(l.mParameters); 1168 } 1169 case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 1170 return commandEnableFocusMoveMsgL(arg1 == 1); 1171 case CAMERA_CMD_PING: 1172 return commandPingL(); 1173 case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT: 1174 return commandSetVideoBufferCountL(arg1); 1175 default: 1176 ALOGE("%s: Unknown command %d (arguments %d, %d)", 1177 __FUNCTION__, cmd, arg1, arg2); 1178 return BAD_VALUE; 1179 } 1180} 1181 1182status_t Camera2Client::commandStartSmoothZoomL() { 1183 ALOGE("%s: Unimplemented!", __FUNCTION__); 1184 return OK; 1185} 1186 1187status_t Camera2Client::commandStopSmoothZoomL() { 1188 ALOGE("%s: Unimplemented!", __FUNCTION__); 1189 return OK; 1190} 1191 1192status_t Camera2Client::commandSetDisplayOrientationL(int degrees) { 1193 int transform = Parameters::degToTransform(degrees, 1194 mCameraFacing == CAMERA_FACING_FRONT); 1195 if (transform == -1) { 1196 ALOGE("%s: Camera %d: Error setting %d as display orientation value", 1197 __FUNCTION__, mCameraId, degrees); 1198 return BAD_VALUE; 1199 } 1200 SharedParameters::Lock l(mParameters); 1201 if (transform != l.mParameters.previewTransform && 1202 mPreviewStreamId != NO_STREAM) { 1203 mDevice->setStreamTransform(mPreviewStreamId, transform); 1204 } 1205 l.mParameters.previewTransform = transform; 1206 return OK; 1207} 1208 1209status_t Camera2Client::commandEnableShutterSoundL(bool enable) { 1210 SharedParameters::Lock l(mParameters); 1211 if (enable) { 1212 l.mParameters.playShutterSound = true; 1213 return OK; 1214 } 1215 1216 // Disabling shutter sound may not be allowed. In that case only 1217 // allow the mediaserver process to disable the sound. 1218 char value[PROPERTY_VALUE_MAX]; 1219 property_get("ro.camera.sound.forced", value, "0"); 1220 if (strncmp(value, "0", 2) != 0) { 1221 // Disabling shutter sound is not allowed. Deny if the current 1222 // process is not mediaserver. 1223 if (getCallingPid() != getpid()) { 1224 ALOGE("Failed to disable shutter sound. Permission denied (pid %d)", 1225 getCallingPid()); 1226 return PERMISSION_DENIED; 1227 } 1228 } 1229 1230 l.mParameters.playShutterSound = false; 1231 return OK; 1232} 1233 1234status_t Camera2Client::commandPlayRecordingSoundL() { 1235 mCameraService->playSound(CameraService::SOUND_RECORDING); 1236 return OK; 1237} 1238 1239status_t Camera2Client::commandStartFaceDetectionL(int type) { 1240 ALOGV("%s: Camera %d: Starting face detection", 1241 __FUNCTION__, mCameraId); 1242 status_t res; 1243 SharedParameters::Lock l(mParameters); 1244 switch (l.mParameters.state) { 1245 case Parameters::DISCONNECTED: 1246 case Parameters::STOPPED: 1247 case Parameters::WAITING_FOR_PREVIEW_WINDOW: 1248 case Parameters::STILL_CAPTURE: 1249 ALOGE("%s: Camera %d: Cannot start face detection without preview active", 1250 __FUNCTION__, mCameraId); 1251 return INVALID_OPERATION; 1252 case Parameters::PREVIEW: 1253 case Parameters::RECORD: 1254 case Parameters::VIDEO_SNAPSHOT: 1255 // Good to go for starting face detect 1256 break; 1257 } 1258 // Ignoring type 1259 if (l.mParameters.fastInfo.bestFaceDetectMode == 1260 ANDROID_STATS_FACE_DETECTION_OFF) { 1261 ALOGE("%s: Camera %d: Face detection not supported", 1262 __FUNCTION__, mCameraId); 1263 return INVALID_OPERATION; 1264 } 1265 if (l.mParameters.enableFaceDetect) return OK; 1266 1267 l.mParameters.enableFaceDetect = true; 1268 1269 res = updateRequests(l.mParameters); 1270 1271 return res; 1272} 1273 1274status_t Camera2Client::commandStopFaceDetectionL(Parameters ¶ms) { 1275 status_t res = OK; 1276 ALOGV("%s: Camera %d: Stopping face detection", 1277 __FUNCTION__, mCameraId); 1278 1279 if (!params.enableFaceDetect) return OK; 1280 1281 params.enableFaceDetect = false; 1282 1283 if (params.state == Parameters::PREVIEW 1284 || params.state == Parameters::RECORD 1285 || params.state == Parameters::VIDEO_SNAPSHOT) { 1286 res = updateRequests(params); 1287 } 1288 1289 return res; 1290} 1291 1292status_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) { 1293 SharedParameters::Lock l(mParameters); 1294 l.mParameters.enableFocusMoveMessages = enable; 1295 1296 return OK; 1297} 1298 1299status_t Camera2Client::commandPingL() { 1300 // Always ping back if access is proper and device is alive 1301 SharedParameters::Lock l(mParameters); 1302 if (l.mParameters.state != Parameters::DISCONNECTED) { 1303 return OK; 1304 } else { 1305 return NO_INIT; 1306 } 1307} 1308 1309status_t Camera2Client::commandSetVideoBufferCountL(size_t count) { 1310 if (recordingEnabledL()) { 1311 ALOGE("%s: Camera %d: Error setting video buffer count after " 1312 "recording was started", __FUNCTION__, mCameraId); 1313 return INVALID_OPERATION; 1314 } 1315 1316 // 32 is the current upper limit on the video buffer count for BufferQueue 1317 if (count > 32) { 1318 ALOGE("%s: Camera %d: Error setting %d as video buffer count value", 1319 __FUNCTION__, mCameraId, count); 1320 return BAD_VALUE; 1321 } 1322 1323 // Need to reallocate memory for heap 1324 if (mRecordingHeapCount != count) { 1325 if (mRecordingHeap != 0) { 1326 mRecordingHeap.clear(); 1327 mRecordingHeap = NULL; 1328 } 1329 mRecordingHeapCount = count; 1330 } 1331 1332 return OK; 1333} 1334 1335/** Device-related methods */ 1336 1337void Camera2Client::notifyError(int errorCode, int arg1, int arg2) { 1338 ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2); 1339} 1340 1341void Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) { 1342 ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__, 1343 frameNumber, timestamp); 1344} 1345 1346void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { 1347 ALOGV("%s: Autofocus state now %d, last trigger %d", 1348 __FUNCTION__, newState, triggerId); 1349 bool sendCompletedMessage = false; 1350 bool sendMovingMessage = false; 1351 1352 bool success = false; 1353 bool afInMotion = false; 1354 { 1355 SharedParameters::Lock l(mParameters); 1356 switch (l.mParameters.focusMode) { 1357 case Parameters::FOCUS_MODE_AUTO: 1358 case Parameters::FOCUS_MODE_MACRO: 1359 // Don't send notifications upstream if they're not for the current AF 1360 // trigger. For example, if cancel was called in between, or if we 1361 // already sent a notification about this AF call. 1362 if (triggerId != l.mParameters.currentAfTriggerId) break; 1363 switch (newState) { 1364 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1365 success = true; 1366 // no break 1367 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1368 sendCompletedMessage = true; 1369 l.mParameters.currentAfTriggerId = -1; 1370 break; 1371 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1372 // Just starting focusing, ignore 1373 break; 1374 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1375 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1376 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1377 default: 1378 // Unexpected in AUTO/MACRO mode 1379 ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d", 1380 __FUNCTION__, newState); 1381 break; 1382 } 1383 break; 1384 case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO: 1385 case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE: 1386 switch (newState) { 1387 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1388 success = true; 1389 // no break 1390 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1391 // Don't send notifications upstream if they're not for 1392 // the current AF trigger. For example, if cancel was 1393 // called in between, or if we already sent a 1394 // notification about this AF call. 1395 // Send both a 'AF done' callback and a 'AF move' callback 1396 if (triggerId != l.mParameters.currentAfTriggerId) break; 1397 sendCompletedMessage = true; 1398 afInMotion = false; 1399 if (l.mParameters.enableFocusMoveMessages && 1400 l.mParameters.afInMotion) { 1401 sendMovingMessage = true; 1402 } 1403 l.mParameters.currentAfTriggerId = -1; 1404 break; 1405 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1406 // Cancel was called, or we switched state; care if 1407 // currently moving 1408 afInMotion = false; 1409 if (l.mParameters.enableFocusMoveMessages && 1410 l.mParameters.afInMotion) { 1411 sendMovingMessage = true; 1412 } 1413 break; 1414 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1415 // Start passive scan, inform upstream 1416 afInMotion = true; 1417 // no break 1418 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1419 // Stop passive scan, inform upstream 1420 if (l.mParameters.enableFocusMoveMessages) { 1421 sendMovingMessage = true; 1422 } 1423 break; 1424 } 1425 l.mParameters.afInMotion = afInMotion; 1426 break; 1427 case Parameters::FOCUS_MODE_EDOF: 1428 case Parameters::FOCUS_MODE_INFINITY: 1429 case Parameters::FOCUS_MODE_FIXED: 1430 default: 1431 if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) { 1432 ALOGE("%s: Unexpected AF state change %d " 1433 "(ID %d) in focus mode %d", 1434 __FUNCTION__, newState, triggerId, 1435 l.mParameters.focusMode); 1436 } 1437 } 1438 } 1439 if (sendMovingMessage) { 1440 SharedCameraClient::Lock l(mSharedCameraClient); 1441 if (l.mCameraClient != 0) { 1442 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE, 1443 afInMotion ? 1 : 0, 0); 1444 } 1445 } 1446 if (sendCompletedMessage) { 1447 SharedCameraClient::Lock l(mSharedCameraClient); 1448 if (l.mCameraClient != 0) { 1449 l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, 1450 success ? 1 : 0, 0); 1451 } 1452 } 1453} 1454 1455void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { 1456 ALOGV("%s: Autoexposure state now %d, last trigger %d", 1457 __FUNCTION__, newState, triggerId); 1458 mCaptureSequencer->notifyAutoExposure(newState, triggerId); 1459} 1460 1461void Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) { 1462 ALOGV("%s: Auto-whitebalance state now %d, last trigger %d", 1463 __FUNCTION__, newState, triggerId); 1464} 1465 1466int Camera2Client::getCameraId() const { 1467 return mCameraId; 1468} 1469 1470const sp<Camera2Device>& Camera2Client::getCameraDevice() { 1471 return mDevice; 1472} 1473 1474const sp<CameraService>& Camera2Client::getCameraService() { 1475 return mCameraService; 1476} 1477 1478camera2::SharedParameters& Camera2Client::getParameters() { 1479 return mParameters; 1480} 1481 1482int Camera2Client::getPreviewStreamId() const { 1483 return mPreviewStreamId; 1484} 1485 1486int Camera2Client::getCaptureStreamId() const { 1487 return mJpegProcessor->getStreamId(); 1488} 1489 1490int Camera2Client::getCallbackStreamId() const { 1491 return mCallbackProcessor->getStreamId(); 1492} 1493 1494int Camera2Client::getRecordingStreamId() const { 1495 return mRecordingStreamId; 1496} 1497 1498int Camera2Client::getZslStreamId() const { 1499 return mZslProcessor->getStreamId(); 1500} 1501 1502status_t Camera2Client::registerFrameListener(int32_t id, 1503 wp<camera2::FrameProcessor::FilteredListener> listener) { 1504 return mFrameProcessor->registerListener(id, listener); 1505} 1506 1507status_t Camera2Client::removeFrameListener(int32_t id) { 1508 return mFrameProcessor->removeListener(id); 1509} 1510 1511Camera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client): 1512 mCameraClient(client.mCameraClient), 1513 mSharedClient(client) { 1514 mSharedClient.mCameraClientLock.lock(); 1515} 1516 1517Camera2Client::SharedCameraClient::Lock::~Lock() { 1518 mSharedClient.mCameraClientLock.unlock(); 1519} 1520 1521Camera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client): 1522 mCameraClient(client) { 1523} 1524 1525Camera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=( 1526 const sp<ICameraClient>&client) { 1527 Mutex::Autolock l(mCameraClientLock); 1528 mCameraClient = client; 1529 return *this; 1530} 1531 1532void Camera2Client::SharedCameraClient::clear() { 1533 Mutex::Autolock l(mCameraClientLock); 1534 mCameraClient.clear(); 1535} 1536 1537const int32_t Camera2Client::kPreviewRequestId; 1538const int32_t Camera2Client::kRecordRequestId; 1539const int32_t Camera2Client::kFirstCaptureRequestId; 1540 1541void Camera2Client::onRecordingFrameAvailable() { 1542 ATRACE_CALL(); 1543 status_t res; 1544 sp<Camera2Heap> recordingHeap; 1545 size_t heapIdx = 0; 1546 nsecs_t timestamp; 1547 { 1548 SharedParameters::Lock l(mParameters); 1549 1550 BufferItemConsumer::BufferItem imgBuffer; 1551 res = mRecordingConsumer->acquireBuffer(&imgBuffer); 1552 if (res != OK) { 1553 ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)", 1554 __FUNCTION__, mCameraId, strerror(-res), res); 1555 return; 1556 } 1557 timestamp = imgBuffer.mTimestamp; 1558 1559 mRecordingFrameCount++; 1560 ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount); 1561 1562 // TODO: Signal errors here upstream 1563 if (l.mParameters.state != Parameters::RECORD && 1564 l.mParameters.state != Parameters::VIDEO_SNAPSHOT) { 1565 ALOGV("%s: Camera %d: Discarding recording image buffers received after " 1566 "recording done", 1567 __FUNCTION__, mCameraId); 1568 mRecordingConsumer->releaseBuffer(imgBuffer); 1569 return; 1570 } 1571 1572 if (mRecordingHeap == 0) { 1573 const size_t bufferSize = 4 + sizeof(buffer_handle_t); 1574 ALOGV("%s: Camera %d: Creating recording heap with %d buffers of " 1575 "size %d bytes", __FUNCTION__, mCameraId, 1576 mRecordingHeapCount, bufferSize); 1577 1578 mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount, 1579 "Camera2Client::RecordingHeap"); 1580 if (mRecordingHeap->mHeap->getSize() == 0) { 1581 ALOGE("%s: Camera %d: Unable to allocate memory for recording", 1582 __FUNCTION__, mCameraId); 1583 mRecordingConsumer->releaseBuffer(imgBuffer); 1584 return; 1585 } 1586 for (size_t i = 0; i < mRecordingBuffers.size(); i++) { 1587 if (mRecordingBuffers[i].mBuf != 1588 BufferItemConsumer::INVALID_BUFFER_SLOT) { 1589 ALOGE("%s: Camera %d: Non-empty recording buffers list!", 1590 __FUNCTION__, mCameraId); 1591 } 1592 } 1593 mRecordingBuffers.clear(); 1594 mRecordingBuffers.setCapacity(mRecordingHeapCount); 1595 mRecordingBuffers.insertAt(0, mRecordingHeapCount); 1596 1597 mRecordingHeapHead = 0; 1598 mRecordingHeapFree = mRecordingHeapCount; 1599 } 1600 1601 if ( mRecordingHeapFree == 0) { 1602 ALOGE("%s: Camera %d: No free recording buffers, dropping frame", 1603 __FUNCTION__, mCameraId); 1604 mRecordingConsumer->releaseBuffer(imgBuffer); 1605 return; 1606 } 1607 1608 heapIdx = mRecordingHeapHead; 1609 mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount; 1610 mRecordingHeapFree--; 1611 1612 ALOGV("%s: Camera %d: Timestamp %lld", 1613 __FUNCTION__, mCameraId, timestamp); 1614 1615 ssize_t offset; 1616 size_t size; 1617 sp<IMemoryHeap> heap = 1618 mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset, 1619 &size); 1620 1621 uint8_t *data = (uint8_t*)heap->getBase() + offset; 1622 uint32_t type = kMetadataBufferTypeGrallocSource; 1623 *((uint32_t*)data) = type; 1624 *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle; 1625 ALOGV("%s: Camera %d: Sending out buffer_handle_t %p", 1626 __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle); 1627 mRecordingBuffers.replaceAt(imgBuffer, heapIdx); 1628 recordingHeap = mRecordingHeap; 1629 } 1630 1631 // Call outside locked parameters to allow re-entrancy from notification 1632 SharedCameraClient::Lock l(mSharedCameraClient); 1633 if (l.mCameraClient != 0) { 1634 l.mCameraClient->dataCallbackTimestamp(timestamp, 1635 CAMERA_MSG_VIDEO_FRAME, 1636 recordingHeap->mBuffers[heapIdx]); 1637 } 1638} 1639 1640/** Utility methods */ 1641 1642status_t Camera2Client::updateRequests(Parameters ¶ms) { 1643 status_t res; 1644 1645 res = updatePreviewRequest(params); 1646 if (res != OK) { 1647 ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)", 1648 __FUNCTION__, mCameraId, strerror(-res), res); 1649 return res; 1650 } 1651 res = updateRecordingRequest(params); 1652 if (res != OK) { 1653 ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)", 1654 __FUNCTION__, mCameraId, strerror(-res), res); 1655 return res; 1656 } 1657 1658 if (params.state == Parameters::PREVIEW) { 1659 res = startPreviewL(params, true); 1660 if (res != OK) { 1661 ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)", 1662 __FUNCTION__, mCameraId, strerror(-res), res); 1663 return res; 1664 } 1665 } else if (params.state == Parameters::RECORD || 1666 params.state == Parameters::VIDEO_SNAPSHOT) { 1667 res = mDevice->setStreamingRequest(mRecordingRequest); 1668 if (res != OK) { 1669 ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)", 1670 __FUNCTION__, mCameraId, strerror(-res), res); 1671 return res; 1672 } 1673 } 1674 return res; 1675} 1676 1677status_t Camera2Client::updatePreviewStream(const Parameters ¶ms) { 1678 ATRACE_CALL(); 1679 status_t res; 1680 1681 if (mPreviewStreamId != NO_STREAM) { 1682 // Check if stream parameters have to change 1683 uint32_t currentWidth, currentHeight; 1684 res = mDevice->getStreamInfo(mPreviewStreamId, 1685 ¤tWidth, ¤tHeight, 0); 1686 if (res != OK) { 1687 ALOGE("%s: Camera %d: Error querying preview stream info: " 1688 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1689 return res; 1690 } 1691 if (currentWidth != (uint32_t)params.previewWidth || 1692 currentHeight != (uint32_t)params.previewHeight) { 1693 ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d", 1694 __FUNCTION__, mCameraId, currentWidth, currentHeight, 1695 params.previewWidth, params.previewHeight); 1696 res = mDevice->waitUntilDrained(); 1697 if (res != OK) { 1698 ALOGE("%s: Camera %d: Error waiting for preview to drain: " 1699 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1700 return res; 1701 } 1702 res = mDevice->deleteStream(mPreviewStreamId); 1703 if (res != OK) { 1704 ALOGE("%s: Camera %d: Unable to delete old output stream " 1705 "for preview: %s (%d)", __FUNCTION__, mCameraId, 1706 strerror(-res), res); 1707 return res; 1708 } 1709 mPreviewStreamId = NO_STREAM; 1710 } 1711 } 1712 1713 if (mPreviewStreamId == NO_STREAM) { 1714 res = mDevice->createStream(mPreviewWindow, 1715 params.previewWidth, params.previewHeight, 1716 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, 1717 &mPreviewStreamId); 1718 if (res != OK) { 1719 ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)", 1720 __FUNCTION__, mCameraId, strerror(-res), res); 1721 return res; 1722 } 1723 } 1724 1725 res = mDevice->setStreamTransform(mPreviewStreamId, 1726 params.previewTransform); 1727 if (res != OK) { 1728 ALOGE("%s: Camera %d: Unable to set preview stream transform: " 1729 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1730 return res; 1731 } 1732 1733 return OK; 1734} 1735 1736status_t Camera2Client::updatePreviewRequest(const Parameters ¶ms) { 1737 ATRACE_CALL(); 1738 status_t res; 1739 if (mPreviewRequest.entryCount() == 0) { 1740 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, 1741 &mPreviewRequest); 1742 if (res != OK) { 1743 ALOGE("%s: Camera %d: Unable to create default preview request: " 1744 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1745 return res; 1746 } 1747 } 1748 1749 res = params.updateRequest(&mPreviewRequest); 1750 if (res != OK) { 1751 ALOGE("%s: Camera %d: Unable to update common entries of preview " 1752 "request: %s (%d)", __FUNCTION__, mCameraId, 1753 strerror(-res), res); 1754 return res; 1755 } 1756 1757 res = mPreviewRequest.update(ANDROID_REQUEST_ID, 1758 &kPreviewRequestId, 1); 1759 1760 return OK; 1761} 1762 1763status_t Camera2Client::updateRecordingRequest(const Parameters ¶ms) { 1764 ATRACE_CALL(); 1765 status_t res; 1766 if (mRecordingRequest.entryCount() == 0) { 1767 res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD, 1768 &mRecordingRequest); 1769 if (res != OK) { 1770 ALOGE("%s: Camera %d: Unable to create default recording request:" 1771 " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1772 return res; 1773 } 1774 } 1775 1776 res = params.updateRequest(&mRecordingRequest); 1777 if (res != OK) { 1778 ALOGE("%s: Camera %d: Unable to update common entries of recording " 1779 "request: %s (%d)", __FUNCTION__, mCameraId, 1780 strerror(-res), res); 1781 return res; 1782 } 1783 1784 return OK; 1785} 1786 1787status_t Camera2Client::updateRecordingStream(const Parameters ¶ms) { 1788 status_t res; 1789 1790 if (mRecordingConsumer == 0) { 1791 // Create CPU buffer queue endpoint. We need one more buffer here so that we can 1792 // always acquire and free a buffer when the heap is full; otherwise the consumer 1793 // will have buffers in flight we'll never clear out. 1794 mRecordingConsumer = new BufferItemConsumer( 1795 GRALLOC_USAGE_HW_VIDEO_ENCODER, 1796 mRecordingHeapCount + 1, 1797 true); 1798 mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this)); 1799 mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer")); 1800 mRecordingWindow = new SurfaceTextureClient( 1801 mRecordingConsumer->getProducerInterface()); 1802 // Allocate memory later, since we don't know buffer size until receipt 1803 } 1804 1805 if (mRecordingStreamId != NO_STREAM) { 1806 // Check if stream parameters have to change 1807 uint32_t currentWidth, currentHeight; 1808 res = mDevice->getStreamInfo(mRecordingStreamId, 1809 ¤tWidth, ¤tHeight, 0); 1810 if (res != OK) { 1811 ALOGE("%s: Camera %d: Error querying recording output stream info: " 1812 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1813 return res; 1814 } 1815 if (currentWidth != (uint32_t)params.videoWidth || 1816 currentHeight != (uint32_t)params.videoHeight) { 1817 // TODO: Should wait to be sure previous recording has finished 1818 res = mDevice->deleteStream(mRecordingStreamId); 1819 if (res != OK) { 1820 ALOGE("%s: Camera %d: Unable to delete old output stream " 1821 "for recording: %s (%d)", __FUNCTION__, mCameraId, 1822 strerror(-res), res); 1823 return res; 1824 } 1825 mRecordingStreamId = NO_STREAM; 1826 } 1827 } 1828 1829 if (mRecordingStreamId == NO_STREAM) { 1830 mRecordingFrameCount = 0; 1831 res = mDevice->createStream(mRecordingWindow, 1832 params.videoWidth, params.videoHeight, 1833 CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId); 1834 if (res != OK) { 1835 ALOGE("%s: Camera %d: Can't create output stream for recording: " 1836 "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res); 1837 return res; 1838 } 1839 } 1840 1841 return OK; 1842} 1843 1844size_t Camera2Client::calculateBufferSize(int width, int height, 1845 int format, int stride) { 1846 switch (format) { 1847 case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16 1848 return width * height * 2; 1849 case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21 1850 return width * height * 3 / 2; 1851 case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2 1852 return width * height * 2; 1853 case HAL_PIXEL_FORMAT_YV12: { // YV12 1854 size_t ySize = stride * height; 1855 size_t uvStride = (stride / 2 + 0xF) & ~0xF; 1856 size_t uvSize = uvStride * height / 2; 1857 return ySize + uvSize * 2; 1858 } 1859 case HAL_PIXEL_FORMAT_RGB_565: 1860 return width * height * 2; 1861 case HAL_PIXEL_FORMAT_RGBA_8888: 1862 return width * height * 4; 1863 case HAL_PIXEL_FORMAT_RAW_SENSOR: 1864 return width * height * 2; 1865 default: 1866 ALOGE("%s: Unknown preview format: %x", 1867 __FUNCTION__, format); 1868 return 0; 1869 } 1870} 1871 1872} // namespace android 1873