EGL

用它开发需要做哪些事情。

DIsplay 与原生窗口建立链接。EGL在Android中可以用java调,也可以用C++调。

EGLDisplay eglGetDisplay                                // 获取原生窗口的链接

EGLBoolean eglInitlize                                     // 再进行窗口的初始化。

Surface配置和创建Surface。创建一个渲染区域,它是最终我们用来显示的对象。

EGLBoolean eglChooseConfig                                // 对渲染区域进行参数的配置。比方说颜色的深度、红色、绿色对应的深度、颜色的存储格式等

EGLSurface eglCreateWindowSurface                      // 创建surface

经过上面两步操作后,会创建一个surface,我们将来的画面就会渲染到这块surface当中去。

Context 创建渲染环境。该渲染环境主要用于描述OpenGL ES的所有项目运行需要的数据结构(如用到的顶点数据怎么绘制)。包括顶点、片断着色器、顶点数据矩阵。

eglCreateConrtext

eglMakeCurrent

GLSL

具体的显示YUV数据。又称之为shade,着色器语言。它主要包含下列两个模块:顶点着色器片元着色器。

顶点着色器是针对每个顶点执行一次。比方说要画一个三维的模型,这个时候就需要把每个顶点给计算出来,然后跟着光照的改变而改变(因为虽然三个三点的坐标是固定的,但是视角不同,这三个值就会不一样,这个时候就需要确定一个顶点着色器,把顶点的值给算出来,绘制视频则无此问题,只要绘制一个矩形就可以了)。

片元着色器是针对每个显示的片元(像素点)执行一次,执行的时候会调用相应的代码,这个时候就可以把每个像素相应的颜色给改变掉(比方说传递的是YUV的数据,但是YUV的数据是不能直接用来显示的,这个时候就可以在片元着色器里面把它的值进行转换,转换成RGB的值用于显示)。

GLSL的基本语法与C相同。

它支持向量和矩阵的操作。

GLSL提供了大量的内置函数来提供丰富的扩展功能。

同时GLSL还通过一些限定符操作来管理输入输出的。

显示YUV代码演示

  1. 准备YUV数据。通过FFmpeg工具生成一个YUV文件

ffmpeg –i 720.mp4 –pix_fmt yuv420p –s 424*240 out.yuv

把生成的YUV数据上传到模拟器

PS:需要下载FFmpeg.exe工具。

yuv420p,

p是平面格式(平面格式就是针对一幅图像,,Y存在第一位,再存U,再存V,它们是非交错的格式,就是Y全部存完了,再存U,再存V)。

如果是交错格式的话可能就是一个Y,一个U,一个V,这种存放方式。

示例代码:

需要包含库文件

target_link_libraries( # Specifies the target library.
native-lib
GLESv2
EGL
android # Links the target library to the log library
# included in the NDK.
${log-lib} )

C++代码

extern "C"
JNIEXPORT void JNICALL
Java_com_yuneec_testopengles_Xplay_open(JNIEnv *env, jobject instance, jstring url_,
jobject surface) {
const char *url = env->GetStringUTFChars(url_, ); // 获取原始窗口
ANativeWindow *nwin = ANativeWindow_fromSurface(env, surface);
// EGL
// 1. EGL display 的创建和初始化
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
LOGE("eglGetDisplay() failed");
return;
}
if (EGL_TRUE != eglInitialize(display, , )) {
LOGE("eglInitialize() failed");
return;
}
// 2. Surface
// surface 窗口配置
// 输出配置
EGLConfig config;
EGLint configNum;
EGLint configSpec[] = {
EGL_RED_SIZE, ,
EGL_GREEN_SIZE, ,
EGL_BLUE_SIZE, ,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE
};
if (EGL_TRUE != eglChooseConfig(display, configSpec, &config, , &configNum)) {
LOGE("eglChooseConfig() failed");
return;
}
// 创建Surface
EGLSurface winSurface = eglCreateWindowSurface(display, config, nwin, );
if (winSurface == EGL_NO_SURFACE) {
LOGE("eglCreateWindowSurface() failed");
return;
} //3. context 创建关联的上下文
const EGLint ctxAttr[] = {
EGL_CONTEXT_CLIENT_VERSION,,EGL_NONE
};
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctxAttr);
if (context == EGL_NO_CONTEXT) {
LOGE("eglCreateContext failed");
return;
}
if (EGL_TRUE != eglMakeCurrent(display, winSurface, winSurface, context)) {
LOGE("eglMakeCurrent failed");
return;
} LOGI("EGL init success"); env->ReleaseStringUTFChars(url_, url);
}

FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化的更多相关文章

  1. 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:

    14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率: 主线程 在InnoDB 是一个线程 执行各种任务在后台. ...

  2. 14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取

    14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取 一个预读请求是一个I/ ...

  3. 14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate

    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate 主的master thread ...

  4. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  5. 14.4.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预读

    14.4.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预读 一个预读请求 是一个I ...

  6. FFmpeg(12)-使用NDK通过GLSurfaceView完成视频的播放

    一.包含头文件和库文件 这里采用的是NDK中的ANativeWindow来完成视频的播放,因为需要添加相关的库和头文件. CMakeLists target_link_libraries( # Spe ...

  7. 启动Genymotion时报错Failed to initialize backend EGL display

    在启动Genymotion的时候报错: video card说的是显卡,你的显卡可能不支持  OpenGL2.0,或者你装的驱动有问题. 解决办法:将驱动重新安装一下. 可直接下载一个如“驱动人生“一 ...

  8. beaglebone black ubuntu display x11 server的配置

     Change default resolution on BeagleBone modesetting vs fbdev digiteltlc May 7th, 2014, 03:28 PM Hi ...

  9. Android NDK 简单介绍、工具安装、环境配置

    NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一 ...

随机推荐

  1. GDALBuildVRT异构波段的支持

    目录 简述 修改源码 1.修改DatasetProperty结构体 2.修改VRTBuilder::AnalyseRaster函数 3.修改VRTBuilder::CreateVRTNonSepara ...

  2. grep命令-v参数过滤以井号、分号开头的注释信息行及空白行

    grep命令-v参数(反向选择)分别去掉所有以#(井号)和;(分号)开头的注释信息行,对于剩余的空白行可以再用^$来表示并反选过滤 [root@rhel7 samba]# cat smb.conf | ...

  3. Win一键查看用户密码

    测试Win7环境,能探测系统密码 Download: 链接: https://pan.baidu.com/s/1skTeNrJ 密码: avpa

  4. 转:开源3D引擎介绍

    Delta3D:Delta3D是一个功能齐全的游戏引擎,可用于游戏,模拟或其他图形应用.其模块化设计集成了其他的开源项目,如‘开放场景图’,‘开放动力学引擎’,‘人物动画库’和‘OpenAL’ .De ...

  5. ios中自定义checkbox

    //自定义button#import <UIKit/UIKit.h> @interface CKButton : UIButton @end #import "CKButton. ...

  6. iOS UILabel设置行间距和字间距

    实现UILabel的文字,设置行间距和字间距. 效果图: 代码: let lblTitle = UILabel(frame: CGRect(x: , y: , width: KScreenWidth- ...

  7. 统计bytearray中的bitcount

    给定一个byte数组,要求统计byte数组的bitcount,也就是byte数组中为1的位的个数. Redis提供了位数组数据结构,位数组是相对独立的一个程序,在<Redis设计与实现>( ...

  8. 【CI】CN.一种多尺度协同变异的微粒群优化算法

    [论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘  玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...

  9. MATLAB 的unique函数——数组矩阵的唯一值

    MATLAB 的unique函数——求数组矩阵的唯一值 相关MathWork文档见此:unique数组中的唯一值 1.C = unique(A) 返回与 A 中相同的数据,但是不包含重复项.C 已按照 ...

  10. MATLAB R2018a 安装教程

    1.下载相应的 MATLAB  R2018a  版本如下:[matlab2018的百度云盘:链接:https://pan.baidu.com/s/1OV242y6EV6auvG3DvvqD8A 密码: ...