Camera3Device.h revision d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49d
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> 27cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h> 282d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei#include <camera/camera2/ICameraDeviceUser.h> 297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h" 31f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h" 327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to 357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions. 367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" { 387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_process_capture_result_t)( 397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_capture_result_t *); 417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala typedef void (callbacks_notify_t)( 437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const struct camera3_callback_ops *, 447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala const camera3_notify_msg_t *); 457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala} 467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android { 487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 { 507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream; 527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream; 537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface; 547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface; 557b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 567b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala} 577b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala 587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/** 5995dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher. 607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device : 627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public CameraDeviceBase, 637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private camera3_callback_ops { 647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala Camera3Device(int id); 667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual ~Camera3Device(); 687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 70f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * CameraDeviceBase interface 717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 7371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin virtual int getId() const; 74f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 75f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to idle state on success. 76e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh virtual status_t initialize(CameraModule *module); 777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t disconnect(); 787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t dump(int fd, const Vector<String16> &args); 797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual const CameraMetadata& info() const; 80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 81f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Capture and setStreamingRequest will configure streams if currently in 82f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // idle state 83cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL); 84cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t captureList(const List<const CameraMetadata> &requests, 85cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 86cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t setStreamingRequest(const CameraMetadata &request, 87cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 88cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests, 89cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 90cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL); 91f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout); 93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 94f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Actual stream creation/deletion is delayed until first request is submitted 95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // If adding streams while actively capturing, will pause device before adding 9628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He // stream, reconfiguring device, and unpausing. 97727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala virtual status_t createStream(sp<Surface> consumer, 983d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala uint32_t width, uint32_t height, int format, 99b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id); 1005a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin virtual status_t createInputStream( 1015a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin uint32_t width, uint32_t height, int format, 1025a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin int *id); 1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin virtual status_t createZslStream( 1042fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin uint32_t width, uint32_t height, 1052fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int depth, 1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin /*out*/ 1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin int *id, 1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin sp<camera3::Camera3ZslStream>* zslStream); 1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createReprocessStreamFromStream(int outputId, int *id); 110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t getStreamInfo(int id, 112d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *width, uint32_t *height, 113d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala uint32_t *format, android_dataspace *dataSpace); 1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setStreamTransform(int id, int transform); 115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteStream(int id); 1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t deleteReprocessStream(int id); 118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1191fa8999c91d5df81949aa723000058380cd3faa2Zhijun He virtual status_t configureStreams(bool isConstraiedHighSpeed = false); 120618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen virtual status_t getInputBufferProducer( 121618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen sp<IGraphicBufferProducer> *producer); 122e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin 1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t createDefaultRequest(int templateId, CameraMetadata *request); 124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Transitions to the idle state on success 1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitUntilDrained(); 127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t setNotifyCallback(NotificationListener *listener); 12946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala virtual bool willNotify3A(); 1307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t waitForNextFrame(nsecs_t timeout); 131cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t getNextResult(CaptureResult *frame); 132f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerAutofocus(uint32_t id); 1347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerCancelAutofocus(uint32_t id); 1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t triggerPrecaptureMetering(uint32_t id); 136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual status_t pushReprocessBuffer(int reprocessStreamId, 1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala buffer_handle_t *buffer, wp<BufferReleasedListener> listener); 1397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 140cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei virtual status_t flush(int64_t *lastFrameNumber = NULL); 141abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 1424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala virtual status_t prepare(int streamId); 1434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 144204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He virtual uint32_t getDeviceVersion(); 145204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 14628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const; 14728c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He 148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Methods called by subclasses 149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala void notifyStatus(bool idle); // updates from StatusTracker 150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 1521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpLockAttempts = 10; 1531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin static const size_t kDumpSleepDuration = 100000; // 0.10 sec 15442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const size_t kInFlightWarnLimit = 20; 15542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec 156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala static const nsecs_t kActiveTimeout = 500000000; // 500 ms 1574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger; 158f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He // minimal jpeg buffer size: 256KB + blob header 159f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He static const ssize_t kMinJpegBufferSize = 256 * 1024 + sizeof(camera3_jpeg_blob); 16016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala // Constant to use for stream ID when one doesn't exist 16116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala static const int NO_STREAM = -1; 162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // A lock to enforce serialization on the input/configure side 164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // of the public interface. 165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Only locked by public methods inherited from CameraDeviceBase. 166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Not locked by methods guarded by mOutputLock, since they may act 167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // concurrently to the input/configure side of the interface. 168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Must be locked before mLock if both will be locked by a method 169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Mutex mInterfaceLock; 170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // The main lock on internal state 172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mLock; 173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 174f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Camera device ID 175f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; 176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 1771fa8999c91d5df81949aa723000058380cd3faa2Zhijun He // Flag indicating is the current active stream configuration is constrained high speed. 1781fa8999c91d5df81949aa723000058380cd3faa2Zhijun He bool mIsConstrainedHighSpeedConfiguration; 1791fa8999c91d5df81949aa723000058380cd3faa2Zhijun He 180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** Scope for mLock ****/ 181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mDeviceInfo; 185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 186a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He CameraMetadata mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT]; 187a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He 188204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He uint32_t mDeviceVersion; 189cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 190618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen struct Size { 191618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t width; 192618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t height; 193618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){} 194618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen }; 195618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // Map from format to size. 196618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen Vector<Size> mSupportedOpaqueInputSizes; 197618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen 198f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala enum Status { 199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ERROR, 200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_UNINITIALIZED, 201f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_UNCONFIGURED, 202f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala STATUS_CONFIGURED, 203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala STATUS_ACTIVE 204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala } mStatus; 205f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Vector<Status> mRecentStatusUpdates; 206f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala Condition mStatusChanged; 207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 208b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Tracking cause of fatal errors when in STATUS_ERROR 209b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala String8 mErrorCause; 210b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 211f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Mapping of stream IDs to stream instances 2122fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > 2132fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin StreamSet; 214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala StreamSet mOutputStreams; 216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala int mNextStreamId; 218ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala bool mNeedConfig; 219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 22016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala int mDummyStreamId; 22116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Whether to send state updates upstream 223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Pause when doing transparent reconfiguration 224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool mPauseStateNotify; 225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Need to hold on to stream references until configure completes. 2272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; 228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 229204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Whether the HAL will send partial result 230204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool mUsePartialResult; 231204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He 232204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Number of partial results that will be delivered by the HAL. 233204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He uint32_t mNumPartialResults; 234fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /**** End scope for mLock ****/ 236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 237d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen typedef struct AeTriggerCancelOverride { 238d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool applyAeLock; 239d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aeLock; 240d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool applyAePrecaptureTrigger; 241d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen uint8_t aePrecaptureTrigger; 242d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen } AeTriggerCancelOverride_t; 243d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class CaptureRequest : public LightRefBase<CaptureRequest> { 245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala public: 246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala CameraMetadata mSettings; 247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<camera3::Camera3Stream> mInputStream; 248c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen camera3_stream_buffer_t mInputBuffer; 2492fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin Vector<sp<camera3::Camera3OutputStreamInterface> > 2502fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin mOutputStreams; 251cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras mResultExtras; 252d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Used to cancel AE precapture trigger for devices doesn't support 253d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 254d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride_t mAeTriggerCancelOverride; 255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala }; 256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala typedef List<sp<CaptureRequest> > RequestList; 257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 25890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t checkStatusOkToCaptureLocked(); 25990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 26090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei status_t convertMetadataListToRequestListLocked( 26190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei const List<const CameraMetadata> &metadataList, 2622d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 2632d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei RequestList *requestList); 26490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 265cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating, 266cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei int64_t *lastFrameNumber = NULL); 26790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 2691e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the last request submitted to the hal by the request thread. 2701e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * 2711e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Takes mLock. 2721e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 273f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual CameraMetadata getLatestRequestLocked(); 274f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 275f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 276f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Pause processing and flush everything, but don't tell the clients. 277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * This is for reconfiguring outputs transparently when according to the 278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * CameraDeviceBase interface we shouldn't need to. 279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 280f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalPauseAndWaitLocked(); 2821e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 2831e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Resume work after internalPauseAndWaitLocked() 285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Must be called with mLock and mInterfaceLock both held. 286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t internalResumeLocked(); 288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 289f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 290f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Wait until status tracker tells us we've transitioned to the target state 291f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * set, which is either ACTIVE when active==true or IDLE (which is any 292f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * non-ACTIVE state) when active==false. 293f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 294f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Needs to be called with mLock and mInterfaceLock held. This means there 295f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * can ever only be one waiter at most. 296f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 297f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * During the wait mLock is released. 298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * 299f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 300f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala status_t waitUntilStateThenRelock(bool active, nsecs_t timeout); 301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 30369a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Implementation of waitUntilDrained. On success, will transition to IDLE state. 30469a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * 30569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He * Need to be called with mLock and mInterfaceLock held. 30669a374897392c8bd70f441b7284f6f578c651ec9Zhijun He */ 30769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He status_t waitUntilDrainedLocked(); 30869a374897392c8bd70f441b7284f6f578c651ec9Zhijun He 30969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He /** 310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Do common work for setting up a streaming or single capture request. 311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * On success, will transition to ACTIVE if in IDLE. 312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request); 314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Build a CaptureRequest request from the CameraDeviceBase request 317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * settings. 318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request); 3207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Take the currently-defined set of streams and configure the HAL to use 323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * them. This is a long-running operation (may be several hundered ms). 324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala status_t configureStreamsLocked(); 3267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 327b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala /** 32816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * Add a dummy stream to the current stream set as a workaround for 32916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * not allowing 0 streams in the camera HAL spec. 33016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala */ 33116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t addDummyStreamLocked(); 33216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 33316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala /** 33416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala * Remove a dummy stream if the current config includes real streams. 33516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala */ 33616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala status_t tryRemoveDummyStreamLocked(); 33716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala 33816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala /** 339b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * Set device into an error state due to some fatal failure, and set an 340b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * error message to indicate why. Only the first call's message will be 341b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala * used. The message is also sent to the log. 342b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala */ 343b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 344b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateV(const char *fmt, va_list args); 345b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLocked(const char *fmt, ...); 346b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorStateLockedV(const char *fmt, va_list args); 347b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Debugging trylock/spin method 350f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Try to acquire a lock a few times with sleeps between before giving up. 351f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 352f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala bool tryLockSpinRightRound(Mutex& lock); 353f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 354618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen /** 355618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen * Helper function to determine if an input size for implementation defined 356618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen * format is supported. 357618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen */ 358618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen bool isOpaqueInputSizeSupported(uint32_t width, uint32_t height); 359cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 360cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh /** 361cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh * Helper function to get the largest Jpeg resolution (in area) 362cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh * Return Size(0, 0) if static metatdata is invalid 363cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh */ 364cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh Size getMaxJpegResolution() const; 365cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh 3664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin struct RequestTrigger { 3674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata tag number, e.g. android.control.aePrecaptureTrigger 3684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin uint32_t metadataTag; 3694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Metadata value, e.g. 'START' or the trigger ID 3704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t entryValue; 3714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // The last part of the fully qualified path, e.g. afTrigger 3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin const char *getTagName() const { 3744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_name(metadataTag) ?: "NULL"; 3754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 3764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // e.g. TYPE_BYTE, TYPE_INT32, etc. 3784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int getTagType() const { 3794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin return get_camera_metadata_tag_type(metadataTag); 3804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin } 3814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin }; 3824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 3847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Thread for managing capture request submission to HAL device. 3857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala class RequestThread : public Thread { 3877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 3887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala public: 3897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestThread(wp<Camera3Device> parent, 391f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> statusTracker, 392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *hal3Device); 393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 3944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala void setNotificationListener(NotificationListener *listener); 3951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Call after stream (re)-configuration is completed. 398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void configurationComplete(); 400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Set or clear the list of repeating requests. Does not block 403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * on either. Use waitUntilPaused to wait until request queue 404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * has emptied out. 405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 4062d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t setRepeatingRequests(const RequestList& requests, 4072d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 4082d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 4092d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t clearRepeatingRequests(/*out*/ 4102d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 4112d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei 4122d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei status_t queueRequestList(List<sp<CaptureRequest> > &requests, 4132d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei /*out*/ 4142d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 41590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei 416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 417abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala * Remove all queued and repeating requests, and pending triggers 418abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala */ 4191754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala status_t clear(NotificationListener *listener, 4201754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala /*out*/ 4212d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t *lastFrameNumber = NULL); 422abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala 423abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala /** 4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Queue a trigger to be dispatched with the next outgoing 4254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * process_capture_request. The settings for that request only 4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * will be temporarily rewritten to add the trigger tag/value. 4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Subsequent requests will not be rewritten (for this tag). 4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTrigger(RequestTrigger trigger[], size_t count); 4304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * Pause/unpause the capture thread. Doesn't block, so use 433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala * waitUntilPaused to wait until the thread is paused. 434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala */ 435f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void setPaused(bool paused); 436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 437f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala /** 4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Wait until thread processes the capture request with settings' 4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * android.request.id == requestId. 4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * 4414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Returns TIMED_OUT in case the thread does not process the request 4424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * within the timeout. 4434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 4444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout); 4454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 4461e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin /** 447f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Shut down the thread. Shutdown is asynchronous, so thread may 448f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * still be running once this method returns. 449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 450f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala virtual void requestExit(); 451f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 4531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * Get the latest request that was sent to the HAL 4541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin * with process_capture_request. 4551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin */ 4561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata getLatestRequest() const; 4571e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin 4584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 4594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Returns true if the stream is a target of any queued or repeating 4604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * capture request 4614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 4624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream); 4634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 4647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala protected: 4657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala virtual bool threadLoop(); 4677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 4687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala private: 46942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala static int getId(const wp<Camera3Device> &device); 47042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 4714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t queueTriggerLocked(RequestTrigger trigger); 4724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Mix-in queued triggers into this request 4734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t insertTriggers(const sp<CaptureRequest> &request); 4744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Purge the queued triggers from this request, 4754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // restoring the old field values for those tags. 4764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin status_t removeTriggers(const sp<CaptureRequest> &request); 4772f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala 4782f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // HAL workaround: Make sure a trigger ID always exists if 4792f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala // a trigger does 4802f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala status_t addDummyTriggerIds(const sp<CaptureRequest> &request); 4814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 482f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala static const nsecs_t kRequestTimeout = 50e6; // 50 ms 483f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Waits for a request, or returns NULL if times out. 485f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> waitForNextRequest(); 486f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Return buffers, etc, for a request that couldn't be fully 488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // constructed. The buffers will be returned in the ERROR state 489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // to mark them as not having valid data. 490f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // All arguments will be modified. 491f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala void cleanUpFailedRequest(camera3_capture_request_t &request, 492f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> &nextRequest, 493f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Vector<camera3_stream_buffer_t> &outputBuffers); 494f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 495f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Pause handling 496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool waitIfPaused(); 49726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala void unpauseForNewRequests(); 498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 499b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala // Relay error to parent device object setErrorState 500b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala void setErrorState(const char *fmt, ...); 501b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala 5028684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold 5038684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh bool isRepeatingRequestLocked(const sp<CaptureRequest>); 5048684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh 505d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Handle AE precapture trigger cancel for devices <= CAMERA_DEVICE_API_VERSION_3_2. 506d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen void handleAePrecaptureCancelRequest(sp<CaptureRequest> request); 507d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 508f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala wp<Camera3Device> mParent; 509f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala wp<camera3::StatusTracker> mStatusTracker; 510f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala camera3_device_t *mHal3Device; 511f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 5121754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *mListener; 5131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala const int mId; // The camera ID 515f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala int mStatusId; // The RequestThread's component ID for 516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // status tracking 51742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 518f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mRequestLock; 519f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mRequestSignal; 520f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRequestQueue; 521f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala RequestList mRepeatingRequests; 522e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // The next request being prepped for submission to the HAL, no longer 523e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // on the request queue. Read-only even with mRequestLock held, outside 524e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala // of threadLoop 525e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala sp<const CaptureRequest> mNextRequest; 526f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 527f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mReconfigured; 528f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala 529f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused 530f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Mutex mPauseLock; 531f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mDoPause; 532f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mDoPauseSignal; 533f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala bool mPaused; 534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala Condition mPausedSignal; 5357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 536f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<CaptureRequest> mPrevRequest; 5374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mPrevTriggers; 5387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 53942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mFrameNumber; 5404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5411e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin mutable Mutex mLatestRequestMutex; 5424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Condition mLatestRequestSignal; 5434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // android.request.id for latest process_capture_request 5444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin int32_t mLatestRequestId; 5451e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin CameraMetadata mLatestRequest; 5464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap; 5484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin Mutex mTriggerMutex; 5494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerMap; 5504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerRemovedMap; 5514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin TriggerMap mTriggerReplacedMap; 552c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh uint32_t mCurrentAfTriggerId; 553c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh uint32_t mCurrentPreCaptureTriggerId; 554cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 5552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei int64_t mRepeatingLastFrameNumber; 556d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 557d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Whether the device supports AE lock 558d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool mAeLockAvailable; 5597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala }; 560f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala sp<RequestThread> mRequestThread; 5617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 5627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 56342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala * In-flight queue for tracking completion of capture requests. 56442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala */ 56542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 56642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala struct InFlightRequest { 56742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by notify() SHUTTER call. 56843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t shutterTimestamp; 56943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Set by process_capture_result(). 57043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen nsecs_t sensorTimestamp; 5711d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He int requestStatus; 57242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Set by process_capture_result call with valid metadata 57342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala bool haveResultMetadata; 57442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Decremented by calls to process_capture_result with valid output 575f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He // and input buffers 57642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala int numBuffersLeft; 577cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei CaptureResultExtras resultExtras; 578c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He // If this request has any input buffer 579c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He bool hasInputBuffer; 58042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 58143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // The last metadata that framework receives from HAL and 58243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // not yet send out because the shutter event hasn't arrived. 58343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // It's added by process_capture_result and sent when framework 58443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // receives the shutter event. 58543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CameraMetadata pendingMetadata; 58643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 58743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Buffers are added by process_capture_result when output buffers 58843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // return from HAL but framework has not yet received the shutter 58943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // event. They will be returned to the streams when framework receives 59043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // the shutter event. 59143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen Vector<camera3_stream_buffer_t> pendingOutputBuffers; 59243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 593d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // Used to cancel AE precapture trigger for devices doesn't support 594d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL 595d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride_t aeTriggerCancelOverride; 596d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 59743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 598204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He // Fields used by the partial result only 599204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He struct PartialResultInFlight { 600fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Set by process_capture_result once 3A has been sent to clients 601fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool haveSent3A; 602fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Result metadata collected so far, when partial results are in use 603fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala CameraMetadata collectedResult; 604fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 605204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He PartialResultInFlight(): 606fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala haveSent3A(false) { 607fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala } 608204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He } partialResult; 609fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 610f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala // Default constructor needed by KeyedVector 61142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightRequest() : 61243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp(0), 61343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp(0), 6141d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He requestStatus(OK), 61542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala haveResultMetadata(false), 616c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He numBuffersLeft(0), 617d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen hasInputBuffer(false), 618d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride({false, 0, false, 0}){ 61942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala } 620cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei 621d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput, 622d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen AeTriggerCancelOverride aeTriggerCancelOverride) : 62343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen shutterTimestamp(0), 62443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen sensorTimestamp(0), 625cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei requestStatus(OK), 626cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei haveResultMetadata(false), 627cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei numBuffersLeft(numBuffers), 628c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He resultExtras(extras), 629d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen hasInputBuffer(hasInput), 630d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen aeTriggerCancelOverride(aeTriggerCancelOverride){ 631c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He } 6324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala }; 6334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 63442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala // Map from frame number to the in-flight request state 63542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap; 63642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 63742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala Mutex mInFlightLock; // Protects mInFlightMap 63842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala InFlightMap mInFlightMap; 63942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 640cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei status_t registerInFlight(uint32_t frameNumber, 641d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, 642d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 643f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala 644f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala /** 645204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He * For the partial result, check if all 3A state fields are available 646fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * and if so, queue up 3A-only result to the client. Returns true if 3A 647fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala * is sent. 648fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala */ 649204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He bool processPartial3AResult(uint32_t frameNumber, 650cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei const CameraMetadata& partial, const CaptureResultExtras& resultExtras); 651fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 652fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala // Helpers for reading and writing 3A metadata into to/from partial results 653fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 654fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool get3AResult(const CameraMetadata& result, int32_t tag, 655cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei T* value, uint32_t frameNumber); 656fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala 657fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala template<typename T> 658fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value, 659cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei uint32_t frameNumber); 660d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 661d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen /** 662d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * Override result metadata for cancelling AE precapture trigger applied in 663d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen * handleAePrecaptureCancelRequest(). 664d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen */ 665d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen void overrideResultForPrecaptureCancel(CameraMetadata* result, 666d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 667d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen 668fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala /** 669f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Tracking for idle detection 670f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala */ 671f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala sp<camera3::StatusTracker> mStatusTracker; 67242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala 67342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala /** 6744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Thread for preparing streams 6754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 6764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala class PreparerThread : private Thread, public virtual RefBase { 6774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala public: 6784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala PreparerThread(); 6794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala ~PreparerThread(); 6804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala void setNotificationListener(NotificationListener *listener); 6824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 6844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Queue up a stream to be prepared. Streams are processed by 6854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * a background thread in FIFO order 6864d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 6874d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t prepare(sp<camera3::Camera3StreamInterface>& stream); 6884d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6894d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 6904d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala * Cancel all current and pending stream preparation 6914d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala */ 6924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala status_t clear(); 6934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6944d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala private: 6954d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala Mutex mLock; 6964d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6974d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala virtual bool threadLoop(); 6984d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 6994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Guarded by mLock 7004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala NotificationListener *mListener; 7024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala List<sp<camera3::Camera3StreamInterface> > mPendingStreams; 7034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool mActive; 7044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala bool mCancelNow; 7054d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7064d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala // Only accessed by threadLoop and the destructor 7074d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<camera3::Camera3StreamInterface> mCurrentStream; 7094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala }; 7104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala sp<PreparerThread> mPreparerThread; 7114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala 7124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala /** 7137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala * Output result queue and current HAL device 3A state 7147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala */ 7157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala // Lock for output side of device 7177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Mutex mOutputLock; 7187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** Scope for mOutputLock ****/ 720618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // the minimal frame number of the next non-reprocess result 72142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextResultFrameNumber; 722618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen // the minimal frame number of the next reprocess result 723618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen uint32_t mNextReprocessResultFrameNumber; 72442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala uint32_t mNextShutterFrameNumber; 725cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei List<CaptureResult> mResultQueue; 7267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala Condition mResultSignal; 7277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala NotificationListener *mListener; 7287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /**** End scope for mOutputLock ****/ 7307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala 7317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala /** 7327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Callback functions from HAL device 7337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 7347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void processCaptureResult(const camera3_capture_result *result); 7357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala void notify(const camera3_notify_msg *msg); 7377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7381754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala // Specific notify handlers 7391754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala void notifyError(const camera3_error_msg_t &msg, 7401754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener); 7411754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala void notifyShutter(const camera3_shutter_msg_t &msg, 7421754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala NotificationListener *listener); 7431754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala 74443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // helper function to return the output buffers to the streams. 74543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void returnOutputBuffers(const camera3_stream_buffer_t *outputBuffers, 74643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen size_t numBuffers, nsecs_t timestamp); 74743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 74843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Insert the capture result given the pending metadata, result extras, 74943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // partial results, and the frame number to the result queue. 75043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void sendCaptureResult(CameraMetadata &pendingMetadata, 75143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen CaptureResultExtras &resultExtras, 752618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen CameraMetadata &collectedPartialResult, uint32_t frameNumber, 753d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen bool reprocess, const AeTriggerCancelOverride_t &aeTriggerCancelOverride); 75443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 75543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen /**** Scope for mInFlightLock ****/ 75643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 75743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // Remove the in-flight request of the given index from mInFlightMap 75843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen // if it's no longer needed. It must only be called with mInFlightLock held. 75943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen void removeInFlightRequestIfReadyLocked(int idx); 76043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 76143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen /**** End scope for mInFlightLock ****/ 76243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen 7637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala /** 7647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Static callback forwarding methods from HAL to instance 7657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */ 7667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_process_capture_result_t sProcessCaptureResult; 7677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala static callbacks_notify_t sNotify; 7697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device 7717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android 7737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala 7747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif 775