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> 26c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang#include <utils/Timers.h> 277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <hardware/camera3.h> 28cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h> 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 31f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h" 32125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include "device3/Camera3BufferManager.h" 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to 367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions. 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" { 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_process_capture_result_t)( 407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result_t *); 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_notify_t)( 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg_t *); 467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android { 497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 { 517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream; 537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream; 547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface; 557b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface; 567b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 577b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala} 587b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 6095dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher. 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device : 637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public CameraDeviceBase, 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private camera3_callback_ops { 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 66c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device(int id); 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual ~Camera3Device(); 707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 74f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 7571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin virtual int getId() const; 76f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 77f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to idle state on success. 78e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh virtual status_t initialize(CameraModule *module); 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t disconnect(); 807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16> &args); 817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual const CameraMetadata& info() const; 82f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 83f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Capture and setStreamingRequest will configure streams if currently in 84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // idle state 85cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL); 86cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t captureList(const List<const CameraMetadata> &requests, 87cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 88cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t setStreamingRequest(const CameraMetadata &request, 89cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 90cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests, 91cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 92cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL); 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 97f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 9828c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He // stream, reconfiguring device, and unpausing. 99727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala virtual status_t createStream(sp<Surface> consumer, 1003d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala uint32_t width, uint32_t height, int format, 101125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id, 102125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID); 1035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin virtual status_t createInputStream( 1045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, 1055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin int *id); 1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t createZslStream( 1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 1092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 1102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 1112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream>* zslStream); 1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 115d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *width, uint32_t *height, 116d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *format, android_dataspace *dataSpace); 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1221fa8999c91d5df81949aa723000058380cd3faa2Zhijun He virtual status_t configureStreams(bool isConstraiedHighSpeed = false); 123618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen virtual status_t getInputBufferProducer( 124618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen sp<IGraphicBufferProducer> *producer); 125e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 13246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala virtual bool willNotify3A(); 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t getNextResult(CaptureResult *frame); 135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 143cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t flush(int64_t *lastFrameNumber = NULL); 144abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala virtual status_t prepare(int streamId); 1464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 147b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala virtual status_t tearDown(int streamId); 148b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala 149b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang virtual status_t addBufferListenerForStream(int streamId, 150b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang wp<camera3::Camera3StreamBufferListener> listener); 151b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang 152c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk virtual status_t prepare(int maxCount, int streamId); 153c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk 154204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He virtual uint32_t getDeviceVersion(); 155204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 15628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; 15795a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala ssize_t getPointCloudBufferSize() const; 158d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ssize_t getRawOpaqueBufferSize(int32_t width, int32_t height) const; 15928c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He 160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Methods called by subclasses 161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala void notifyStatus(bool idle); // updates from StatusTracker 162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 1641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpLockAttempts = 10; 1651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpSleepDuration = 100000; // 0.10 sec 16642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala static const nsecs_t kActiveTimeout = 500000000; // 500 ms 168c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen static const size_t kInFlightWarnLimit = 20; 169c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen static const size_t kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8 170f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala // SCHED_FIFO priority for request submission thread in HFR mode 1714a8f4a3f567d8b3134b1c7ab21ca774f279ab9c2Chien-Yu Chen static const int kConstrainedHighSpeedThreadPriority = 1; 172c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen 1734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 174f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // minimal jpeg buffer size: 256KB + blob header 175f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He static const ssize_t kMinJpegBufferSize = 256 * 1024 + sizeof(camera3_jpeg_blob); 17616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Constant to use for stream ID when one doesn't exist 17716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala static const int NO_STREAM = -1; 178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // A lock to enforce serialization on the input/configure side 180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // of the public interface. 181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Only locked by public methods inherited from CameraDeviceBase. 182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Not locked by methods guarded by mOutputLock, since they may act 183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // concurrently to the input/configure side of the interface. 184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Must be locked before mLock if both will be locked by a method 185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex mInterfaceLock; 186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The main lock on internal state 188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Camera device ID 191f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; 192f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1931fa8999c91d5df81949aa723000058380cd3faa2Zhijun He // Flag indicating is the current active stream configuration is constrained high speed. 1941fa8999c91d5df81949aa723000058380cd3faa2Zhijun He bool mIsConstrainedHighSpeedConfiguration; 1951fa8999c91d5df81949aa723000058380cd3faa2Zhijun He 196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 202a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He CameraMetadata mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT]; 203a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He 204204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He uint32_t mDeviceVersion; 205cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 2064c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // whether Camera3Device should derive ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST for 2074c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh // backward compatibility. Should not be changed after initialization. 2084c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh bool mDerivePostRawSensKey = false; 2094c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh 210618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen struct Size { 211618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t width; 212618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t height; 213618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){} 214618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen }; 215618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // Map from format to size. 216618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Vector<Size> mSupportedOpaqueInputSizes; 217618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala enum Status { 219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_UNCONFIGURED, 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_CONFIGURED, 223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 225183f056393423b344e73f388f21d30379a38e519Ruben Brunk 226183f056393423b344e73f388f21d30379a38e519Ruben Brunk // Only clear mRecentStatusUpdates, mStatusWaiters from waitUntilStateThenRelock 227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Vector<Status> mRecentStatusUpdates; 228183f056393423b344e73f388f21d30379a38e519Ruben Brunk int mStatusWaiters; 229183f056393423b344e73f388f21d30379a38e519Ruben Brunk 230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Condition mStatusChanged; 231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 232b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 233b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 234b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 2362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 2372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 242ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 24416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala int mDummyStreamId; 24516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Whether to send state updates upstream 247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Pause when doing transparent reconfiguration 248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool mPauseStateNotify; 249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 2512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 253204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Whether the HAL will send partial result 254204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool mUsePartialResult; 255204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 256204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Number of partial results that will be delivered by the HAL. 257204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He uint32_t mNumPartialResults; 258fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 261c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // The offset converting from clock domain of other subsystem 262c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // (video/hardware composer) to that of camera. Assumption is that this 263c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // offset won't change during the life cycle of the camera device. In other 264c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang // words, camera device shouldn't be open during CPU suspend. 265c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang nsecs_t mTimestampOffset; 266c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang 267d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen typedef struct AeTriggerCancelOverride { 268d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool applyAeLock; 269d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aeLock; 270d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool applyAePrecaptureTrigger; 271d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aePrecaptureTrigger; 272d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } AeTriggerCancelOverride_t; 273d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 278c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen camera3_stream_buffer_t mInputBuffer; 2792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 2802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 281cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras mResultExtras; 282d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Used to cancel AE precapture trigger for devices doesn't support 283d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 284d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride_t mAeTriggerCancelOverride; 28585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // The number of requests that should be submitted to HAL at a time. 28685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // For example, if batch size is 8, this request and the following 7 28785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // requests will be submitted to HAL at a time. The batch size for 28885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // the following 7 requests will be ignored by the request thread. 28985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen int mBatchSize; 290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 29390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t checkStatusOkToCaptureLocked(); 29490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 29590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t convertMetadataListToRequestListLocked( 29690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, 2972d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 2982d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei RequestList *requestList); 29990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 300cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating, 301cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 30290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 3041e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 3051e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 3061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 3071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual CameraMetadata getLatestRequestLocked(); 309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 311183f056393423b344e73f388f21d30379a38e519Ruben Brunk * Update the current device status and wake all waiting threads. 312183f056393423b344e73f388f21d30379a38e519Ruben Brunk * 313183f056393423b344e73f388f21d30379a38e519Ruben Brunk * Must be called with mLock held. 314183f056393423b344e73f388f21d30379a38e519Ruben Brunk */ 315183f056393423b344e73f388f21d30379a38e519Ruben Brunk void internalUpdateStatusLocked(Status status); 316183f056393423b344e73f388f21d30379a38e519Ruben Brunk 317183f056393423b344e73f388f21d30379a38e519Ruben Brunk /** 318f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Pause processing and flush everything, but don't tell the clients. 319f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * This is for reconfiguring outputs transparently when according to the 320f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * CameraDeviceBase interface we shouldn't need to. 321f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 322f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalPauseAndWaitLocked(); 3241e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 3251e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Resume work after internalPauseAndWaitLocked() 327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 329f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalResumeLocked(); 330f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 331f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 332f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Wait until status tracker tells us we've transitioned to the target state 333f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * set, which is either ACTIVE when active==true or IDLE (which is any 334f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * non-ACTIVE state) when active==false. 335f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 336f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Needs to be called with mLock and mInterfaceLock held. This means there 337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * can ever only be one waiter at most. 338f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * During the wait mLock is released. 340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 34569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Implementation of waitUntilDrained. On success, will transition to IDLE state. 34669a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * 34769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Need to be called with mLock and mInterfaceLock held. 34869a374897392c8bd70f441b7284f6f578c651ec9Zhijun He */ 34969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He status_t waitUntilDrainedLocked(); 35069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 35169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He /** 352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 3709b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen * Cancel stream configuration that did not finish successfully. 3719b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen */ 3729b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen void cancelStreamsConfigurationLocked(); 3739b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen 3749b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen /** 37516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * Add a dummy stream to the current stream set as a workaround for 37616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * not allowing 0 streams in the camera HAL spec. 37716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala */ 37816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t addDummyStreamLocked(); 37916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 38016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala /** 38116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * Remove a dummy stream if the current config includes real streams. 38216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala */ 38316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t tryRemoveDummyStreamLocked(); 38416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 38516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala /** 386b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 387b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 388b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 389b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 390b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 391b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 392b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 393b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 394b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 396f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Debugging trylock/spin method 397f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Try to acquire a lock a few times with sleeps between before giving up. 398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool tryLockSpinRightRound(Mutex& lock); 400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 401618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen /** 402618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen * Helper function to determine if an input size for implementation defined 403618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen * format is supported. 404618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen */ 405618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen bool isOpaqueInputSizeSupported(uint32_t width, uint32_t height); 406cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 407cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh /** 408cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh * Helper function to get the largest Jpeg resolution (in area) 409cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh * Return Size(0, 0) if static metatdata is invalid 410cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh */ 411cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size getMaxJpegResolution() const; 412cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 413c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang /** 414c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang * Helper function to get the offset between MONOTONIC and BOOTTIME 415c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang * timestamp. 416c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang */ 417c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang static nsecs_t getMonoToBoottimeOffset(); 418c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang 4192cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala /** 4202cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala * Helper function to map between legacy and new dataspace enums 4212cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala */ 4222cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala static android_dataspace mapToLegacyDataspace(android_dataspace dataSpace); 4232cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala 4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 4254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 4314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 4324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 4334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 4344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 4364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 4374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> statusTracker, 450ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen camera3_device_t *hal3Device, 451ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen bool aeLockAvailable); 452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 4534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala void setNotificationListener(NotificationListener *listener); 4541754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 458c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen void configurationComplete(bool isConstrainedHighSpeed); 459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 4652d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t setRepeatingRequests(const RequestList& requests, 4662d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 4672d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 4682d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t clearRepeatingRequests(/*out*/ 4692d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 4702d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 4712d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t queueRequestList(List<sp<CaptureRequest> > &requests, 4722d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 4732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 47490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 476abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 477abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 4781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala status_t clear(NotificationListener *listener, 4791754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala /*out*/ 4802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 481abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 482abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 48385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen * Flush all pending requests in HAL. 48485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen */ 48585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen status_t flush(); 48685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 48785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen /** 4884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 4894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 4904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 4914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 4924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 4934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 4944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 5024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 5034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 5044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 5054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 5064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 5074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 5084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 5094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5101e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 511f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Shut down the thread. Shutdown is asynchronous, so thread may 512f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * still be running once this method returns. 513f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void requestExit(); 515f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 5171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 5181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 5191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 5201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 5211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 5224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 5234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Returns true if the stream is a target of any queued or repeating 5244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * capture request 5254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 5264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream); 5274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 5297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 5317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 53342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 53442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 5354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 5364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 5374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 5384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 5394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 5404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 5412f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 5422f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 5432f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 5442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 5454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 54885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Used to prepare a batch of requests. 54985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen struct NextRequest { 55085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<CaptureRequest> captureRequest; 55185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen camera3_capture_request_t halRequest; 55285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Vector<camera3_stream_buffer_t> outputBuffers; 55385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen bool submitted; 55485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen }; 55585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 55657ea29251d93c9423030de387573142064366a30Chien-Yu Chen // Wait for the next batch of requests and put them in mNextRequests. mNextRequests will 55757ea29251d93c9423030de387573142064366a30Chien-Yu Chen // be empty if it times out. 55857ea29251d93c9423030de387573142064366a30Chien-Yu Chen void waitForNextRequestBatch(); 559f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 56085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // Waits for a request, or returns NULL if times out. Must be called with mRequestLock hold. 56185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen sp<CaptureRequest> waitForNextRequestLocked(); 56285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 56357ea29251d93c9423030de387573142064366a30Chien-Yu Chen // Prepare HAL requests and output buffers in mNextRequests. Return TIMED_OUT if getting any 56457ea29251d93c9423030de387573142064366a30Chien-Yu Chen // output buffer timed out. If an error is returned, the caller should clean up the pending 56557ea29251d93c9423030de387573142064366a30Chien-Yu Chen // request batch. 56657ea29251d93c9423030de387573142064366a30Chien-Yu Chen status_t prepareHalRequests(); 56785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 56857ea29251d93c9423030de387573142064366a30Chien-Yu Chen // Return buffers, etc, for requests in mNextRequests that couldn't be fully constructed and 56957ea29251d93c9423030de387573142064366a30Chien-Yu Chen // send request errors if sendRequestError is true. The buffers will be returned in the 57057ea29251d93c9423030de387573142064366a30Chien-Yu Chen // ERROR state to mark them as not having valid data. mNextRequests will be cleared. 57157ea29251d93c9423030de387573142064366a30Chien-Yu Chen void cleanUpFailedRequests(bool sendRequestError); 572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 573e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen // Stop the repeating request if any of its output streams is abandoned. 574e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen void checkAndStopRepeatingRequest(); 575e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 57826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 579f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 580b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 581b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 582b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 5838684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold 5848684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh bool isRepeatingRequestLocked(const sp<CaptureRequest>); 5858684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 586d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Handle AE precapture trigger cancel for devices <= CAMERA_DEVICE_API_VERSION_3_2. 587d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen void handleAePrecaptureCancelRequest(sp<CaptureRequest> request); 588d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 589e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen // Clear repeating requests. Must be called with mRequestLock held. 590e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen status_t clearRepeatingRequestsLocked(/*out*/ int64_t *lastFrameNumber = NULL); 591e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 592f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 593f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala wp<camera3::StatusTracker> mStatusTracker; 594f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 5961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *mListener; 5971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 598f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; // The camera ID 599f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int mStatusId; // The RequestThread's component ID for 600f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // status tracking 60142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 60657ea29251d93c9423030de387573142064366a30Chien-Yu Chen // The next batch of requests being prepped for submission to the HAL, no longer 607e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // on the request queue. Read-only even with mRequestLock held, outside 608e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // of threadLoop 60957ea29251d93c9423030de387573142064366a30Chien-Yu Chen Vector<NextRequest> mNextRequests; 61085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen 61185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen // To protect flush() and sending a request batch to HAL. 61285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen Mutex mFlushLock; 613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 615f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 616f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 617f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 6227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 623f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 6244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 6257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 62642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 6274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 6281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 6294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 6304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 6314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 6321e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 6334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 6344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 6354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 6364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 6374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 6384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 639c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh uint32_t mCurrentAfTriggerId; 640c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh uint32_t mCurrentPreCaptureTriggerId; 641cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 6422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t mRepeatingLastFrameNumber; 643d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 644d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Whether the device supports AE lock 645d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool mAeLockAvailable; 646c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen 647c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen // Flag indicating if we should prepare video stream for video requests. 648c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen bool mPrepareVideoStream; 6497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 6517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 6527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 65342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 65442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 65542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 65642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 65742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 65843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp; 65943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Set by process_capture_result(). 66043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t sensorTimestamp; 6611d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He int requestStatus; 66242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 66342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 66442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 665f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He // and input buffers 66642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 667cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 668c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // If this request has any input buffer 669c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He bool hasInputBuffer; 67042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 67143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // The last metadata that framework receives from HAL and 67243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // not yet send out because the shutter event hasn't arrived. 67343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // It's added by process_capture_result and sent when framework 67443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // receives the shutter event. 67543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata pendingMetadata; 67643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 6775cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // The metadata of the partial results that framework receives from HAL so far 6785cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // and has sent out. 6795cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen CameraMetadata collectedPartialResult; 6805cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 68143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Buffers are added by process_capture_result when output buffers 68243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // return from HAL but framework has not yet received the shutter 68343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // event. They will be returned to the streams when framework receives 68443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the shutter event. 68543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Vector<camera3_stream_buffer_t> pendingOutputBuffers; 68643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 687d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Used to cancel AE precapture trigger for devices doesn't support 688d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 689d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride_t aeTriggerCancelOverride; 690d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 691f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Default constructor needed by KeyedVector 69242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 69343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp(0), 69443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp(0), 6951d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He requestStatus(OK), 69642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 697c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He numBuffersLeft(0), 698d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen hasInputBuffer(false), 699d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride({false, 0, false, 0}){ 70042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 701cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 702d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput, 703d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride aeTriggerCancelOverride) : 70443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp(0), 70543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp(0), 706cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei requestStatus(OK), 707cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei haveResultMetadata(false), 708cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei numBuffersLeft(numBuffers), 709c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He resultExtras(extras), 710d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen hasInputBuffer(hasInput), 711d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride(aeTriggerCancelOverride){ 712c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 7134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala }; 7144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 71542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 71642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 71742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 71842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 71942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 72042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 721cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t registerInFlight(uint32_t frameNumber, 722d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, 723d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 724f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 725f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 726d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * Override result metadata for cancelling AE precapture trigger applied in 727d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * handleAePrecaptureCancelRequest(). 728d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 729d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen void overrideResultForPrecaptureCancel(CameraMetadata* result, 730d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 731d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 732fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** 733f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Tracking for idle detection 734f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 735f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> mStatusTracker; 73642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 73742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 738125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * Graphic buffer manager for output streams. Each device has a buffer manager, which is used 739125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * by the output streams to get and return buffers if these streams are registered to this 740125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He * buffer manager. 741125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He */ 742125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He sp<camera3::Camera3BufferManager> mBufferManager; 743125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He 744125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He /** 7454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Thread for preparing streams 7464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 7474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala class PreparerThread : private Thread, public virtual RefBase { 7484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala public: 7494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala PreparerThread(); 7504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ~PreparerThread(); 7514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala void setNotificationListener(NotificationListener *listener); 7534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 755c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk * Queue up a stream to be prepared. Streams are processed by a background thread in FIFO 756c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk * order. Pre-allocate up to maxCount buffers for the stream, or the maximum number needed 757c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk * for the pipeline if maxCount is ALLOCATE_PIPELINE_MAX. 7584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 759c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk status_t prepare(int maxCount, sp<camera3::Camera3StreamInterface>& stream); 7604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 7624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Cancel all current and pending stream preparation 7634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 7644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t clear(); 7654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala private: 7674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex mLock; 7684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala virtual bool threadLoop(); 7704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Guarded by mLock 7724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala NotificationListener *mListener; 7744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala List<sp<camera3::Camera3StreamInterface> > mPendingStreams; 7754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool mActive; 7764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool mCancelNow; 7774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Only accessed by threadLoop and the destructor 7794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<camera3::Camera3StreamInterface> mCurrentStream; 7814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala }; 7824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<PreparerThread> mPreparerThread; 7834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 7857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 7867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 7877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 7897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 7907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 792618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // the minimal frame number of the next non-reprocess result 79342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 794618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // the minimal frame number of the next reprocess result 795618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t mNextReprocessResultFrameNumber; 7963df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen // the minimal frame number of the next non-reprocess shutter 79742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 7983df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen // the minimal frame number of the next reprocess shutter 7993df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen uint32_t mNextReprocessShutterFrameNumber; 800cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei List<CaptureResult> mResultQueue; 8017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 8027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 8037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 8047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 8057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 8067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 8077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 8087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 8097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 8107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 8127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Specific notify handlers 8141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala void notifyError(const camera3_error_msg_t &msg, 8151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener); 8161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala void notifyShutter(const camera3_shutter_msg_t &msg, 8171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener); 8181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 81943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // helper function to return the output buffers to the streams. 82043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void returnOutputBuffers(const camera3_stream_buffer_t *outputBuffers, 82143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen size_t numBuffers, nsecs_t timestamp); 82243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 8235cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // Send a partial capture result. 8245cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen void sendPartialCaptureResult(const camera_metadata_t * partialResult, 8255cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const CaptureResultExtras &resultExtras, uint32_t frameNumber, 8265cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 8275cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 8285cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // Send a total capture result given the pending metadata and result extras, 82943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // partial results, and the frame number to the result queue. 83043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void sendCaptureResult(CameraMetadata &pendingMetadata, 83143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResultExtras &resultExtras, 832618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen CameraMetadata &collectedPartialResult, uint32_t frameNumber, 833d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool reprocess, const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 83443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 8355cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // Insert the result to the result queue after updating frame number and overriding AE 8365cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // trigger cancel. 8375cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen // mOutputLock must be held when calling this function. 8385cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen void insertResultLocked(CaptureResult *result, uint32_t frameNumber, 8395cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 8405cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen 84143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen /**** Scope for mInFlightLock ****/ 84243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 84343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Remove the in-flight request of the given index from mInFlightMap 84443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // if it's no longer needed. It must only be called with mInFlightLock held. 84543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void removeInFlightRequestIfReadyLocked(int idx); 84643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 84743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen /**** End scope for mInFlightLock ****/ 84843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 8497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 8507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 8517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 8527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 8537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 8557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 8577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 8597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 8607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 861