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 26 namespace android { 27 28 namespace 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 */ 36 class 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 * latestTimestamp will be filled with the largest timestamp of buffers 63 * being cleared, 0 if there is no buffer being clear. 64 */ 65 status_t clearInputRingBuffer(nsecs_t* latestTimestamp); 66 67 protected: 68 69 /** 70 * Camera3OutputStreamInterface implementation 71 */ 72 status_t setTransform(int transform); 73 74 private: 75 76 // Input buffers pending to be queued into HAL 77 List<sp<RingBufferConsumer::PinnedBufferItem> > mInputBufferQueue; 78 sp<RingBufferConsumer> mProducer; 79 80 // Input buffers in flight to HAL 81 Vector<sp<RingBufferConsumer::PinnedBufferItem> > mBuffersInFlight; 82 83 /** 84 * Camera3Stream interface 85 */ 86 87 // getInputBuffer/returnInputBuffer operate the input stream side of the 88 // ZslStream. 89 virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer); 90 virtual status_t returnInputBufferLocked( 91 const camera3_stream_buffer &buffer); 92 93 // Actual body to return either input or output buffers 94 virtual status_t returnBufferCheckedLocked( 95 const camera3_stream_buffer &buffer, 96 nsecs_t timestamp, 97 bool output, 98 /*out*/ 99 sp<Fence> *releaseFenceOut); 100 101 // Disconnet the Camera3ZslStream specific bufferQueues. 102 virtual status_t disconnectLocked(); 103 104 status_t clearInputRingBufferLocked(nsecs_t* latestTimestamp); 105 106 }; // class Camera3ZslStream 107 108 }; // namespace camera3 109 110 }; // namespace android 111 112 #endif 113