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