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