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 21f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB 2222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai#include <gui/BufferHubConsumer.h> 2322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai#include <gui/BufferHubProducer.h> 24f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif 25f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai 266b091c53000c843211c218ce40287a7edca9bc63Daniel Lam#include <gui/BufferQueue.h> 27e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueConsumer.h> 283e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/BufferQueueCore.h> 29e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza#include <gui/BufferQueueProducer.h> 306b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 313e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozanamespace android { 326b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 333e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::ProxyConsumerListener( 343e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza const wp<ConsumerListener>& consumerListener): 353e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza mConsumerListener(consumerListener) {} 36546ed2d7d98ce4f1415647913a231a6b4fc6ca66Mathias Agopian 373e96f1982fda358424b0b75f394cbf7c1794a072Dan StozaBufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {} 386b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 395ea5e5905170f32d5cf45ad35c552d64743892c3Brian Andersonvoid BufferQueue::ProxyConsumerListener::onDisconnect() { 405ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson sp<ConsumerListener> listener(mConsumerListener.promote()); 415ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson if (listener != NULL) { 425ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson listener->onDisconnect(); 435ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson } 445ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson} 455ea5e5905170f32d5cf45ad35c552d64743892c3Brian Anderson 468dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameAvailable( 4754716317b5752010134edc64421a3f492bd608abDan Stoza const BufferItem& item) { 483e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 493e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza if (listener != NULL) { 508dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza listener->onFrameAvailable(item); 513e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza } 526b091c53000c843211c218ce40287a7edca9bc63Daniel Lam} 536b091c53000c843211c218ce40287a7edca9bc63Daniel Lam 54dc13c5b85b099050c73297a19f1ef89308f7620bDan Stozavoid BufferQueue::ProxyConsumerListener::onFrameReplaced( 55dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza const BufferItem& item) { 56dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 57dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza if (listener != NULL) { 58dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza listener->onFrameReplaced(item); 59dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza } 60dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza} 61dc13c5b85b099050c73297a19f1ef89308f7620bDan Stoza 623e96f1982fda358424b0b75f394cbf7c1794a072Dan Stozavoid BufferQueue::ProxyConsumerListener::onBuffersReleased() { 633e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 643e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza if (listener != NULL) { 653e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza listener->onBuffersReleased(); 66cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis } 67cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis} 68cd1806e210f2633423f0fb14d39fa00d03974223Jamie Gennis 69e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stozavoid BufferQueue::ProxyConsumerListener::onSidebandStreamChanged() { 70e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza sp<ConsumerListener> listener(mConsumerListener.promote()); 71e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza if (listener != NULL) { 72e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza listener->onSidebandStreamChanged(); 73e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza } 74e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza} 75e0d5862ad85f7bf4feb1eee9444bf3a5b49c5842Dan Stoza 763890c3995c4a52439844faeb80b5503d42b977d8Brian Andersonvoid BufferQueue::ProxyConsumerListener::addAndGetFrameTimestamps( 77d6927fb1143398370c0885844bfb58923ef740b7Brian Anderson const NewFrameEventsEntry* newTimestamps, 783890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson FrameEventHistoryDelta* outDelta) { 79ce796e78a57018f186b062199c75d94545318acaPablo Ceballos sp<ConsumerListener> listener(mConsumerListener.promote()); 803890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson if (listener != nullptr) { 813890c3995c4a52439844faeb80b5503d42b977d8Brian Anderson listener->addAndGetFrameTimestamps(newTimestamps, outDelta); 82ce796e78a57018f186b062199c75d94545318acaPablo Ceballos } 83ce796e78a57018f186b062199c75d94545318acaPablo Ceballos} 84ce796e78a57018f186b062199c75d94545318acaPablo Ceballos 85f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stozavoid BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer, 8670982a5f95f68295244e5f6cc037c193713a5259Dan Stoza sp<IGraphicBufferConsumer>* outConsumer, 87468051e20be19130572231266db306396a56402bIrvel bool consumerIsSurfaceFlinger) { 88f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza LOG_ALWAYS_FATAL_IF(outProducer == NULL, 89f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza "BufferQueue: outProducer must not be NULL"); 90f522af7eb6048c2efae77d7b94960bc49c003e0eDan Stoza LOG_ALWAYS_FATAL_IF(outConsumer == NULL, 919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza "BufferQueue: outConsumer must not be NULL"); 929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 930556d79eacbf0c9978080d87aa4075120533c7efMathias Agopian sp<BufferQueueCore> core(new BufferQueueCore()); 94b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(core == NULL, 95b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueCore"); 96b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 97468051e20be19130572231266db306396a56402bIrvel sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger)); 98b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(producer == NULL, 99b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueProducer"); 100b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 101b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core)); 102b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza LOG_ALWAYS_FATAL_IF(consumer == NULL, 103b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza "BufferQueue: failed to create BufferQueueConsumer"); 104b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza 105b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza *outProducer = producer; 106b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza *outConsumer = consumer; 1079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza} 1089f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza 109f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#ifndef NO_BUFFERHUB 11022029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Caivoid BufferQueue::createBufferHubQueue(sp<IGraphicBufferProducer>* outProducer, 11122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai sp<IGraphicBufferConsumer>* outConsumer) { 11222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(outProducer == NULL, "BufferQueue: outProducer must not be NULL"); 11322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(outConsumer == NULL, "BufferQueue: outConsumer must not be NULL"); 11422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 11522029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai sp<IGraphicBufferProducer> producer; 11622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai sp<IGraphicBufferConsumer> consumer; 11722029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 11822029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai dvr::ProducerQueueConfigBuilder configBuilder; 11922029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai std::shared_ptr<dvr::ProducerQueue> producerQueue = 120639d479b8a432771f7fa5ae4b93f677d2c8eb125Jiwen 'Steve' Cai dvr::ProducerQueue::Create(configBuilder.Build(), dvr::UsagePolicy{}); 12122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(producerQueue == NULL, "BufferQueue: failed to create ProducerQueue."); 12222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 12322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai std::shared_ptr<dvr::ConsumerQueue> consumerQueue = producerQueue->CreateConsumerQueue(); 12422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(consumerQueue == NULL, "BufferQueue: failed to create ConsumerQueue."); 12522029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 12622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai producer = BufferHubProducer::Create(producerQueue); 12722029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai consumer = BufferHubConsumer::Create(consumerQueue); 12822029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 12922029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(producer == NULL, "BufferQueue: failed to create BufferQueueProducer"); 13022029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai LOG_ALWAYS_FATAL_IF(consumer == NULL, "BufferQueue: failed to create BufferQueueConsumer"); 13122029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 13222029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai *outProducer = producer; 13322029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai *outConsumer = consumer; 13422029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai} 135f5f36c75527b1924ef8cb5cb66eb745dd27a0fc6Jiwen 'Steve' Cai#endif 13622029508934659a51c6345b6c01da386f6006ec2Jiwen 'Steve' Cai 1376b091c53000c843211c218ce40287a7edca9bc63Daniel Lam}; // namespace android 138