Camera3Device.h revision 184dfe4ea5e2ba33951bed2b1366007aee0ce3da
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); 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamingRequest(const CameraMetadata &request); 837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t clearStreamingRequest(); 84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // stream, reconfiguring device, and unpausing. 907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createStream(sp<ANativeWindow> consumer, 917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int *id); 935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin virtual status_t createInputStream( 945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, 955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin int *id); 962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t createZslStream( 972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream>* zslStream); 1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format); 1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 11746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala virtual bool willNotify3A(); 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getNextFrame(CameraMetadata *frame); 120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 128abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala virtual status_t flush(); 129abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Methods called by subclasses 131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala void notifyStatus(bool idle); // updates from StatusTracker 132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 1341e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpLockAttempts = 10; 1351e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpSleepDuration = 100000; // 0.10 sec 13642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const size_t kInFlightWarnLimit = 20; 13742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala static const nsecs_t kActiveTimeout = 500000000; // 500 ms 1394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 141f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // A lock to enforce serialization on the input/configure side 142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // of the public interface. 143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Only locked by public methods inherited from CameraDeviceBase. 144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Not locked by methods guarded by mOutputLock, since they may act 145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // concurrently to the input/configure side of the interface. 146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Must be locked before mLock if both will be locked by a method 147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex mInterfaceLock; 148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The main lock on internal state 150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Camera device ID 153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; 154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala vendor_tag_query_ops_t mVendorTagOps; 161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala enum Status { 163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_UNCONFIGURED, 166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_CONFIGURED, 167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Vector<Status> mRecentStatusUpdates; 170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Condition mStatusChanged; 171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 172b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 173b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 1762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 1772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 182ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Whether to send state updates upstream 185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Pause when doing transparent reconfiguration 186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool mPauseStateNotify; 187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 1892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 191fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled 192fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool mUsePartialResultQuirk; 193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 2002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 2012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 2061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 2071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 2081e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 2091e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual CameraMetadata getLatestRequestLocked(); 211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 212f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 213f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Pause processing and flush everything, but don't tell the clients. 214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * This is for reconfiguring outputs transparently when according to the 215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * CameraDeviceBase interface we shouldn't need to. 216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalPauseAndWaitLocked(); 2191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Resume work after internalPauseAndWaitLocked() 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalResumeLocked(); 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Wait until status tracker tells us we've transitioned to the target state 228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * set, which is either ACTIVE when active==true or IDLE (which is any 229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * non-ACTIVE state) when active==false. 230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Needs to be called with mLock and mInterfaceLock held. This means there 232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * can ever only be one waiter at most. 233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * During the wait mLock is released. 235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 2507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 2567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 257b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 258b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 259b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 260b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 261b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 262b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 263b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 264b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 265b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 266b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Debugging trylock/spin method 269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Try to acquire a lock a few times with sleeps between before giving up. 270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool tryLockSpinRightRound(Mutex& lock); 272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 2754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 2764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 2774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 2784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 2804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 2814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 2824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 2854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 2864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 2874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 2917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 2927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 2947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 2967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> statusTracker, 299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t setRepeatingRequests(const RequestList& requests); 312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t clearRepeatingRequests(); 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t queueRequest(sp<CaptureRequest> request); 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 317abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 318abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 319abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala status_t clear(); 320abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 321abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 3224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 3234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 3244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 3254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 3264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 3284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 3364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 3374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 3384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 3394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 3424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 3434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3441e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Shut down the thread. Shutdown is asynchronous, so thread may 346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * still be running once this method returns. 347f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void requestExit(); 349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 350f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 3511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 3521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 3531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 3541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 3551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 3567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 3577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 3597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 36142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 36242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 3634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 3644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 3654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 3664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 3674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 3684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 3692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 3702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 3712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 3722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 38926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 391b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 392b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 393b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala wp<camera3::StatusTracker> mStatusTracker; 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; // The camera ID 399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int mStatusId; // The RequestThread's component ID for 400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // status tracking 40142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 4157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 4174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 4187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 41942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 4204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 4224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 4234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 4251e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 4304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 4314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 43642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 43742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 43842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 43942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 440f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // android.request.id for the request 441f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int requestId; 44242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 44342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t captureTimestamp; 4441d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He int requestStatus; 44542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 44642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 44742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 44842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // buffers 44942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 45042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 451fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Fields used by the partial result quirk only 452fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala struct PartialResultQuirkInFlight { 453fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Set by process_capture_result once 3A has been sent to clients 454fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool haveSent3A; 455fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Result metadata collected so far, when partial results are in use 456fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala CameraMetadata collectedResult; 457fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 458fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala PartialResultQuirkInFlight(): 459fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala haveSent3A(false) { 460fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 461fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } partialResultQuirk; 462fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 463f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Default constructor needed by KeyedVector 46442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 465f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(0), 46642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 4671d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He requestStatus(OK), 46842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 46942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(0) { 47042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 47142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 472f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala InFlightRequest(int id, int numBuffers) : 473f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala requestId(id), 47442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 475cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He requestStatus(OK), 47642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 47742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(numBuffers) { 47842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 47942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala }; 48042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 48142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 48342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 48442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 48542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 486f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t registerInFlight(int32_t frameNumber, int32_t requestId, 487f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int32_t numBuffers); 488f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 489f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 490fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * For the partial result quirk, check if all 3A state fields are available 491fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * and if so, queue up 3A-only result to the client. Returns true if 3A 492fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * is sent. 493fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 494184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId, 495184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala const CameraMetadata& partial); 496fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 497fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Helpers for reading and writing 3A metadata into to/from partial results 498fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 499fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool get3AResult(const CameraMetadata& result, int32_t tag, 500fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala T* value, int32_t frameNumber); 501fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value, 504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala int32_t frameNumber); 505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** 506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Tracking for idle detection 507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 508f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> mStatusTracker; 50942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 51042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 5117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 5127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 5137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 5157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 5167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 5187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 51942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 52042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 5217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala List<CameraMetadata> mResultQueue; 5227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 5237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 5247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 5267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 5277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 5297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 5317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 5337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 5357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 5367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 5377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 5387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 5407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 5427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 5447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 546