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