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