GraphicBuffer、AHardwareBuffer、ANativeWindowBuffer关系

共同点 :

1. 其实三者都是同一个东西,AHardwareBuffer、ANativeWindowBuffer都是GraphicBuffer通过类型转换而来。

联系

1. GraphicBuffer 继承了ANativeWindowBuffer,所以可以直接通过static_cast<>类型转换成ANativeWindowBuffer,不过由于是多继承,所以转完有一个地址偏移(static_cast 自动完成),

偏移量为0x10(64位场景)大小,为GraphicBuffer父类对象RefBase大小(包括虚函数表指针8字节,成员变量 weakref_impl* const mRefs 8字节)

多继承、带虚函数的偏移,可以参考

https://joydig.com/cpp-base-pointer-offset-adjustment-for-multiple-inheritance/

2. AHardwareBuffer只是一个抽象的概念,没有具体类型,与GraphicBuffer 没有任何继承关系,所以只能通过reinterpret_cast 强制类型转换而来。

区别:

1. AHardwareBuffer 没有具体的类型,是个空结构体,类似于void 类型,aosp封装的那些AHardWareBuffer_XXX接口https://developer.android.com/ndk/reference/group/a-hardware-buffer,其实底层都是把AHardwareBuffer转回成 GraphicBuffer,再去调GraphicBuffer接口。

2. 关于地址: AHardwareBuffer 与GraphicBuffer相同,与ANativeWindowBuffer不同,所以前2者之间可以直接类型强转,与第三者不行,

3. 类型转换接口


/*
总之 
AHardwareBuffer <-----> GraphicBuffer
用reinterpret_cast<> 无地址偏移,直接强转

ANativeWindowBuffer <------> GraphicBuffer
用static_cast<>, 有地址偏移

AHardwareBuffer <------> ANativeWindowBuffer
需要先转成GraphicBuffer,再做第二次类型转换

**/


const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer) {
    return GraphicBuffer::fromAHardwareBuffer(buffer);
}

GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(AHardwareBuffer* buffer) {
    return GraphicBuffer::fromAHardwareBuffer(buffer);
}

const ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(const AHardwareBuffer* buffer) {
    return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
}

ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(AHardwareBuffer* buffer) {
    return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
}

AHardwareBuffer* AHardwareBuffer_from_GraphicBuffer(GraphicBuffer* buffer) {
    return buffer->toAHardwareBuffer();
}

sp<GraphicBuffer> GraphicBuffer::from(ANativeWindowBuffer* anwb) {
    return static_cast<GraphicBuffer *>(anwb);
}

GraphicBuffer* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer* buffer) {
    return reinterpret_cast<GraphicBuffer*>(buffer);
}

GraphicBuffer const* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer const* buffer) {
    return reinterpret_cast<GraphicBuffer const*>(buffer);
}

AHardwareBuffer* GraphicBuffer::toAHardwareBuffer() {
    return reinterpret_cast<AHardwareBuffer*>(this);
}

AHardwareBuffer const* GraphicBuffer::toAHardwareBuffer() const {
    return reinterpret_cast<AHardwareBuffer const*>(this);
}

AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(ANativeWindowBuffer* anwb) {
    return AHardwareBuffer_from_GraphicBuffer(static_cast<GraphicBuffer*>(anwb));
}

ANativeWindowBuffer* GraphicBuffer::getNativeBuffer() const
{
    return static_cast<ANativeWindowBuffer*>(
            const_cast<GraphicBuffer*>(this));
}

猜你喜欢

转载自blog.csdn.net/goodnight1994/article/details/127442301