版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页全志V85x内G2D模块实现图片格式步骤方法G2D主要功能:
1)旋转:支持90、180、270旋转;
2)scale:放缩;
3)镜像反转:H/V;
4)透明叠加:实现两个rgb图片叠加;
5)格式转换:yuv转rgb等多种格式相互间转换;
6)矩形填充,等诸多功能;
G2D配置
源码目录
(ti)na-v853-docker/kernel/(linux)-4.9/drivers/char/sunxi_g2d
makekernel_menuconfig配置
DeviceDrivers>Characterdevices>sunxig2ddriver
DeviceTree设备树配置
sun8iw21p1.dtsi路径:
tina-v853-docker/kernel/linux-4.9/arch/(arm)/boot/dts/sun8iw21p1.dtsi
g2d:g2d@05410000{compatible="allwinner,sunxi-g2d";reg=;interrupts=;clocks=
注:status要设定为“okay”状态。
重新编译内核
使用烧录工具PhoenixSuit将编译打包好的img镜像烧录到开发板。
(ad)bshell打开控制终端查看设备节点G2D:
通过G2D设备节点进行操作
staticintSampleG2d_G2dOpen(SAMPLE_G2D_CTX*p_g2d_ctx){intret=0;p_g2d_ctx->mG2dFd=open("/dev/g2d",O_RDWR,0);if(p_g2d_ctx->mG2dFd
G2Dsample具体应用
G2Dsample目录
进行rotation,scale,格式转换
具体实现:将nv21格式的1920x1080图转换成rgb888格式并放缩为640x360大小。具体用到两个功能,格式转换和放缩。
首先根据1920x1080nv21格式以及640x360rgb888格式申请虚拟地址空间以及转换成物理地址(注意:g2d转换是在物理地址中完成的)
1920x1080nv21格式空间大小(输入文件):
Y占19202380=2073600字节
UV占19202380/2=1036800字节
640x360rgb888格式空间大小(输出文件):
RGB占6403603=691200字节
另外:虚拟地址转换成物理地址使用如下函数:
g2d_getPhyAddrByVirAddr()
申请虚拟空间并转换成物理空间完整函数如下:
staticintPrepareFrmBuff(SAMPLE_G2D_CTX*p_g2d_ctx){SampleG2(dC)onfig*pConfig=NULL;unsignedintsize=0;pConfig=p_g2d_ctx->src_frm_info.frm_width=pConfig->mSrcWidth;p_g2d_ctx->src_frm_info.frm_height=pConfig->mSrcHeight;p_g2d_ctx->dst_frm_info.frm_width=pConfig->mDstWidth;p_g2d_ctx->dst_frm_info.frm_height=pConfig->mDstHeight;size=ALIGN(p_g2d_ctx->src_frm_info.frm_width,16)*ALIGN(p_g2d_ctx->src_frm_info.frm_height,16);if(pConfig->mPicFormat==MM_(PI)XEL_FORMAT_YVU_SEMIPLANAR_420||pConfig->mPicFormat==MM_PIXEL_FORMAT_YUV_SEMIPLANAR_420){p_g2d_ctx->src_frm_info.p_vir_addr[0]=(void*)g2d_allocMem(size);if(NULL==p_g2d_ctx->src_frm_info.p_vir_addr[0]){aloge("malloc_src_frm_y_mem_failed");return-1;}p_g2d_ctx->src_frm_info.p_vir_addr[1]=(void*)g2d_allocMem(size/2);if(NULL==p_g2d_ctx->src_frm_info.p_vir_addr[1]){g2d_freeMem(p_g2d_ctx->src_frm_info.p_vir_addr[0]);aloge("malloc_src_frm_c_mem_failed");return-1;}p_g2d_ctx->src_frm_info.p_phy_addr[0]=(void*)g2d_getPhyAddrByVirAddr(p_g2d_ctx->src_frm_info.p_vir_addr[0]);p_g2d_ctx->src_frm_info.p_phy_addr[1]=(void*)g2d_getPhyAddrByVirAddr(p_g2d_ctx->src_frm_info.p_vir_addr[1]);}if(pConfig->mDstPicFormat==MM_PIXEL_FORMAT_RGB_888){size=p_g2d_ctx->dst_frm_info.frm_width*p_g2d_ctx->dst_frm_info.frm_height*3;p_g2d_ctx->dst_frm_info.p_vir_addr[0]=(void*)g2d_allocMem(size);if(NULL==p_g2d_ctx->dst_frm_info.p_vir_addr[0]){if(p_g2d_ctx->src_frm_info.p_vir_addr[0]!=NULL){g2d_freeMem(p_g2d_ctx->src_frm_info.p_vir_addr[0]);}if(p_g2d_ctx->src_frm_info.p_vir_addr[1]!=NULL){g2d_freeMem(p_g2d_ctx->src_frm_info.p_vir_addr[1]);}aloge("malloc_dst_frm_y_mem_failed");return-1;}p_g2d_ctx->dst_frm_info.p_phy_addr[0]=(void*)g2d_getPhyAddrByVirAddr(p_g2d_ctx->dst_frm_info.p_vir_addr[0]);}return0;}
通过fopen传菜间两个文件句柄,fd_infd_out用来操作输入输出两个文件资源。
p_g2d_ctx->fd_in=fopen(p_g2d_ctx->mConfigPara.SrcFile,"r");if(NULL==p_g2d_ctx->fd_in){aloge("opensrcfilefailed");ret=-1;goto_err2;}fseek(p_g2d_ctx->fd_in,0,SEEK_SET);p_g2d_ctx->fd_out=fopen(p_g2d_ctx->mConfigPara.DstFile,"wb");if(NULL==p_g2d_ctx->fd_out){aloge("openoutfilefailed");ret=-1;goto_err2;}fseek(p_g2d_ctx->fd_out,0,SEEK_SET);
读出1920x1080nv21图资放入虚拟空间
read_len=p_g2d_ctx->src_frm_info.frm_width*p_g2d_ctx->src_frm_info.frm_height;if(pConfig->mPicFormat==MM_PIXEL_FORMAT_YVU_SEMIPLANAR_420||pConfig->mPicFormat==MM_PIXEL_FORMAT_YUV_SEMIPLANAR_420){size1=fread(p_g2d_ctx->src_frm_info.p_vir_addr[0],1,read_len,p_g2d_ctx->fd_in);if(size1!=read_len){aloge("read_y_data_frm_src_file_invalid");}size2=fread(p_g2d_ctx->src_frm_info.p_vir_addr[1],1,read_len/2,p_g2d_ctx->fd_in);if(size2!=read_len/2){aloge("read_c_data_frm_src_file_invalid");}fclose(p_g2d_ctx->fd_in);g2d_flushCache((void*)p_g2d_ctx->src_frm_info.p_vir_addr[0],read_len);g2d_flushCache((void*)p_g2d_ctx->src_frm_info.p_vir_addr[1],read_len/2);}
打开g2d初始化,并开始转换
ret=SampleG2d_G2dOpen(p_g2d_ctx);if(retmPicFormat,if(ret!=SUCCESS){aloge("fatalerror!srcpixelformat[0x%x]isinvalid!",pConfig->mPicFormat);return-1;}ret=convert_PIXEL_FORMAT_E_to_g2d_fmt_enh(pConfig->mDstPicFormat,if(ret!=SUCCESS){aloge("fatalerror!dstpixelformat[0x%x]isinvalid!",pConfig->mPicFormat);return-1;}//configblit(mems)et(if(0!=pConfig->mDstRotate){aloge("fatal_err:rotation(can)'tbepe(rf)ormedwhendoscaling");}blit.flag_h=G2D_BLT_NONE_H;//anglerotationused//switch(pConfig->mDstRotate)//{//case0://blit.flag_h=G2D_BLT_NONE_H;//G2D_ROT_0,G2D_BLT_NONE_H//break;//case90://blit.flag_h=G2D_ROT_90;//break;//case180://blit.flag_h=G2D_ROT_180;//break;//case270://blit.flag_h=G2D_ROT_270;//break;//default://aloge("fatalerror!rotation[%d]isinvalid!",pConfig->mDstRotate);//blit.flag_h=G2D_BLT_NONE_H;//break;//}//blit.src_image_h.bbuff=1;//blit.src_image_h.color=0xff;blit.src_image_h.format=eSrcFormat;blit.src_image_h.laddr[0]=(unsignedint)p_g2d_ctx->src_frm_info.p_phy_addr[0];blit.src_image_h.laddr[1]=(unsignedint)p_g2d_ctx->src_frm_info.p_phy_addr[1];blit.src_image_h.laddr[2]=(unsignedint)p_g2d_ctx->src_frm_info.p_phy_addr[2];//blit.src_image_h.haddr[]=blit.src_image_h.width=p_g2d_ctx->src_frm_info.frm_width;blit.src_image_h.height=p_g2d_ctx->src_frm_info.frm_height;blit.src_image_h.align[0]=0;blit.src_image_h.align[1]=0;blit.src_image_h.align[2]=0;blit.src_image_h.clip_rect.x=pConfig->mSrcRectX;blit.src_image_h.clip_rect.y=pConfig->mSrcRectY;blit.src_image_h.clip_rect.w=pConfig->mSrcRectW;blit.src_image_h.clip_rect.h=pConfig->mSrcRectH;blit.src_image_h.gamut=G2D_BT601;blit.src_image_h.bpremul=0;//blit.src_image_h.alpha=0xff;blit.src_image_h.mode=G2D_PIXEL_ALPHA;//G2D_PIXEL_ALPHA,G2D_GLOBAL_ALPHAblit.src_image_h.fd=-1;blit.src_image_h.use_phy_addr=1;//blit.dst_image_h.bbuff=1;//blit.dst_image_h.color=0xff;blit.dst_image_h.format=eDstFormat;blit.dst_image_h.laddr[0]=(unsignedint)p_g2d_ctx->dst_frm_info.p_phy_addr[0];blit.dst_image_h.laddr[1]=(unsignedint)p_g2d_ctx->dst_frm_info.p_phy_addr[1];blit.dst_image_h.laddr[2]=(unsignedint)p_g2d_ctx->dst_frm_info.p_phy_addr[2];//blit.dst_image_h.haddr[]=blit.dst_image_h.width=p_g2d_ctx->dst_frm_info.frm_width;blit.dst_image_h.height=p_g2d_ctx->dst_frm_info.frm_height;blit.dst_image_h.align[0]=0;blit.dst_image_h.align[1]=0;blit.dst_image_h.align[2]=0;blit.dst_image_h.clip_rect.x=pConfig->mDstRectX;blit.dst_image_h.clip_rect.y=pConfig->mDstRectY;blit.dst_image_h.clip_rect.w=pConfig->mDstRectW;blit.dst_image_h.clip_rect.h=pConfig->mDstRectH;blit.dst_image_h.gamut=G2D_BT601;blit.dst_image_h.bpremul=0;//blit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年汽车设计师专业知识水平考试题库
- 2026年国际贸易实务与关税政策专业题库
- 2026年区块链在娱乐产业的应用与发展趋势题库
- 2026年法律职业资格考试题法律案例分析与法律文书写作
- 2026年网络技术原理与应用题集基础版与进阶版
- 2026年电气工程师考试电力系统设计与维护题库
- 2026年通信技术工程师认证考试题集及答案
- 2026年食品卫生与安全检测专业考核试题
- 2026年法律从业者实务考试练习题
- 2026年安全生产标准化知识竞赛试题及答案
- (新版)老年人能力评估师理论考试复习题库(含答案)
- 光纤激光打标机说明书
- 社会调查研究方法课程教学设计实施方案
- 治理现代化下的高校合同管理
- 境外宗教渗透与云南边疆民族地区意识形态安全研究
- GB/T 33365-2016钢筋混凝土用钢筋焊接网试验方法
- GB/T 28920-2012教学实验用危险固体、液体的使用与保管
- GB/T 16426-1996粉尘云最大爆炸压力和最大压力上升速率测定方法
- ARDS患者的护理查房课件
- 人大企业经济学考研真题-802经济学综合历年真题重点
- 建筑抗震鉴定标准课件
评论
0/150
提交评论