Camera3ZslStream.h revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/*
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright (C) 2013 The Android Open Source Project
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * you may not use this file except in compliance with the License.
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * You may obtain a copy of the License at
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * See the License for the specific language governing permissions and
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * limitations under the License.
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define ANDROID_SERVERS_CAMERA3_ZSL_STREAM_H
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <utils/RefBase.h>
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <gui/Surface.h>
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <gui/RingBufferConsumer.h>
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "Camera3OutputStream.h"
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace android {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace camera3 {
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * A class for managing a single opaque ZSL stream to/from the camera device.
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * This acts as a bidirectional stream at the HAL layer, caching and discarding
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * most output buffers, and when directed, pushes a buffer back to the HAL for
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * processing.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Camera3ZslStream :
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        public Camera3OutputStream {
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  public:
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     * Set up a ZSL stream of a given resolution. Depth is the number of buffers
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * cached within the stream that can be retrieved for input.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Camera3ZslStream(int id, uint32_t width, uint32_t height, int depth);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~Camera3ZslStream();
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void     dump(int fd, const Vector<String16> &args) const;
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE };
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * Locate a buffer matching this timestamp in the RingBufferConsumer,
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     * and mark it to be queued at the next getInputBufferLocked invocation.
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     *
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch     * Errors: Returns NO_BUFFER_AVAILABLE if we could not find a match.
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     *
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch     */
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    status_t enqueueInputBufferByTimestamp(nsecs_t timestamp,
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                           nsecs_t* actualTimestamp);
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    /**
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch     * Clears the buffers that can be used by enqueueInputBufferByTimestamp
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     */
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    status_t clearInputRingBuffer();
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  protected:
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /**
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Camera3OutputStreamInterface implementation
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     */
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    status_t setTransform(int transform);
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  private:
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int mDepth;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Input buffers pending to be queued into HAL
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    List<sp<RingBufferConsumer::PinnedBufferItem> > mInputBufferQueue;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    sp<RingBufferConsumer>                          mProducer;
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Input buffers in flight to HAL
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Vector<sp<RingBufferConsumer::PinnedBufferItem> > mBuffersInFlight;
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    /**
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)     * Camera3Stream interface
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     */
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // getInputBuffer/returnInputBuffer operate the input stream side of the
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // ZslStream.
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual status_t returnInputBufferLocked(
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            const camera3_stream_buffer &buffer);
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Actual body to return either input or output buffers
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    virtual status_t returnBufferCheckedLocked(
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            const camera3_stream_buffer &buffer,
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            nsecs_t timestamp,
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            bool output,
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            /*out*/
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            sp<Fence> *releaseFenceOut);
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; // class Camera3ZslStream
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; // namespace camera3
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; // namespace android
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch