Camera3Device.h revision 1fa8999c91d5df81949aa723000058380cd3faa2
1/* 2 * Copyright (C) 2013 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#ifndef ANDROID_SERVERS_CAMERA3DEVICE_H 18#define ANDROID_SERVERS_CAMERA3DEVICE_H 19 20#include <utils/Condition.h> 21#include <utils/Errors.h> 22#include <utils/List.h> 23#include <utils/Mutex.h> 24#include <utils/Thread.h> 25#include <utils/KeyedVector.h> 26#include <hardware/camera3.h> 27#include <camera/CaptureResult.h> 28#include <camera/camera2/ICameraDeviceUser.h> 29 30#include "common/CameraDeviceBase.h" 31#include "device3/StatusTracker.h" 32 33/** 34 * Function pointer types with C calling convention to 35 * use for HAL callback functions. 36 */ 37extern "C" { 38 typedef void (callbacks_process_capture_result_t)( 39 const struct camera3_callback_ops *, 40 const camera3_capture_result_t *); 41 42 typedef void (callbacks_notify_t)( 43 const struct camera3_callback_ops *, 44 const camera3_notify_msg_t *); 45} 46 47namespace android { 48 49namespace camera3 { 50 51class Camera3Stream; 52class Camera3ZslStream; 53class Camera3OutputStreamInterface; 54class Camera3StreamInterface; 55 56} 57 58/** 59 * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher. 60 */ 61class Camera3Device : 62 public CameraDeviceBase, 63 private camera3_callback_ops { 64 public: 65 Camera3Device(int id); 66 67 virtual ~Camera3Device(); 68 69 /** 70 * CameraDeviceBase interface 71 */ 72 73 virtual int getId() const; 74 75 // Transitions to idle state on success. 76 virtual status_t initialize(CameraModule *module); 77 virtual status_t disconnect(); 78 virtual status_t dump(int fd, const Vector<String16> &args); 79 virtual const CameraMetadata& info() const; 80 81 // Capture and setStreamingRequest will configure streams if currently in 82 // idle state 83 virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL); 84 virtual status_t captureList(const List<const CameraMetadata> &requests, 85 int64_t *lastFrameNumber = NULL); 86 virtual status_t setStreamingRequest(const CameraMetadata &request, 87 int64_t *lastFrameNumber = NULL); 88 virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests, 89 int64_t *lastFrameNumber = NULL); 90 virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL); 91 92 virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 93 94 // Actual stream creation/deletion is delayed until first request is submitted 95 // If adding streams while actively capturing, will pause device before adding 96 // stream, reconfiguring device, and unpausing. 97 virtual status_t createStream(sp<ANativeWindow> consumer, 98 uint32_t width, uint32_t height, int format, 99 android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id); 100 virtual status_t createInputStream( 101 uint32_t width, uint32_t height, int format, 102 int *id); 103 virtual status_t createZslStream( 104 uint32_t width, uint32_t height, 105 int depth, 106 /*out*/ 107 int *id, 108 sp<camera3::Camera3ZslStream>* zslStream); 109 virtual status_t createReprocessStreamFromStream(int outputId, int *id); 110 111 virtual status_t getStreamInfo(int id, 112 uint32_t *width, uint32_t *height, uint32_t *format); 113 virtual status_t setStreamTransform(int id, int transform); 114 115 virtual status_t deleteStream(int id); 116 virtual status_t deleteReprocessStream(int id); 117 118 virtual status_t configureStreams(bool isConstraiedHighSpeed = false); 119 virtual status_t getInputBufferProducer( 120 sp<IGraphicBufferProducer> *producer); 121 122 virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 123 124 // Transitions to the idle state on success 125 virtual status_t waitUntilDrained(); 126 127 virtual status_t setNotifyCallback(NotificationListener *listener); 128 virtual bool willNotify3A(); 129 virtual status_t waitForNextFrame(nsecs_t timeout); 130 virtual status_t getNextResult(CaptureResult *frame); 131 132 virtual status_t triggerAutofocus(uint32_t id); 133 virtual status_t triggerCancelAutofocus(uint32_t id); 134 virtual status_t triggerPrecaptureMetering(uint32_t id); 135 136 virtual status_t pushReprocessBuffer(int reprocessStreamId, 137 buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 138 139 virtual status_t flush(int64_t *lastFrameNumber = NULL); 140 141 virtual status_t prepare(int streamId); 142 143 virtual uint32_t getDeviceVersion(); 144 145 virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; 146 147 // Methods called by subclasses 148 void notifyStatus(bool idle); // updates from StatusTracker 149 150 private: 151 static const size_t kDumpLockAttempts = 10; 152 static const size_t kDumpSleepDuration = 100000; // 0.10 sec 153 static const size_t kInFlightWarnLimit = 20; 154 static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 155 static const nsecs_t kActiveTimeout = 500000000; // 500 ms 156 struct RequestTrigger; 157 // minimal jpeg buffer size: 256KB + blob header 158 static const ssize_t kMinJpegBufferSize = 256 * 1024 + sizeof(camera3_jpeg_blob); 159 // Constant to use for stream ID when one doesn't exist 160 static const int NO_STREAM = -1; 161 162 // A lock to enforce serialization on the input/configure side 163 // of the public interface. 164 // Only locked by public methods inherited from CameraDeviceBase. 165 // Not locked by methods guarded by mOutputLock, since they may act 166 // concurrently to the input/configure side of the interface. 167 // Must be locked before mLock if both will be locked by a method 168 Mutex mInterfaceLock; 169 170 // The main lock on internal state 171 Mutex mLock; 172 173 // Camera device ID 174 const int mId; 175 176 // Flag indicating is the current active stream configuration is constrained high speed. 177 bool mIsConstrainedHighSpeedConfiguration; 178 179 /**** Scope for mLock ****/ 180 181 camera3_device_t *mHal3Device; 182 183 CameraMetadata mDeviceInfo; 184 185 CameraMetadata mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT]; 186 187 uint32_t mDeviceVersion; 188 189 struct Size { 190 uint32_t width; 191 uint32_t height; 192 Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){} 193 }; 194 // Map from format to size. 195 Vector<Size> mSupportedOpaqueInputSizes; 196 197 enum Status { 198 STATUS_ERROR, 199 STATUS_UNINITIALIZED, 200 STATUS_UNCONFIGURED, 201 STATUS_CONFIGURED, 202 STATUS_ACTIVE 203 } mStatus; 204 Vector<Status> mRecentStatusUpdates; 205 Condition mStatusChanged; 206 207 // Tracking cause of fatal errors when in STATUS_ERROR 208 String8 mErrorCause; 209 210 // Mapping of stream IDs to stream instances 211 typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 212 StreamSet; 213 214 StreamSet mOutputStreams; 215 sp<camera3::Camera3Stream> mInputStream; 216 int mNextStreamId; 217 bool mNeedConfig; 218 219 int mDummyStreamId; 220 221 // Whether to send state updates upstream 222 // Pause when doing transparent reconfiguration 223 bool mPauseStateNotify; 224 225 // Need to hold on to stream references until configure completes. 226 Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 227 228 // Whether the HAL will send partial result 229 bool mUsePartialResult; 230 231 // Number of partial results that will be delivered by the HAL. 232 uint32_t mNumPartialResults; 233 234 /**** End scope for mLock ****/ 235 236 class CaptureRequest : public LightRefBase<CaptureRequest> { 237 public: 238 CameraMetadata mSettings; 239 sp<camera3::Camera3Stream> mInputStream; 240 camera3_stream_buffer_t mInputBuffer; 241 Vector<sp<camera3::Camera3OutputStreamInterface> > 242 mOutputStreams; 243 CaptureResultExtras mResultExtras; 244 }; 245 typedef List<sp<CaptureRequest> > RequestList; 246 247 status_t checkStatusOkToCaptureLocked(); 248 249 status_t convertMetadataListToRequestListLocked( 250 const List<const CameraMetadata> &metadataList, 251 /*out*/ 252 RequestList *requestList); 253 254 status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating, 255 int64_t *lastFrameNumber = NULL); 256 257 /** 258 * Get the last request submitted to the hal by the request thread. 259 * 260 * Takes mLock. 261 */ 262 virtual CameraMetadata getLatestRequestLocked(); 263 264 /** 265 * Pause processing and flush everything, but don't tell the clients. 266 * This is for reconfiguring outputs transparently when according to the 267 * CameraDeviceBase interface we shouldn't need to. 268 * Must be called with mLock and mInterfaceLock both held. 269 */ 270 status_t internalPauseAndWaitLocked(); 271 272 /** 273 * Resume work after internalPauseAndWaitLocked() 274 * Must be called with mLock and mInterfaceLock both held. 275 */ 276 status_t internalResumeLocked(); 277 278 /** 279 * Wait until status tracker tells us we've transitioned to the target state 280 * set, which is either ACTIVE when active==true or IDLE (which is any 281 * non-ACTIVE state) when active==false. 282 * 283 * Needs to be called with mLock and mInterfaceLock held. This means there 284 * can ever only be one waiter at most. 285 * 286 * During the wait mLock is released. 287 * 288 */ 289 status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 290 291 /** 292 * Implementation of waitUntilDrained. On success, will transition to IDLE state. 293 * 294 * Need to be called with mLock and mInterfaceLock held. 295 */ 296 status_t waitUntilDrainedLocked(); 297 298 /** 299 * Do common work for setting up a streaming or single capture request. 300 * On success, will transition to ACTIVE if in IDLE. 301 */ 302 sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 303 304 /** 305 * Build a CaptureRequest request from the CameraDeviceBase request 306 * settings. 307 */ 308 sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 309 310 /** 311 * Take the currently-defined set of streams and configure the HAL to use 312 * them. This is a long-running operation (may be several hundered ms). 313 */ 314 status_t configureStreamsLocked(); 315 316 /** 317 * Add a dummy stream to the current stream set as a workaround for 318 * not allowing 0 streams in the camera HAL spec. 319 */ 320 status_t addDummyStreamLocked(); 321 322 /** 323 * Remove a dummy stream if the current config includes real streams. 324 */ 325 status_t tryRemoveDummyStreamLocked(); 326 327 /** 328 * Set device into an error state due to some fatal failure, and set an 329 * error message to indicate why. Only the first call's message will be 330 * used. The message is also sent to the log. 331 */ 332 void setErrorState(const char *fmt, ...); 333 void setErrorStateV(const char *fmt, va_list args); 334 void setErrorStateLocked(const char *fmt, ...); 335 void setErrorStateLockedV(const char *fmt, va_list args); 336 337 /** 338 * Debugging trylock/spin method 339 * Try to acquire a lock a few times with sleeps between before giving up. 340 */ 341 bool tryLockSpinRightRound(Mutex& lock); 342 343 /** 344 * Helper function to determine if an input size for implementation defined 345 * format is supported. 346 */ 347 bool isOpaqueInputSizeSupported(uint32_t width, uint32_t height); 348 349 /** 350 * Helper function to get the largest Jpeg resolution (in area) 351 * Return Size(0, 0) if static metatdata is invalid 352 */ 353 Size getMaxJpegResolution() const; 354 355 struct RequestTrigger { 356 // Metadata tag number, e.g. android.control.aePrecaptureTrigger 357 uint32_t metadataTag; 358 // Metadata value, e.g. 'START' or the trigger ID 359 int32_t entryValue; 360 361 // The last part of the fully qualified path, e.g. afTrigger 362 const char *getTagName() const { 363 return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 364 } 365 366 // e.g. TYPE_BYTE, TYPE_INT32, etc. 367 int getTagType() const { 368 return get_camera_metadata_tag_type(metadataTag); 369 } 370 }; 371 372 /** 373 * Thread for managing capture request submission to HAL device. 374 */ 375 class RequestThread : public Thread { 376 377 public: 378 379 RequestThread(wp<Camera3Device> parent, 380 sp<camera3::StatusTracker> statusTracker, 381 camera3_device_t *hal3Device); 382 383 void setNotificationListener(NotificationListener *listener); 384 385 /** 386 * Call after stream (re)-configuration is completed. 387 */ 388 void configurationComplete(); 389 390 /** 391 * Set or clear the list of repeating requests. Does not block 392 * on either. Use waitUntilPaused to wait until request queue 393 * has emptied out. 394 */ 395 status_t setRepeatingRequests(const RequestList& requests, 396 /*out*/ 397 int64_t *lastFrameNumber = NULL); 398 status_t clearRepeatingRequests(/*out*/ 399 int64_t *lastFrameNumber = NULL); 400 401 status_t queueRequestList(List<sp<CaptureRequest> > &requests, 402 /*out*/ 403 int64_t *lastFrameNumber = NULL); 404 405 /** 406 * Remove all queued and repeating requests, and pending triggers 407 */ 408 status_t clear(NotificationListener *listener, 409 /*out*/ 410 int64_t *lastFrameNumber = NULL); 411 412 /** 413 * Queue a trigger to be dispatched with the next outgoing 414 * process_capture_request. The settings for that request only 415 * will be temporarily rewritten to add the trigger tag/value. 416 * Subsequent requests will not be rewritten (for this tag). 417 */ 418 status_t queueTrigger(RequestTrigger trigger[], size_t count); 419 420 /** 421 * Pause/unpause the capture thread. Doesn't block, so use 422 * waitUntilPaused to wait until the thread is paused. 423 */ 424 void setPaused(bool paused); 425 426 /** 427 * Wait until thread processes the capture request with settings' 428 * android.request.id == requestId. 429 * 430 * Returns TIMED_OUT in case the thread does not process the request 431 * within the timeout. 432 */ 433 status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 434 435 /** 436 * Shut down the thread. Shutdown is asynchronous, so thread may 437 * still be running once this method returns. 438 */ 439 virtual void requestExit(); 440 441 /** 442 * Get the latest request that was sent to the HAL 443 * with process_capture_request. 444 */ 445 CameraMetadata getLatestRequest() const; 446 447 /** 448 * Returns true if the stream is a target of any queued or repeating 449 * capture request 450 */ 451 bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream); 452 453 protected: 454 455 virtual bool threadLoop(); 456 457 private: 458 static int getId(const wp<Camera3Device> &device); 459 460 status_t queueTriggerLocked(RequestTrigger trigger); 461 // Mix-in queued triggers into this request 462 int32_t insertTriggers(const sp<CaptureRequest> &request); 463 // Purge the queued triggers from this request, 464 // restoring the old field values for those tags. 465 status_t removeTriggers(const sp<CaptureRequest> &request); 466 467 // HAL workaround: Make sure a trigger ID always exists if 468 // a trigger does 469 status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 470 471 static const nsecs_t kRequestTimeout = 50e6; // 50 ms 472 473 // Waits for a request, or returns NULL if times out. 474 sp<CaptureRequest> waitForNextRequest(); 475 476 // Return buffers, etc, for a request that couldn't be fully 477 // constructed. The buffers will be returned in the ERROR state 478 // to mark them as not having valid data. 479 // All arguments will be modified. 480 void cleanUpFailedRequest(camera3_capture_request_t &request, 481 sp<CaptureRequest> &nextRequest, 482 Vector<camera3_stream_buffer_t> &outputBuffers); 483 484 // Pause handling 485 bool waitIfPaused(); 486 void unpauseForNewRequests(); 487 488 // Relay error to parent device object setErrorState 489 void setErrorState(const char *fmt, ...); 490 491 // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold 492 bool isRepeatingRequestLocked(const sp<CaptureRequest>); 493 494 wp<Camera3Device> mParent; 495 wp<camera3::StatusTracker> mStatusTracker; 496 camera3_device_t *mHal3Device; 497 498 NotificationListener *mListener; 499 500 const int mId; // The camera ID 501 int mStatusId; // The RequestThread's component ID for 502 // status tracking 503 504 Mutex mRequestLock; 505 Condition mRequestSignal; 506 RequestList mRequestQueue; 507 RequestList mRepeatingRequests; 508 // The next request being prepped for submission to the HAL, no longer 509 // on the request queue. Read-only even with mRequestLock held, outside 510 // of threadLoop 511 sp<const CaptureRequest> mNextRequest; 512 513 bool mReconfigured; 514 515 // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 516 Mutex mPauseLock; 517 bool mDoPause; 518 Condition mDoPauseSignal; 519 bool mPaused; 520 Condition mPausedSignal; 521 522 sp<CaptureRequest> mPrevRequest; 523 int32_t mPrevTriggers; 524 525 uint32_t mFrameNumber; 526 527 mutable Mutex mLatestRequestMutex; 528 Condition mLatestRequestSignal; 529 // android.request.id for latest process_capture_request 530 int32_t mLatestRequestId; 531 CameraMetadata mLatestRequest; 532 533 typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 534 Mutex mTriggerMutex; 535 TriggerMap mTriggerMap; 536 TriggerMap mTriggerRemovedMap; 537 TriggerMap mTriggerReplacedMap; 538 uint32_t mCurrentAfTriggerId; 539 uint32_t mCurrentPreCaptureTriggerId; 540 541 int64_t mRepeatingLastFrameNumber; 542 }; 543 sp<RequestThread> mRequestThread; 544 545 /** 546 * In-flight queue for tracking completion of capture requests. 547 */ 548 549 struct InFlightRequest { 550 // Set by notify() SHUTTER call. 551 nsecs_t shutterTimestamp; 552 // Set by process_capture_result(). 553 nsecs_t sensorTimestamp; 554 int requestStatus; 555 // Set by process_capture_result call with valid metadata 556 bool haveResultMetadata; 557 // Decremented by calls to process_capture_result with valid output 558 // and input buffers 559 int numBuffersLeft; 560 CaptureResultExtras resultExtras; 561 // If this request has any input buffer 562 bool hasInputBuffer; 563 564 565 // The last metadata that framework receives from HAL and 566 // not yet send out because the shutter event hasn't arrived. 567 // It's added by process_capture_result and sent when framework 568 // receives the shutter event. 569 CameraMetadata pendingMetadata; 570 571 // Buffers are added by process_capture_result when output buffers 572 // return from HAL but framework has not yet received the shutter 573 // event. They will be returned to the streams when framework receives 574 // the shutter event. 575 Vector<camera3_stream_buffer_t> pendingOutputBuffers; 576 577 578 // Fields used by the partial result only 579 struct PartialResultInFlight { 580 // Set by process_capture_result once 3A has been sent to clients 581 bool haveSent3A; 582 // Result metadata collected so far, when partial results are in use 583 CameraMetadata collectedResult; 584 585 PartialResultInFlight(): 586 haveSent3A(false) { 587 } 588 } partialResult; 589 590 // Default constructor needed by KeyedVector 591 InFlightRequest() : 592 shutterTimestamp(0), 593 sensorTimestamp(0), 594 requestStatus(OK), 595 haveResultMetadata(false), 596 numBuffersLeft(0), 597 hasInputBuffer(false){ 598 } 599 600 InFlightRequest(int numBuffers) : 601 shutterTimestamp(0), 602 sensorTimestamp(0), 603 requestStatus(OK), 604 haveResultMetadata(false), 605 numBuffersLeft(numBuffers), 606 hasInputBuffer(false){ 607 } 608 609 InFlightRequest(int numBuffers, CaptureResultExtras extras) : 610 shutterTimestamp(0), 611 sensorTimestamp(0), 612 requestStatus(OK), 613 haveResultMetadata(false), 614 numBuffersLeft(numBuffers), 615 resultExtras(extras), 616 hasInputBuffer(false){ 617 } 618 619 InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput) : 620 shutterTimestamp(0), 621 sensorTimestamp(0), 622 requestStatus(OK), 623 haveResultMetadata(false), 624 numBuffersLeft(numBuffers), 625 resultExtras(extras), 626 hasInputBuffer(hasInput){ 627 } 628 }; 629 630 // Map from frame number to the in-flight request state 631 typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 632 633 Mutex mInFlightLock; // Protects mInFlightMap 634 InFlightMap mInFlightMap; 635 636 status_t registerInFlight(uint32_t frameNumber, 637 int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput); 638 639 /** 640 * For the partial result, check if all 3A state fields are available 641 * and if so, queue up 3A-only result to the client. Returns true if 3A 642 * is sent. 643 */ 644 bool processPartial3AResult(uint32_t frameNumber, 645 const CameraMetadata& partial, const CaptureResultExtras& resultExtras); 646 647 // Helpers for reading and writing 3A metadata into to/from partial results 648 template<typename T> 649 bool get3AResult(const CameraMetadata& result, int32_t tag, 650 T* value, uint32_t frameNumber); 651 652 template<typename T> 653 bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value, 654 uint32_t frameNumber); 655 /** 656 * Tracking for idle detection 657 */ 658 sp<camera3::StatusTracker> mStatusTracker; 659 660 /** 661 * Thread for preparing streams 662 */ 663 class PreparerThread : private Thread, public virtual RefBase { 664 public: 665 PreparerThread(); 666 ~PreparerThread(); 667 668 void setNotificationListener(NotificationListener *listener); 669 670 /** 671 * Queue up a stream to be prepared. Streams are processed by 672 * a background thread in FIFO order 673 */ 674 status_t prepare(sp<camera3::Camera3StreamInterface>& stream); 675 676 /** 677 * Cancel all current and pending stream preparation 678 */ 679 status_t clear(); 680 681 private: 682 Mutex mLock; 683 684 virtual bool threadLoop(); 685 686 // Guarded by mLock 687 688 NotificationListener *mListener; 689 List<sp<camera3::Camera3StreamInterface> > mPendingStreams; 690 bool mActive; 691 bool mCancelNow; 692 693 // Only accessed by threadLoop and the destructor 694 695 sp<camera3::Camera3StreamInterface> mCurrentStream; 696 }; 697 sp<PreparerThread> mPreparerThread; 698 699 /** 700 * Output result queue and current HAL device 3A state 701 */ 702 703 // Lock for output side of device 704 Mutex mOutputLock; 705 706 /**** Scope for mOutputLock ****/ 707 // the minimal frame number of the next non-reprocess result 708 uint32_t mNextResultFrameNumber; 709 // the minimal frame number of the next reprocess result 710 uint32_t mNextReprocessResultFrameNumber; 711 uint32_t mNextShutterFrameNumber; 712 List<CaptureResult> mResultQueue; 713 Condition mResultSignal; 714 NotificationListener *mListener; 715 716 /**** End scope for mOutputLock ****/ 717 718 /** 719 * Callback functions from HAL device 720 */ 721 void processCaptureResult(const camera3_capture_result *result); 722 723 void notify(const camera3_notify_msg *msg); 724 725 // Specific notify handlers 726 void notifyError(const camera3_error_msg_t &msg, 727 NotificationListener *listener); 728 void notifyShutter(const camera3_shutter_msg_t &msg, 729 NotificationListener *listener); 730 731 // helper function to return the output buffers to the streams. 732 void returnOutputBuffers(const camera3_stream_buffer_t *outputBuffers, 733 size_t numBuffers, nsecs_t timestamp); 734 735 // Insert the capture result given the pending metadata, result extras, 736 // partial results, and the frame number to the result queue. 737 void sendCaptureResult(CameraMetadata &pendingMetadata, 738 CaptureResultExtras &resultExtras, 739 CameraMetadata &collectedPartialResult, uint32_t frameNumber, 740 bool reprocess); 741 742 /**** Scope for mInFlightLock ****/ 743 744 // Remove the in-flight request of the given index from mInFlightMap 745 // if it's no longer needed. It must only be called with mInFlightLock held. 746 void removeInFlightRequestIfReadyLocked(int idx); 747 748 /**** End scope for mInFlightLock ****/ 749 750 /** 751 * Static callback forwarding methods from HAL to instance 752 */ 753 static callbacks_process_capture_result_t sProcessCaptureResult; 754 755 static callbacks_notify_t sNotify; 756 757}; // class Camera3Device 758 759}; // namespace android 760 761#endif 762