android native播放 yuv420数据

本文介绍了如何利用EGL作为OpenGL ES与Android本地窗口系统的接口,实现YUV420数据的播放。通过初始化EGLDisplay、创建配置和Surface、建立EGL上下文,然后调用OpenGL进行顶点和片元Shader初始化、纹理创建和数据填充,最终通过eglSwapBuffers将显示内容与窗口绑定。示例代码和详细步骤助于理解整个过程。
摘要由CSDN通过智能技术生成

EGL™是Khronos呈现api(如OpenGL ES或OpenVG)与底层本机平台窗口系统之间的接口。它处理图形上下文管理、表面/缓冲区绑定和呈现同步,并使用其他Khronos api支持高性能、加速、混合模式的2D和3D呈现。EGL还提供了Khronos之间的互操作能力,以支持在api之间高效地传输数据——例如在运行OpenMAX AL的视频子系统和运行OpenGL ES的GPU之间。

通俗来讲就是,EGL是渲染API(如OpenGL, OpenGL ES, OpenVG)和本地窗口系统之间的接口。EGL可以理解为OpenGl ES ES和设备之间的桥梁,EGL是为OpenGl提供绘制表面的。因为OpenGl是跨平台的,当它访问不同平台的设备的时候需要EGL作为中间的适配器。

先update一个小demo后面再解析,代码的链接如下。

1、初始化egl  :   (代码实现如 testopenglegl.cpp) https://download.csdn.net/download/jmmingming/89208269

1) 获取EGLDisplay对象 显示设备

2)初始化Display

3)获取配置并创建surface

4)创建并打开EGL上下文

具体操作如下:

std::int16_t Testdisplayer(const char * url, void * windows)
{
    ALOGD("Testdisplayer: url = %s ", url);

    FILE *fp = fopen(url, "rb");
    if (!fp) {
        ALOGE("open file %s failed !!", url);
        return false;
    }

    ANativeWindow * nwin = (ANativeWindow *) windows;
    // ========EGL=======
    //1、egl display 创建和初始化
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if (display == EGL_NO_DISPLAY) {
        ALOGE("eglGetDisplay failed !!");
        return false;
    }
    if (EGL_TRUE != eglInitialize(display, 0, 0)) {
        ALOGE("eglInitialize failed !!");
        return false;
    }

    // 2 配置surface
    EGLConfig config;
    EGLint configNum;
    EGLint configSpec[] = {
            EGL_RED_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_BLUE_SIZE, 8,
            EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE
    };
    if(EGL_TRUE != eglChooseConfig(display,configSpec,&config,1,&configNum))
    {
        ALOGE("eglChooseConfig failed!");
        return false;
    }

    winsurface = eglCreateWindowSurface(display,config,nwin,0);
    if (winsurface == EGL_NO_SURFACE) {
        ALOGE("eglCreateWindowSurface test failed !!");
        return false;
    }

    //3 context 创建关联的上下文
    const EGLint ctxAttr[] = {
            EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE
    };
    EGLContext context = eglCreateContext(display,config,EGL_NO_CONTEXT,ctxAttr);
    if (context == EGL_NO_CONTEXT) {
        ALOGE("eglCreateContext failed !!");
        return false;
    }
    if (EGL_TRUE != eglMakeCurrent(display, winsurface, winsurface, context)) {
        ALOGE("eglMakeCurrent fail");
        return false;
    }
    ALOGE("EGL Init Success!");

    // &
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值