最简单的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%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: "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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何小龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值