Home | History | Annotate | Download | only in gui
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "BufferQueue"
     18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
     19 //#define LOG_NDEBUG 0
     20 
     21 #ifndef NO_BUFFERHUB
     22 #include <gui/BufferHubConsumer.h>
     23 #include <gui/BufferHubProducer.h>
     24 #endif
     25 
     26 #include <gui/BufferQueue.h>
     27 #include <gui/BufferQueueConsumer.h>
     28 #include <gui/BufferQueueCore.h>
     29 #include <gui/BufferQueueProducer.h>
     30 
     31 namespace android {
     32 
     33 BufferQueue::ProxyConsumerListener::ProxyConsumerListener(
     34         const wp<ConsumerListener>& consumerListener):
     35         mConsumerListener(consumerListener) {}
     36 
     37 BufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}
     38 
     39 void BufferQueue::ProxyConsumerListener::onDisconnect() {
     40     sp<ConsumerListener> listener(mConsumerListener.promote());
     41     if (listener != NULL) {
     42         listener->onDisconnect();
     43     }
     44 }
     45 
     46 void BufferQueue::ProxyConsumerListener::onFrameAvailable(
     47         const BufferItem& item) {
     48     sp<ConsumerListener> listener(mConsumerListener.promote());
     49     if (listener != NULL) {
     50         listener->onFrameAvailable(item);
     51     }
     52 }
     53 
     54 void BufferQueue::ProxyConsumerListener::onFrameReplaced(
     55         const BufferItem& item) {
     56     sp<ConsumerListener> listener(mConsumerListener.promote());
     57     if (listener != NULL) {
     58         listener->onFrameReplaced(item);
     59     }
     60 }
     61 
     62 void BufferQueue::ProxyConsumerListener::onBuffersReleased() {
     63     sp<ConsumerListener> listener(mConsumerListener.promote());
     64     if (listener != NULL) {
     65         listener->onBuffersReleased();
     66     }
     67 }
     68 
     69 void BufferQueue::ProxyConsumerListener::onSidebandStreamChanged() {
     70     sp<ConsumerListener> listener(mConsumerListener.promote());
     71     if (listener != NULL) {
     72         listener->onSidebandStreamChanged();
     73     }
     74 }
     75 
     76 void BufferQueue::ProxyConsumerListener::addAndGetFrameTimestamps(
     77         const NewFrameEventsEntry* newTimestamps,
     78         FrameEventHistoryDelta* outDelta) {
     79     sp<ConsumerListener> listener(mConsumerListener.promote());
     80     if (listener != nullptr) {
     81         listener->addAndGetFrameTimestamps(newTimestamps, outDelta);
     82     }
     83 }
     84 
     85 void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
     86         sp<IGraphicBufferConsumer>* outConsumer,
     87         bool consumerIsSurfaceFlinger) {
     88     LOG_ALWAYS_FATAL_IF(outProducer == NULL,
     89             "BufferQueue: outProducer must not be NULL");
     90     LOG_ALWAYS_FATAL_IF(outConsumer == NULL,
     91             "BufferQueue: outConsumer must not be NULL");
     92 
     93     sp<BufferQueueCore> core(new BufferQueueCore());
     94     LOG_ALWAYS_FATAL_IF(core == NULL,
     95             "BufferQueue: failed to create BufferQueueCore");
     96 
     97     sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core, consumerIsSurfaceFlinger));
     98     LOG_ALWAYS_FATAL_IF(producer == NULL,
     99             "BufferQueue: failed to create BufferQueueProducer");
    100 
    101     sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));
    102     LOG_ALWAYS_FATAL_IF(consumer == NULL,
    103             "BufferQueue: failed to create BufferQueueConsumer");
    104 
    105     *outProducer = producer;
    106     *outConsumer = consumer;
    107 }
    108 
    109 #ifndef NO_BUFFERHUB
    110 void BufferQueue::createBufferHubQueue(sp<IGraphicBufferProducer>* outProducer,
    111                                        sp<IGraphicBufferConsumer>* outConsumer) {
    112     LOG_ALWAYS_FATAL_IF(outProducer == NULL, "BufferQueue: outProducer must not be NULL");
    113     LOG_ALWAYS_FATAL_IF(outConsumer == NULL, "BufferQueue: outConsumer must not be NULL");
    114 
    115     sp<IGraphicBufferProducer> producer;
    116     sp<IGraphicBufferConsumer> consumer;
    117 
    118     dvr::ProducerQueueConfigBuilder configBuilder;
    119     std::shared_ptr<dvr::ProducerQueue> producerQueue =
    120             dvr::ProducerQueue::Create(configBuilder.Build(), dvr::UsagePolicy{});
    121     LOG_ALWAYS_FATAL_IF(producerQueue == NULL, "BufferQueue: failed to create ProducerQueue.");
    122 
    123     std::shared_ptr<dvr::ConsumerQueue> consumerQueue = producerQueue->CreateConsumerQueue();
    124     LOG_ALWAYS_FATAL_IF(consumerQueue == NULL, "BufferQueue: failed to create ConsumerQueue.");
    125 
    126     producer = BufferHubProducer::Create(producerQueue);
    127     consumer = BufferHubConsumer::Create(consumerQueue);
    128 
    129     LOG_ALWAYS_FATAL_IF(producer == NULL, "BufferQueue: failed to create BufferQueueProducer");
    130     LOG_ALWAYS_FATAL_IF(consumer == NULL, "BufferQueue: failed to create BufferQueueConsumer");
    131 
    132     *outProducer = producer;
    133     *outConsumer = consumer;
    134 }
    135 #endif
    136 
    137 }; // namespace android
    138