视频YUV422转420的TI DSP源代码
注册 | 登录 忘记密码?51cto 首页 | 博客 | 论坛 | 招聘 热点文章简单cdn 之二 帮助
https://www.360docs.net/doc/929337170.html, > 复制链接 邀请加入技术圈
转载:11
翻译:0原创:9 集成系集成系统统-人生人生观观
加友情链接
发短消息相册技术圈博客
首页 | linux 技术 | dsp 技术 | 项目管理 | 随笔 | 集萃 | 历史哲学 | 幽默摘录
讲述:我与51CTO 不得不说的故事 博客互动专题 之 2009,痛并快乐着的IT 人博主的更多文章>>
视频YUV4:2:2转4:2:0的TI DSP 源代源代码码
zjb_integrated
博客博客统计统计统计信息信息用户名:zjb_integrated 文章数:20 评论数:5 访问量:6518 无忧币:128 博客积分:162 博客等级:2
注册日期:2009-10-07 距离博客争夺赛结束还有13 天
热门热门热门文章文章
搜索本博客搜索本博客内内文章
我的技我的技术术圈
去技术圈首页看看
最近最近访访客
cityrain
QYN1234
gefsw..
2009466
bluebee
ytewo..
yman88
orionsss
邵程程
51cto..
最新最新评论评论
zjb_integrated :我把图整理帖出来,其实你可以把YUV.. lyblyxj :哈哈 博主真敬业 ps :杨哥都看不懂了
yangjunfeng : 学习,看不大清楚,完了得去冲冲电了
zjb_integrated :竟然得到管理员的关照,非常感谢。..
zjb_integrated :非常感谢您的提示!很不错。本人也..
51CTO 推荐博文
商业智能成CIO 优先关注.. Dom4j 中XPath 相对路径.. IE8如何使用原生JSON 对.. 一个DBA 总结的数据库经验 使用TIBCO 构建Web Service 设计模式系列二——业.. Query 学习之:Datepick.. Net 设计模式之工厂方法.. [编程好习惯] 通过命名.. 业务系统设计之三:系.. 设计模式系列一——数..
友情友情链链接
/*视频输入格式定义*/
#define PAL 1 /*PAL 制CCD 摄像头图像采集*/ #define NTSC 0 /*NTSC 制CCD 摄像头图像采集*/ #define CMOS 0 /*CMOS 摄像头图像采集*/ #if (1== PAL)
#define ORG_IMG_WIDTH 720 /*D1 格式*/ #define ORG_IMG_HEIGHT 576 #elif (1==NTSC )
#define ORG_IMG_WIDTH 720 /*D1 格式*/ #define ORG_IMG_HEIGHT 480 #elif (1==CMOS)
#define ORG_IMG_WIDTH 640 /*VGA 格式*/ #define ORG_IMG_HEIGHT 480
#endif
yuv422to420(const *unsigned char YCbCr_buf ) /*YCbCr_buf 指向YUV4:2:2的空间*/ {
unsigned int m0,m1,m2,m3,x,y; unsigned int tmp,tmp0,tmp1,tmp2;
tmp = (unsigned int)YCbCr_buf;/*对于D1,CIF,QCIF,VGA,QVGA 的BUF 肯定是4字节对齐,所以这里定义unsigned int 也是可以的,当然你也可以使用指针*/ tmp0 = (unsigned int)Y_buf; for(y=0;y for(x=0;x<(ORG_IMG_WIDTH>>1);x+=4) { m0 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<1) + (x<<2)); / m1 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<1) + ((x+1)<<2)); m2 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<1) + ((x+2)<<2)); m3 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<1) + ((x+3)<<2)); *(unsigned short*)(tmp0+y*ORG_IMG_WIDTH + (x<<1))=(unsigned short)(((m 0>>16)&0xFF00)|((m0>>8)&0x00FF)); *(unsigned short*)(tmp0+y*ORG_IMG_WIDTH + ((x+1)<<1))=(unsigned short)(((m1>>16)&0xFF00)|((m1>>8)&0x00FF)); *(unsigned short*)(tmp0+y*ORG_IMG_WIDTH + ((x+2)<<1))=(unsigned short)(((m2>>16)&0xFF00)|((m2>>8)&0x00FF)); *(unsigned short*)(tmp0+y*RG_IMG_WIDTH + ((x+3)<<1))=(unsigned short) (((m3>>16)&0xFF00)|((m3>>8)&0x00FF)); } } tmp1=(unsigned int)U_buf; tmp2=(unsigned int)V_buf; for(y=0;y<(ORG_IMG_HEIGHT>>1);y++) { for(x=0;x<(ORG_IMG_WIDTH>>1);x+=4) { m0 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<2) + (x<<2)); m1 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<2) + ((x+1)<<2)); m2 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<2) + ((x+2)<<2)); m3 = *(unsigned int*)(tmp+y*(ORG_IMG_WIDTH<<2) + ((x+3)<<2)); *(unsigned char*)(tmp1+y*(ORG_IMG_WIDTH>>1) + x)=(unsigned char)m0; *(unsigned char*)(tmp2+y*(ORG_IMG_WIDTH>>1) + x)=(unsigned char)(m0> >16); *(unsigned char*)(tmp1+y*(ORG_IMG_WIDTH>>1) + x + 1)=(unsigned char)m 1; *(unsigned char*)(tmp2+y*(ORG_IMG_WIDTH>>1) + x + 1)=(unsigned char)(m 1>>16); *(unsigned char*)(tmp1+y*(ORG_IMG_WIDTH>>1) + x + 2)=(unsigned char)m 2; *(unsigned char*)(tmp2+y*(ORG_IMG_WIDTH>>1) + x + 2)=(unsigned char)(m 2>>16); *(unsigned char*)(tmp1+y*(ORG_IMG_WIDTH>>1) + x + 3)=(unsigned char)m3; *(unsigned char*)(tmp2+y*(ORG_IMG_WIDTH>>1) + x + 3)=(unsigned char)(m3 >>16); } } } 对上面的代码点评:DSP的优化原则,能移位,就不要乘除;能int 读内存,就不要用char读内存,因为C6 4,C64+的DSP 读内存指令需要4个时钟周期;循环能成4的倍数,最好拆4次操作,形成管道流水线操作,当然循环内部不能有if, break等语句。 另外,DM642或DM643有自己的效率更高的程序,这里也奉献给大家。 #include #include #include #pragma DATA_SECTION(int_mem_temp, ".img_buf");/*可以把.img_buf定义到L2RAM*/ #pragma DATA_ALIGN(int_mem_temp, 128); unsigned char int_mem_temp[720]; void yuv422to420( char *frameIn[], char *frm_out[], int width, int height) { char *pSrcY = frameIn[0]; char *pSrcU = frameIn[1]; char *pSrcV = frameIn[2]; char *pDestY = frm_out[0]; char *pDestU = frm_out[1]; char *pDestV = frm_out[2]; unsigned int id; unsigned int i; for( i = 0; i < height; i++) { id = DAT_copy(pSrcY + (i * 720), int_mem_temp, 720); id = DAT_copy(int_mem_temp, pDestY + (i * 720), 720); DAT_wait(id); } for( i = 0; i < (height >> 1); i++) { id = DAT_copy(pSrcU + (i * 720), int_mem_temp, 360); id = DAT_copy(int_mem_temp, pDestU + (i * 360), 360); DAT_wait(id); } for( i = 0; i < (height >> 1); i++) { id = DAT_copy(pSrcV + (i * 720), int_mem_temp, 360); id = DAT_copy(int_mem_temp, pDestV + (i * 360), 360); DAT_wait(id); } return ; } void yuv420to422( char *frameIn[], char *frm_out[], int width, int height) { char *pSrcY = frameIn[0]; char *pSrcU = frameIn[1]; char *pSrcV = frameIn[2]; char *pDestY = frm_out[0]; char *pDestU = frm_out[1]; char *pDestV = frm_out[2]; unsigned int id; unsigned int i; for( i = 0; i < height; i++) { id = DAT_copy(pSrcY + (i * 720), int_mem_temp, 720); id = DAT_copy(int_mem_temp, pDestY + (i * 720), 720); DAT_wait(id); } for( i = 0; i < (height >> 1); i++) { id = DAT_copy(pSrcU + (i * 360), int_mem_temp, 360); id = DAT_copy(int_mem_temp, pDestU + ((2 * i) * 360), 360); id = DAT_copy(int_mem_temp, pDestU + ((2*i + 1)* 360), 360); DAT_wait(id); } for( i = 0; i < (height >> 1); i++) { id = DAT_copy(pSrcV + (i * 360), int_mem_temp, 360); id = DAT_copy(int_mem_temp, pDestV + ((2*i) * 360), 360); id = DAT_copy(int_mem_temp, pDestV + ((2*i+1) * 360), 360); DAT_wait(id); } return ; } 上一篇 你没想到的中外历史下一篇 PADS2007 注册码破解 类别:dsp技术┆技术圈( 0)┆阅读( 151) ┆评论( 4)┆推送到技术圈┆返回首页 相关文章 决定在DSP 上开展IVS 智能视频分析 aptana 的很好视频教程(English )Ping 的源代码提取DVD 视频盘的资源 JMF 捕获音频和视频一 一扔就涨(小扔)在凤凰卫视的采访视频 网众NxD XP5.6语音视频教程(WIN 版) [徒步天下原创]使用EXCEL VBA 完成校验码生成..视频网站顶网以金币换货币,07年产业链调整开始 一个五岁小孩子表演hip-hop 的视频 文章文章评论评论 2009-11-26 21:38:22 竟然得到管理员的关照,非常感谢。很荣幸,特别加精奉献转换速度更快的算法: 这个是一个VGA 640x480的函数,在DM6441(513MHz)上处理640x480只需要5.5ms 。又快了2ms ,在DSP 的算法中,快2ms 是一个不错的提高。 void yuv422_to_420_vga(const unsigned char *YCbCr_buf, unsigned char *y_dst_buf, unsigned char *u_dst_buf, unsigned char *v_dst_buf) { unsigned int m0,m1,m2,m3,x,y; unsigned int tmp,tmp0,tmp1,tmp2; tmp = (unsigned int)YCbCr_buf; tmp0 = (unsigned int)y_dst_buf; for(y=0;y for(x=0;x<320;x +=4) { m0 = *(unsigned int*)(tmp +y*1280 + (x<<2)); // locate index:0,4,8,12,16,20 m1 = *(unsigned int*)(tmp +y*1280 + ((x +1)<<2)); m2 = *(unsigned int*)(tmp +y*1280 + ((x +2)<<2)); m3 = *(unsigned int*)(tmp +y*1280 + ((x +3)<<2)); *(unsigned int*)(tmp0+y*CMOS_VGA_IMG_WIDTH + (x<<1))=(m1&0xFF000000)|((m1<<8)&0x00FF0000)|((m0>>16)&0x0000FF00)|((m0>>8)&0x000000FF); *(unsigned int*)(tmp0+y*CMOS_VGA_IMG_WIDTH + ((x<<1)+4))=(m3&0xFF000000)|((m3<<8)&0x00FF0000)|((m2>>16)&0x0000FF00)|((m2>>8)&0x000000FF); } } tmp1=(unsigned int)u_dst_buf; tmp2=(unsigned int)v_dst_buf; for(y=0;y<240;y ++) { for(x=0;x<320;x +=4) { m0 = *(unsigned int*)(tmp +y*2560 + (x<<2)); m1 = *(unsigned int*)(tmp +y*2560 + ((x +1)<<2)); m2 = *(unsigned int*)(tmp +y*2560 + ((x +2)<<2)); m3 = *(unsigned int*)(tmp +y*2560 + ((x +3)<<2)); *(unsigned int*)(tmp1+y*320 + x)=(m3<<24)|((m2<<16)&0x00FF0000)|((m1<<8)&0x0000FF00)|(m0&0x000000FF); *(unsigned int*)(tmp2+y*320 + x)=((m3<<8)&0xFF000000)|(m2&0x00FF0000)|((m1>>8)&0x0000FF00)|((m0>>16)&0x000000FF); } } } 2009-11-27 08:43:39 学习,看不大清楚,完了得去冲冲电了 2009-11-27 11:47:51 哈哈 博主真敬业 ps :杨哥都看不懂了 2009-11-27 18:05:59 [1楼] zjb_integrated [2楼] yangjunfeng [3楼] lyblyxj [4楼] zjb_integrated 我把图整理帖出来,其实你可以把YUV422的存储格式当做2维数组,比如NTSC D1格式,720 x 480,就是第一行一共有720x2个字节的数据,其中Y分量为720字节,U分量为360字节,V分量有360字节,一共有480行。 发表评论 昵称:登陆快速注册 验证码: 点击图片可刷新验证码 博客过2级,无需填写验证码内容: 提 交 Copyright By https://www.360docs.net/doc/929337170.html, 版权所有