雷霄骅《最简单的视音频播放示例2:GDI播放YUV, RGB 》中YUV转RGB的过程
雷霄骅在 https://blog.csdn.net/leixiaohua1020/article/details/40266503 一文中提到了yuv转rgb的代码,通过简单的改造,就可以直观的看出yuv的模样。
测试rgb的渲染。
改动CONVERT_YUV420PtoRGB24 的代码如下。
void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2); y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){R = 255;G = 0;B = 0;offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B;rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}
期待的结果为整个窗口为红色。
只渲染yuv中的y数据。
改动CONVERT_YUV420PtoRGB24 的代码如下。
void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2);y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){Y = *(y_planar + nWidth * i + j);R = Y;G = Y;B = Y;offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B;rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}
运行后的结果为:
可以看出,Y代表的就是亮度信息。
添加uv数据
改动CONVERT_YUV420PtoRGB24 的代码如下。值得注意的是,雷兄给的第一种方法,颜色有些许偏差,查资料可以看出来,第二种方法更加主流。https://stackoverflow.com/questions/1737726/how-to-perform-rgb-yuv-conversion-in-c-c
void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2);int u_width = (nWidth >> 1);y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){Y = *(y_planar + nWidth * i + j);offSet = (i >> 1) * (u_width)+(j >> 1);U = *(v_planar + offSet);V = *(u_planar + offSet);int C, D, E;C = Y - 16;D = U - 128;E = V - 128;R = CONVERT_ADJUST((298 * C + 409 * E + 128) >> 8);G = CONVERT_ADJUST((298 * C - 100 * D - 208 * E + 128) >> 8);B = CONVERT_ADJUST((298 * C + 516 * D + 128) >> 8);offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B; // 如果不想再调用CHANGE_ENDIAN_PIC,可以直接调换 b和r的赋值位置。rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}
雷霄骅《最简单的视音频播放示例2:GDI播放YUV, RGB 》中YUV转RGB的过程相关推荐
- 雷霄骅开源视音频项目汇总
from: http://blog.csdn.net/leixiaohua1020/article/details/42658139# 作者:雷霄骅, 一个值得怀念的人 本文汇总一下自己视音频编解码学 ...
- 最简单的视音频播放示例7:SDL2播放RGB/YUV
最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例2:GDI播放YUV, RGB 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surfa ...
- 最简单的视音频播放示例9:SDL2播放PCM
本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...
- 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- 最简单的视音频播放示例8:DirectSound播放PCM
===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...
- 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)
===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...
- 最简单的视音频播放示例5:OpenGL播放RGB/YUV
===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...
- 最简单的视音频播放示例2:GDI播放YUV, RGB
===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...
- 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)
===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...
- 最简单的视音频播放示例3 Direct3D播放YUV,RGB(通过Surface)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! ==== ...
最新文章
- 上三角矩阵的特征值分解
- Docker selenium自动化 - 修改/dev/shm路径大小实例演示,“session deleted because of page crash“问题解决
- win7卸载打印机驱动
- 【HDOJ】3006 The Number of set
- 2021年春季学期期末统一考试 劳动与社会保障法(本) 试题
- C语言里最基础的关键字
- Razor Generator
- mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...
- 开发环境中Docker的使用
- mysql 事务操作详细实例介绍
- 地推HTTP成长介绍
- 【数据结构和算法】哈希表详解
- “杭银理财”杯浙江工业大学大学生程序设计竞赛暨全国邀请赛 签到题9题
- geotools绘制地图导出图片
- 如何关闭谷歌的安全搜索?
- String 常用方法总结
- using eclipse to write c programe
- 形式语言与自动机之一 语言与文法
- 合约战事风云 |链捕手
- ~6. ccf 2021-09-1 数组推导
热门文章
- raytrace 算法理论与实践
- android 强制打开gps定位_Android开发之android_gps定位服务简单实现
- java程序模拟QQ空间登录 - 并模拟刷说说的赞
- java access_Java 连接Access数据库的两种方式
- java long 转换成 Date
- 真正彻底卸载ie8的某些加载项
- Matlab 绘制 1931 CIE色品图 并标点
- Tip - 彻底卸载删除3721(雅虎助手)。快速!
- crackme用来测试程序设计人员的逆向工程技能的小程序。
- UltraISO制作启动盘时报错:磁盘/映像容量太小