//pYUV为422,yuv为420
/*ok!
* brief:pyuv is yuv422sp srcIn, and yuv is yuv420p desOut 
*/
int YUV422To420(unsigned char *pYUV, unsigned char*yuv, int lWidth, int lHeight)
{        
int i,j;
unsigned char*pY = yuv;
unsigned char *pU = yuv + lWidth*lHeight;
unsigned char *pV = pU + (lWidth*lHeight)/4;
 
unsigned char *pYUVTemp = pYUV;
unsigned char *pYUVTempNext = pYUV+lWidth*2;
         
 for(i=0; i<lheight; i+=2) <="" div="">

 {
    for(j=0; j<lwidth; j+=2) <="" div="">

     {
       pY[j] = *pYUVTemp++;
       pY[j+lWidth] = *pYUVTempNext++;
                         
       pU[j/2] =(*(pYUVTemp) + *(pYUVTempNext))/2;
       pYUVTemp++;
       pYUVTempNext++;
                         
       pY[j+1] = *pYUVTemp++;
       pY[j+1+lWidth] = *pYUVTempNext++;
                         
       pV[j/2] =(*(pYUVTemp) + *(pYUVTempNext))/2;
       pYUVTemp++;
       pYUVTempNext++;
     }
       pYUVTemp+=lWidth*2;
       pYUVTempNext+=lWidth*2;
       pY+=lWidth*2;
       pU+=lWidth/2;
       pV+=lWidth/2;
   }
         
       return 1;
}

大意了,每四行计算时,牵引错误,试试下面的代码吧,不过这种代码很有优化的余地
书籍可以参考“视频技术手册”,上面有YUV422到YUV420采样转换的讲解

C/C++ code

 

int YUV422To420(unsigned char *pYUV, unsigned int *yuv, int lWidth, int lHeight)
{ //sp
int i,j;
unsigned int *pY = yuv;
unsigned int *pU = yuv + lWidth*lHeight;
unsigned int *pV = pU + (lWidth*lHeight)/4;

unsigned char *pYUVTemp = pYUV;
unsigned char *pYUVTempNext = pYUV+lWidth*2;
unsigned char *pYUV2 = pYUVTempNext + lWidth*2;
unsigned char *pYUV3 = pYUVTempNext + lWidth*4;

for(i=0; i<lHeight; i+=4)
{
for(j=0; j<lWidth; j+=4)
{
// Y0
pY[j] = pYUVTemp[j];
pY[j+lWidth] = pYUVTempNext[j];
pY[j+lWidth*2] = pYUV2[j];
pY[j+lWidth*3] = pYUV3[j];
// U
pU[j/2] = (3*pYUVTemp[j+1] + pYUV2[j+1])/4;
pU[j/2+lWidth/2] = (pYUVTempNext[j+1] + 3*pYUV3[j+1])/4;
// Y1
pY[j+1] = pYUVTemp[j+2];
pY[j+lWidth+1] = pYUVTempNext[j+2];
pY[j+lWidth*2+1] = pYUV2[j+2];
pY[j+lWidth*3+1] = pYUV3[j+2];
// V
pV[j/2] = (3*pYUVTemp[j+3] + pYUV2[j+3])/4;
pV[j/2+lWidth/2] = (pYUVTempNext[j+3] + 3*pYUV3[j+3])/4;

}
// 分别加四行
pYUVTemp+=lWidth*2*4;
pYUVTempNext+=lWidth*2*4;
pYUV2+=lWidth*2*4;
pYUV3+=lWidth*2*4;
// Y加上四行
pY+=lWidth*4;
// UV加两行
pU+=lWidth;
pV+=lWidth;
}

return 1;
}

http://www.xuebuyuan.com/1541892.html

http://bbs.csdn.net/topics/370045077

http://blog.csdn.net/searchsun/article/details/2443867  yuv pannle packet

http://blog.chinaunix.net/uid-29181887-id-3992543.html

http://www.videolan.org/developers/x264.html x264编码器

http://www.cnblogs.com/zhengbin/p/5023640.html js 黑客帝国特效

最新文章

  1. Caffe 源碼閱讀(二) SyncedMemory.hpp
  2. 深入理解 CSS 的 :before 和 :after 选择器(制作select下拉列表美化插件)
  3. android 入门 004 (同一个方法,点击实现不同的效果)
  4. java的主函数中各个词的作用
  5. 简单学C——第五天
  6. MapReduce入门
  7. oracle sql语句中使用if逻辑
  8. Android至ViewPager添加切换动画——使用属性动画
  9. Linux关机命令详解
  10. 实现quartz定时器及quartz定时器原理介绍(转)
  11. Visual Studio插件Resharper 2016.1 及以上版本激活方法【亲测有效】
  12. 【liferay】2、可配置portlet
  13. 如何用RSS订阅?
  14. 免费开源的diff软件“meld”-替代beyond compare的神器
  15. 【转载】docker 应用之动态扩展容器空间大小
  16. POJ 1459 - Power Network 【Ek-最大流】
  17. 求最短路的三种方法:dijkstra,spfa,floyd
  18. Unity官方实例教程 Roll-a-Ball
  19. 进程间共享数据Manager
  20. 如何从CentOS官网下载我们想要的版本

热门文章

  1. Leetcode 397.整数替换
  2. 【JavaScript 5—基础知识点】:正则表达式(笔记)
  3. hdu 1536 sg (dfs实现)
  4. 03-offsetParent属性
  5. Codeforces Round #361 (Div. 2)——B. Mike and Shortcuts(BFS+小坑)
  6. VS链接错误: LNIK1123
  7. properties类的基本使用方法
  8. Mysql 实现篮球比赛赛程中两支队伍的查询
  9. python虚拟环境使用
  10. cannot find package &quot;golang.org/x/crypto/pbkdf2&quot; in any of: