前言
前面两篇文章《最简单的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
25cc_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
描述
- 首先启动server进程,用于创建BufferQueue、Producer和Consumer对象;
- 在client端通过ServiceManager获取到Producer & Consumer的远程代理;
- 通过Producer & Consumer的远程代理,完成BufferQueue的一系列操作(操作内容同《最简单的BufferQueue测试程序(一)》一样)。
注意: Android规定,BufferQueue必须在Consumer进程中创建。因此该示例将
consumerConnect()
放在了server.cpp中。如果放在client.cpp中,在调用queueBuffer()
时,程序会出现crash。
源码下载
GitHub: mytest3
参考资料
Android BufferQueue自测试程序:BufferQueue_test.cpp: DISABLED_BufferQueueInAnotherProcess
最后
以上就是神勇时光最近收集整理的关于最简单的BufferQueue测试程序(三)的全部内容,更多相关最简单内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复