Camera2Device.h revision cab96a4a7a2900fa991ab77ae45ba8d4be97e054
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA_CAMERA2DEVICE_H
1861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_CAMERA2DEVICE_H
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
20f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Condition.h>
2161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <utils/Errors.h>
223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/List.h>
233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/Mutex.h>
243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/RefBase.h>
253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/String8.h>
263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/String16.h>
273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala#include <utils/Vector.h>
283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "hardware/camera2.h"
30cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala#include "CameraMetadata.h"
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaclass Camera2Device : public virtual RefBase {
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  public:
36f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Camera2Device(int id);
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ~Camera2Device();
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t initialize(camera_module_t *module);
41f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t dump(int fd, const Vector<String16>& args);
433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    /**
45cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * The device's static characteristics metadata buffer
463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala     */
47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    const CameraMetadata& info() const;
486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
49d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
50d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for capture. The Camera2Device takes ownership of the
51d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer.
52d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
53cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t capture(CameraMetadata &request);
54d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
55d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for streaming. The Camera2Device makes a copy of the
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer and the caller retains ownership.
58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
59cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t setStreamingRequest(const CameraMetadata &request);
60cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    /**
62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * Clear the streaming request slot.
63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     */
64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t clearStreamingRequest();
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
66d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
67d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create an output stream of the requested size and format.
68d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
69d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device selects
70d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * an appropriate format; it can be queried with getStreamInfo.
71d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
72d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must be
73d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * equal to the size in bytes of the buffers to allocate for the stream. For
74d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * other formats, the size parameter is ignored.
75d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t createStream(sp<ANativeWindow> consumer,
77d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            int *id);
796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
80d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
81d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Get information about a given stream.
82d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
83d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t getStreamInfo(int id,
84d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
85d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
86d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
87c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     * Set stream gralloc buffer transform
88c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     */
89c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t setStreamTransform(int id, int transform);
90c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
91c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    /**
92d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Delete stream. Must not be called if there are requests in flight which
93d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * reference that stream.
94d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t deleteStream(int id);
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
97d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
98d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create a metadata buffer with fields that the HAL device believes are
99d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * best for the given use case
100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
101cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t createDefaultRequest(int templateId, CameraMetadata *request);
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
104d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Wait until all requests have been processed. Returns INVALID_OPERATION if
105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * the streaming slot is not empty, or TIMED_OUT if the requests haven't
106d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * finished processing in 10 seconds.
107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
108d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t waitUntilDrained();
109d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
110160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
111160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Abstract class for HAL notification listeners
112160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
113160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    class NotificationListener {
114160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      public:
115160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        // Refer to the Camera2 HAL definition for notification definitions
116160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyError(int errorCode, int arg1, int arg2) = 0;
117160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyShutter(int frameNumber, nsecs_t timestamp) = 0;
118160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoFocus(uint8_t newState, int triggerId) = 0;
119160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoExposure(uint8_t newState, int triggerId) = 0;
120160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId) = 0;
121160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      protected:
122160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual ~NotificationListener();
123160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    };
124160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
125160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
126160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Connect HAL notifications to a listener. Overwrites previous
127160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * listener. Set to NULL to stop receiving notifications.
128160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
129160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t setNotifyCallback(NotificationListener *listener);
130160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
131174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
1328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * Abstract class for HAL frame available notifications
1338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
1348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    class FrameListener {
1358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala      public:
1368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        virtual void onNewFrameAvailable() = 0;
1378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala      protected:
1388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        virtual ~FrameListener();
1398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    };
1408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
1428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * Set a frame listener to be notified about new frames.
1438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
1448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t setFrameListener(FrameListener *listener);
1458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
1478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * Get next metadata frame from the frame queue. Returns NULL if the queue
1488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * is empty; caller takes ownership of the metadata buffer.
1498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
150cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t getNextFrame(CameraMetadata *frame);
1518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
153174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger auto-focus. The latest ID used in a trigger autofocus or cancel
154174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
155174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
156174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
157174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerAutofocus(uint32_t id);
158174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
159174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
160174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Cancel auto-focus. The latest ID used in a trigger autofocus/cancel
161174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
162174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
163174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
164174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerCancelAutofocus(uint32_t id);
165174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
166174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
167174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger pre-capture metering. The latest ID used in a trigger pre-capture
168174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * call will be returned by the HAL in all subsequent AE and AWB
169174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
170174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
171174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerPrecaptureMetering(uint32_t id);
172174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
17361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  private:
17461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const int mId;
17661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    camera2_device_t *mDevice;
17761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
178cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata mDeviceInfo;
179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    vendor_tag_query_ops_t *mVendorTagOps;
180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Queue class for both sending requests to a camera2 device, and for
183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * receiving frames from a camera2 device.
184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     */
185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    class MetadataQueue: public camera2_request_queue_src_ops_t,
186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                         public camera2_frame_queue_dst_ops_t {
187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      public:
188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        MetadataQueue();
189f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ~MetadataQueue();
190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Interface to camera2 HAL device, either for requests (device is
192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // consumer) or for frames (device is producer)
193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t*   getToConsumerInterface();
194f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        void setFromConsumerInterface(camera2_device_t *d);
195f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue consumer endpoint to a camera2 device
1976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setConsumerDevice(camera2_device_t *d);
1986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue producer endpoint to a camera2 device
1996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setProducerDevice(camera2_device_t *d);
2006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
201f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t* getToProducerInterface();
202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Real interfaces. On enqueue, queue takes ownership of buffer pointer
204f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // On dequeue, user takes ownership of buffer pointer.
205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t enqueue(camera_metadata_t *buf);
206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t dequeue(camera_metadata_t **buf, bool incrementCount = true);
207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int      getBufferCount();
208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t waitForBuffer(nsecs_t timeout);
2098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        status_t setListener(FrameListener *listener);
210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Set repeating buffer(s); if the queue is empty on a dequeue call, the
212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // queue copies the contents of the stream slot into the queue, and then
2136ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // dequeues the first new entry. The metadata buffers passed in are
2146ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // copied.
215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(camera_metadata_t *buf);
216f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(const List<camera_metadata_t*> &bufs);
217f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
2193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
220f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      private:
2216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t signalConsumerLocked();
222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t freeBuffers(List<camera_metadata_t*>::iterator start,
223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                List<camera_metadata_t*>::iterator end);
224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera2_device_t *mDevice;
226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Mutex mMutex;
228f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Condition notEmpty;
229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mFrameCount;
231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
232f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCount;
233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mEntries;
234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mStreamSlotCount;
235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mStreamSlot;
236f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
237f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool mSignalConsumer;
2388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        FrameListener *mListener;
239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
240f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_frame_queue_dst_ops_t *q);
242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
244f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
245f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_buffer_count(
246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
247f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_dequeue(const camera2_request_queue_src_ops_t *q,
249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t **buffer);
250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_free(const camera2_request_queue_src_ops_t *q,
252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *old_buffer);
253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_dequeue(const camera2_frame_queue_dst_ops_t *q,
255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                size_t entries, size_t bytes,
256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t **buffer);
257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_cancel(const camera2_frame_queue_dst_ops_t *q,
259f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *old_buffer);
260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_enqueue(const camera2_frame_queue_dst_ops_t *q,
262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *filled_buffer);
263f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }; // class MetadataQueue
265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mRequestQueue;
267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mFrameQueue;
268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    /**
2706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
2716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
2726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     */
2736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    class StreamAdapter: public camera2_stream_ops, public virtual RefBase {
2746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      public:
2756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        StreamAdapter(camera2_device_t *d);
2766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ~StreamAdapter();
2786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
279d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        /**
280d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Create a HAL device stream of the requested size and format.
281d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
282d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device
283d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * selects an appropriate format; it can be queried with getFormat.
284d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
285d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must
286d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * be equal to the size in bytes of the buffers to allocate for the
287d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * stream. For other formats, the size parameter is ignored.
288d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
2896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t connectToDevice(sp<ANativeWindow> consumer,
290d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                uint32_t width, uint32_t height, int format, size_t size);
2916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        status_t release();
2936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
294c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        status_t setTransform(int transform);
295c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
296d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Get stream parameters.
297d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Only valid after a successful connectToDevice call.
298d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        int      getId() const     { return mId; }
299d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
300d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
301d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
3026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        // Dump stream information
3043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
3053297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      private:
3076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        enum {
3086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ERROR = -1,
3099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            RELEASED = 0,
3106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALLOCATED,
3116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            CONNECTED,
3126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ACTIVE
3136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } mState;
3146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
3166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera2_device_t *mDevice;
3176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mId;
3196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mWidth;
3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mHeight;
3216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mFormat;
322d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t   mSize;
3236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mUsage;
3246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxProducerBuffers;
3256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxConsumerBuffers;
3263297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mTotalBuffers;
3276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int mFormatRequested;
3286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        /** Debugging information */
3303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mActiveBuffers;
3313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mFrameCount;
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int64_t  mLastTimestamp;
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops *getStreamOps();
3356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static ANativeWindow* toANW(const camera2_stream_ops_t *w);
3376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int dequeue_buffer(const camera2_stream_ops_t *w,
3396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t** buffer);
3406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int enqueue_buffer(const camera2_stream_ops_t* w,
3426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int64_t timestamp,
3436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int cancel_buffer(const camera2_stream_ops_t* w,
3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int set_crop(const camera2_stream_ops_t* w,
3496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int left, int top, int right, int bottom);
3506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }; // class StreamAdapter
3516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    typedef List<sp<StreamAdapter> > StreamList;
3536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    StreamList mStreams;
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
355160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    // Receives HAL notifications and routes them to the NotificationListener
356160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    static void notificationCallback(int32_t msg_type,
357160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext1,
358160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext2,
359160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext3,
360160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            void *user);
361160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}; // class Camera2Device
36361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
36561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#endif
367