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,这种存放方式。

示例代码:

需要包含库文件

  1. target_link_libraries( # Specifies the target library.
  2. native-lib
  3. GLESv2
  4. EGL
  5. android
  6.  
  7. # Links the target library to the log library
  8. # included in the NDK.
  9. ${log-lib} )

C++代码

  1. extern "C"
  2. JNIEXPORT void JNICALL
  3. Java_com_yuneec_testopengles_Xplay_open(JNIEnv *env, jobject instance, jstring url_,
  4. jobject surface) {
  5. const char *url = env->GetStringUTFChars(url_, );
  6.  
  7. // 获取原始窗口
  8. ANativeWindow *nwin = ANativeWindow_fromSurface(env, surface);
  9. // EGL
  10. // 1. EGL display 的创建和初始化
  11. EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  12. if (display == EGL_NO_DISPLAY) {
  13. LOGE("eglGetDisplay() failed");
  14. return;
  15. }
  16. if (EGL_TRUE != eglInitialize(display, , )) {
  17. LOGE("eglInitialize() failed");
  18. return;
  19. }
  20. // 2. Surface
  21. // surface 窗口配置
  22. // 输出配置
  23. EGLConfig config;
  24. EGLint configNum;
  25. EGLint configSpec[] = {
  26. EGL_RED_SIZE, ,
  27. EGL_GREEN_SIZE, ,
  28. EGL_BLUE_SIZE, ,
  29. EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE
  30. };
  31. if (EGL_TRUE != eglChooseConfig(display, configSpec, &config, , &configNum)) {
  32. LOGE("eglChooseConfig() failed");
  33. return;
  34. }
  35. // 创建Surface
  36. EGLSurface winSurface = eglCreateWindowSurface(display, config, nwin, );
  37. if (winSurface == EGL_NO_SURFACE) {
  38. LOGE("eglCreateWindowSurface() failed");
  39. return;
  40. }
  41.  
  42. //3. context 创建关联的上下文
  43. const EGLint ctxAttr[] = {
  44. EGL_CONTEXT_CLIENT_VERSION,,EGL_NONE
  45. };
  46. EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, ctxAttr);
  47. if (context == EGL_NO_CONTEXT) {
  48. LOGE("eglCreateContext failed");
  49. return;
  50. }
  51. if (EGL_TRUE != eglMakeCurrent(display, winSurface, winSurface, context)) {
  52. LOGE("eglMakeCurrent failed");
  53. return;
  54. }
  55.  
  56. LOGI("EGL init success");
  57.  
  58. env->ReleaseStringUTFChars(url_, url);
  59. }

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. 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引

    from:  http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B ...

  2. Tensorflow结点打包和依赖控制

    深度学习库能够充分发挥GPU并行计算的能力,但是有时我们却不得不需要串行.这时就需要用到依赖控制. import tensorflow as tf a = tf.Variable(1) b = tf. ...

  3. 给你出道题---N个数字的静态决策区分问题

    决策,是世界上最重要的事情. 走路分两步:看准方向,大步前进.看准方向的过程就是决策. 任何一个问题,都对应两个空间:解空间和决策空间.我们所要做的就是使用决策空间去划分解空间. 决策可以分成两类:单 ...

  4. leetcode44:wildcard

    44. Wildcard Matching 问题描述 给定字符串s和模式p,判断字符串s是否完全符合模式p 其中字符串s只包含小写字母,模式串p包含小写字母.*.?,其中星号表示任意长度的任意字符串, ...

  5. find -exec 与xargs 区别

    find . -name "*.txt" -exec rm {} \;find . -name "*.txt" | xargs rm {} -exec    1 ...

  6. C链表的简单案例

    此案例只是简单的使用链表 链表的特点: 1.不需要提前知道要存入数据的长度 2.最后结点为NULL 3.头结点指向下一个结点的结构体指针 #include <stdio.h> #inclu ...

  7. jQuery UI API - 可拖拽小部件(Draggable Widget)(转)

    所属类别 交互(Interactions) 用法 描述:允许使用鼠标移动元素. 版本新增:1.0 依赖: UI 核心(UI Core) 部件库(Widget Factory) 鼠标交互(Mouse I ...

  8. 【Spring】SpringMVC之详解AOP

    1,AOP简介 Aspect Oriented Programming  面向切面编程.AOP还是以OOP为基础,只不过将共同逻辑封装为组件,然后通过配置的方式将组件动态切入到原有组件中.这样做的有点 ...

  9. 轻量级验证码生成插件webutil-licenseImage源码与实例应用

    webutil-licenseImage 插件内置4种验证码样式,支持用户扩展.自定义样式实现简单验证码. 源码脱管地址: http://code.google.com/p/licenseimage/ ...

  10. docker学习笔记 --- centos install

    Docker简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...