显示器如何显示一个YUV422格式的图形
记录在开发过程中对知识点的一些理解:
在开发渲染程序的过程中,需要对视屏文件进行解码解码后特效文件的叠加,使用的技术是(FFmpeg+DirectX)
解码出来的视屏数据格式是YUYV,使用DirectX的创建的纹理格式为RGBA,
(1):视屏的宽高分别为Width和Height,则视屏最后在显卡中显示为RGBA的缓存大小:Width*4*Height。
(2):FFmpeg解码为YUYV格式的缓存大小为:Width*2*Height,因为每个像素采样一个Y,每两个像素采样一个UV。那么则创建一个宽度为Width*2,高度为Height的DirectX纹理来存储解码后的YUYV数据,将此数据送入定点作色器和像素作色器进行采样。其大概流程为:
解码后的YUYV数据 -> DirectX纹理数据 -> 作色器采样(还原为2倍大小)-> 显示器输出显示

YUYV数据和RGBA纹理中的数据完全一样,都是YUYVYUYVYUYV……的格式和大小,并没有带有真正的透明度信息(即YUYV分别对应RGBA,其实A存储的为V信息),数据只有在进行采样的时候送入顶点和像素作色器才被还原为原来的大小,在作色器中才有数据格式的变化,将YUV转化为RGB,然后给A的透明度填充为固定值,不透明。
(3):下面来分析采样的方式:

目的:将一个宽度只有显示一半的纹理数据(YUYV)完整的显示在显示器上,即将一个大小为【W/2 * H】的YUV/RGBA纹理变化为一个大小为【w * H】的RGBA数据,并且显示在显示器上面
分析:如何将一个大小不等于显示屏宽度的图像全屏完整的显示出来呢?答案是:在横向和纵向进行屏幕显示分辨率的宽度个数次采样,假如屏幕的分辨率是1920*1080,则将要显示的图像进行横向1920次采样,纵向1080次采样。
则for(int i = 0;i<1080;i++)
{
for(int j = 0; j< 1920; j++)
{
//Samplate 对需要输出的原始图形进行采样,则每次采样的位置为(src.i/1920*src.w)
//假如原图像的宽高为960*1080,则第一次C采样的点位(0,0),第二次采样的地位(0,0),第三次(1.0),第四次(1.0)
//则纹理坐标为(0/960,0/1080)映射到(0/1920,0/1080)
//则纹理坐标为(0/960,0/1080)映射到(1/1920,0/1080)
//则纹理坐标为(1/960,0/1080)映射到(2/1920,0/1080)
//则纹理坐标为(1/960,0/1080)映射到(3/1920,0/1080)
}
}
如下图所示:
其实作色器会在原始图像中每个像素采样两次;每次采样的纹理坐标为(i/1920,j),i为的范围是【0-960】

显示器如何显示一个YUV422格式的图形的更多相关文章
- toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算
作用 toString()的作用是返回一个反映这个对象的字符串; valueOf()的作用是返回它相应的原始值; 异同点 共同点:在 JavaScript 中,toString()方法和valueOf ...
- Java如何以(MMM)格式显示一个月份的名称?
JAVA中,如何以(MMM)格式显示一个月份的名称? 此示例显示如何使用Calender类的Calender.getInstance()方法和Formatter类的fmt.format()方法来显示( ...
- js获取上一个月、下一个月格式为yyyy-mm-dd的日期
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取
第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...
- Ubuntu 12.04更换显示器后显示“显示不支援”,只能进恢复模式工作
以前用的一台14寸液晶,换成17寸后,进入系统显示器上“显示不支援” .仔细观查,电脑硬盘自检能显示后,后面都是黑屏. 解决过程. 因为grub 启动菜单不能显示.盲按方向键,发现菜单里的其它项目可 ...
- OpenGL编程逐步深入(二)在窗口中显示一个点
准备知识 在本文中我们将会接触到OpenGl的扩展库GLEW( OpenGL Extension Wrangler Library),GLEW可以帮助我们处理OpenGl中繁琐的扩展管理.一旦初始化后 ...
- osgEarth使用笔记1——显示一个数字地球
目录 1. 概述 2. 实现 2.1. 三维显示 2.2. 二维显示 1. 概述 osgEarth支持.earth格式的文件,里面保存了数字地球相关信息的配置XML,只需要读取这个配置文件,就可以直接 ...
- win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法
如上图所示,桌面或其他大部分地方点击右键菜单,都只显示一个白色框,鼠标移上去才有菜单项看,并且效果很丑 解决办法: 计算机-右键-属性-高级-性能-设置-视觉效果-淡入淡出或滑动菜单到视图,将其前面的 ...
- ios显示一个下载banner
<meta name="apple-itunes-app" content="app-id=432274380" /> 这个标签是告诉iphone的 ...
随机推荐
- mac 常用开发软件列表
toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...
- 51Nod - 1001:数组中和等于K的数对
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A: ...
- ACM常用算法
数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维 ...
- 理解cookie和session技术
一.HTTP协议的无状态性 WEB应用程序使用的是HTTP协议传输数据的,HTTP协议是一个无状态的协议,这次数据传输完毕,客户端会和服务端断开连接,再次传输数据就需要重新建立新的连接,这也就无法会话 ...
- JavaWeb-入门第一课-1.静态web动态web 2.web服务器 3.下载和安装Tomcat-web服务器
文章来源:http://www.cnblogs.com/xdp-gacl/p/3729033.html 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思 静态web资源(如html ...
- MySQL--lsblk命令查看块设备
lsblk命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息.块设备有硬盘,闪存盘,cd-ROM等等. lsblk命令包含在util-linux-ng包中, ...
- 个人博客:有态度的HBase/Spark/BigData
个人博客:有态度的HBase/Spark/BigData 关于我 本人范欣欣,男,就职于网易杭州研究院后台技术中心数据库技术组,专注于HBase的开发运维,热衷于MySQL等相关数据库技术.联系方式: ...
- oracle 与sql serve 获取随机行数的数据
Oracle 随机获取N条数据 当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到这 ...
- Java使用Unsafe接口操作数组Demo
public class unSafeArrayDemo { private static final sun.misc.Unsafe UNSAFE; private static final lon ...
- 客户端用javascript获取grid的数据。