текстура для преобразования 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 (...) из-за соображений производительности.

Ответы на вопрос(1)

Ваш ответ на вопрос