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应用一 ...
随机推荐
- java if语句
//if语句 //Test10.java import java.util.Scanner; public class Test16{ public static void main(String[] ...
- nullpointerxception——处理思路
概念: 1.所谓的指针,就是java中的对象的引用.比如String s;这个s就是指针.2.所谓的空指针,就是指针的内容为空.比如上面的s,如果令它指向null,就是空指针.3.所谓的空指针异常,就 ...
- 图解 eclicpse 智能提示 配置
输入的内容: “.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ” 第一步: 第二步:
- 实现仿UC浏览器首页下拉动画
经常用UC看到首页有这么一个动画,就仿造写了一下. 实现分析 1.画曲线的动画 这个一眼看去就想到用贝塞尔曲线画,来看贝塞尔曲线方法,给出两个定点,和一个控制点就可以画. CGContextAddQu ...
- 入门程序,hello world
RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根据你给它的路由,缓冲规则进行传递消息. 一.专业术语 1. 生产者: 在现实生活中就好比制造商 ...
- Python学习笔记(十一)—— 函数式编程
一.函数式编程理念 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变 ...
- 微信小程序-携带参数的二维码条形码生成
demo文件目录 index.js文件 //index.js var wxbarcode = require('../../utils/index.js'); Page({ data: { code: ...
- ceph-RGW Jewel版新概念
一.概述 zone: 包含多个RGW实例的一个逻辑概念.zone不能跨集群,同一个zone的数据保存在同一组pool中: zonegroup:一个zonegroup如果包含一个或多个zone,如果包含 ...
- ASP.NET 5 RC 2:UrlRouting 设置(不包含MVC6的UrlRouting设置)
0.Program.cs using System.IO; using Microsoft.AspNetCore.Hosting; namespace AspNetCoreUrlRoutingDemo ...
- Android中3种全屏方法及3种去掉标题栏的方法
一.去掉标题栏的方法 第一种:入门的时候经常使用的一种方法 复制代码代码如下: requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉标题栏注意这句一 ...