This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/TDA2EX17EVM: in Vision SDK version 3.6 , OPENGL api from YUV to RGB , image brightnes ( 0-15 235-255) lost

Part Number: TDA2EX17EVM


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:  

yuv420.rar