视频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, 版权所有

相关文档
最新文档