199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza/*
299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * Copyright 2014 The Android Open Source Project
399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *
499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * you may not use this file except in compliance with the License.
699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * You may obtain a copy of the License at
799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *
899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *
1099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * Unless required by applicable law or agreed to in writing, software
1199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
1299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * See the License for the specific language governing permissions and
1499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza * limitations under the License.
1599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza */
1699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
1799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#define LOG_TAG "StreamSplitter_test"
1899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza//#define LOG_NDEBUG 0
1999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
20cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza#include <gui/BufferItem.h>
2199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/BufferQueue.h>
2299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/IConsumerListener.h>
2399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/ISurfaceComposer.h>
2499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/StreamSplitter.h>
2599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <private/gui/ComposerService.h>
2699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
2799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gtest/gtest.h>
2899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
2999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozanamespace android {
3099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
3199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaclass StreamSplitterTest : public ::testing::Test {
3299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
3399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaprotected:
3499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    StreamSplitterTest() {
3599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        const ::testing::TestInfo* const testInfo =
3699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            ::testing::UnitTest::GetInstance()->current_test_info();
3799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
3899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                testInfo->name());
3999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    }
4099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
4199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ~StreamSplitterTest() {
4299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        const ::testing::TestInfo* const testInfo =
4399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            ::testing::UnitTest::GetInstance()->current_test_info();
4499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
4599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                testInfo->name());
4699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    }
4799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza};
4899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
4999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozastruct DummyListener : public BnConsumerListener {
508dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza    virtual void onFrameAvailable(const BufferItem& /* item */) {}
5199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    virtual void onBuffersReleased() {}
5299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    virtual void onSidebandStreamChanged() {}
5399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza};
5499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
55f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stozastatic const uint32_t TEST_DATA = 0x12345678u;
56f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza
5799b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OneInputOneOutput) {
5899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> inputProducer;
5999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> inputConsumer;
603bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    BufferQueue::createBufferQueue(&inputProducer, &inputConsumer);
6199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
6299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> outputProducer;
6399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> outputConsumer;
643bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    BufferQueue::createBufferQueue(&outputProducer, &outputConsumer);
6599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false));
6699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
6799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<StreamSplitter> splitter;
6899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter);
6999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, status);
7099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, splitter->addOutput(outputProducer));
7199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
723bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // Never allow the output BufferQueue to allocate a buffer
733bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    ASSERT_EQ(OK, outputProducer->allowAllocation(false));
743bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza
7599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferOutput qbOutput;
7699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener,
7799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            NATIVE_WINDOW_API_CPU, false, &qbOutput));
7899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
7999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    int slot;
8099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<Fence> fence;
8199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<GraphicBuffer> buffer;
8299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
83567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
8499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
8599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer));
8699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
8799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    uint32_t* dataIn;
8899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
8999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            reinterpret_cast<void**>(&dataIn)));
90f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
9199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
9299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
9399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferInput qbInput(0, false,
94567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
95567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
9699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput));
9799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
983bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // Now that we have dequeued/allocated one buffer, prevent any further
993bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // allocations
1003bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    ASSERT_EQ(OK, inputProducer->allowAllocation(false));
1013bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza
102cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
10399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, outputConsumer->acquireBuffer(&item, 0));
10499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
10599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    uint32_t* dataOut;
10699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
10799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            reinterpret_cast<void**>(&dataOut)));
108f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
10999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
11099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
11147650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(OK, outputConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
11299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
11399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
1143bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // This should succeed even with allocation disabled since it will have
1153bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // received the buffer back from the output BufferQueue
11699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
117567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
11899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
11999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}
12099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
12199b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OneInputMultipleOutputs) {
12299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    const int NUM_OUTPUTS = 4;
12399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
12499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> inputProducer;
12599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> inputConsumer;
1263bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    BufferQueue::createBufferQueue(&inputProducer, &inputConsumer);
12799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
12899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> outputProducers[NUM_OUTPUTS] = {};
12999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> outputConsumers[NUM_OUTPUTS] = {};
13099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    for (int output = 0; output < NUM_OUTPUTS; ++output) {
13199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        BufferQueue::createBufferQueue(&outputProducers[output],
1323bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza                &outputConsumers[output]);
13399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ASSERT_EQ(OK, outputConsumers[output]->consumerConnect(
13499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    new DummyListener, false));
13599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    }
13699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
13799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<StreamSplitter> splitter;
13899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter);
13999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, status);
14099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    for (int output = 0; output < NUM_OUTPUTS; ++output) {
14199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ASSERT_EQ(OK, splitter->addOutput(outputProducers[output]));
1423bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza
1433bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza        // Never allow the output BufferQueues to allocate a buffer
1443bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza        ASSERT_EQ(OK, outputProducers[output]->allowAllocation(false));
14599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    }
14699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
14799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferOutput qbOutput;
14899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener,
14999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            NATIVE_WINDOW_API_CPU, false, &qbOutput));
15099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
15199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    int slot;
15299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<Fence> fence;
15399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<GraphicBuffer> buffer;
15499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
155567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
15699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
15799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer));
15899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
15999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    uint32_t* dataIn;
16099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
16199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            reinterpret_cast<void**>(&dataIn)));
162f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
16399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
16499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
16599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferInput qbInput(0, false,
166567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
167567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
16899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput));
16999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
1703bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // Now that we have dequeued/allocated one buffer, prevent any further
1713bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // allocations
1723bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    ASSERT_EQ(OK, inputProducer->allowAllocation(false));
1733bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza
17499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    for (int output = 0; output < NUM_OUTPUTS; ++output) {
175cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza        BufferItem item;
17699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ASSERT_EQ(OK, outputConsumers[output]->acquireBuffer(&item, 0));
17799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
17899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        uint32_t* dataOut;
17999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
18099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    reinterpret_cast<void**>(&dataOut)));
181f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza        ASSERT_EQ(*dataOut, TEST_DATA);
18299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza        ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
18399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
18447650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos        ASSERT_EQ(OK, outputConsumers[output]->releaseBuffer(item.mSlot,
18599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    item.mFrameNumber, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR,
18699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    Fence::NO_FENCE));
18799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    }
18899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
1893bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // This should succeed even with allocation disabled since it will have
1903bb0c8810fb461a64f04bce81f32ca1994fde9b5Dan Stoza    // received the buffer back from the output BufferQueues
19199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
192567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
19399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
19499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}
19599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
19699b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OutputAbandonment) {
19799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> inputProducer;
19899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> inputConsumer;
19999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    BufferQueue::createBufferQueue(&inputProducer, &inputConsumer);
20099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
20199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferProducer> outputProducer;
20299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<IGraphicBufferConsumer> outputConsumer;
20399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    BufferQueue::createBufferQueue(&outputProducer, &outputConsumer);
20499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false));
20599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
20699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<StreamSplitter> splitter;
20799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter);
20899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, status);
20999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, splitter->addOutput(outputProducer));
21099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
21199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferOutput qbOutput;
21299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener,
21399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza            NATIVE_WINDOW_API_CPU, false, &qbOutput));
21499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
21599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    int slot;
21699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<Fence> fence;
21799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    sp<GraphicBuffer> buffer;
21899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
219567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
22099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
22199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer));
22299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
22399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    // Abandon the output
22499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    outputConsumer->consumerDisconnect();
22599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
22699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    IGraphicBufferProducer::QueueBufferInput qbInput(0, false,
227567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
228567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
22999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput));
23099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
23199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    // Input should be abandoned
232567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    ASSERT_EQ(NO_INIT, inputProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
233567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            GRALLOC_USAGE_SW_WRITE_OFTEN));
23499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}
23599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza
23699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza} // namespace android
237