16b091c53000c843211c218ce40287a7edca9bc63Daniel Lam/*
26b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Copyright (C) 2012 The Android Open Source Project
36b091c53000c843211c218ce40287a7edca9bc63Daniel Lam *
46b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Licensed under the Apache License, Version 2.0 (the "License");
56b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * you may not use this file except in compliance with the License.
66b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * You may obtain a copy of the License at
76b091c53000c843211c218ce40287a7edca9bc63Daniel Lam *
86b091c53000c843211c218ce40287a7edca9bc63Daniel Lam *      http://www.apache.org/licenses/LICENSE-2.0
96b091c53000c843211c218ce40287a7edca9bc63Daniel Lam *
106b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * Unless required by applicable law or agreed to in writing, software
116b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * distributed under the License is distributed on an "AS IS" BASIS,
126b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * See the License for the specific language governing permissions and
146b091c53000c843211c218ce40287a7edca9bc63Daniel Lam * limitations under the License.
156b091c53000c843211c218ce40287a7edca9bc63Daniel Lam */
166b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
176b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#define LOG_TAG "BufferQueue"
181c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS
19fa5b40ebb8923133df12dc70591bfe35b3f1c9b3Jamie Gennis//#define LOG_NDEBUG 0
206b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
216b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#include <gui/BufferQueue.h>
22e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueConsumer.h>
233e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/BufferQueueCore.h>
24e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueProducer.h>
256b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
263e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozanamespace android {
276b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
283e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::ProxyConsumerListener(
293e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        const wp<ConsumerListener>& consumerListener):
303e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        mConsumerListener(consumerListener) {}
31546ed2d7d98ce4f1415647913a231a6b4fc6ca66Mathias Agopian
323e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}
336b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
348dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameAvailable(
358dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza        const android::BufferItem& item) {
363e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
373e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    if (listener != NULL) {
388dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza        listener->onFrameAvailable(item);
393e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    }
406b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}
416b091c53000c843211c218ce40287a7edca9bc63Daniel Lam
423e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozavoid BufferQueue::ProxyConsumerListener::onBuffersReleased() {
433e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
443e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza    if (listener != NULL) {
453e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza        listener->onBuffersReleased();
46cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis    }
47cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis}
48cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis
49e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stozavoid BufferQueue::ProxyConsumerListener::onSidebandStreamChanged() {
50e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    sp<ConsumerListener> listener(mConsumerListener.promote());
51e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    if (listener != NULL) {
52e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza        listener->onSidebandStreamChanged();
53e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza    }
54e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza}
55e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza
56f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stozavoid BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
57f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza        sp<IGraphicBufferConsumer>* outConsumer,
58f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza        const sp<IGraphicBufferAlloc>& allocator) {
59f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza    LOG_ALWAYS_FATAL_IF(outProducer == NULL,
60f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza            "BufferQueue: outProducer must not be NULL");
61f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza    LOG_ALWAYS_FATAL_IF(outConsumer == NULL,
629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            "BufferQueue: outConsumer must not be NULL");
639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<BufferQueueCore> core(new BufferQueueCore(allocator));
65b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(core == NULL,
66b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueCore");
67b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
68b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core));
69b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(producer == NULL,
70b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueProducer");
71b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
72b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));
73b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    LOG_ALWAYS_FATAL_IF(consumer == NULL,
74b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza            "BufferQueue: failed to create BufferQueueConsumer");
75b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza
76b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    *outProducer = producer;
77b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza    *outConsumer = consumer;
789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
806b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}; // namespace android
81