Camera3Device.h revision 42368d9308db27a47c9ac706f9b040fa269257a9
17fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/* 27fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 37fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 47fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 57fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * you may not use this file except in compliance with the License. 67fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * You may obtain a copy of the License at 77fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 87fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 97fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * 107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * See the License for the specific language governing permissions and 147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * limitations under the License. 157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 17f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA3DEVICE_H 18f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#define ANDROID_SERVERS_CAMERA3DEVICE_H 197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Condition.h> 217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Errors.h> 227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/List.h> 237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Mutex.h> 247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Thread.h> 257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "CameraDeviceBase.h" 27f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3Stream.h" 28f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3OutputStream.h" 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "hardware/camera3.h" 317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to 347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions. 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" { 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_process_capture_result_t)( 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result_t *); 407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_notify_t)( 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg_t *); 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android { 477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device : 527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public CameraDeviceBase, 537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private camera3_callback_ops { 547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device(int id); 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual ~Camera3Device(); 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 60f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 62f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 6371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin virtual int getId() const; 64f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 65f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to idle state on success. 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t initialize(camera_module_t *module); 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t disconnect(); 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16> &args); 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual const CameraMetadata& info() const; 70f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Capture and setStreamingRequest will configure streams if currently in 72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // idle state 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t capture(CameraMetadata &request); 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamingRequest(const CameraMetadata &request); 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t clearStreamingRequest(); 76f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 81f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // stream, reconfiguring device, and unpausing. 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createStream(sp<ANativeWindow> consumer, 837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, 847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int *id); 857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format); 897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 98f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getNextFrame(CameraMetadata *frame); 102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 11142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const size_t kInFlightWarnLimit = 20; 11242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 1134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const int mId; 120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala vendor_tag_query_ops_t mVendorTagOps; 124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala enum { 126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_IDLE, 129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 132b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 133b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 134b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef KeyedVector<int, sp<camera3::Camera3OutputStream> > StreamSet; 137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<sp<camera3::Camera3Stream> > mDeletedStreams; 144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 145f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 146f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 147f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<sp<camera3::Camera3Stream> > mOutputStreams; 152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Lock-held version of waitUntilDrained. Will transition to IDLE on 157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * success. 158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t waitUntilDrainedLocked(); 160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 180b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 181b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 182b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 183b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 184b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 185b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 186b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 187b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 188b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 1894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 1904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 1914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 1924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 1934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 1944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 1954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 1964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 1974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 1984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 1994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 2014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 2024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 2034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 2054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 2077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 2087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 2107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 2127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t setRepeatingRequests(const RequestList& requests); 227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t clearRepeatingRequests(); 228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t queueRequest(sp<CaptureRequest> request); 230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 2324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 2334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 2344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 2354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 2364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 2374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 2384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Wait until thread is paused, either due to setPaused(true) 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * or due to lack of input requests. Returns TIMED_OUT in case 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * the thread does not pause within the timeout. 249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t waitUntilPaused(nsecs_t timeout); 2517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 2534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 2544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 2554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 2564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 2574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 2584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 2594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 2604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 2627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 2647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 26642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 26742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 2684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 2694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 2704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 2714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 2724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 291b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 292b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 293b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 29742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala const int mId; 29842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 3144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 3157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 31642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 3174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mLatestRequestMutex; 3194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 3204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 3214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 3224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 3244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 3254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 3264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 3274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 3287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 3307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 33242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 33342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 33442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 33542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 33642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 33742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t captureTimestamp; 33842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 33942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 34042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 34142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // buffers 34242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 34342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 34542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 34642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 34742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(0) { 34842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 34942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 35042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala explicit InFlightRequest(int numBuffers) : 35142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 35242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 35342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(numBuffers) { 35442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 35542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala }; 35642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 35742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 35842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 35942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 36042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 36142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 36242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala status_t registerInFlight(int32_t frameNumber, int32_t numBuffers); 36342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 36442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 3657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 3667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 3677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 3697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 3707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 3727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 37342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 37442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 3757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala List<CameraMetadata> mResultQueue; 3767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 3777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 3787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala struct AlgState { 3807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_enum_android_control_ae_state aeState; 3817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_enum_android_control_af_state afState; 3827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala camera_metadata_enum_android_control_awb_state awbState; 3837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala AlgState() : 3857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala aeState(ANDROID_CONTROL_AE_STATE_INACTIVE), 3867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala afState(ANDROID_CONTROL_AF_STATE_INACTIVE), 3877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala awbState(ANDROID_CONTROL_AWB_STATE_INACTIVE) { 3887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } 3897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala } m3AState; 3907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 3927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 3937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 3947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 3957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 3967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 3977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 3997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 4017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 4027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 4037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 4047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 4067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 4087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 4107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 412