Camera3Device.h revision 95dd5ba5bf83716f2eed5fe72366c4212464d710
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/** 5795dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher. 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 163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala enum Status { 164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_UNCONFIGURED, 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_CONFIGURED, 168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Vector<Status> mRecentStatusUpdates; 171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Condition mStatusChanged; 172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 173b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 175b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 1772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 1782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 183ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Whether to send state updates upstream 186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Pause when doing transparent reconfiguration 187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool mPauseStateNotify; 188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 1902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 192fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled 193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool mUsePartialResultQuirk; 194fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 2012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 2022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 20690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t checkStatusOkToCaptureLocked(); 20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 20890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t convertMetadataListToRequestListLocked( 20990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, 21090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei /*out*/RequestList *requestList); 21190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 21290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating); 21390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 2151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 2161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 2171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 2181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual CameraMetadata getLatestRequestLocked(); 220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Pause processing and flush everything, but don't tell the clients. 223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * This is for reconfiguring outputs transparently when according to the 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * CameraDeviceBase interface we shouldn't need to. 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalPauseAndWaitLocked(); 2281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Resume work after internalPauseAndWaitLocked() 231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalResumeLocked(); 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Wait until status tracker tells us we've transitioned to the target state 237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * set, which is either ACTIVE when active==true or IDLE (which is any 238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * non-ACTIVE state) when active==false. 239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Needs to be called with mLock and mInterfaceLock held. This means there 241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * can ever only be one waiter at most. 242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * During the wait mLock is released. 244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 24969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Implementation of waitUntilDrained. On success, will transition to IDLE state. 25069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * 25169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Need to be called with mLock and mInterfaceLock held. 25269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He */ 25369a374897392c8bd70f441b7284f6f578c651ec9Zhijun He status_t waitUntilDrainedLocked(); 25469a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 25569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He /** 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 2667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 2727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 273b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 274b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 275b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 276b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 277b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 278b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 279b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 280b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 281b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 282b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Debugging trylock/spin method 285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Try to acquire a lock a few times with sleeps between before giving up. 286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool tryLockSpinRightRound(Mutex& lock); 288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 2974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 2984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 3014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 3024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 3034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 3044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 3054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 3077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 3087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 3107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> statusTracker, 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t setRepeatingRequests(const RequestList& requests); 328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t clearRepeatingRequests(); 329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t queueRequest(sp<CaptureRequest> request); 331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 33290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t queueRequestList(List<sp<CaptureRequest> > &requests); 33390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 335abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 336abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 337abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala status_t clear(); 338abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 339abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 3424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 3434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 3444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 3464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 3544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 3554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 3564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 3574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 3584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 3594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 3614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 363f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Shut down the thread. Shutdown is asynchronous, so thread may 364f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * still be running once this method returns. 365f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 366f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void requestExit(); 367f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 368f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 3691e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 3701e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 3711e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 3721e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 3731e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 3757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 3777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 37942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 38042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 3814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 3824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 3834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 3844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 3854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 3864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 3872f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 3882f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 3892f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 3902f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 3914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 40726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 409b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 410b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 411b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala wp<camera3::StatusTracker> mStatusTracker; 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; // The camera ID 417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int mStatusId; // The RequestThread's component ID for 418f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // status tracking 41942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 4367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 43742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4391e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 4414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 4424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 4431e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 4444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 4464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 4474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 4484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 4494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 4507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 4527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 45442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 45542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 45642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 45742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 458f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // android.request.id for the request 459f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 46042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 46142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t captureTimestamp; 4621d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He int requestStatus; 46342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 46442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 46542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 46642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // buffers 46742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 46842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 469fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fields used by the partial result quirk only 470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala struct PartialResultQuirkInFlight { 471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Set by process_capture_result once 3A has been sent to clients 472fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool haveSent3A; 473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Result metadata collected so far, when partial results are in use 474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala CameraMetadata collectedResult; 475fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 476fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala PartialResultQuirkInFlight(): 477fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala haveSent3A(false) { 478fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 479fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } partialResultQuirk; 480fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 481f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Default constructor needed by KeyedVector 48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 483f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(0), 48442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 4851d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He requestStatus(OK), 48642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 48742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(0) { 48842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 48942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 490f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala InFlightRequest(int id, int numBuffers) : 491f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(id), 49242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 493cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He requestStatus(OK), 49442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 49542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(numBuffers) { 49642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 49742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala }; 49842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 49942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 50042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 50142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 50242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 50342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 504f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t registerInFlight(int32_t frameNumber, int32_t requestId, 505f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int32_t numBuffers); 506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * For the partial result quirk, check if all 3A state fields are available 509fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * and if so, queue up 3A-only result to the client. Returns true if 3A 510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * is sent. 511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 512184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId, 513184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const CameraMetadata& partial); 514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Helpers for reading and writing 3A metadata into to/from partial results 516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool get3AResult(const CameraMetadata& result, int32_t tag, 518fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala T* value, int32_t frameNumber); 519fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 520fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 521fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value, 522fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t frameNumber); 523fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** 524f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Tracking for idle detection 525f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 526f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> mStatusTracker; 52742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 52842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 5297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 5307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 5317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 5337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 5347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 5367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 53742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 53842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 5397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala List<CameraMetadata> mResultQueue; 5407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 5417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 5427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 5447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 5467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 5477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 5497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 5587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 5607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 5627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 564