概要

本示例代码使用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",    ],}

描述

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

运行结果

$ adb shell /data/mytestdata out is 0x12345678

示例下载

GitHub: mytest

参考资料

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

更多相关文章

  1. Android之RecyclerView实现时光轴
  2. Android(安卓)使用JAVA代码控制UI界面
  3. android handler 多线程
  4. android中图片加载到内存的实例代码
  5. Android中界面中有多个edittext,如何默认让第二个获取焦点
  6. Android(安卓)在一个应用中如何启动另外一个已安装的应用!!!
  7. android真机上 conn.getOutputStream()异常 Does not support ou
  8. 移动web开发常用JavaScript代码
  9. android intent 传递list或者对象

随机推荐

  1. [转]新浪微博AppKey大集合
  2. ViewPager实现一个页面多个Item的显示
  3. Android CTS Tips
  4. CMD命令创建、编译Android应用程序
  5. Android VideoPlayer
  6. Android 5.1状态栏背景色定制 在Launcher
  7. Android中javax annotation Nullable找不
  8. Android 开源优秀项目
  9. Android studio 运行出现Error running a
  10. android Standard Broadcast Actions 的