显示器如何显示一个YUV420格式的图形

记录在开发过程中对知识点的一些理解:

在开发渲染程序的过程中,需要对视屏文件进行解码解码后特效文件的叠加,使用的技术是(FFmpeg+DirectX)

解码出来的视屏数据格式是YUYV(YUV420),使用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】

  

时间: 2024-10-25 00:03:26

显示器如何显示一个YUV420格式的图形的相关文章

toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算

作用 toString()的作用是返回一个反映这个对象的字符串; valueOf()的作用是返回它相应的原始值; 异同点 共同点:在 JavaScript 中,toString()方法和valueOf()方法,在输出对象时会自动调用.不同点:二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString. js中的Date, Array, Number, Boolean, Function等访问实例的toSting方法和valueOf方法,都会返回不同的东西.

显示器电子枪显示一个汉字,画完所有的笔画,求最短路径算法。求讨论

 如题. 个人觉得有两种思路,第一是归结为旅行商问题,用分支限界法或者其它方法求解.假设一个汉字有n划,就对应2n个点对.每画一划,就少了2个选择,所以总共的解空间大小是2n*2(n-1)*...*2. 第二是归结为中国邮递员问题,走完一个连通图的所有边,怎么走路径最短,通过添加一些多余的边,也是能得到最优解的.但是汉字可能不是一个连通图,怎么办?也许可以先通过计算汉字各划的位置关系,将其扩展为连通图? 感觉第一种方法要简洁一些,便于处理. 请问大家思路?

POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页 //第一个单元格 Row row=sheet.createRow(0); // 创建一个行 Cell cell=row.createCell(0); // 创建一个单元格 第1列 cell.setCellValue(new Date()); // 给

显示一个托盘

1 private NotifyIcon notifyIcon = null; //这里在窗体上没有拖拽一个NotifyIcon控件,而是在这里定义了一个变量 2 public Form1() 3 { 4 InitializeComponent(); 5 InitialTray(); //调用初始化托盘显示函数 6 } 7 8 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 9 { 10 e.Cancel

EasyUI的DataGrid日期列(datebox)正确显示json时间格式

问题描述: 前端使用EasyUI,后台使用Spring MVC, 数据库里面存储的时间格式为:2014-06-10,但是后台返回给前台页面的数据是json格式的,类似于:1402367297000的形式,日期列datebox是无法解析的.具体如下图: 自己也是EasyUI小白,网上查查资料,倒腾下总算搞出来了,这里做下记录. 一般情况下我们所需的日期格式都是:2014-02-02或者2014/09/09形式的,因此首先要考虑实现一个添加日期格式化的插件. jQuery日期格式化 在自己的js中添

C#winform两个或多个panel重叠布局时如何显示一个

现象:panel1和panel2或更多panel,叠放在一起,panel和panel2是同一层次的.panel1和panel2切换时只能显示一个panel,如何切换呢? 解决方法: 1.打开vs视图-其他窗口-文档大纲,看看层次关系,就可以看出最上面的panel是窗体里显示出来的.如何让panel2出现在窗体去编辑呢? 2.拖动panel2到panel1前面,即可编辑panel2

opencv 显示一个图片/播放视频

//显示图片 #include"highgui.h" int main(int argc,char **argv) { IplImage *img=NULL; char *imgname="E:/实验/image/1.jpg"; img=cvLoadImage(imgname);//cvLoadImage加载一个图片 并返回一个IplImage指针 cvNamedWindow("test",0);//创建一个叫test的窗口,窗口大小固定 cvS

QApplication::alert 如果窗口不是活动窗口,则会向窗口显示一个警告(非常好用,效果就和TeamViewer一样)

void QApplication::alert(QWidget * widget, int msec = 0)如果窗口不是活动窗口,则会向窗口显示一个警告.警报会显示msec 毫秒.如果毫秒为零,闪烁一段时间后会停止,任务栏图标会一直亮着.widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> #include <QTime> namespace Ui { clas

用Dialog显示一个列表

要求:用Dialog对话框显示一个列表,并实现其点击效果 代码: private ListView lv_list; private String deleteName; private AlertDialog.Builder builder; private Dialog dialog; private void showDialog() { /**  * 创建Dialog,参数为当前环境与样式.  */ builder = new AlertDialog.Builder(this); Vie