Camera3ZslStream.h revision 0a21051b91c2e07e49eb6fa568c505aee967ab9d
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H 18#define ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H 19 20#include <utils/RefBase.h> 21#include <gui/Surface.h> 22#include <gui/RingBufferConsumer.h> 23 24#include "Camera3OutputStream.h" 25 26namespace android { 27 28namespace camera3 { 29 30/** 31 * A class for managing a single opaque ZSL stream to/from the camera device. 32 * This acts as a bidirectional stream at the HAL layer, caching and discarding 33 * most output buffers, and when directed, pushes a buffer back to the HAL for 34 * processing. 35 */ 36class Camera3ZslStream : 37 public Camera3OutputStream { 38 public: 39 /** 40 * Set up a ZSL stream of a given resolution. bufferCount is the number of buffers 41 * cached within the stream that can be retrieved for input. 42 */ 43 Camera3ZslStream(int id, uint32_t width, uint32_t height, int bufferCount); 44 ~Camera3ZslStream(); 45 46 virtual void dump(int fd, const Vector<String16> &args) const; 47 48 enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE }; 49 50 /** 51 * Locate a buffer matching this timestamp in the RingBufferConsumer, 52 * and mark it to be queued at the next getInputBufferLocked invocation. 53 * 54 * Errors: Returns NO_BUFFER_AVAILABLE if we could not find a match. 55 * 56 */ 57 status_t enqueueInputBufferByTimestamp(nsecs_t timestamp, 58 nsecs_t* actualTimestamp); 59 60 /** 61 * Clears the buffers that can be used by enqueueInputBufferByTimestamp 62 */ 63 status_t clearInputRingBuffer(); 64 65 protected: 66 67 /** 68 * Camera3OutputStreamInterface implementation 69 */ 70 status_t setTransform(int transform); 71 72 private: 73 74 int mDepth; 75 // Input buffers pending to be queued into HAL 76 List<sp<RingBufferConsumer::PinnedBufferItem> > mInputBufferQueue; 77 sp<RingBufferConsumer> mProducer; 78 79 // Input buffers in flight to HAL 80 Vector<sp<RingBufferConsumer::PinnedBufferItem> > mBuffersInFlight; 81 82 /** 83 * Camera3Stream interface 84 */ 85 86 // getInputBuffer/returnInputBuffer operate the input stream side of the 87 // ZslStream. 88 virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer); 89 virtual status_t returnInputBufferLocked( 90 const camera3_stream_buffer &buffer); 91 92 // Actual body to return either input or output buffers 93 virtual status_t returnBufferCheckedLocked( 94 const camera3_stream_buffer &buffer, 95 nsecs_t timestamp, 96 bool output, 97 /*out*/ 98 sp<Fence> *releaseFenceOut); 99 100 // Disconnet the Camera3ZslStream specific bufferQueues. 101 virtual status_t disconnectLocked(); 102 103 status_t clearInputRingBufferLocked(); 104 105}; // class Camera3ZslStream 106 107}; // namespace camera3 108 109}; // namespace android 110 111#endif 112