Tool/software: Code Composer Studio
we use vsdk2.8 and replace sgx libs as you supported, but it dosen't work, so we want to resolve it in vsdk3.6
the probelm is that:
The input format is YUV420, the pixels are full range (0~255), we need to use GPU OpenGL API System_eglSetupYuvTexSurface, the expected output is RGB format pixels with full range (0~255).
that means : range was cutted when yuv witch to rgb.
the function is:
#ifdef QNX_BUILD
static GLuint System_eglSetupYuvTexSurface(System_EglObj *pObj, System_EglTexProperty *pProp, void *bufAddr, int texIndex)
#else
static GLuint System_eglSetupYuvTexSurface(System_EglObj *pObj, System_EglTexProperty *pProp, int dmaBufFd, int texIndex)
#endif
{
#ifdef QNX_BUILD
EGLCompatBuffer eglCBuf;
#else
EGLint attr[32];
int attrIdx;
#endif
PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES;
#ifndef QNX_BUILD
attrIdx = 0;
attr[attrIdx++] = EGL_LINUX_DRM_FOURCC_EXT;
attr[attrIdx++] = FOURCC_STR("NV12");
attr[attrIdx++] = EGL_WIDTH;
attr[attrIdx++] = pProp->width;
attr[attrIdx++] = EGL_HEIGHT;
attr[attrIdx++] = pProp->height;
attr[attrIdx++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
attr[attrIdx++] = pProp->pitch[0];
attr[attrIdx++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
attr[attrIdx++] = pProp->pitch[0];
attr[attrIdx++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
attr[attrIdx++] = 0;
attr[attrIdx++] = EGL_DMA_BUF_PLANE1_OFFSET_EXT;
attr[attrIdx++] = 0;
attr[attrIdx++] = EGL_DMA_BUF_PLANE0_FD_EXT;
attr[attrIdx++] = dmaBufFd;
attr[attrIdx++] = EGL_DMA_BUF_PLANE1_FD_EXT;
attr[attrIdx++] = dmaBufFd;
attr[attrIdx++] = EGL_NONE;
#endif
eglCreateImageKHR =
(PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR");
glEGLImageTargetTexture2DOES =
(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES");
#ifdef QNX_BUILD
eglCBuf = pObj->eglInfo.get_egl_attach_buffer(pProp->width, pProp->height, SYSTEM_DF_YUV420SP_UV, bufAddr);
pObj->eglPixmap[texIndex] = eglCBuf.eglPixmap;
pObj->texImg[texIndex] = eglCreateImageKHR(
pObj->display,
EGL_NO_CONTEXT,
EGL_NATIVE_PIXMAP_KHR,
(EGLNativePixmapType)(pObj->eglPixmap[texIndex]),
NULL
);
#else
pObj->texImg[texIndex] = eglCreateImageKHR(
pObj->display,
EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
NULL,
attr
);
#endif
System_eglCheckEglError("eglCreateImageKHR", EGL_TRUE);
if (pObj->texImg[texIndex] == EGL_NO_IMAGE_KHR) {
Vps_printf(" EGL: ERROR: eglCreateImageKHR failed !!!\n");
return -1;
}
glGenTextures(1, &pObj->texYuv[texIndex]);
System_eglCheckGlError("eglCreateImageKHR");
glBindTexture(GL_TEXTURE_EXTERNAL_OES, pObj->texYuv[texIndex]);
System_eglCheckGlError("glBindTexture");
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
System_eglCheckGlError("glTexParameteri");
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)pObj->texImg[texIndex]);
System_eglCheckGlError("glEGLImageTargetTexture2DOES");
#ifdef QNX_BUILD
pObj->bufAddr[texIndex] = bufAddr;
#else
pObj->dmaBufFd[texIndex] = dmaBufFd;
#endif
return 0;
}
yuv420 picture show below, it dump from memory: