赞
踩
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));
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。