Wie zu verwenden GraphicBuffer im android-ndk
Bitte ich dies mit Hinweis auf eine Antwort für meine Frage bei Wie zur Verbesserung der opengl-es-anzeigen-Leistung in android . Ich war versucht, um den code zu erstellen, die verwendet GraphicBuffer mit ndk-r9d. aber Es ist zu sagen GraphicBuffer ist nicht deklariert, in diesem Umfang. Die gleichen Kommentare für eglCreateImageKHR und glEGLImageTargetTexture2DOES.
Habe ich Hinzugefügt EGL/eglext.h und GLES2/gl2ext.h . Ich habe versucht, um ui/GraphicBuffer.h aber es ist nicht Einnahme es. Gibt es eine andere header-Datei Hinzugefügt werden ?
Den unten angegebenen code habe ich Hinzugefügt, um zu vermeiden, die Verwendung von 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);
Was kann ich tun, um es auszuführen......
Vielen Dank im Voraus..
- GraphicBuffer.h ist nicht Bestandteil des NDK. Müssen Sie zum extrahieren der header aus den AOSP Quellen, und verwenden Sie es mit dem Verständnis, dass dies eine interne API, die Gegenstand zwischen den Versionen ändern. FWIW, stackoverflow.com/questions/21151259 relevant sein können.
- fadden vielen Dank für Ihre Antwort.. ich habe diese Frage gestellt, um speed up my video-frame-Anzeige, wie in meiner Frage an stackoverflow.com/questions/23131472/.... Haben Sie eine Lösung für andere als graphicBuffer. Und wie extrahieren der header aus den AOSP Quellen
- wie kann ich extrahieren der header aus den AOSP Quellen
- Können Sie mir einen Vorschlag..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arbeite ich an diesem problem in diesen Tagen, auch.
Viele blogs sagte, eine Kopie des Android-source-code benötigt wird, um die Verbindung zusammen mit Ihrem Projekt. Ich glaube, es ist elegant, get-Funktion von
libui.so
in runtime, die "alternative Ansatz" erwähnt, die von Aleksandar Stojiljkovic.Ich geschrieben habe, eine einfache Bibliothek, das zu tun. Hier ist es.
Leider wurde es entfernt von hier, aber Sie könnte einige Antworten gibt:
http://community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage--updating-a-texture-without-copying-memory-under-android
Kurz gesagt, müssen Sie erstellen Sie Android-Plattform-code, und erstellen Sie die Bibliothek, die würden wrap Zugang zu GraphicBuffer und die erforderlichen API und bauen gegen android-code-Basis. Wie andere erwähnt haben, müssen Sie halten die Bibliothek...
Dies ist ein alternativer Ansatz:
https://code.google.com/p/chromium/codesearch#chromium/src/third_party/deqp/src/framework/platform/android/tcuAndroidInternals.cpp&l=167
GraphicBuffer ist im namespace android.
Entweder hinzufügen:
using namespace android;
oder beziehen sich auf GraphicBuffer mit android::GraphicBuffer