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