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
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_2_0
31f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala *
32f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * TODO for camera2 API implementation:
33f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Does not produce notifyShutter / notifyIdle callbacks to NotificationListener
34f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala * Use waitUntilDrained for idle.
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera2Device: public CameraDeviceBase {
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  public:
38f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Camera2Device(int id);
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera2Device();
414c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
424c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    /**
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * CameraDevice interface
44d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
4571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t initialize(camera_module_t *module);
477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16>& args);
497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
50cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL);
51cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t captureList(const List<const CameraMetadata> &requests,
52cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                 int64_t *lastFrameNumber = NULL);
53cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t setStreamingRequest(const CameraMetadata &request,
54cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         int64_t *lastFrameNumber = NULL);
55cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests,
56cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                             int64_t *lastFrameNumber = NULL);
57cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL);
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
6028c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He            uint32_t width, uint32_t height, int format, int *id);
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
63d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
67e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    // No-op on HAL2 devices
68e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin    virtual status_t configureStreams();
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
7246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
74cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t getNextResult(CaptureResult *frame);
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
80abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    // Flush implemented as just a wait
81cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t flush(int64_t *lastFrameNumber = NULL);
82204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    virtual uint32_t getDeviceVersion();
8328c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He    virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const;
84204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
8561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  private:
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const int mId;
877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera2_device_t *mHal2Device;
8861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata mDeviceInfo;
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
91204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    uint32_t mDeviceVersion;
92204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Queue class for both sending requests to a camera2 device, and for
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * receiving frames from a camera2 device.
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     */
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    class MetadataQueue: public camera2_request_queue_src_ops_t,
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                         public camera2_frame_queue_dst_ops_t {
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      public:
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        MetadataQueue();
101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ~MetadataQueue();
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Interface to camera2 HAL device, either for requests (device is
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // consumer) or for frames (device is producer)
105f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t*   getToConsumerInterface();
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        void setFromConsumerInterface(camera2_device_t *d);
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue consumer endpoint to a camera2 device
1096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setConsumerDevice(camera2_device_t *d);
1106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue producer endpoint to a camera2 device
1116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setProducerDevice(camera2_device_t *d);
1126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t* getToProducerInterface();
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Real interfaces. On enqueue, queue takes ownership of buffer pointer
116f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // On dequeue, user takes ownership of buffer pointer.
117f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t enqueue(camera_metadata_t *buf);
118fbd60660780839a15db9f1c78c5feecd6ba6ed09Eino-Ville Talvala        status_t dequeue(camera_metadata_t **buf, bool incrementCount = false);
119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int      getBufferCount();
120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t waitForBuffer(nsecs_t timeout);
1214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        // Wait until a buffer with the given ID is dequeued. Will return
1224c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        // immediately if the latest buffer dequeued has that ID.
1234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        status_t waitForDequeue(int32_t id, nsecs_t timeout);
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Set repeating buffer(s); if the queue is empty on a dequeue call, the
126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // queue copies the contents of the stream slot into the queue, and then
12780de5dca0b8e04f81da0d15dff957f82551eaafcChien-Yu Chen        // dequeues the first new entry. The methods take the ownership of the
12880de5dca0b8e04f81da0d15dff957f82551eaafcChien-Yu Chen        // metadata buffers passed in.
129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(camera_metadata_t *buf);
130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(const List<camera_metadata_t*> &bufs);
131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
132abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        // Clear the request queue and the streaming slot
133abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        status_t clear();
134abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
1363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      private:
1386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t signalConsumerLocked();
139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t freeBuffers(List<camera_metadata_t*>::iterator start,
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                List<camera_metadata_t*>::iterator end);
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Mutex mMutex;
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Condition notEmpty;
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mFrameCount;
1484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        int32_t mLatestRequestId;
1494c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        Condition mNewRequestId;
150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCount;
152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mEntries;
153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mStreamSlotCount;
154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mStreamSlot;
155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool mSignalConsumer;
157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_frame_queue_dst_ops_t *q);
160f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_buffer_count(
164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_dequeue(const camera2_request_queue_src_ops_t *q,
167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t **buffer);
168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
169f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_free(const camera2_request_queue_src_ops_t *q,
170f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *old_buffer);
171f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
172f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_dequeue(const camera2_frame_queue_dst_ops_t *q,
173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                size_t entries, size_t bytes,
174f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t **buffer);
175f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_cancel(const camera2_frame_queue_dst_ops_t *q,
177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *old_buffer);
178f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
179f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_enqueue(const camera2_frame_queue_dst_ops_t *q,
180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *filled_buffer);
181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
182f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }; // class MetadataQueue
183f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mRequestQueue;
185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mFrameQueue;
186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    /**
1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
1896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     */
1916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    class StreamAdapter: public camera2_stream_ops, public virtual RefBase {
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      public:
1936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        StreamAdapter(camera2_device_t *d);
1946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ~StreamAdapter();
1966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        /**
198d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Create a HAL device stream of the requested size and format.
199d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device
201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * selects an appropriate format; it can be queried with getFormat.
202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must
204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * be equal to the size in bytes of the buffers to allocate for the
205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * stream. For other formats, the size parameter is ignored.
206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
2076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t connectToDevice(sp<ANativeWindow> consumer,
208d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                uint32_t width, uint32_t height, int format, size_t size);
2096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        status_t release();
2116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
212c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        status_t setTransform(int transform);
213c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Get stream parameters.
215d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Only valid after a successful connectToDevice call.
216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        int      getId() const     { return mId; }
217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        // Dump stream information
2223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
2233297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      private:
2256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        enum {
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ERROR = -1,
2279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            RELEASED = 0,
2286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALLOCATED,
2296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            CONNECTED,
2306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ACTIVE
2316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } mState;
2326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
2347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
2356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mId;
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mWidth;
2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mHeight;
2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mFormat;
240d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t   mSize;
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mUsage;
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxProducerBuffers;
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxConsumerBuffers;
2443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mTotalBuffers;
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int mFormatRequested;
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2473297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        /** Debugging information */
2483297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mActiveBuffers;
2493297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mFrameCount;
2503297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int64_t  mLastTimestamp;
2513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops *getStreamOps();
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static ANativeWindow* toANW(const camera2_stream_ops_t *w);
2556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int dequeue_buffer(const camera2_stream_ops_t *w,
2576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t** buffer);
2586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int enqueue_buffer(const camera2_stream_ops_t* w,
2606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int64_t timestamp,
2616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
2626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int cancel_buffer(const camera2_stream_ops_t* w,
2646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
2656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int set_crop(const camera2_stream_ops_t* w,
2676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int left, int top, int right, int bottom);
2686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }; // class StreamAdapter
2696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    typedef List<sp<StreamAdapter> > StreamList;
2716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    StreamList mStreams;
2726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
27769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    class ReprocessStreamAdapter: public camera2_stream_in_ops, public virtual RefBase {
27869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      public:
27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ReprocessStreamAdapter(camera2_device_t *d);
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ~ReprocessStreamAdapter();
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Create a HAL device reprocess stream based on an existing output stream.
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t connectToDevice(const sp<StreamAdapter> &outputStream);
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t release();
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Push buffer into stream for reprocessing. Takes ownership until it notifies
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * that the buffer has been released
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t pushIntoStream(buffer_handle_t *handle,
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                const wp<BufferReleasedListener> &releaseListener);
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Get stream parameters.
29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Only valid after a successful connectToDevice call.
30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int      getId() const     { return mId; }
30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
30569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        // Dump stream information
30769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      private:
31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        enum {
31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ERROR = -1,
31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            RELEASED = 0,
31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ACTIVE
31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } mState;
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        wp<StreamAdapter> mBaseStream;
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        struct QueueEntry {
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *handle;
32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            wp<BufferReleasedListener> releaseListener;
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        };
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mQueue;
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mInFlightQueue;
32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mId;
33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mWidth;
33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mHeight;
33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFormat;
33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /** Debugging information */
33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mActiveBuffers;
33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFrameCount;
33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int64_t  mLastTimestamp;
33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        const camera2_stream_in_ops *getStreamOps();
34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int acquire_buffer(const camera2_stream_in_ops_t *w,
34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t** buffer);
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int release_buffer(const camera2_stream_in_ops_t* w,
34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t* buffer);
34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }; // class ReprocessStreamAdapter
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    typedef List<sp<ReprocessStreamAdapter> > ReprocessStreamList;
35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ReprocessStreamList mReprocessStreams;
35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
353160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    // Receives HAL notifications and routes them to the NotificationListener
354160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    static void notificationCallback(int32_t msg_type,
355160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext1,
356160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext2,
357160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext3,
358160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            void *user);
359160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}; // class Camera2Device
36161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
36361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#endif
365