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.

[参考译文] 视频纹理的 Android 演示无法正常工作

Guru**** 2609955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648562/android-demo-for-video-texture-can-not-work

我在上海与 Anand 一起过世。

他为我们演示了如何在 Android 上创建限制。

但它无法正常工作。

========================================================================

int main (int argc、char** argv){ 
EGLBoolean 返回值;
EGLConfig MyConfig ={0};

EGLint context_attribs[]={EGL_context_client_version、2、EGL_none};
EGLint s_configAttribs[]={
EGL_surface_type、EGL_window_bit、
EGL_RENDERABLE_TYPE、EGL_OpenGL_ES2_BIT、
EGL_RED_SIZE、8、
EGL_GREEN_SIZE、8、
EGL_blue_size、8、
EGL_alpha_size、8、
EGL_DEPTY_SIZE、16、
EGL_SAMPLE_buffers、1、
EGL_Samples、4、
EGL_NONE};
EGLint MajorVersion;
EGLint minorVersion;
EGLContext 环境;
EGL 表面;
EGLint w、h;

EGLDisplay dpy;

CheckEglError (") ");
dpy = eglGetDisplay (EGL_default_display);
CheckEglError ("eglGetDisplay");
if (dpy = EGL_NO_DISPLAY){
printf ("eglGetDisplay 返回的 EGL_NO_DISPLAY.\n");
返回0;


返回值= eglInitialize (dpy、&MajorVersion、&minorVersion);
checkEglError ("eglInitialize"、returnValue);
fprintf (stderr、"EGL 版本%d.%d\n"、MajorVersion、MinorVersion);
if (returnValue!= EGL_true){
printf ("eglInitialize Failed\n");
返回0;


WindowSurface WindowSurface;
EGLNativeWindowType 窗口= windowSurface。getSurface ();
返回值= EGLUtils::selectConfigForNativeWindow (dpy、s_configAttribs、Window、&MyConfig);
if (返回值){
printf("EGLUtils::selectConfigForNativeWindow()返回%d",返回值);
返回1;


========================================================================================================
上面的红色字返回错误-21
Anand 告诉我们将这个问题推在这里
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已将您的问题转交给一位专家征求意见。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否分享有关此版本所针对的 TI 基准版本的信息?

    谢谢、

    Gowtham

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在下面发布了有关系统信息的图片

    =================== 另一个问题===================

    使用 Anand 的新修补程序(gralloc.so),我们已经成功地设置了 YV12纹理,就像已经转换的代码一样。

    主 API 是"registerBuffer"、它可以注册我们的物理缓冲区。

    但是当我们转向 YUYV 格式时,它就崩溃了!

    "registerBuffer"是问题。

    =================== 下面是我们的代码=========================================================================

    #include "VideoTexture.h"
    
    
    
    #define FourCC (a、b、c、d)((uint32_t)(uint8_t)(a)|((uint32_t)(uint8_t)(b)<< 8)|(uint32_t)(c)(c)< uint8_t (
    t)(uint8_t)(uint8_t)(t)(uint8_t)(uint8_t)<[t)、<uint8_t (uint8_t)、<uint8_t (uint8_t)<[t)、<uint8_t (ustr[t)、<uint8_
    EGLSyncKHR (* eglCreateSyncKHR)(EGLDisplay dpy、EGLenum 类型、const EGLint * attrib_list);
    EGLBoolean (* eglDestroySyncKHR)(EGLDisplay dpy、EGLSyncKHR SYNC);
    EGLint (* eglClientWaitSyncKHR)(EGLDisplay dpy、EGLSyncKHR SYNC、EGLint 标志、EGLTimeKHR 超时);
    EGLBoolean (* eglGetSyncAttribKHR)(EGLDisplay dpy、EGLSyncKHR SYNC、EGLint 属性、EGLint *值);
    #include "DRM_fourcc.h"
    
    PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
    PFNGLEGLIMAGETTEXURE2DOESPROC glEGLImageTargetTexture2DOES;
    
    静态 anativeWindowBuffer ANWB;
    const gralloc_module_t * grModule =空;
    const alloc_device_t *分配设备=空;
    
    const int yuvTexUsage = Android::GraphicBuffer::usage_hw_纹 理| Android:GraphicBuffer::usage_sw_write_nar;
    const int yuvTexFormat = HAL_PIXEL_FORMAT_YV12;
    
    int align (int x、int a){
    返回(x +(A-1))和(~(A-1));
    }
    静态 int openGraphicsHAL()
    {
    int err = 0;
    gralloc_module_t const *模块;
    
    IF (grModule)
    返回0;
    
    ERR = HW_GET_MODULE (GRALLOC_hardware_MODULE_ID、
    (const hw_module_t **)&module);
    如果(err){
    run_info ("%s":打开 Android 图形 HAL 失败(err=%d)\n"、
    _func__、err);
    转至 ERR_OUT;
    }
    
    err = module->common.methods->open((const hw_module_t*)模块,
    GRALLOC_hardware_GPU0、(HW_DEVICE_t **)和分配器件);
    如果(err){
    run_info ("%s":打开 Android Grapichs HAL 设备失败(err=%d)\n"、
    _func__、err);
    转至 ERR_OUT;
    }
    
    GRModule =模块;
    
    ERR_OUT:
    返回错误;
    }
    
    静态空 incRefNop (struct android_native_base_t __unused *base){}
    静态空 decRefNop (struct android_native_base_t __unused *base){}
    
    #define OMAP-BO_M4_buffer_shift20
    void * VideoTexture::alloc_bo (int bpp、int width、int height、int *bo_handle、int *间距、 unsigned char nBufidx)
    {
    uint32_t 标志= 0;
    
    if (nBufidx >=1 && nBufidx <= 8){
    flag = nBufidx << OMA_BO_M4_buffer_shift;
    }
    否则{
    run_info ("bufIdx 错误!! %d"、nBufidx);
    返回 NULL;
    }
    
    struct omap_bo *bo;
    uint32_t bo_flags = OMAP-BO_SCANOUT;
    
    if ((bo_flags & omap_bo_t平 铺)=OMAP_BO_t平 铺)
    {
    BO_FLAGS &=~OMAP-BO_TOBLET;
    如果(bpp =8){
    BO_FLAGS |= OMA_BO_TOBLE_8;
    } 如果(bpp =16){
    BO_FLAGS |= OMA_BO_TOBLE_16;
    } 如果(bpp =32){
    BO_FLAGS |= OMA_BO_TOBLE_32;
    }
    }
    
    BO_FLAGS |= OMA_BO_WC;
    
    if (bo_flags & omap_bo_平 铺){
    //bo = omap_bo_new_t平 铺((omap_device*) m_pGraphic->GetDevice()、宽度、高度、bo_FLAGS);
    } 否则{
    //bo = omap_bo_new (((omap_device*) m_pGraphic->GetDevice ()、width * height * bpp / 8、bo_flags);
    run_info ("omap_bo_new nBufidx:%d\r\n"、nBufidx);
    run_info ("omap_device:%x\r\n"、m_pGraphic->GetDevice());
    run_info ("width:%d height:%d bpp:%d\r\n"、width、height、bpp);
    BO = omap_bo_new (((omap_device*) m_pGraphics->GetDevice ()、宽度*高度* bpp / 8、
    OMAP-BO_WC | OMAP-BO_SCANOUT | FLAG);
    run_info ("bo:%x\r\n"、bo);
    }
    
    如果(bo)
    {
    //*bo_handle = omap_bo_handle (bo);
    *间距=宽度* bpp / 8;
    //IF (BO_FLAGS 和 OMAP-BO_TOB砖 型)
    //*pitch = ALIGN2 (*pitch、page_shift);
    run_info (“节距:%d\r\n",*节距);
    }
    返回(void*) bo;
    }
    
    int VideoTexture::SetYV12Buffer (unsigned char* pbuffer、int nWid、int nHgt、unsigned char nBufidx)
    {
    if (nWid <= 0 || nHgt <= 0)
    {
    run_info ("InitVideoBuffer!error");
    返回 NULL;
    }
    
    地图 :iterator ITER=m_mapDma2Tex.find (nBufidx);
    if (itER!= m_mapDma2Tex.end())
    {
    //run_info ("未创建 YUV 缓冲区、开始%d\r\n"、nBufidx);
    m_nTexture = ITER->second;
    }
    其他
    {
    run_info ("创建 YUV 缓冲区开始%d\r\n"、nBufidx);
    PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
    PFNGLEGLIMAGETTEXURE2DOESPROC glEGLImageTargetTexture2DOES;
    eglCreateImageKHR =
    (PFNEGLCREATEIMAGEKHRPROC) eglGetProAddress("eglCreateImageKHR");
    glEGLImageTargetText2DOES =
    (PFNGLEGLIMAGETRGETTEXURE2DOESPROC) eglGetProcAddress ("glEGLImageTargetTexture2DOES");
    
    int nPitch = 0;
    int nHandle = OMA_BO_SCANOUT;
    INT DFD = 0;
    EGLint 属性[20];
    
    omap_bo * tempBO =(omap_bo *) alloc_bo (16、nWid、nHgt、_nHandle、&nPitch、 nBufidx);
    
    dfd = omap_bo_dmabuf (tempBO);
    run_info ("dfd:%d\r\n"、dfd);
    
    /*创建 nativeWindowBuffer 并将其打包*/
    img_native_handle_t * imgHandle =(IMG_native_handle_t *) native_handle_create (
    1、IMG_NATE_Handle_NUMFDS - 1 + IMG_NATE_Handle_NUMINTS);
    如果(!imgHandle){
    run_info ("无法创建 IMG_native_handle_t");
    返回 false;
    }
    imgHandle->FD[0]= DFD;
    imgHandle->usage=yuvTexUsage;
    imgHandle->iWidth = nWid;
    imgHandle->iHeight = nHgt;
    imgHandle->iFormat = yuvTexFormat;
    imgHandle->uiBpp = 12;
    imgHandle->uiFlags = 0;
    imgHandle->ui64Stamp = 0ULL;
    run_info ("创建的 buffer_handle\n");
    
    Android::status_t err = openGraphicsHAL();
    如果(err){
    run_info ("%s":打开图形 HAL\n"、__func__失败);
    返回 false;
    }
    
    ERR = grModule->registerBuffer (grModule、(buffer_handle_t) imgHandle);
    如果(err){
    run_info ("%s":无法使用 gralloc (%d)注册缓冲区\n"、
    _func__、err);
    返回 false;
    }
    run_info ("registerd the buffer with gralloc\n");
    
    anwb.common.magic = Android_native_buffer_magic;
    anwb.common.version = sizeof (anativeWindowBuffer);
    memset (anwb.common.reserved、0、sizeof (anwb.common.reserved));
    anwb.common.incRef = incRefNop;
    anwb.common.decRef = decRefNop;
    ANWB.width = imgHandle->iWidth;
    ANWB.height = imgHandle->iHeight;
    ANWB.STRIDE =对齐(ANWB.width、16);
    anwb.usage = imgHandle->usage;
    ANWB.format = imgHandle->iFormat;
    ANWB.handle =(buffer_handle_t) imgHandle;
    run_info ("从缓冲区句柄创建 anativeWindowBuffer \n);
    
    EGLImageKHR img = eglCreateImageKHR (m_pGraphics->getDisplay()、EGL_NO_Context、EGL_Native 缓冲区_Android、
    (EGLClientBuffer)&ANWB,0);
    
    EGLint 错误= eglGetError();
    
    if (错误!= EGL_Success)
    {
    run_info (" CreateImageKHR:错误%d\n"、错误);
    }
    否则{
    run_info (" eglCreateImageKHR:成功!\n");
    }
    
    if (m_pKHRImage = EGL_NO_IMAGE_KHR){
    run_info (" m_pKHRImage 为空!!!\n");
    }
    
    
    格网格纹理(1、&m_nTexture);
    glBindTexture (GL_纹 理_external_OES、m_nTexture);
    GlTextParameteri (GL_turete_external_OES、GL_turete_min_filter、GL_linear_linear);
    GlTextParameteri (GL_turete_external_OES、GL_turete_mag_filter、GL_linear);
    //glTextParameteri (GL_turete_external_OES、GL_turete_wrap_S、GL_linear_mipmap_linear);
    //glTextParameteri (GL_turete_external_OES、GL_turete_wrap_T、GL_linearl);
    glEGLImageTargetTexture2DOES (GL_Texture_external_OES、(GLeglImageOES) m_pKHRImage);
    //glGenerateMipmap (gL_t纹 理_external_OES);
    //m_pAddress = OMA_BO_MAP (tempBO);
    m_mapDma2Tex.insert(pair (nBufidx、m_nTexture);
    }
    
    m_nVideoWid = nWid;
    m_nVideoHgt = nHgt;
    返回 SUCCESS_RETURN
    ;}
    
    
    int VideoTexture::UpdateToShader ()
    {
    unsigned int nProgram = m_pEffect->GetCurrentProgram();
    glActiveTexture (GL_TEXTURE0);
    glBindTexture (GL_纹 理_external_OES、m_nTexture);
    glGenerateMipmap (gL_t纹 理_external_OES);
    Glint location = glGetUniformLocation (nProgram、"sam0");
    如果(位置=-1)
    {
    run_info ("-1 lacation!\r\n");
    返回 HIK3DERR_WRONG_PARA
    ;}
    glUniform1i (位置、0);
    
    返回 SUCCESS_RETURN
    ;}
    
    } 

    ===================================================================================================
    我们刚刚将 HAL_PIXEL_FORMAT_YV12修改为 HAL_PIXEL_FORMAT_YCbCr_422_I

    API "registerBuffer"损毁!

    我们 在标题中尝试了所有格式、可以成功创建的格式为:

     HAL_PIXEL_FORMAT_YV12、   HAL_PIXEL_FORMAT_TI_NV12

    失败的是:

    HAL_PIXEL_FORMAT_TI_UYVY、HAL_PIXEL_FORMAT_YCbCr_422_888、HAL_PIXEL_FORMAT_YCbCcr_444_888

    我们直接使用"YUYV"作为 fourcc 代码0x56595559 、它也崩溃了

    我们将 bpp 从12修改为16、再次崩溃。

    ===========================================================================================================================================

    那么、如何在 Android 上创建 yuyv 映像呢?

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    让我向 Anand 了解一下对 gralloc 库所做的更改。

    对于寄存器缓冲区错误、请从以下补丁中获取二进制文件。 它修复了在测试中使用 registerBuffer API 时出现的一些错误。

    review.omapzoom.org

     

    谢谢、

    Gowtham

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这不奏效。 您能不能只是尝试使用"YUYV (YUY2)"格式的视频数据。

    并展示其工作原理(编写一个简单的演示)?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    随附的示例(Android `GL2_yuvtex` test 的修改版本) 显示了如何使用 gralloc 注册 NV12 `OMAP-bo` buffer。 我确实看到 您的代码段遵循类似的行、因此应该非常相似。  关于 YUV2格式支持、gralloc 不要求其支持、 并且我们的 gralloc 实现目前不支持它。 如果您看到 任何非 NV12 YUV 格式的错误、则行为与预期一致。  NV12是否满足您的需求?

    谢谢、

    Gowthame2e.ti.com/.../gl2_5F00_yuvtex_5F00_import.tar.gz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已成功创建 YV12和 nv12纹理。

    但这还不够、因为我们的摄像头传感器仅提供 YUY2格式、这意味着我们必须 手动转换它。

    实际上、我们已经完成了这项工作、但对于 VPE 处理器而言、这需要太多时间。

    但是、如果我们使用 CPU 对其进行转换、 即使速度更快、高利用率也将是另一个问题。

    ===========================================================================================================================================

    您能否制作支持 YUY2格式的补丁?

    这 必须是 完美的解决方案!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    遗憾的是、添加 YUV2格式的支持并不重要。 我们可以在即将发布的 Oreo 版本中规划 IT 支持、该版本将在第2季度发布。 此时,您可以升级到较新版本,也可以将修补程序导回基准。

    谢谢、
    Gowtham