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