2个YUV视频 拼接技术

[cpp]  view plain  copy
  1. /************************************************* 
  2. * 主要功能:两路 YUV4:2:0拼接一路左右半宽格式YUV视频 
  3. 参考资料:http://www.pudn.com/downloads271/sourcecode/multimedia/vfw/detail1237363.html 
  4. U_size=V_size=Y_size/2 
  5. *************************************************/  
  6. #include<stdio.h>  
  7. #include<stdlib.h>  
  8. #include<string.h>  
  9. #define PREWEIGHT 1920  
  10. #define PREHEIGHT 1080  
  11. #define RESWEIGHT 3840  
  12. #define RESHEIGHT 1080  
  13. #define PREYSIZE ((PREWEIGHT)*(PREHEIGHT))  
  14. #define PREUSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))  
  15. #define PREVSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))  
  16. #define RESYSIZE ((RESWEIGHT)*(RESHEIGHT))  
  17. #define RESUSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))  
  18. #define RESVSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))  
  19. #define PRESIZE ((PREYSIZE)+(PREUSIZE)+(PREVSIZE))  
  20. #define RESSIZE ((RESYSIZE)+(RESUSIZE)+(RESVSIZE))  
  21.   
  22. int GetFrameNum(const char *File)  
  23. {  
  24.     FILE *fp;  
  25.     int size=0;  
  26.     if (!(fp=fopen(File,"rb")))  
  27.     {  
  28.         printf("Open %s error !",File);  
  29.         exit(1);  
  30.     }   
  31.     else  
  32.     {  
  33.         fseek(fp,0,SEEK_END);/*将文件指针移到YUV文件的末尾*/    
  34.         size=ftell(fp);/*计算文件的总大小*/  
  35.     }  
  36.     return (size/PRESIZE);  
  37. }  
  38. void ReadYUV(char *ResBuf,char *PreBuf,int resstart,int prestart,int resoffset,int preoffset,int size,int height)  
  39. {  
  40.     int k;  
  41.     for (k=0;k<height;k++)  
  42.     {  
  43. //注意这里用memmov不用strncpy  
  44.         memmove(ResBuf+resstart+k*(resoffset),PreBuf+prestart+k*(preoffset),size);
  45.     }  
  46. }  
  47. int main(int argc,char *argv[])  
  48. {  
  49.     /*两路YUV文件名*/
  50.     const char *FileName[]={"e:\BMX_L_1920x1080_240frms.yuv","e:\BMX_R_1920x1080_240frms.yuv"};  
  51.     FILE *FileResult;/*输出文件名*/  
  52.     FILE** fp_combine=(FILE**)malloc(sizeof(FILE *)*3);/*申请文件指针*/  
  53.     int *FileFrameNum=(int *)malloc(sizeof(int)*3);/*每个YUV的帧数*/  
  54.     char *PreBuf=(char *)malloc(sizeof(char)*(PRESIZE+1));/*处理前每一帧图像的大小*/  
  55.     char *ResBuf=(char*)malloc(sizeof(char)*(RESSIZE+1));/*处理后每一帧图像的大小*/  
  56.     int Y_start_section=0;/*预处理图片Y分量存入目标区域的起始区域*/  
  57.     int U_start_section = 0;/*预处理图片U分量存入目标区域的起始区域*/  
  58.     int V_start_section = 0;/*预处理图片V分量存入目标区域的起始区域*/  
  59.     int File_offset = 0;/*预处理文件偏移值*/      
  60.     int i_combine=0,j_combine=0,k_combine=0;/*控制循环*/  
  61.     /*判断申请内存是否成功*/  
  62.     if (!((fp_combine)&&(FileFrameNum)&&(PreBuf)&&(ResBuf)))  
  63.     {  
  64.         printf("Allocate memeroy Faile !");  
  65.         exit(1);  
  66.     }   
  67.     /*初始化申请空间*/  
  68.     memset(fp_combine,0,sizeof(FILE *)*2);  
  69.     memset(FileFrameNum,0,sizeof(int)*2);  
  70.     memset(PreBuf,0,sizeof(char)*PRESIZE);  
  71.     memset(ResBuf,0,sizeof(char)*RESSIZE);  
  72.     if (!(FileResult=fopen("hua_result.YUV","wb")))/*创建输出文件*/  
  73.     {  
  74.         printf("Creat File faile !");  
  75.         exit(1);  
  76.     }   
  77.     for (i_combine=0;i_combine<2;i_combine++)  
  78.     {  
  79.         if(!(fp_combine[i_combine]=fopen(FileName[i_combine],"rb")))/*打开输入文件*/  
  80.         {  
  81.             printf("Open File %s Faile !",FileName[i_combine]);  
  82.             exit(1);  
  83.         }  
  84.         else  
  85.         {  
  86.             FileFrameNum[i_combine]=GetFrameNum(FileName[i_combine]);/*存储每一个视频的帧数*/  
  87.         }  
  88.     }  
  89.     i_combine=0;  
  90.     k_combine=FileFrameNum[i_combine];  
  91.     while (i_combine<k_combine)  
  92.     {  
  93.         File_offset = i_combine*PRESIZE;  
  94.         j_combine=0;  
  95.         while (j_combine<2)  
  96.         {  
  97.             fseek(fp_combine[j_combine],File_offset,SEEK_SET);/*移动文件指针至需要处理的数据的位置*/  
  98.             fread(PreBuf,1,PRESIZE,fp_combine[j_combine]);/*读取一幅图像*/  
  99.             if (j_combine==0)  
  100.             {  
  101.                 /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/  
  102.                 Y_start_section=0;  
  103.                 U_start_section=RESYSIZE;  
  104.                 V_start_section=RESYSIZE+RESUSIZE;  
  105.             }   
  106.             else  
  107.             {  
  108.                 /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/  
  109.                 Y_start_section=PREWEIGHT;  
  110.                 U_start_section=RESYSIZE+PREWEIGHT/2;  
  111.                 V_start_section=RESYSIZE+RESUSIZE+PREWEIGHT/2;  
  112.             }  
  113.             /*分别读Y、U、V*/  
  114.             ReadYUV(ResBuf,PreBuf,Y_start_section,0, RESWEIGHT,PREWEIGHT,PREWEIGHT,PREHEIGHT);  
  115.             ReadYUV(ResBuf,PreBuf,U_start_section,PREYSIZE, RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);  
  116.             ReadYUV(ResBuf,PreBuf,V_start_section,PREYSIZE+PREUSIZE, RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);  
  117.             j_combine++;  
  118.         }  
  119.         fwrite(ResBuf,1,RESSIZE,FileResult);  
  120.         fflush(FileResult);  
  121.         i_combine++;  
  122.     }  
  123.     fclose(fp_combine[0]);  
  124.     fclose(fp_combine[1]);  
  125.     fclose(FileResult);  
  126.     return 0;  
  127. }  
  128.   
  129.   
  130.   
  131.    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值