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