【问题标题】:How to use GraphicBuffer in android ndk如何在android ndk中使用GraphicBuffer
【发布时间】:2014-06-09 07:28:04
【问题描述】:

我是参考How to improve opengl es display performance in android 的问题的答案来问这个问题的。我试图构建使用带有 ndk-r9d 的 GraphicBuffer 的代码。但它是说 GraphicBuffer 没有在这个范围内声明。 eglCreateImageKHR 和 glEGLImageTargetTexture2DOES 的 cmets 相同。

我添加了 EGL/eglext.h 和 GLES2/gl2ext.h 。我试图包含 ui/GraphicBuffer.h 但它没有接受它。还有头文件要加吗?

我添加了下面给出的代码以避免使用 glTexSubImage2D()。

  GraphicBuffer * pGraphicBuffer = new GraphicBuffer(frame_width, frame_height, PIXEL_FORMAT_RGB_565, GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE);

        // Lock the buffer to get a pointer
        unsigned char * pBitmap = NULL;
        pGraphicBuffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,(void **)&pBitmap);

        // Write 2D image to pBitmap
        memcpy(pBitmap, frame_buffer, frame_width * frame_height * 3);

        // Unlock to allow OpenGL ES to use it
        pGraphicBuffer->unlock();

        EGLClientBuffer ClientBufferAddress = pGraphicBuffer->getNativeBuffer();
        EGLint SurfaceType = EGL_NATIVE_BUFFER_ANDROID;

        // Make an EGL Image at the same address of the native client buffer
        EGLDisplay eglDisplayHandle = eglGetDisplay(EGL_DEFAULT_DISPLAY);

        // Create an EGL Image with these attributes
        EGLint eglImageAttributes[] = {EGL_WIDTH, frame_width, EGL_HEIGHT, frame_height, EGL_MATCH_FORMAT_KHR,  EGL_FORMAT_RGB_565_KHR, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};

        EGLImageKHR eglImageHandle = eglCreateImageKHR(eglDisplayHandle, EGL_NO_CONTEXT, SurfaceType, ClientBufferAddress, eglImageAttributes);

        // Create a texture and bind it to GL_TEXTURE_2D
/*        EGLint TextureHandle;
        glGenTextures(1, &TextureHandle);
        glBindTexture(GL_TEXTURE_2D, TextureHandle);
*/
        // Attach the EGL Image to the same texture
        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImageHandle);

我该怎么做才能让它运行......

提前谢谢..

【问题讨论】:

  • GraphicBuffer.h 不是 NDK 的一部分。您需要从 AOSP 源中提取标头,并在了解这是一个内部 API 的情况下使用它,在不同版本之间可能会发生变化。 FWIW,stackoverflow.com/questions/21151259 可能是相关的。
  • @fadden 感谢您的回复.. 我已经问过这个问题来加快我的视频帧显示速度,就像我在stackoverflow.com/questions/23131472/… 的问题一样。除了graphicBuffer,你还有其他解决方案吗?以及如何从 AOSP 源中提取标头
  • @fadden 如何从 AOSP 源中提取标头
  • @Gorilla.Maguila 你能给我一个建议吗..

标签: android opengl-es android-ndk egl


【解决方案1】:

这几天我也在研究这个问题。

许多博客表示需要一份 Android 源代码副本才能与您的项目链接。我相信在运行时从libui.so 获取函数会更优雅,这就是 Aleksandar Stojiljkovic 提到的“替代方法”。

我已经编写了一个简单的库来做到这一点。 Here是吗。

【讨论】:

    【解决方案2】:

    不幸的是,它已从此处删除,但您可以在那里得到一些答案: http://community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage--updating-a-texture-without-copying-memory-under-android

    简而言之,您需要构建 Android 平台代码并创建库来包装对 GraphicBuffer 和所需 API 的访问,并针对 Android 代码库进行构建。如前所述,您需要维护库...

    这是另一种方法: https://code.google.com/p/chromium/codesearch#chromium/src/third_party/deqp/src/framework/platform/android/tcuAndroidInternals.cpp&l=167

    【讨论】:

    • 从链接中添加一些信息(甚至只是一些引号)真的很有帮助。事实上,这几乎是一个仅链接的答案,不受欢迎,可能会被删除。
    【解决方案3】:

    GraphicBuffer 在命名空间 android 中。

    要么添加:

    使用命名空间android;

    或使用 android::GraphicBuffer 引用 GraphicBuffer

    【讨论】:

    • 感谢您的回复。但命名空间没有在 ndk 中定义,因为我使用的是本机代码。你试过了吗……
    • 它就在那里。在 GraphicBuffer.h 你会发现: namespace android { class GraphicBufferMapper;
    • @Doug Rogers 感谢您的回复。但是 GraphicBuffer.h 不是 ndk 的一部分。我试图将文件复制到我的项目中,但我也应该复制所有依赖的文件,这可能会在下一个 android 版本中改变......
    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多