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

概述

前言

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

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

Android版本:8.1

参考代码

server.cpp

#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

#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

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",
],
}

运行结果

$ 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测试程序(三)的全部内容,希望文章能够帮你解决最简单的BufferQueue测试程序(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部