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 2099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/BufferQueue.h> 2199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/IConsumerListener.h> 2299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/ISurfaceComposer.h> 2399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gui/StreamSplitter.h> 2499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <private/gui/ComposerService.h> 2599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 2699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza#include <gtest/gtest.h> 2799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 2899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozanamespace android { 2999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 3099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaclass StreamSplitterTest : public ::testing::Test { 3199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 3299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaprotected: 3399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza StreamSplitterTest() { 3499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza const ::testing::TestInfo* const testInfo = 3599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ::testing::UnitTest::GetInstance()->current_test_info(); 3699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ALOGV("Begin test: %s.%s", testInfo->test_case_name(), 3799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza testInfo->name()); 3899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 3999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 4099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ~StreamSplitterTest() { 4199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza const ::testing::TestInfo* const testInfo = 4299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ::testing::UnitTest::GetInstance()->current_test_info(); 4399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ALOGV("End test: %s.%s", testInfo->test_case_name(), 4499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza testInfo->name()); 4599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 4699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}; 4799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 4899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozastruct DummyListener : public BnConsumerListener { 4999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza virtual void onFrameAvailable() {} 5099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza virtual void onBuffersReleased() {} 5199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza virtual void onSidebandStreamChanged() {} 5299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}; 5399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 5499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaclass CountedAllocator : public BnGraphicBufferAlloc { 5599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozapublic: 5699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza CountedAllocator() : mAllocCount(0) { 5799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<ISurfaceComposer> composer(ComposerService::getComposerService()); 5899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza mAllocator = composer->createGraphicBufferAlloc(); 5999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 6099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 6199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza virtual ~CountedAllocator() {} 6299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 6399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza virtual sp<GraphicBuffer> createGraphicBuffer(uint32_t w, uint32_t h, 6499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza PixelFormat format, uint32_t usage, status_t* error) { 6599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ++mAllocCount; 6699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<GraphicBuffer> buffer = mAllocator->createGraphicBuffer(w, h, format, 6799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza usage, error); 6899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza return buffer; 6999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 7099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 7199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza int getAllocCount() const { return mAllocCount; } 7299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 7399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stozaprivate: 7499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferAlloc> mAllocator; 7599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza int mAllocCount; 7699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza}; 7799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 7899b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OneInputOneOutput) { 7999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<CountedAllocator> allocator(new CountedAllocator); 8099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 8199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> inputProducer; 8299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> inputConsumer; 8399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&inputProducer, &inputConsumer, allocator); 8499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 8599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> outputProducer; 8699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> outputConsumer; 8799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&outputProducer, &outputConsumer, allocator); 8899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false)); 8999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 9099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<StreamSplitter> splitter; 9199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 9299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, status); 9399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, splitter->addOutput(outputProducer)); 9499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 9599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferOutput qbOutput; 9699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 9799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza NATIVE_WINDOW_API_CPU, false, &qbOutput)); 9899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 9999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza int slot; 10099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<Fence> fence; 10199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<GraphicBuffer> buffer; 10299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 10399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 10499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 10599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 10699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 10799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza uint32_t* dataIn; 10899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, 10999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza reinterpret_cast<void**>(&dataIn))); 11099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *dataIn = 0x12345678; 11199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, buffer->unlock()); 11299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 11399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 11499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 11599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Fence::NO_FENCE); 11699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 11799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 11899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferConsumer::BufferItem item; 11999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumer->acquireBuffer(&item, 0)); 12099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 12199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza uint32_t* dataOut; 12299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, 12399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza reinterpret_cast<void**>(&dataOut))); 12499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(*dataOut, 0x12345678); 12599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, item.mGraphicBuffer->unlock()); 12699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 12799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumer->releaseBuffer(item.mBuf, item.mFrameNumber, 12899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE)); 12999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 13099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 13199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 13299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 13399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 13499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(1, allocator->getAllocCount()); 13599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza} 13699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 13799b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OneInputMultipleOutputs) { 13899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza const int NUM_OUTPUTS = 4; 13999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<CountedAllocator> allocator(new CountedAllocator); 14099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 14199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> inputProducer; 14299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> inputConsumer; 14399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&inputProducer, &inputConsumer, allocator); 14499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 14599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> outputProducers[NUM_OUTPUTS] = {}; 14699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> outputConsumers[NUM_OUTPUTS] = {}; 14799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza for (int output = 0; output < NUM_OUTPUTS; ++output) { 14899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&outputProducers[output], 14999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza &outputConsumers[output], allocator); 15099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumers[output]->consumerConnect( 15199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza new DummyListener, false)); 15299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 15399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 15499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<StreamSplitter> splitter; 15599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 15699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, status); 15799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza for (int output = 0; output < NUM_OUTPUTS; ++output) { 15899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, splitter->addOutput(outputProducers[output])); 15999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 16099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 16199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferOutput qbOutput; 16299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 16399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza NATIVE_WINDOW_API_CPU, false, &qbOutput)); 16499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 16599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza int slot; 16699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<Fence> fence; 16799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<GraphicBuffer> buffer; 16899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 16999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 17099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 17199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 17299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 17399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza uint32_t* dataIn; 17499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN, 17599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza reinterpret_cast<void**>(&dataIn))); 17699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza *dataIn = 0x12345678; 17799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, buffer->unlock()); 17899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 17999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 18099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 18199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Fence::NO_FENCE); 18299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 18399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 18499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza for (int output = 0; output < NUM_OUTPUTS; ++output) { 18599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferConsumer::BufferItem item; 18699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumers[output]->acquireBuffer(&item, 0)); 18799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 18899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza uint32_t* dataOut; 18999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, 19099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza reinterpret_cast<void**>(&dataOut))); 19199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(*dataOut, 0x12345678); 19299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, item.mGraphicBuffer->unlock()); 19399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 19499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumers[output]->releaseBuffer(item.mBuf, 19599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza item.mFrameNumber, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, 19699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Fence::NO_FENCE)); 19799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza } 19899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 19999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 20099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 20199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 20299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 20399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(1, allocator->getAllocCount()); 20499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza} 20599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 20699b18b447dec188bcec37b415603b9dd400fc7e1Dan StozaTEST_F(StreamSplitterTest, OutputAbandonment) { 20799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> inputProducer; 20899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> inputConsumer; 20999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&inputProducer, &inputConsumer); 21099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 21199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferProducer> outputProducer; 21299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<IGraphicBufferConsumer> outputConsumer; 21399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza BufferQueue::createBufferQueue(&outputProducer, &outputConsumer); 21499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, outputConsumer->consumerConnect(new DummyListener, false)); 21599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 21699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<StreamSplitter> splitter; 21799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza status_t status = StreamSplitter::createSplitter(inputConsumer, &splitter); 21899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, status); 21999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, splitter->addOutput(outputProducer)); 22099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 22199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferOutput qbOutput; 22299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->connect(new DummyProducerListener, 22399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza NATIVE_WINDOW_API_CPU, false, &qbOutput)); 22499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 22599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza int slot; 22699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<Fence> fence; 22799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza sp<GraphicBuffer> buffer; 22899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, 22999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0, 23099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza GRALLOC_USAGE_SW_WRITE_OFTEN)); 23199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->requestBuffer(slot, &buffer)); 23299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 23399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza // Abandon the output 23499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza outputConsumer->consumerDisconnect(); 23599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 23699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza IGraphicBufferProducer::QueueBufferInput qbInput(0, false, 23799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Rect(0, 0, 1, 1), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, 23899b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza Fence::NO_FENCE); 23999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(OK, inputProducer->queueBuffer(slot, qbInput, &qbOutput)); 24099b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 24199b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza // Input should be abandoned 24299b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza ASSERT_EQ(NO_INIT, inputProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 24399b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 0, GRALLOC_USAGE_SW_WRITE_OFTEN)); 24499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza} 24599b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza 24699b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza} // namespace android 247