StreamSplitter_test.cpp revision 99b18b447dec188bcec37b415603b9dd400fc7e1
16cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams/* 26a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye * Copyright 2014 The Android Open Source Project 36cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * 46cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 56cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * you may not use this file except in compliance with the License. 66cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * You may obtain a copy of the License at 76cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * 86cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 96cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * 106cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * Unless required by applicable law or agreed to in writing, software 116cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 126cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * See the License for the specific language governing permissions and 146cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams * limitations under the License. 156cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams */ 166cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams 176cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams#define LOG_TAG "StreamSplitter_test" 186cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams//#define LOG_NDEBUG 0 199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines 206a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye#include <gui/BufferQueue.h> 216a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye#include <gui/IConsumerListener.h> 226a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye#include <gui/ISurfaceComposer.h> 236cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams#include <gui/StreamSplitter.h> 246a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye#include <private/gui/ComposerService.h> 256a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 266a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye#include <gtest/gtest.h> 276cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams 286cc888e77e17ac522f75bf61403307de8ace2ef3Jason Samsnamespace android { 296cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams 306a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayeclass StreamSplitterTest : public ::testing::Test { 316a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 326a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayeprotected: 336a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye StreamSplitterTest() { 346cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams const ::testing::TestInfo* const testInfo = 356cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams ::testing::UnitTest::GetInstance()->current_test_info(); 366a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ALOGV("Begin test: %s.%s", testInfo->test_case_name(), 376a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye testInfo->name()); 386a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 396a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 406a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ~StreamSplitterTest() { 416a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye const ::testing::TestInfo* const testInfo = 426a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ::testing::UnitTest::GetInstance()->current_test_info(); 436a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ALOGV("End test: %s.%s", testInfo->test_case_name(), 446a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye testInfo->name()); 456a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 466a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye}; 476a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 486a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayestruct DummyListener : public BnConsumerListener { 496a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye virtual void onFrameAvailable() {} 506a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye virtual void onBuffersReleased() {} 516a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye virtual void onSidebandStreamChanged() {} 526a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye}; 536a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 546a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayeclass CountedAllocator : public BnGraphicBufferAlloc { 556a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayepublic: 566a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye CountedAllocator() : mAllocCount(0) { 576a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<ISurfaceComposer> composer(ComposerService::getComposerService()); 586a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye mAllocator = composer->createGraphicBufferAlloc(); 596a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 606a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 616a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye virtual ~CountedAllocator() {} 626a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 636a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, 646a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye PixelFormat format, uint32_t usage, status_t* error) { 656a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ++mAllocCount; 666a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<GraphicBuffer> buffer = mAllocator->createGraphicBuffer(w, h, format, 676a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye usage, error); 686a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye return buffer; 696a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 706a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 716a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye int getAllocCount() const { return mAllocCount; } 726a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 736a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahayeprivate: 746a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferAlloc> mAllocator; 756a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye int mAllocCount; 766a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye}; 776a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 786a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu DelahayeTEST_F(StreamSplitterTest, OneInputOneOutput) { 796a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<CountedAllocator> allocator(new CountedAllocator); 806a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 816a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> inputProducer; 826a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> inputConsumer; 836a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&inputProducer, &inputConsumer, allocator); 846a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 856a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> outputProducer; 866a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> outputConsumer; 876a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&outputProducer, &outputConsumer, allocator); 886a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false)); 896a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 906a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<StreamSplitter> splitter; 916a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 926a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, status); 936a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, splitter->addOutput(outputProducer)); 946a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 956a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferOutput qbOutput; 966a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 976a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye NATIVE_WINDOW_API_CPU, false, &qbOutput)); 986a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 996a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye int slot; 1006a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<Fence> fence; 1016a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<GraphicBuffer> buffer; 1026a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 1036a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 1046a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye GRALLOC_USAGE_SW_WRITE_OFTEN)); 1056a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 1066a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1076a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye uint32_t* dataIn; 1086a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, 1096a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye reinterpret_cast<void**>(&dataIn))); 1106a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye *dataIn = 0x12345678; 1116a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, buffer->unlock()); 1126a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1136a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 1146a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 1156a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Fence::NO_FENCE); 1166a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 1176a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1186a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferConsumer::BufferItem item; 1196a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumer->acquireBuffer(&item, 0)); 1206a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1216a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye uint32_t* dataOut; 1226a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, 1236a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye reinterpret_cast<void**>(&dataOut))); 1246a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(*dataOut, 0x12345678); 1256a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, item.mGraphicBuffer->unlock()); 1266a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1276a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumer->releaseBuffer(item.mBuf, item.mFrameNumber, 1286a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE)); 1296a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1306a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 1316a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 1326a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye GRALLOC_USAGE_SW_WRITE_OFTEN)); 1336a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1346a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(1, allocator->getAllocCount()); 1356a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye} 1366a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1376a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu DelahayeTEST_F(StreamSplitterTest, OneInputMultipleOutputs) { 1386a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye const int NUM_OUTPUTS = 4; 1396a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<CountedAllocator> allocator(new CountedAllocator); 1406a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1416a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> inputProducer; 1426a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> inputConsumer; 1436a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&inputProducer, &inputConsumer, allocator); 1446a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1456a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> outputProducers[NUM_OUTPUTS] = {}; 1466a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> outputConsumers[NUM_OUTPUTS] = {}; 1476a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye for (int output = 0; output < NUM_OUTPUTS; ++output) { 1486a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&outputProducers[output], 1496a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye &outputConsumers[output], allocator); 1506a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumers[output]->consumerConnect( 1516a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye new DummyListener, false)); 1526a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 1536a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1546a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<StreamSplitter> splitter; 1556a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 1566a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, status); 1576a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye for (int output = 0; output < NUM_OUTPUTS; ++output) { 1586a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, splitter->addOutput(outputProducers[output])); 1596a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 1606a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1616a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferOutput qbOutput; 1626a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 1636a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye NATIVE_WINDOW_API_CPU, false, &qbOutput)); 1646a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1656cc888e77e17ac522f75bf61403307de8ace2ef3Jason Sams int slot; 1666a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<Fence> fence; 1676a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<GraphicBuffer> buffer; 1686a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 1696a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 1706a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye GRALLOC_USAGE_SW_WRITE_OFTEN)); 1716a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 1726a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1736a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye uint32_t* dataIn; 1746a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, 1756a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye reinterpret_cast<void**>(&dataIn))); 1766a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye *dataIn = 0x12345678; 1776a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, buffer->unlock()); 1786a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1796a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 1806a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 1816a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Fence::NO_FENCE); 1826a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 1836a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1846a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye for (int output = 0; output < NUM_OUTPUTS; ++output) { 1856a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferConsumer::BufferItem item; 1866a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumers[output]->acquireBuffer(&item, 0)); 1876a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1886a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye uint32_t* dataOut; 1896a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, 1906a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye reinterpret_cast<void**>(&dataOut))); 1916a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(*dataOut, 0x12345678); 1926a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, item.mGraphicBuffer->unlock()); 1936a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1946a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumers[output]->releaseBuffer(item.mBuf, 1956a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye item.mFrameNumber, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, 1966a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Fence::NO_FENCE)); 1976a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye } 1986a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 1996a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 2006a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 2016a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye GRALLOC_USAGE_SW_WRITE_OFTEN)); 2026a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2036a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(1, allocator->getAllocCount()); 2046a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye} 2056a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2066a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu DelahayeTEST_F(StreamSplitterTest, OutputAbandonment) { 2076a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> inputProducer; 2086a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> inputConsumer; 2096a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&inputProducer, &inputConsumer); 2106a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2116a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferProducer> outputProducer; 2126a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<IGraphicBufferConsumer> outputConsumer; 2136a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye BufferQueue::createBufferQueue(&outputProducer, &outputConsumer); 2146a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false)); 2156a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2166a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<StreamSplitter> splitter; 2176a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 2186a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, status); 2196a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, splitter->addOutput(outputProducer)); 2206a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2216a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferOutput qbOutput; 2226a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 2236a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye NATIVE_WINDOW_API_CPU, false, &qbOutput)); 2246a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2256a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye int slot; 2266a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<Fence> fence; 2276a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye sp<GraphicBuffer> buffer; 2286a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 2296a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 2306a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye GRALLOC_USAGE_SW_WRITE_OFTEN)); 2316a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 2326a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2336a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye // Abandon the output 2346a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye outputConsumer->consumerDisconnect(); 2356a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2366a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 2376a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 2386a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye Fence::NO_FENCE); 2396a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 2406a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2416a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye // Input should be abandoned 2426a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye ASSERT_EQ(NO_INIT, inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 2436a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 0, GRALLOC_USAGE_SW_WRITE_OFTEN)); 2446a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye} 2456a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye 2466a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye} // namespace android 2476a5875cf96a6eebf4ef2e176176868ecbf17122fMatthieu Delahaye