Camera3Device.h revision 90e59c98c343e941b1a75307ffa4b4b5f1eb50d6
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> 257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <utils/KeyedVector.h> 267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <hardware/camera3.h> 277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 29f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h" 307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions. 347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" { 367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_process_capture_result_t)( 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result_t *); 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_notify_t)( 417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg_t *); 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android { 467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 { 487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream; 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream; 517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface; 527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface; 537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala} 557b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device : 607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public CameraDeviceBase, 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private camera3_callback_ops { 627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device(int id); 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual ~Camera3Device(); 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 68f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 70f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 7171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin virtual int getId() const; 72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 73f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to idle state on success. 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t initialize(camera_module_t *module); 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t disconnect(); 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16> &args); 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual const CameraMetadata& info() const; 78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Capture and setStreamingRequest will configure streams if currently in 80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // idle state 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t capture(CameraMetadata &request); 8290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei virtual status_t captureList(const List<const CameraMetadata> &requests); 837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamingRequest(const CameraMetadata &request); 8490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests); 857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t clearStreamingRequest(); 86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 91f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // stream, reconfiguring device, and unpausing. 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createStream(sp<ANativeWindow> consumer, 937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, 947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int *id); 955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin virtual status_t createInputStream( 965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, 975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin int *id); 982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t createZslStream( 992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 1022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream>* zslStream); 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format); 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 11946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala virtual bool willNotify3A(); 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getNextFrame(CameraMetadata *frame); 122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 130abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala virtual status_t flush(); 131abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Methods called by subclasses 133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala void notifyStatus(bool idle); // updates from StatusTracker 134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 1361e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpLockAttempts = 10; 1371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpSleepDuration = 100000; // 0.10 sec 13842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const size_t kInFlightWarnLimit = 20; 13942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 140f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala static const nsecs_t kActiveTimeout = 500000000; // 500 ms 1414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // A lock to enforce serialization on the input/configure side 144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // of the public interface. 145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Only locked by public methods inherited from CameraDeviceBase. 146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Not locked by methods guarded by mOutputLock, since they may act 147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // concurrently to the input/configure side of the interface. 148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Must be locked before mLock if both will be locked by a method 149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex mInterfaceLock; 150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The main lock on internal state 152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Camera device ID 155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; 156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala vendor_tag_query_ops_t mVendorTagOps; 163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala enum Status { 165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_UNCONFIGURED, 168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_CONFIGURED, 169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Vector<Status> mRecentStatusUpdates; 172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Condition mStatusChanged; 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 175b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 176b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 1782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 1792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 184ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Whether to send state updates upstream 187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Pause when doing transparent reconfiguration 188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool mPauseStateNotify; 189f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 1912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled 194fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool mUsePartialResultQuirk; 195fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 2022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 2032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t checkStatusOkToCaptureLocked(); 20890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 20990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t convertMetadataListToRequestListLocked( 21090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, 21190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei /*out*/RequestList *requestList); 21290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 21390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating); 21490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 2161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 2171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 2181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 2191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual CameraMetadata getLatestRequestLocked(); 221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Pause processing and flush everything, but don't tell the clients. 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * This is for reconfiguring outputs transparently when according to the 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * CameraDeviceBase interface we shouldn't need to. 226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalPauseAndWaitLocked(); 2291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Resume work after internalPauseAndWaitLocked() 232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalResumeLocked(); 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Wait until status tracker tells us we've transitioned to the target state 238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * set, which is either ACTIVE when active==true or IDLE (which is any 239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * non-ACTIVE state) when active==false. 240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Needs to be called with mLock and mInterfaceLock held. This means there 242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * can ever only be one waiter at most. 243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * During the wait mLock is released. 245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 2607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 2667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 267b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 268b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 269b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 270b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 271b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 272b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 273b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 274b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 275b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 276b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Debugging trylock/spin method 279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Try to acquire a lock a few times with sleeps between before giving up. 280f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool tryLockSpinRightRound(Mutex& lock); 282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 2834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 2844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 2854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 2864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 2874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 2974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 2994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 3017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 3027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 3047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> statusTracker, 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t setRepeatingRequests(const RequestList& requests); 322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t clearRepeatingRequests(); 323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t queueRequest(sp<CaptureRequest> request); 325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 32690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t queueRequestList(List<sp<CaptureRequest> > &requests); 32790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 329abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 330abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 331abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala status_t clear(); 332abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 333abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 3344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 3354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 3364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 3374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 3384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 3484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 3494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 3504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 3514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 3524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 3534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 3554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 357f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Shut down the thread. Shutdown is asynchronous, so thread may 358f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * still be running once this method returns. 359f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void requestExit(); 361f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 362f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 3631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 3641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 3651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 3661e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 3671e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 3697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 3717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 37342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 37442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 3754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 3764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 3774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 3784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 3794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 3804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 3812f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 3822f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 3832f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 3842f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 3854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 40126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 403b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 404b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 405b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala wp<camera3::StatusTracker> mStatusTracker; 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 410f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; // The camera ID 411f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int mStatusId; // The RequestThread's component ID for 412f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // status tracking 41342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 4277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 4307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 43142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 4324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4331e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 4344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 4364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 4371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 4414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 4424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 4434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 44842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 44942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 45042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 45142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // android.request.id for the request 453f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 45442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 45542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t captureTimestamp; 4561d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He int requestStatus; 45742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 45842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 45942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 46042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // buffers 46142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 46242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 463fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fields used by the partial result quirk only 464fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala struct PartialResultQuirkInFlight { 465fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Set by process_capture_result once 3A has been sent to clients 466fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool haveSent3A; 467fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Result metadata collected so far, when partial results are in use 468fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala CameraMetadata collectedResult; 469fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala PartialResultQuirkInFlight(): 471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala haveSent3A(false) { 472fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } partialResultQuirk; 474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 475f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Default constructor needed by KeyedVector 47642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 477f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(0), 47842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 4791d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He requestStatus(OK), 48042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 48142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(0) { 48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 48342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 484f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala InFlightRequest(int id, int numBuffers) : 485f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(id), 48642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 487cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He requestStatus(OK), 48842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 48942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(numBuffers) { 49042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 49142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala }; 49242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 49342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 49442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 49542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 49642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 49742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 498f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t registerInFlight(int32_t frameNumber, int32_t requestId, 499f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int32_t numBuffers); 500f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 501f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * For the partial result quirk, check if all 3A state fields are available 503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * and if so, queue up 3A-only result to the client. Returns true if 3A 504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * is sent. 505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 506184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId, 507184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const CameraMetadata& partial); 508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 509fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Helpers for reading and writing 3A metadata into to/from partial results 510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool get3AResult(const CameraMetadata& result, int32_t tag, 512fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala T* value, int32_t frameNumber); 513fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value, 516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t frameNumber); 517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** 518f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Tracking for idle detection 519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 520f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> mStatusTracker; 52142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 52242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 5237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 5247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 5257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 5277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 5287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 5307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 53142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 53242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 5337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala List<CameraMetadata> mResultQueue; 5347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 5357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 5367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 5387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 5407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 5417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 5437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 5457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 5477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 5487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 5507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 558