yuv422sp to yuv422p

2016-12-07 08:24:16来源:CSDN作者:xu1fei2人点击

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

由于目前很多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);  
}  

相关文章

    无相关信息

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台