最简单的BufferQueue测试程序(一)
16lz
2021-01-24
概要
本示例代码使用BufferQueue最基本的操作接口,演示了BufferQueue操作的基本流程。
Android版本:8.1
伪代码
void main(void){createBufferQueue();consumerConnect()connect();dequeueBuffer();requestBuffer();queueBuffer();acquireBuffer();releaseBuffer();}
详细参考代码
mytest.cpp:
#define LOG_TAG "MyTest"#include #include #include #include #include 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", ],}
描述
- 从BufferQueue中申请一块1x1大小的buffer;
- 向该buffer中写入0x12345678,然后放入BufferQueue队列中;
- 从队列中取出该buffer,并读取该buffer的内容;
- 释放该buffer。
运行结果
$ adb shell /data/mytestdata out is 0x12345678
示例下载
GitHub: mytest
参考资料
Android BufferQueue自测试程序:BufferQueue_test.cpp —— MoveFromConsumerToProducer
更多相关文章
- Android之RecyclerView实现时光轴
- Android(安卓)使用JAVA代码控制UI界面
- android handler 多线程
- android中图片加载到内存的实例代码
- Android中界面中有多个edittext,如何默认让第二个获取焦点
- Android(安卓)在一个应用中如何启动另外一个已安装的应用!!!
- android真机上 conn.getOutputStream()异常 Does not support ou
- 移动web开发常用JavaScript代码
- android intent 传递list或者对象