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