18be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala/* 28be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project 38be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * 48be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 58be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * you may not use this file except in compliance with the License. 68be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * You may obtain a copy of the License at 78be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * 88be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 98be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * 108be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 118be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 128be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * See the License for the specific language governing permissions and 148be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * limitations under the License. 158be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 168be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 178be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H 188be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H 198be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 208be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <utils/RefBase.h> 218be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#include <gui/Surface.h> 22ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin#include <gui/RingBufferConsumer.h> 238be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 24ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin#include "Camera3OutputStream.h" 258be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 268be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace android { 278be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 288be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvalanamespace camera3 { 298be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 308be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala/** 318be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * A class for managing a single opaque ZSL stream to/from the camera device. 328be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * This acts as a bidirectional stream at the HAL layer, caching and discarding 338be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * most output buffers, and when directed, pushes a buffer back to the HAL for 348be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * processing. 358be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkinclass Camera3ZslStream : 37ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin public Camera3OutputStream { 388be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala public: 398be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala /** 40054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin * Set up a ZSL stream of a given resolution. bufferCount is the number of buffers 418be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * cached within the stream that can be retrieved for input. 428be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 43054aab3479a094b0a04d48db9cb8f325ea5be162Igor Murashkin Camera3ZslStream(int id, uint32_t width, uint32_t height, int bufferCount); 44ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin ~Camera3ZslStream(); 458be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 468be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala virtual void dump(int fd, const Vector<String16> &args) const; 478be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 48ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE }; 49ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 50ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin /** 51ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Locate a buffer matching this timestamp in the RingBufferConsumer, 52ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * and mark it to be queued at the next getInputBufferLocked invocation. 53ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * 54ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Errors: Returns NO_BUFFER_AVAILABLE if we could not find a match. 55ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * 56ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin */ 57ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin status_t enqueueInputBufferByTimestamp(nsecs_t timestamp, 58ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin nsecs_t* actualTimestamp); 59ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 608be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala /** 61ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Clears the buffers that can be used by enqueueInputBufferByTimestamp 626b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh * latestTimestamp will be filled with the largest timestamp of buffers 636b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh * being cleared, 0 if there is no buffer being clear. 648be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 656b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh status_t clearInputRingBuffer(nsecs_t* latestTimestamp); 668be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 67ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin protected: 68ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin 698be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala /** 70ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin * Camera3OutputStreamInterface implementation 718be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 72ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin status_t setTransform(int transform); 738be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 748be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala private: 758be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 76ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // Input buffers pending to be queued into HAL 77ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin List<sp<RingBufferConsumer::PinnedBufferItem> > mInputBufferQueue; 78ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin sp<RingBufferConsumer> mProducer; 79ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 80ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // Input buffers in flight to HAL 81ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin Vector<sp<RingBufferConsumer::PinnedBufferItem> > mBuffersInFlight; 828be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 838be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala /** 848be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala * Camera3Stream interface 858be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala */ 868be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 87ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // getInputBuffer/returnInputBuffer operate the input stream side of the 88ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin // ZslStream. 89ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer); 90ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin virtual status_t returnInputBufferLocked( 91ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin const camera3_stream_buffer &buffer); 92ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin 93ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin // Actual body to return either input or output buffers 94ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin virtual status_t returnBufferCheckedLocked( 95ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin const camera3_stream_buffer &buffer, 96ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin nsecs_t timestamp, 97ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin bool output, 98ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin /*out*/ 99ae3d0babb9c5d68b107b53d5a67193309020c556Igor Murashkin sp<Fence> *releaseFenceOut); 1000a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1010a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He // Disconnet the Camera3ZslStream specific bufferQueues. 1020a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He virtual status_t disconnectLocked(); 1030a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1046b7a2294b9e4da784cfe4b562ee1720ad606c852Yin-Chia Yeh status_t clearInputRingBufferLocked(nsecs_t* latestTimestamp); 1050a21051b91c2e07e49eb6fa568c505aee967ab9dZhijun He 1068be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // class Camera3ZslStream 1078be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 1088be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace camera3 1098be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 1108be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala}; // namespace android 1118be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala 1128be20f50711a94426f1394ec113672e41c1224e8Eino-Ville Talvala#endif 113