我是靠谱客的博主 神勇时光,这篇文章主要介绍最简单的BufferQueue测试程序(三),现在分享给大家,希望可以做个参考。

前言

前面两篇文章《最简单的BufferQueue测试程序(一)》和《最简单的BufferQueue测试程序(二)》演示的都是在本地同一进程中操作BufferQueue,而实际使用过程中往往会出现Producer和Consumer位于不同的进程,这时候就需要通过binder调用来实现跨进程操作BufferQueue了。

本篇将以最简单的代码形式,演示如何在远程操作BufferQueue。

Android版本:8.1

参考代码

server.cpp

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define LOG_TAG "MyTest" #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/ProcessState.h> #include <gui/BufferQueue.h> #include <thread> 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); sp<IServiceManager> serviceManager = defaultServiceManager(); serviceManager->addService(String16("MyProducer"), IInterface::asBinder(producer)); serviceManager->addService(String16("MyConsumer"), IInterface::asBinder(consumer)); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; }

client.cpp

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define LOG_TAG "MyTest" #include <binder/IServiceManager.h> #include <gui/BufferItem.h> #include <gui/BufferQueue.h> #include <gui/IProducerListener.h> #include <ui/GraphicBuffer.h> #include <system/window.h> using namespace android; int main(int argc, char** argv) { sp<IServiceManager> serviceManager = defaultServiceManager(); sp<IBinder> binderProducer = serviceManager->getService(String16("MyProducer")); sp<IBinder> binderConsumer = serviceManager->getService(String16("MyConsumer")); sp<IGraphicBufferProducer> producer = interface_cast<IGraphicBufferProducer>(binderProducer); sp<IGraphicBufferConsumer> consumer = interface_cast<IGraphicBufferConsumer>(binderConsumer); 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%08xn", *dataOut); item.mGraphicBuffer->unlock(); consumer->releaseBuffer(item.mSlot, item.mFrameNumber, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE); return 0; }

Android.bp

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cc_test { name: "client", srcs: ["client.cpp"], clang: true, shared_libs: [ "liblog", "libbinder", "libgui", "libui", "libutils", ], } cc_test { name: "server", srcs: ["server.cpp"], clang: true, shared_libs: [ "liblog", "libbinder", "libgui", "libui", "libutils", ], }

运行结果

复制代码
1
2
3
4
$ adb shell /data/server & $ adb shell /data/client data out is 0x12345678

描述

  1. 首先启动server进程,用于创建BufferQueue、Producer和Consumer对象;
  2. 在client端通过ServiceManager获取到Producer & Consumer的远程代理;
  3. 通过Producer & Consumer的远程代理,完成BufferQueue的一系列操作(操作内容同《最简单的BufferQueue测试程序(一)》一样)。

注意: Android规定,BufferQueue必须在Consumer进程中创建。因此该示例将consumerConnect()放在了server.cpp中。如果放在client.cpp中,在调用queueBuffer()时,程序会出现crash。

源码下载

GitHub: mytest3

参考资料

Android BufferQueue自测试程序:BufferQueue_test.cpp: DISABLED_BufferQueueInAnotherProcess

最后

以上就是神勇时光最近收集整理的关于最简单的BufferQueue测试程序(三)的全部内容,更多相关最简单内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部