текстура для преобразования YUV420 в RGB в OpenGL ES
Я должен конвертировать и отображать изображения YUV420P в цветовое пространство RGB, используя графический процессор AMD на процессоре Freescale iMX53 (OpenGL ES 2.0, EGL). ОС Linux, нет X11. Чтобы достичь этого, я должен иметь возможность создать соответствующее изображение, содержащее данные YUV420P: это может быть тип изображения YUV420P / YV12 или 3 простых 8-битных изображения, по одному для каждого компонента (Y, U, V).
glTexImage2D исключен, поскольку он медленный, кадры YUV420P являются результатом декодирования видео в реальном времени @ 25FPS, и с помощью glTexImage2D мы не можем сохранить желаемую частоту кадров.
Есть альтернатива: eglCreateImageKHR / glEGLImageTargetTexture2DOES. Единственная проблема заключается в том, что они не могут обрабатывать любой формат изображения, который подходит для данных YUV420 / YV12.
EGLint attribs[] = {
EGL_WIDTH, 800,
EGL_HEIGHT, 480,
EGL_IMAGE_FORMAT_FSL, EGL_FORMAT_YUV_YV12_FSL,
EGL_NONE
};
EGLint const req_attribs[] = {
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_ALPHA_SIZE, 0,
EGL_SAMPLES, 0,
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE
};
...
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, NULL, NULL);
eglBindAPI(EGL_OPENGL_ES_API);
eglChooseConfig(display, req_attribs, config, ARRAY_SIZE(config), &num_configs);
ctx = eglCreateContext(display, curr_config, NULL, NULL);
surface = eglCreateWindowSurface(display, curr_config, fb_handle, NULL);
...
EGLImageKHR yuv_img = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NEW_IMAGE_FSL, NULL, attribs);
eglQueryImageFSL(display, yuv_img, EGL_CLIENTBUFFER_TYPE_FSL, (EGLint *)&ptr);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, yuv_img);
glEGLImageTargetTexture2DOES (...) завершается ошибкой. Если я изменю соответствующую строку в 'attribs' на это:
EGL_IMAGE_FORMAT_FSL, EGL_FORMAT_RGB_565_FSL,
тогда изображение может быть назначено на текстуру OpenGL ES, но не следует хранить 8-битные данные (Y / U / V) или YUV420 / YV12. Поиск в сети (включая форум сообщества Freescale) Я не нашел никакого решения для этого.
Как я могу создать изображение, которое:
быстро создавать;в конечном итоге может быть назначен уже существующему буферу (указан физический адрес или виртуальный адрес);может использоваться в программе фрагмент / вершинный шейдер для выполнения преобразования YUV -> RGB;Ограничение состоит в том, чтобы избежать ненужных memcpy (...) из-за соображений производительности.