最简单的BufferQueue测试程序(一)

概要

本示例代码使用BufferQueue最基本的操作接口,演示了BufferQueue操作的基本流程。

Android版本:8.1

伪代码

void main(void)
{
	createBufferQueue();
	consumerConnect()
	connect();
	
	dequeueBuffer();
	requestBuffer();
	queueBuffer();
	
	acquireBuffer();
	releaseBuffer();
}

详细参考代码

mytest.cpp:

#define LOG_TAG "MyTest"

#include <gui/BufferItem.h>
#include <gui/BufferQueue.h>
#include <gui/IProducerListener.h>

#include <ui/GraphicBuffer.h>

#include <system/window.h>

using namespace android;

struct DummyConsumer : public BnConsumerListener {
    void onFrameAvailable(const BufferItem& /* item */) override {}
    void onBuffersReleased() override {}
    void onSidebandStreamChanged() override {}
};

int main(int argc, char** argv)
{
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;

    BufferQueue::createBufferQueue(&producer, &consumer);

    consumer->consumerConnect(new DummyConsumer, false);

    IGraphicBufferProducer::QueueBufferOutput output;
    producer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false, &output);

    /****************** Producer ***********************/
    int slot;
    sp<Fence> fence;
    sp<GraphicBuffer> buffer;
    producer->dequeueBuffer(&slot, &fence, 0, 0, 0,
		    	     GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr, nullptr);
    producer->requestBuffer(slot, &buffer);

    uint32_t* dataIn;
    buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
		 reinterpret_cast<void**>(&dataIn));
    *dataIn = 0x12345678u;
    buffer->unlock();

    IGraphicBufferProducer::QueueBufferInput input(0, false, HAL_DATASPACE_UNKNOWN, Rect(1, 1),
				    NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
    producer->queueBuffer(slot, input, &output);


    /****************** Consumer ***********************/
    BufferItem item;
    consumer->acquireBuffer(&item, static_cast<nsecs_t>(0));

    uint32_t* dataOut;
    item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
		    	      reinterpret_cast<void**>(&dataOut));
    printf("data out is 0x%08x\n", *dataOut);
    item.mGraphicBuffer->unlock();

    consumer->releaseBuffer(item.mSlot, item.mFrameNumber, EGL_NO_DISPLAY,
		    	     EGL_NO_SYNC_KHR, Fence::NO_FENCE);

    return 0;
}

Android.bp:

cc_test {
    name: "mytest",

    srcs: ["mytest.cpp"],

    clang: true,

    shared_libs: [
        "liblog",
        "libbinder",
        "libgui",
        "libui",
        "libutils",
    ],
}

描述

  1. 从BufferQueue中申请一块1x1大小的buffer;
  2. 向该buffer中写入0x12345678,然后放入BufferQueue队列中;
  3. 从队列中取出该buffer,并读取该buffer的内容;
  4. 释放该buffer。

运行结果

$ adb shell /data/mytest
data out is 0x12345678

示例下载

GitHub: mytest

参考资料

Android BufferQueue自测试程序:BufferQueue_test.cpp —— MoveFromConsumerToProducer

发布了68 篇原创文章 · 获赞 112 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/hexiaolong2009/article/details/99053375