yuv422sp to yuv422p
一、本代码实现功能如下:
由于目前很多yuv看图软件没有yuv422sp格式,故实现:
读取yuv422sp源文件数据,转换为yuv422p,并写入目标文件;
二、编译及使用方法如下:
gcc yuv422sp_to_yuv422p.c -o yuv422sp_to_yuv422p;
./yuv422sp_to_yuv422p srcFile dstFile width height;
源码如下:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
/**
yyyy yyyy
uv uv
->
yyyy yyyy
uu
vv
*/
void yuv422sp_to_yuv422p(unsigned char* yuv422sp, unsigned char* yuv422p, int width, int height)
{
int i, j;
int y_size;
int uv_size;
unsigned char* p_y1;
unsigned char* p_uv;
unsigned char* p_y2;
unsigned char* p_u;
unsigned char* p_v;
y_size = uv_size = width * height;
p_y1 = yuv422sp;
p_uv = yuv422sp + y_size;
p_y2 = yuv422p;
p_u = yuv422p + y_size;
p_v = p_u + width * height / 2;
memcpy(p_y2, p_y1, y_size);
for (j = 0, i = 0; j < uv_size; j+=2, i++)
{
p_u[i] = p_uv[j];
p_v[i] = p_uv[j+1];
}
}
int main(int argc, char **argv) {
int from_fd, to_fd;
int bytes_read, bytes_write;
char *src_buffer;
char *dst_buffer;
int width = 0;
int height = 0;
fprintf(stderr, "src file: %s, dst file: %s, rect: [%d-%d]\n\a",
argv[1], argv[2], atoi(argv[3]), atoi(argv[4]));
if (argc != 5) {
fprintf(stderr, "Usage:%s fromfile tofile\n\a", argv[0]);
exit(1);
}
/* 打开源文件 */
if ((from_fd = open(argv[1], O_RDONLY)) == -1) {
fprintf(stderr, "Open %s Error:%s\n", argv[1], strerror(errno));
exit(1);
}
/* 创建目的文件 */
if ((to_fd = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)) == -1) {
fprintf(stderr, "Open %s Error:%s\n", argv[2], strerror(errno));
exit(1);
}
width = atoi(argv[3]);
height = atoi(argv[4]);
src_buffer = (char*)malloc(width * height * 2);
if(src_buffer == NULL){
fprintf(stderr, "malloc src_buffer failled!\n\a");
exit(1);
}
dst_buffer = (char*)malloc(width * height * 2);
if(dst_buffer == NULL){
fprintf(stderr, "malloc dst_buffer failled!\n\a");
exit(1);
}
/* 以下代码是一个经典的拷贝文件的代码 */
while (bytes_read = read(from_fd, src_buffer, width * height * 2)) {
/* 一个致命的错误发生了 */
if ((bytes_read == -1) && (errno != EINTR)) break;
else if (bytes_read > 0) {
fprintf(stderr, "bytes_read: %d\n\a", bytes_read);
yuv422sp_to_yuv422p(src_buffer, dst_buffer, width, height);
while (bytes_write = write(to_fd, dst_buffer, bytes_read)) {
/* 一个致命错误发生了 */
if ((bytes_write == -1) && (errno != EINTR))break;
/* 写完了所有读的字节 */
else if (bytes_write == bytes_read) break;
/* 只写了一部分,继续写 */
else if (bytes_write > 0) {
dst_buffer += bytes_write;
bytes_read -= bytes_write;
}
}
/* 写的时候发生的致命错误 */
fprintf(stderr, "bytes_write: %d\n\a", bytes_write);
if (bytes_write == -1)break;
}
}
close(from_fd);
close(to_fd);
free(src_buffer);
free(dst_buffer);
exit(0);
}
yuv422sp to yuv422p相关推荐
- YUV格式学习:NV16和YUV422P格式互换
其实以前也实现过SP转P的格式,现在再完善一些,写成此文.由于是相同采样空间的转换,只是个别分量位置的调整,只要明白了Y.U.V分量的布置,就很容易写出来. 代码如下: /** yyyy yyyy u ...
- YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
对于YUV422的格式,网上有一大堆资料,这里就不说了.直奔主题,给出如何转换的函数,一如既往,只用代码说事. YUV422有打包格式(Packed),一如前文所述.同时还有平面格式(Planar), ...
- 利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转
2019独角兽企业重金招聘Python工程师标准>>> yuyv422的数据来自ffdshow raw filter输出的yuv2, 其实就是yuv422p的packed模式, 要转 ...
- Yuv422p 转Yuy2
planar的YUV格式转packed的YUV格式 其他的YUV间格式转换,可以根据原理实现. #include <stdio.h> #include <stdlib.h> # ...
- YUV444,YUV422P,YUVY,YUYV,UYVY,NV21,NV12
分类: H.264(54) 目录(?)[-] Name Description V4L2_PIX_FMT_NV12 ('NV12'), V4L2_PIX_FMT_NV21 ('NV21') V4 ...
- 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别
https://blog.csdn.net/byhook/article/details/84037338
- yuv420p 详解_Android中的YUV格式解析
一.YUV格式 YUV 表示三个分量, Y 表示 亮度(Luminance),即灰度值,UV表示色度(Chrominance),描述图像色彩和饱和度,指定颜色.YUV格式有YUV444. YUV422 ...
- 从应用调用vivi驱动分析v4l2 -- 申请缓存(VIDIOC_REQBUFS)
Linux v4l2架构学习总链接 vivi代码 v4l2测试代码 step 5 : 设置缓存 1,申请缓存 struct v4l2_requestbuffers req;req.count = nr ...
- 一文读懂rawRGB、RGB和YUV数据格式与转换
rawRGB 图像采集的过程为:光照在成像物体被反射 -> 镜头汇聚 -> Sensor光电转换-> ADC转换为rawRGB 因为sensor上每个像素只采集特定颜色的光的强度,因 ...
- v4l2及gstreamer使用指南
目录 V4L2 编译 获取摄像头信息 列出设备节点 列出某个节点的属性参数 捕获图像和视频 像素格式 YUYV图像格式 图像大小 7yuv MPP压缩测试 交叉编译配置 压缩测试 格瑞克 采集视频命令 ...
最新文章
- vcenter converter 转换xenserver下linux的错误
- Android stadio 自定义debug release keystore
- python安装包为什么这么小-python(x,y)安装好了为何还是加载不了包
- 看漫画学python pdf下载_看漫画还能学Python❓❓❓| 0基础小白福音
- TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
- 基于JAVA+SpringMVC+Mybatis+MYSQL的公司管理系统
- 打砖块游戏代码 c语言,打砖块游戏的源代码(请多指教)
- 18650锂电池保护板接线图_锂电池保护板几种接线方法
- QtDesigner配置
- android自定义吸顶,Android ScrollView+ViewPager 固定顶部控件,自动吸顶效果
- 【时间序列预测算法】——Holt-Winters算法介绍及代码实现
- HP840G3电脑系统安装
- 链行动之精选案例——区块链解决四大痛点 福费廷结合案例逐步落地
- Tet3在前脑神经元中对抗焦虑
- 动态规划-机器人位于m x n网格的左上角只能向下向右移动,有多少路径
- C程序设计书本例题 求两整数之间最大值
- python 获取数据库字段类型_python数据库类型对应
- 计算机毕业设计Java京东仓库管理系统(源码+系统+mysql数据库+lw文档)
- 事件对象,事件流(事件冒泡和事件捕获)、事件委托、L0和L2注册等相关概念及用法
- TGA图像文件格式资料
热门文章
- 创建最基本的GD32F4xx的工程
- c2000 电阻采样_常用超低阻值采样电阻阻值一览表
- 【Android工具】更新wifi分析仪,wifi信道信息查看工具,wifi分析仪3.10.6L
- 梦网云科技的短信接口怎么样,真实体验
- gradle下载不下来依赖包_Gradle 下载依赖jar包及源码
- 基于SSM的个人博客系统(数据库+源码)
- 三菱plc232数据线驱动下载_三菱FX系列PLC没有编程电缆,通过DIY232串口下载程序...
- matlab difittool,matlab工具箱下载安装和使用方法的汇总|Toolbox 大全
- 【线性代数】1.6矩阵的特征值和特征向量
- cl.exe nmake.exe