Camera3Device.h revision 2f876f9ee63396e4e0117f85c5b3132cac7e2c9d
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" 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to 327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions. 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" { 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_process_capture_result_t)( 367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result_t *); 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_notify_t)( 407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg_t *); 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android { 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 467b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 { 477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream; 497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream; 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface; 517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface; 527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala} 547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device : 597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public CameraDeviceBase, 607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private camera3_callback_ops { 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device(int id); 637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual ~Camera3Device(); 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 67f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 69f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 7071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin virtual int getId() const; 71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to idle state on success. 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t initialize(camera_module_t *module); 747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t disconnect(); 757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16> &args); 767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual const CameraMetadata& info() const; 77f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Capture and setStreamingRequest will configure streams if currently in 79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // idle state 807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t capture(CameraMetadata &request); 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamingRequest(const CameraMetadata &request); 827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t clearStreamingRequest(); 83f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 85f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // stream, reconfiguring device, and unpausing. 897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createStream(sp<ANativeWindow> consumer, 907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t width, uint32_t height, int format, size_t size, 917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala int *id); 925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin virtual status_t createInputStream( 935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, 945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin int *id); 952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t createZslStream( 962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream>* zslStream); 1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala uint32_t *width, uint32_t *height, uint32_t *format); 1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 111f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 11646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala virtual bool willNotify3A(); 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getNextFrame(CameraMetadata *frame); 119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 127abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala virtual status_t flush(); 128abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 1301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpLockAttempts = 10; 1311e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpSleepDuration = 100000; // 0.10 sec 13242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const size_t kInFlightWarnLimit = 20; 13342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 1344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala const int mId; 141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala vendor_tag_query_ops_t mVendorTagOps; 145f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 146f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala enum { 147f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_IDLE, 150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 153b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 154b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 155b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 1572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 1582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 163ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 1662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 1742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 1752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 1801e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 1811e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 1821e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 1831e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 1841e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin virtual CameraMetadata getLatestRequest(); 1851e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 1861e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Lock-held version of waitUntilDrained. Will transition to IDLE on 188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * success. 189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t waitUntilDrainedLocked(); 191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 2037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 208f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 2097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 210b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 211b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 212b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 213b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 214b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 215b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 216b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 217b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 218b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 219b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 2204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 2214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 2224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 2234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 2244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 2254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 2274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 2284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 2294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 2324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 2334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 2344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 2354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 2364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 2387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 2397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 2417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 2437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t setRepeatingRequests(const RequestList& requests); 258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t clearRepeatingRequests(); 259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t queueRequest(sp<CaptureRequest> request); 261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 263abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 264abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 265abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala status_t clear(); 266abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 267abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 2684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 2694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 2704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 2714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 2724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Wait until thread is paused, either due to setPaused(true) 283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * or due to lack of input requests. Returns TIMED_OUT in case 284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * the thread does not pause within the timeout. 285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t waitUntilPaused(nsecs_t timeout); 2877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 2971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 2981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 2991e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 3001e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 3011e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 3021e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 3037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 3047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 30842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 30942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 3104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 3114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 3124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 3134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 3144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 3154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 3162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 3172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 3182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 3192f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 3204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 33626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 338b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 339b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 340b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala const int mId; 34542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 3597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 3614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 36342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 3644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 3664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 3674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 3684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 3691e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 3704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 3724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 3744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 3754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 38042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 38142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 38242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 38342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 38442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 38542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala nsecs_t captureTimestamp; 38642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 38742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 38842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 38942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // buffers 39042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 39142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 39242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 39342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 39442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 39542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(0) { 39642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 39742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 39842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala explicit InFlightRequest(int numBuffers) : 39942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala captureTimestamp(0), 40042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 40142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala numBuffersLeft(numBuffers) { 40242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 40342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala }; 40442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 40542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 40642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 40742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 40842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 40942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 41042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala status_t registerInFlight(int32_t frameNumber, int32_t numBuffers); 41142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 41242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 4137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 4147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 4157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 4167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 4177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 4187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 4197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 4207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 42142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 42242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 4237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala List<CameraMetadata> mResultQueue; 4247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 4257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 4267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 4277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 4287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 4297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 4307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 4317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 4377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 4387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 4397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 4407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 448