Camera2Device.h revision 69230df9905534cda15becd44c0109874c4be5f0
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"
302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "camera2/CameraMetadata.h"
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalaclass Camera2Device : public virtual RefBase {
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  public:
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    typedef camera2::CameraMetadata CameraMetadata;
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
38f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Camera2Device(int id);
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    ~Camera2Device();
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t initialize(camera_module_t *module);
43f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t dump(int fd, const Vector<String16>& args);
453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    /**
47cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * The device's static characteristics metadata buffer
483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala     */
49cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    const CameraMetadata& info() const;
506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
51d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
52d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for capture. The Camera2Device takes ownership of the
53d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer.
54d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
55cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t capture(CameraMetadata &request);
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for streaming. The Camera2Device makes a copy of the
59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer and the caller retains ownership.
60d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
61cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t setStreamingRequest(const CameraMetadata &request);
62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    /**
64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * Clear the streaming request slot.
65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     */
66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t clearStreamingRequest();
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
68d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
69d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create an output stream of the requested size and format.
70d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
71d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device selects
72d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * an appropriate format; it can be queried with getStreamInfo.
73d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
74d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must be
75d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * equal to the size in bytes of the buffers to allocate for the stream. For
76d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * other formats, the size parameter is ignored.
77d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t createStream(sp<ANativeWindow> consumer,
79d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            int *id);
816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
82d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Create an input reprocess stream that uses buffers from an existing
8469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * output stream.
8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
8669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t createReprocessStreamFromStream(int outputId, int *id);
8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
8869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
89d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Get information about a given stream.
90d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
91d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t getStreamInfo(int id,
92d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
93d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
94d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
95c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     * Set stream gralloc buffer transform
96c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     */
97c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t setStreamTransform(int id, int transform);
98c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
99c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    /**
100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Delete stream. Must not be called if there are requests in flight which
101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * reference that stream.
102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
1036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t deleteStream(int id);
1046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Delete reprocess stream. Must not be called if there are requests in
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * flight which reference that stream.
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t deleteReprocessStream(int id);
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
112d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create a metadata buffer with fields that the HAL device believes are
113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * best for the given use case
114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
115cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t createDefaultRequest(int templateId, CameraMetadata *request);
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
118d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Wait until all requests have been processed. Returns INVALID_OPERATION if
119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * the streaming slot is not empty, or TIMED_OUT if the requests haven't
120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * finished processing in 10 seconds.
121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t waitUntilDrained();
123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
124160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
125160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Abstract class for HAL notification listeners
126160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
127160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    class NotificationListener {
128160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      public:
129160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        // Refer to the Camera2 HAL definition for notification definitions
130160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyError(int errorCode, int arg1, int arg2) = 0;
131160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyShutter(int frameNumber, nsecs_t timestamp) = 0;
132160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoFocus(uint8_t newState, int triggerId) = 0;
133160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoExposure(uint8_t newState, int triggerId) = 0;
134160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId) = 0;
135160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      protected:
136160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual ~NotificationListener();
137160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    };
138160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
139160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
140160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Connect HAL notifications to a listener. Overwrites previous
141160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * listener. Set to NULL to stop receiving notifications.
142160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
143160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t setNotifyCallback(NotificationListener *listener);
144160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
145174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
146c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * Wait for a new frame to be produced, with timeout in nanoseconds.
147c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * Returns TIMED_OUT when no frame produced within the specified duration
1488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
149c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    status_t waitForNextFrame(nsecs_t timeout);
1508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
1528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * Get next metadata frame from the frame queue. Returns NULL if the queue
1538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * is empty; caller takes ownership of the metadata buffer.
1548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
155cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t getNextFrame(CameraMetadata *frame);
1568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
158174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger auto-focus. The latest ID used in a trigger autofocus or cancel
159174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
160174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
161174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
162174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerAutofocus(uint32_t id);
163174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
164174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
165174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Cancel auto-focus. The latest ID used in a trigger autofocus/cancel
166174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
167174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
168174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
169174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerCancelAutofocus(uint32_t id);
170174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
171174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
172174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger pre-capture metering. The latest ID used in a trigger pre-capture
173174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * call will be returned by the HAL in all subsequent AE and AWB
174174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
175174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
176174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerPrecaptureMetering(uint32_t id);
177174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Abstract interface for clients that want to listen to reprocess buffer
18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * release events
18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    struct BufferReleasedListener: public virtual RefBase {
18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        virtual void onBufferReleased(buffer_handle_t *handle) = 0;
18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    };
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Push a buffer to be reprocessed into a reprocessing stream, and
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * provide a listener to call once the buffer is returned by the HAL
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t pushReprocessBuffer(int reprocessStreamId,
19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
19361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  private:
19461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
195f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const int mId;
19661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    camera2_device_t *mDevice;
19761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
198cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata mDeviceInfo;
199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    vendor_tag_query_ops_t *mVendorTagOps;
200f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
201f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Queue class for both sending requests to a camera2 device, and for
203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * receiving frames from a camera2 device.
204f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     */
205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    class MetadataQueue: public camera2_request_queue_src_ops_t,
206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                         public camera2_frame_queue_dst_ops_t {
207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      public:
208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        MetadataQueue();
209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ~MetadataQueue();
210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Interface to camera2 HAL device, either for requests (device is
212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // consumer) or for frames (device is producer)
213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t*   getToConsumerInterface();
214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        void setFromConsumerInterface(camera2_device_t *d);
215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue consumer endpoint to a camera2 device
2176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setConsumerDevice(camera2_device_t *d);
2186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue producer endpoint to a camera2 device
2196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setProducerDevice(camera2_device_t *d);
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
221f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t* getToProducerInterface();
222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Real interfaces. On enqueue, queue takes ownership of buffer pointer
224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // On dequeue, user takes ownership of buffer pointer.
225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t enqueue(camera_metadata_t *buf);
226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t dequeue(camera_metadata_t **buf, bool incrementCount = true);
227f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int      getBufferCount();
228f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t waitForBuffer(nsecs_t timeout);
229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Set repeating buffer(s); if the queue is empty on a dequeue call, the
231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // queue copies the contents of the stream slot into the queue, and then
2326ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // dequeues the first new entry. The metadata buffers passed in are
2336ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // copied.
234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(camera_metadata_t *buf);
235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(const List<camera_metadata_t*> &bufs);
236f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
2383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      private:
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t signalConsumerLocked();
241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t freeBuffers(List<camera_metadata_t*>::iterator start,
242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                List<camera_metadata_t*>::iterator end);
243f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
244f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera2_device_t *mDevice;
245f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Mutex mMutex;
247f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Condition notEmpty;
248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mFrameCount;
250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCount;
252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mEntries;
253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mStreamSlotCount;
254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mStreamSlot;
255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool mSignalConsumer;
257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
259f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_frame_queue_dst_ops_t *q);
260f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
261f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
263f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_buffer_count(
264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_dequeue(const camera2_request_queue_src_ops_t *q,
267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t **buffer);
268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
269f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_free(const camera2_request_queue_src_ops_t *q,
270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *old_buffer);
271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_dequeue(const camera2_frame_queue_dst_ops_t *q,
273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                size_t entries, size_t bytes,
274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t **buffer);
275f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_cancel(const camera2_frame_queue_dst_ops_t *q,
277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *old_buffer);
278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_enqueue(const camera2_frame_queue_dst_ops_t *q,
280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *filled_buffer);
281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }; // class MetadataQueue
283f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mRequestQueue;
285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mFrameQueue;
286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    /**
2886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
2896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
2906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     */
2916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    class StreamAdapter: public camera2_stream_ops, public virtual RefBase {
2926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      public:
2936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        StreamAdapter(camera2_device_t *d);
2946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ~StreamAdapter();
2966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
297d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        /**
298d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Create a HAL device stream of the requested size and format.
299d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
300d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device
301d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * selects an appropriate format; it can be queried with getFormat.
302d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
303d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must
304d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * be equal to the size in bytes of the buffers to allocate for the
305d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * stream. For other formats, the size parameter is ignored.
306d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
3076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t connectToDevice(sp<ANativeWindow> consumer,
308d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                uint32_t width, uint32_t height, int format, size_t size);
3096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        status_t release();
3116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
312c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        status_t setTransform(int transform);
313c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Get stream parameters.
315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Only valid after a successful connectToDevice call.
316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        int      getId() const     { return mId; }
317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
318d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
319d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
3206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        // Dump stream information
3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
3233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      private:
3256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        enum {
3266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ERROR = -1,
3279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            RELEASED = 0,
3286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALLOCATED,
3296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            CONNECTED,
3306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ACTIVE
3316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } mState;
3326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
3346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera2_device_t *mDevice;
3356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mId;
3376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mWidth;
3386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mHeight;
3396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mFormat;
340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t   mSize;
3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mUsage;
3426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxProducerBuffers;
3436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxConsumerBuffers;
3443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mTotalBuffers;
3456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int mFormatRequested;
3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        /** Debugging information */
3483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mActiveBuffers;
3493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mFrameCount;
3503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int64_t  mLastTimestamp;
3513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops *getStreamOps();
3536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static ANativeWindow* toANW(const camera2_stream_ops_t *w);
3556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int dequeue_buffer(const camera2_stream_ops_t *w,
3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t** buffer);
3586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int enqueue_buffer(const camera2_stream_ops_t* w,
3606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int64_t timestamp,
3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int cancel_buffer(const camera2_stream_ops_t* w,
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int set_crop(const camera2_stream_ops_t* w,
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int left, int top, int right, int bottom);
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }; // class StreamAdapter
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    typedef List<sp<StreamAdapter> > StreamList;
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    StreamList mStreams;
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    class ReprocessStreamAdapter: public camera2_stream_in_ops, public virtual RefBase {
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      public:
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ReprocessStreamAdapter(camera2_device_t *d);
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ~ReprocessStreamAdapter();
38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Create a HAL device reprocess stream based on an existing output stream.
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t connectToDevice(const sp<StreamAdapter> &outputStream);
38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t release();
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Push buffer into stream for reprocessing. Takes ownership until it notifies
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * that the buffer has been released
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t pushIntoStream(buffer_handle_t *handle,
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                const wp<BufferReleasedListener> &releaseListener);
39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Get stream parameters.
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Only valid after a successful connectToDevice call.
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int      getId() const     { return mId; }
40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        // Dump stream information
40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      private:
41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        enum {
41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ERROR = -1,
41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            RELEASED = 0,
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ACTIVE
41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } mState;
41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        wp<StreamAdapter> mBaseStream;
41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        struct QueueEntry {
42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *handle;
42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            wp<BufferReleasedListener> releaseListener;
42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        };
42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mQueue;
42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mInFlightQueue;
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera2_device_t *mDevice;
42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mId;
43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mWidth;
43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mHeight;
43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFormat;
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /** Debugging information */
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mActiveBuffers;
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFrameCount;
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int64_t  mLastTimestamp;
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        const camera2_stream_in_ops *getStreamOps();
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int acquire_buffer(const camera2_stream_in_ops_t *w,
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t** buffer);
44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int release_buffer(const camera2_stream_in_ops_t* w,
44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t* buffer);
44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }; // class ReprocessStreamAdapter
44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    typedef List<sp<ReprocessStreamAdapter> > ReprocessStreamList;
45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ReprocessStreamList mReprocessStreams;
45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
453160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    // Receives HAL notifications and routes them to the NotificationListener
454160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    static void notificationCallback(int32_t msg_type,
455160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext1,
456160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext2,
457160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext3,
458160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            void *user);
459160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}; // class Camera2Device
46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
46361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#endif
465