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