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);
4398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    status_t disconnect();
44f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
453297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t dump(int fd, const Vector<String16>& args);
463297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    /**
48cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * The device's static characteristics metadata buffer
493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala     */
50cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    const CameraMetadata& info() const;
516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
52d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
53d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for capture. The Camera2Device takes ownership of the
54d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer.
55d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
56cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t capture(CameraMetadata &request);
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
59d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Submit request for streaming. The Camera2Device makes a copy of the
60d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * passed-in buffer and the caller retains ownership.
61d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
62cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t setStreamingRequest(const CameraMetadata &request);
63cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
64cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    /**
65cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     * Clear the streaming request slot.
66cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala     */
67cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t clearStreamingRequest();
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
69d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala     * Wait until a request with the given ID has been dequeued by the
714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala     * HAL. Returns TIMED_OUT if the timeout duration is reached. Returns
724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala     * immediately if the latest request received by the HAL has this id.
734865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala     */
744865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
754865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
764865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    /**
77d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create an output stream of the requested size and format.
78d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
79d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device selects
80d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * an appropriate format; it can be queried with getStreamInfo.
81d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     *
82d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must be
83d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * equal to the size in bytes of the buffers to allocate for the stream. For
84d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * other formats, the size parameter is ignored.
85d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t createStream(sp<ANativeWindow> consumer,
87d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            int *id);
896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
90d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Create an input reprocess stream that uses buffers from an existing
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * output stream.
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t createReprocessStreamFromStream(int outputId, int *id);
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
97d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Get information about a given stream.
98d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
99d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t getStreamInfo(int id,
100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
103c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     * Set stream gralloc buffer transform
104c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala     */
105c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    status_t setStreamTransform(int id, int transform);
106c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
107c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    /**
108d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Delete stream. Must not be called if there are requests in flight which
109d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * reference that stream.
110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
1116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t deleteStream(int id);
1126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Delete reprocess stream. Must not be called if there are requests in
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * flight which reference that stream.
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t deleteReprocessStream(int id);
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Create a metadata buffer with fields that the HAL device believes are
121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * best for the given use case
122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
123cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t createDefaultRequest(int templateId, CameraMetadata *request);
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    /**
126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * Wait until all requests have been processed. Returns INVALID_OPERATION if
127d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * the streaming slot is not empty, or TIMED_OUT if the requests haven't
128d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     * finished processing in 10 seconds.
129d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
130d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t waitUntilDrained();
131d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
132160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
133160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Abstract class for HAL notification listeners
134160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
135160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    class NotificationListener {
136160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      public:
137160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        // Refer to the Camera2 HAL definition for notification definitions
138160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyError(int errorCode, int arg1, int arg2) = 0;
139160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyShutter(int frameNumber, nsecs_t timestamp) = 0;
140160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoFocus(uint8_t newState, int triggerId) = 0;
141160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoExposure(uint8_t newState, int triggerId) = 0;
142160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual void notifyAutoWhitebalance(uint8_t newState, int triggerId) = 0;
143160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala      protected:
144160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala        virtual ~NotificationListener();
145160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    };
146160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
147160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    /**
148160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * Connect HAL notifications to a listener. Overwrites previous
149160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     * listener. Set to NULL to stop receiving notifications.
150160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala     */
151160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    status_t setNotifyCallback(NotificationListener *listener);
152160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
153174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
154c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * Wait for a new frame to be produced, with timeout in nanoseconds.
155c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala     * Returns TIMED_OUT when no frame produced within the specified duration
1568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
157c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    status_t waitForNextFrame(nsecs_t timeout);
1588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
1608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * Get next metadata frame from the frame queue. Returns NULL if the queue
1618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     * is empty; caller takes ownership of the metadata buffer.
1628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala     */
163cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    status_t getNextFrame(CameraMetadata *frame);
1648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    /**
166174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger auto-focus. The latest ID used in a trigger autofocus or cancel
167174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
168174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
169174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
170174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerAutofocus(uint32_t id);
171174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
172174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
173174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Cancel auto-focus. The latest ID used in a trigger autofocus/cancel
174174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * autofocus call will be returned by the HAL in all subsequent AF
175174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
176174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
177174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerCancelAutofocus(uint32_t id);
178174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
179174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    /**
180174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * Trigger pre-capture metering. The latest ID used in a trigger pre-capture
181174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * call will be returned by the HAL in all subsequent AE and AWB
182174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     * notifications.
183174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala     */
184174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    status_t triggerPrecaptureMetering(uint32_t id);
185174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Abstract interface for clients that want to listen to reprocess buffer
188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * release events
189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    struct BufferReleasedListener: public virtual RefBase {
191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        virtual void onBufferReleased(buffer_handle_t *handle) = 0;
192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    };
193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
195da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Push a buffer to be reprocessed into a reprocessing stream, and
196da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * provide a listener to call once the buffer is returned by the HAL
197da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
198da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t pushReprocessBuffer(int reprocessStreamId,
199da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
200da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
20161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  private:
202f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const int mId;
20361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    camera2_device_t *mDevice;
20461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
205cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata mDeviceInfo;
206f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    vendor_tag_query_ops_t *mVendorTagOps;
207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
208f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
209f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Queue class for both sending requests to a camera2 device, and for
210f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * receiving frames from a camera2 device.
211f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     */
212f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    class MetadataQueue: public camera2_request_queue_src_ops_t,
213f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                         public camera2_frame_queue_dst_ops_t {
214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      public:
215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        MetadataQueue();
216f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ~MetadataQueue();
217f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
218f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Interface to camera2 HAL device, either for requests (device is
219f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // consumer) or for frames (device is producer)
220f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t*   getToConsumerInterface();
221f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        void setFromConsumerInterface(camera2_device_t *d);
222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue consumer endpoint to a camera2 device
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setConsumerDevice(camera2_device_t *d);
2256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue producer endpoint to a camera2 device
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setProducerDevice(camera2_device_t *d);
2276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
228f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t* getToProducerInterface();
229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
230f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Real interfaces. On enqueue, queue takes ownership of buffer pointer
231f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // On dequeue, user takes ownership of buffer pointer.
232f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t enqueue(camera_metadata_t *buf);
233547173205b3fd909dd72b597f6372840c38460e4Eino-Ville Talvala        status_t dequeue(camera_metadata_t **buf, bool incrementCount = false);
234f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int      getBufferCount();
235f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t waitForBuffer(nsecs_t timeout);
2364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        // Wait until a buffer with the given ID is dequeued. Will return
2374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        // immediately if the latest buffer dequeued has that ID.
2384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        status_t waitForDequeue(int32_t id, nsecs_t timeout);
239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
240f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Set repeating buffer(s); if the queue is empty on a dequeue call, the
241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // queue copies the contents of the stream slot into the queue, and then
2426ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // dequeues the first new entry. The metadata buffers passed in are
2436ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // copied.
244f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(camera_metadata_t *buf);
245f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(const List<camera_metadata_t*> &bufs);
246f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
2483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      private:
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t signalConsumerLocked();
251f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t freeBuffers(List<camera_metadata_t*>::iterator start,
252f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                List<camera_metadata_t*>::iterator end);
253f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
254f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        camera2_device_t *mDevice;
255f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Mutex mMutex;
257f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Condition notEmpty;
258f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
259f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mFrameCount;
2604865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        int32_t mLatestRequestId;
2614865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        Condition mNewRequestId;
262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
263f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCount;
264f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mEntries;
265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mStreamSlotCount;
266f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mStreamSlot;
267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool mSignalConsumer;
269f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
270f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
271f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_frame_queue_dst_ops_t *q);
272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
273f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
274f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
275f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_buffer_count(
276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_dequeue(const camera2_request_queue_src_ops_t *q,
279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t **buffer);
280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
281f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_free(const camera2_request_queue_src_ops_t *q,
282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *old_buffer);
283f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_dequeue(const camera2_frame_queue_dst_ops_t *q,
285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                size_t entries, size_t bytes,
286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t **buffer);
287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_cancel(const camera2_frame_queue_dst_ops_t *q,
289f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *old_buffer);
290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_enqueue(const camera2_frame_queue_dst_ops_t *q,
292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *filled_buffer);
293f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }; // class MetadataQueue
295f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mRequestQueue;
297f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mFrameQueue;
298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    /**
3006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
3016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
3026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     */
3036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    class StreamAdapter: public camera2_stream_ops, public virtual RefBase {
3046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      public:
3056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        StreamAdapter(camera2_device_t *d);
3066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ~StreamAdapter();
3086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
309d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        /**
310d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Create a HAL device stream of the requested size and format.
311d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
312d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device
313d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * selects an appropriate format; it can be queried with getFormat.
314d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
315d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must
316d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * be equal to the size in bytes of the buffers to allocate for the
317d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * stream. For other formats, the size parameter is ignored.
318d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
3196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t connectToDevice(sp<ANativeWindow> consumer,
320d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                uint32_t width, uint32_t height, int format, size_t size);
3216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        status_t release();
3236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
324c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        status_t setTransform(int transform);
325c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
326d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Get stream parameters.
327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Only valid after a successful connectToDevice call.
328d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        int      getId() const     { return mId; }
329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
330d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
3326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        // Dump stream information
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      private:
3376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        enum {
3386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ERROR = -1,
3399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            RELEASED = 0,
3406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALLOCATED,
3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            CONNECTED,
3426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ACTIVE
3436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } mState;
3446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
3466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        camera2_device_t *mDevice;
3476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mId;
3496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mWidth;
3506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mHeight;
3516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mFormat;
352d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t   mSize;
3536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mUsage;
3546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxProducerBuffers;
3556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxConsumerBuffers;
3563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mTotalBuffers;
3576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int mFormatRequested;
3586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        /** Debugging information */
3603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mActiveBuffers;
3613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mFrameCount;
3623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int64_t  mLastTimestamp;
3633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops *getStreamOps();
3656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static ANativeWindow* toANW(const camera2_stream_ops_t *w);
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int dequeue_buffer(const camera2_stream_ops_t *w,
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t** buffer);
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int enqueue_buffer(const camera2_stream_ops_t* w,
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int64_t timestamp,
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int cancel_buffer(const camera2_stream_ops_t* w,
3766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
3776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int set_crop(const camera2_stream_ops_t* w,
3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int left, int top, int right, int bottom);
3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }; // class StreamAdapter
3816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    typedef List<sp<StreamAdapter> > StreamList;
3836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    StreamList mStreams;
3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    /**
386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala     */
389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    class ReprocessStreamAdapter: public camera2_stream_in_ops, public virtual RefBase {
390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala      public:
391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ReprocessStreamAdapter(camera2_device_t *d);
392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ~ReprocessStreamAdapter();
394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        /**
396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * Create a HAL device reprocess stream based on an existing output stream.
397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         */
398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        status_t connectToDevice(const sp<StreamAdapter> &outputStream);
399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        status_t release();
401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        /**
403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * Push buffer into stream for reprocessing. Takes ownership until it notifies
404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * that the buffer has been released
405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         */
406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        status_t pushIntoStream(buffer_handle_t *handle,
407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                const wp<BufferReleasedListener> &releaseListener);
408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        /**
410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * Get stream parameters.
411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         * Only valid after a successful connectToDevice call.
412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala         */
413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        int      getId() const     { return mId; }
414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        // Dump stream information
419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala      private:
422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        enum {
423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ERROR = -1,
424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            RELEASED = 0,
425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ACTIVE
426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } mState;
427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<StreamAdapter> mBaseStream;
430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        struct QueueEntry {
432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            buffer_handle_t *handle;
433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            wp<BufferReleasedListener> releaseListener;
434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        };
435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        List<QueueEntry> mQueue;
437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        List<QueueEntry> mInFlightQueue;
439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        camera2_device_t *mDevice;
441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mId;
443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mWidth;
444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mHeight;
445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mFormat;
446da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
447da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        /** Debugging information */
448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mActiveBuffers;
449da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint32_t mFrameCount;
450da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        int64_t  mLastTimestamp;
451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        const camera2_stream_in_ops *getStreamOps();
453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        static int acquire_buffer(const camera2_stream_in_ops_t *w,
455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                buffer_handle_t** buffer);
456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        static int release_buffer(const camera2_stream_in_ops_t* w,
458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                buffer_handle_t* buffer);
459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }; // class ReprocessStreamAdapter
461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    typedef List<sp<ReprocessStreamAdapter> > ReprocessStreamList;
463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ReprocessStreamList mReprocessStreams;
464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
465160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    // Receives HAL notifications and routes them to the NotificationListener
466160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    static void notificationCallback(int32_t msg_type,
467160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext1,
468160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext2,
469160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext3,
470160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            void *user);
471160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
472f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}; // class Camera2Device
47361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
47561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
47661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#endif
477