GraphicBufferListener.h revision e7f4e676bb88b17241d71731f9ea50c18cfcb039
1e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith/*
2e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * Copyright (C) 2014 The Android Open Source Project
3e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith *
4e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * Licensed under the Apache License, Version 2.0 (the "License");
5e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * you may not use this file except in compliance with the License.
6e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * You may obtain a copy of the License at
7e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith *
8e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith *      http://www.apache.org/licenses/LICENSE-2.0
9e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith *
10e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * Unless required by applicable law or agreed to in writing, software
11e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * distributed under the License is distributed on an "AS IS" BASIS,
12e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * See the License for the specific language governing permissions and
14e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith * limitations under the License.
15e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith */
16e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
17e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith#ifndef GRAPHIC_BUFFER_LISTENER_H_
18e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith#define GRAPHIC_BUFFER_LISTENER_H_
19e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
20e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith#include <gui/BufferQueue.h>
21e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
22e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithnamespace android {
23e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
24e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithstruct AMessage;
25e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
26e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithstruct GraphicBufferListener : public BufferQueue::ConsumerListener {
27e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithpublic:
28e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    GraphicBufferListener() {};
29e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
30e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    status_t init(
31e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith            const sp<AMessage> &notify,
32e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith            size_t bufferWidth, size_t bufferHeight, size_t bufferCount);
33e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
34e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    virtual void onFrameAvailable();
35e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    virtual void onBuffersReleased();
36e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    virtual void onSidebandStreamChanged();
37e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
38e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // Returns the handle to the producer side of the BufferQueue.  Buffers
39e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // queued on this will be received by GraphicBufferListener.
40e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<IGraphicBufferProducer> getIGraphicBufferProducer() const {
41e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith        return mProducer;
42e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    }
43e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
44e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    BufferQueue::BufferItem getBufferItem();
45e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<GraphicBuffer> getBuffer(BufferQueue::BufferItem item);
46e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    status_t releaseBuffer(BufferQueue::BufferItem item);
47e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
48e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    enum {
49e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith        kWhatFrameAvailable = 'frav',
50e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    };
51e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
52e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smithprivate:
53e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<AMessage> mNotify;
54e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    size_t mNumFramesAvailable;
55e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
56e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    mutable Mutex mMutex;
57e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
58e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // Our BufferQueue interfaces. mProducer is passed to the producer through
59e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // getIGraphicBufferProducer, and mConsumer is used internally to retrieve
60e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // the buffers queued by the producer.
61e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<IGraphicBufferProducer> mProducer;
62e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<IGraphicBufferConsumer> mConsumer;
63e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
64e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    // Cache of GraphicBuffers from the buffer queue.
65e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith    sp<GraphicBuffer> mBufferSlot[BufferQueue::NUM_BUFFER_SLOTS];
66e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith};
67e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
68e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith}   // namespace android
69e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith
70e7f4e676bb88b17241d71731f9ea50c18cfcb039David Smith#endif  // GRAPHIC_BUFFER_LISTENER_H
71