当前位置:   article > 正文

GraphicBuffer、AHardwareBuffer、ANativeWindowBuffer关系

ahardwarebuffer

共同点 :

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. 类型转换接口

  1. /*
  2. 总之
  3. AHardwareBuffer <-----> GraphicBuffer
  4. 用reinterpret_cast<> 无地址偏移,直接强转
  5. ANativeWindowBuffer <------> GraphicBuffer
  6. 用static_cast<>, 有地址偏移
  7. AHardwareBuffer <------> ANativeWindowBuffer
  8. 需要先转成GraphicBuffer,再做第二次类型转换
  9. **/
  10. const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer) {
  11. return GraphicBuffer::fromAHardwareBuffer(buffer);
  12. }
  13. GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(AHardwareBuffer* buffer) {
  14. return GraphicBuffer::fromAHardwareBuffer(buffer);
  15. }
  16. const ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(const AHardwareBuffer* buffer) {
  17. return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
  18. }
  19. ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(AHardwareBuffer* buffer) {
  20. return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
  21. }
  22. AHardwareBuffer* AHardwareBuffer_from_GraphicBuffer(GraphicBuffer* buffer) {
  23. return buffer->toAHardwareBuffer();
  24. }
  25. sp<GraphicBuffer> GraphicBuffer::from(ANativeWindowBuffer* anwb) {
  26. return static_cast<GraphicBuffer *>(anwb);
  27. }
  28. GraphicBuffer* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer* buffer) {
  29. return reinterpret_cast<GraphicBuffer*>(buffer);
  30. }
  31. GraphicBuffer const* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer const* buffer) {
  32. return reinterpret_cast<GraphicBuffer const*>(buffer);
  33. }
  34. AHardwareBuffer* GraphicBuffer::toAHardwareBuffer() {
  35. return reinterpret_cast<AHardwareBuffer*>(this);
  36. }
  37. AHardwareBuffer const* GraphicBuffer::toAHardwareBuffer() const {
  38. return reinterpret_cast<AHardwareBuffer const*>(this);
  39. }
  40. AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(ANativeWindowBuffer* anwb) {
  41. return AHardwareBuffer_from_GraphicBuffer(static_cast<GraphicBuffer*>(anwb));
  42. }
  43. ANativeWindowBuffer* GraphicBuffer::getNativeBuffer() const
  44. {
  45. return static_cast<ANativeWindowBuffer*>(
  46. const_cast<GraphicBuffer*>(this));
  47. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46069?site
推荐阅读
相关标签
  

闽ICP备14008679号