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