一、本代码实现功能如下:

由于目前很多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相关推荐

  1. YUV格式学习:NV16和YUV422P格式互换

    其实以前也实现过SP转P的格式,现在再完善一些,写成此文.由于是相同采样空间的转换,只是个别分量位置的调整,只要明白了Y.U.V分量的布置,就很容易写出来. 代码如下: /** yyyy yyyy u ...

  2. YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24

    对于YUV422的格式,网上有一大堆资料,这里就不说了.直奔主题,给出如何转换的函数,一如既往,只用代码说事. YUV422有打包格式(Packed),一如前文所述.同时还有平面格式(Planar), ...

  3. 利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转

    2019独角兽企业重金招聘Python工程师标准>>> yuyv422的数据来自ffdshow raw filter输出的yuv2, 其实就是yuv422p的packed模式, 要转 ...

  4. Yuv422p 转Yuy2

    planar的YUV格式转packed的YUV格式 其他的YUV间格式转换,可以根据原理实现. #include <stdio.h> #include <stdlib.h> # ...

  5. YUV444,YUV422P,YUVY,YUYV,UYVY,NV21,NV12

      分类: H.264(54)  目录(?)[-] Name Description V4L2_PIX_FMT_NV12 ('NV12'), V4L2_PIX_FMT_NV21 ('NV21') V4 ...

  6. 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别

    https://blog.csdn.net/byhook/article/details/84037338

  7. yuv420p 详解_Android中的YUV格式解析

    一.YUV格式 YUV 表示三个分量, Y 表示 亮度(Luminance),即灰度值,UV表示色度(Chrominance),描述图像色彩和饱和度,指定颜色.YUV格式有YUV444. YUV422 ...

  8. 从应用调用vivi驱动分析v4l2 -- 申请缓存(VIDIOC_REQBUFS)

    Linux v4l2架构学习总链接 vivi代码 v4l2测试代码 step 5 : 设置缓存 1,申请缓存 struct v4l2_requestbuffers req;req.count = nr ...

  9. 一文读懂rawRGB、RGB和YUV数据格式与转换

    rawRGB 图像采集的过程为:光照在成像物体被反射 -> 镜头汇聚 -> Sensor光电转换-> ADC转换为rawRGB 因为sensor上每个像素只采集特定颜色的光的强度,因 ...

  10. v4l2及gstreamer使用指南

    目录 V4L2 编译 获取摄像头信息 列出设备节点 列出某个节点的属性参数 捕获图像和视频 像素格式 YUYV图像格式 图像大小 7yuv MPP压缩测试 交叉编译配置 压缩测试 格瑞克 采集视频命令 ...

最新文章

  1. vcenter converter 转换xenserver下linux的错误
  2. Android stadio 自定义debug release keystore
  3. python安装包为什么这么小-python(x,y)安装好了为何还是加载不了包
  4. 看漫画学python pdf下载_看漫画还能学Python❓❓❓| 0基础小白福音
  5. TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的公司管理系统
  7. 打砖块游戏代码 c语言,打砖块游戏的源代码(请多指教)
  8. 18650锂电池保护板接线图_锂电池保护板几种接线方法
  9. QtDesigner配置
  10. android自定义吸顶,Android ScrollView+ViewPager 固定顶部控件,自动吸顶效果
  11. 【时间序列预测算法】——Holt-Winters算法介绍及代码实现
  12. HP840G3电脑系统安装
  13. 链行动之精选案例——区块链解决四大痛点 福费廷结合案例逐步落地
  14. Tet3在前脑神经元中对抗焦虑
  15. 动态规划-机器人位于m x n网格的左上角只能向下向右移动,有多少路径
  16. C程序设计书本例题 求两整数之间最大值
  17. python 获取数据库字段类型_python数据库类型对应
  18. 计算机毕业设计Java京东仓库管理系统(源码+系统+mysql数据库+lw文档)
  19. 事件对象,事件流(事件冒泡和事件捕获)、事件委托、L0和L2注册等相关概念及用法
  20. TGA图像文件格式资料

热门文章

  1. 创建最基本的GD32F4xx的工程
  2. c2000 电阻采样_常用超低阻值采样电阻阻值一览表
  3. 【Android工具】更新wifi分析仪,wifi信道信息查看工具,wifi分析仪3.10.6L
  4. 梦网云科技的短信接口怎么样,真实体验
  5. gradle下载不下来依赖包_Gradle 下载依赖jar包及源码
  6. 基于SSM的个人博客系统(数据库+源码)
  7. 三菱plc232数据线驱动下载_三菱FX系列PLC没有编程电缆,通过DIY232串口下载程序...
  8. matlab difittool,matlab工具箱下载安装和使用方法的汇总|Toolbox 大全
  9. 【线性代数】1.6矩阵的特征值和特征向量
  10. cl.exe nmake.exe