Camera2Device.h revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
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
317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera2Device: public CameraDeviceBase {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  public:
34f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    Camera2Device(int id);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera2Device();
374c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    /**
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * CameraDevice interface
40d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala     */
4171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t initialize(camera_module_t *module);
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16>& args);
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t capture(CameraMetadata &request);
477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamingRequest(const CameraMetadata &request);
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t clearStreamingRequest();
497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
51d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            int *id);
537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
55d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
6246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getNextFrame(CameraMetadata *frame);
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
7061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala  private:
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    const int mId;
727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    camera2_device_t *mHal2Device;
7361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata mDeviceInfo;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    vendor_tag_query_ops_t *mVendorTagOps;
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    /**
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * Queue class for both sending requests to a camera2 device, and for
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     * receiving frames from a camera2 device.
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala     */
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    class MetadataQueue: public camera2_request_queue_src_ops_t,
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                         public camera2_frame_queue_dst_ops_t {
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      public:
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        MetadataQueue();
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ~MetadataQueue();
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Interface to camera2 HAL device, either for requests (device is
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // consumer) or for frames (device is producer)
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_request_queue_src_ops_t*   getToConsumerInterface();
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        void setFromConsumerInterface(camera2_device_t *d);
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue consumer endpoint to a camera2 device
936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setConsumerDevice(camera2_device_t *d);
946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        // Connect queue producer endpoint to a camera2 device
956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t setProducerDevice(camera2_device_t *d);
966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        const camera2_frame_queue_dst_ops_t* getToProducerInterface();
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Real interfaces. On enqueue, queue takes ownership of buffer pointer
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // On dequeue, user takes ownership of buffer pointer.
101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t enqueue(camera_metadata_t *buf);
102fbd60660780839a15db9f1c78c5feecd6ba6ed09Eino-Ville Talvala        status_t dequeue(camera_metadata_t **buf, bool incrementCount = false);
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int      getBufferCount();
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t waitForBuffer(nsecs_t timeout);
1054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        // Wait until a buffer with the given ID is dequeued. Will return
1064c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        // immediately if the latest buffer dequeued has that ID.
1074c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        status_t waitForDequeue(int32_t id, nsecs_t timeout);
108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Set repeating buffer(s); if the queue is empty on a dequeue call, the
110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // queue copies the contents of the stream slot into the queue, and then
1116ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // dequeues the first new entry. The metadata buffers passed in are
1126ed1ed1b3aa6fe01a72fa1c9fea3d6946adc3048Eino-Ville Talvala        // copied.
113f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(camera_metadata_t *buf);
114f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t setStreamSlot(const List<camera_metadata_t*> &bufs);
115f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
1173297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
118f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala      private:
1196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t signalConsumerLocked();
120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        status_t freeBuffers(List<camera_metadata_t*>::iterator start,
121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                List<camera_metadata_t*>::iterator end);
122f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Mutex mMutex;
126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        Condition notEmpty;
127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mFrameCount;
1294c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        int32_t mLatestRequestId;
1304c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        Condition mNewRequestId;
131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
132f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mCount;
133f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mEntries;
134f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        int mStreamSlotCount;
135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        List<camera_metadata_t*> mStreamSlot;
136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
137f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool mSignalConsumer;
138f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_frame_queue_dst_ops_t *q);
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static MetadataQueue* getInstance(
142f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_buffer_count(
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            const camera2_request_queue_src_ops_t *q);
146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
147f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_dequeue(const camera2_request_queue_src_ops_t *q,
148f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t **buffer);
149f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
150f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int consumer_free(const camera2_request_queue_src_ops_t *q,
151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *old_buffer);
152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_dequeue(const camera2_frame_queue_dst_ops_t *q,
154f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                size_t entries, size_t bytes,
155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t **buffer);
156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_cancel(const camera2_frame_queue_dst_ops_t *q,
158f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            camera_metadata_t *old_buffer);
159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
160f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        static int producer_enqueue(const camera2_frame_queue_dst_ops_t *q,
161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                camera_metadata_t *filled_buffer);
162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }; // class MetadataQueue
164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mRequestQueue;
166f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    MetadataQueue mFrameQueue;
167f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    /**
1696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
1706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
1716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala     */
1726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    class StreamAdapter: public camera2_stream_ops, public virtual RefBase {
1736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      public:
1746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        StreamAdapter(camera2_device_t *d);
1756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ~StreamAdapter();
1776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
178d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        /**
179d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * Create a HAL device stream of the requested size and format.
180d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
181d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, then the HAL device
182d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * selects an appropriate format; it can be queried with getFormat.
183d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         *
184d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * If format is HAL_PIXEL_FORMAT_COMPRESSED, the size parameter must
185d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * be equal to the size in bytes of the buffers to allocate for the
186d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         * stream. For other formats, the size parameter is ignored.
187d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala         */
1886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        status_t connectToDevice(sp<ANativeWindow> consumer,
189d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                uint32_t width, uint32_t height, int format, size_t size);
1906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        status_t release();
1926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
193c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        status_t setTransform(int transform);
194c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Get stream parameters.
196d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Only valid after a successful connectToDevice call.
197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        int      getId() const     { return mId; }
198d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
199d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
2016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2023297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        // Dump stream information
2033297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
2043297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala      private:
2066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        enum {
2076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ERROR = -1,
2089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            RELEASED = 0,
2096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALLOCATED,
2106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            CONNECTED,
2116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ACTIVE
2126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        } mState;
2136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
2157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
2166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mId;
2186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mWidth;
2196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mHeight;
2206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mFormat;
221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t   mSize;
2226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mUsage;
2236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxProducerBuffers;
2246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        uint32_t mMaxConsumerBuffers;
2253297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mTotalBuffers;
2266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        int mFormatRequested;
2276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        /** Debugging information */
2293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mActiveBuffers;
2303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        uint32_t mFrameCount;
2313297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        int64_t  mLastTimestamp;
2323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const camera2_stream_ops *getStreamOps();
2346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static ANativeWindow* toANW(const camera2_stream_ops_t *w);
2366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int dequeue_buffer(const camera2_stream_ops_t *w,
2386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t** buffer);
2396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int enqueue_buffer(const camera2_stream_ops_t* w,
2416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int64_t timestamp,
2426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
2436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int cancel_buffer(const camera2_stream_ops_t* w,
2456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                buffer_handle_t* buffer);
2466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        static int set_crop(const camera2_stream_ops_t* w,
2486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                int left, int top, int right, int bottom);
2496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }; // class StreamAdapter
2506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    typedef List<sp<StreamAdapter> > StreamList;
2526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    StreamList mStreams;
2536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    /**
25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Adapter from an ANativeWindow interface to camera2 device stream ops.
25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     * Also takes care of allocating/deallocating stream in device interface
25769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala     */
25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    class ReprocessStreamAdapter: public camera2_stream_in_ops, public virtual RefBase {
25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      public:
26069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ReprocessStreamAdapter(camera2_device_t *d);
26169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ~ReprocessStreamAdapter();
26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Create a HAL device reprocess stream based on an existing output stream.
26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t connectToDevice(const sp<StreamAdapter> &outputStream);
26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t release();
27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Push buffer into stream for reprocessing. Takes ownership until it notifies
27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * that the buffer has been released
27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t pushIntoStream(buffer_handle_t *handle,
27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                const wp<BufferReleasedListener> &releaseListener);
27769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /**
27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Get stream parameters.
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         * Only valid after a successful connectToDevice call.
28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala         */
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int      getId() const     { return mId; }
28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getWidth() const  { return mWidth; }
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getHeight() const { return mHeight; }
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t getFormat() const { return mFormat; }
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        // Dump stream information
28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        status_t dump(int fd, const Vector<String16>& args);
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala      private:
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        enum {
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ERROR = -1,
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            RELEASED = 0,
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ACTIVE
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } mState;
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<ANativeWindow> mConsumerInterface;
29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        wp<StreamAdapter> mBaseStream;
29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        struct QueueEntry {
30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            buffer_handle_t *handle;
30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            wp<BufferReleasedListener> releaseListener;
30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        };
30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mQueue;
30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        List<QueueEntry> mInFlightQueue;
30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        camera2_device_t *mHal2Device;
31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mId;
31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mWidth;
31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mHeight;
31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFormat;
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        /** Debugging information */
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mActiveBuffers;
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        uint32_t mFrameCount;
31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        int64_t  mLastTimestamp;
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        const camera2_stream_in_ops *getStreamOps();
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int acquire_buffer(const camera2_stream_in_ops_t *w,
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t** buffer);
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        static int release_buffer(const camera2_stream_in_ops_t* w,
32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                buffer_handle_t* buffer);
32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }; // class ReprocessStreamAdapter
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    typedef List<sp<ReprocessStreamAdapter> > ReprocessStreamList;
33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ReprocessStreamList mReprocessStreams;
33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    // Receives HAL notifications and routes them to the NotificationListener
335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    static void notificationCallback(int32_t msg_type,
336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext1,
337160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext2,
338160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            int32_t ext3,
339160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            void *user);
340160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}; // class Camera2Device
34261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}; // namespace android
34461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#endif
346