FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化
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代码演示
- 准备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的配置和初始化的更多相关文章
- 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 是一个线程 执行各种任务在后台. ...
- 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/ ...
- 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 ...
- 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...
- 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 ...
- FFmpeg(12)-使用NDK通过GLSurfaceView完成视频的播放
一.包含头文件和库文件 这里采用的是NDK中的ANativeWindow来完成视频的播放,因为需要添加相关的库和头文件. CMakeLists target_link_libraries( # Spe ...
- 启动Genymotion时报错Failed to initialize backend EGL display
在启动Genymotion的时候报错: video card说的是显卡,你的显卡可能不支持 OpenGL2.0,或者你装的驱动有问题. 解决办法:将驱动重新安装一下. 可直接下载一个如“驱动人生“一 ...
- beaglebone black ubuntu display x11 server的配置
Change default resolution on BeagleBone modesetting vs fbdev digiteltlc May 7th, 2014, 03:28 PM Hi ...
- Android NDK 简单介绍、工具安装、环境配置
NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一 ...
随机推荐
- 由一次 symbol lookup error 引发的思考
开发一个跨平台的项目的时候,大部分时候都是在VS下进行编码,所以也就使用了VS的解决方案来管理项目. 因为要跨平台,当时网上看scons这个工具不错,所以在linux下就使用了scons来作为编译脚本 ...
- oracle初始化化表空间用户权限
oracle单实例安装完毕,需要初始化表空间.用户.等信息.不积跬步,何以至千里! 用sys账户登录oracle数据库,以此来完成所有操作! 01.创建临时表空间 create temporary t ...
- Spring Cloud开发实践 - 01 - 简介和根模块
简介 使用Spring Boot的提升主要在于jar的打包形式给运维带来了很大的便利, 而Spring Cloud本身的优点不是那么明显, 相对于Dubbo而言, 可能体现在跨语言的交互性上(例如可以 ...
- Ubuntu18.04下编译安装Guitarix 0.37.3
准备工作 源文件下载 https://sourceforge.net/projects/guitarix/files/guitarix/ 安装依赖. 参考 https://sourceforge.ne ...
- 输出控制台信息到日志 并 通过cronolog对tomcat进行日志切分
windows下tomcat默认并不会把控制台输出的信息都记录进日志文件.但是在生产环境中,出现问题时,控制台的日志输出是无法查据的,因此需要将日志记录下来. 解决方法: 输出日志到文件 修改tomc ...
- AWVS扫描工具使用教程
上文AppScan扫描工具-工作原理&操作教程有写到Web安全漏洞扫描工具之一的APPScan,除此,还有另外一款国内使用比较主流的Web安全漏洞扫描工具——AWVS.相较于大容量的AppSc ...
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- 使用Unified Auditing Policy审计数据泵导出操作
1.创建审计策略 SQL> alter session set container=pdb1; SQL> create or replace directory dumpdir as '/ ...
- iOS UILabel设置居上对齐,居中对齐,居下对齐
在iOS中默认的UILabel中的文字在竖直方向上仅仅能居中对齐,博主參考国外站点.从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐.详细例如以下: // // myUILabel ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...