版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页全志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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全新网络游戏开发合同2篇
- 2024-2025学年新教材高中历史第八单元20世纪下半叶世界的新变化第19课资本主义国家的新变化课时作业含解析新人教版必修中外历史纲要下
- 2025不动产登记信息化改造项目合同3篇
- 2025年微信小程序企业客户关系管理系统开发与应用合同3篇
- 2024销售人员职业发展保障劳动合同3篇
- 二零二五年度医疗设施临时借款合同参考样本4篇
- 2025高温粘合剂产业链金融服务平台合作合同3篇
- 2025年度电信设备知识产权保护合同3篇
- 2025年度食品行业退换货质量保证协议书
- 二零二五年度高层建筑楼顶广告位使用权租赁合同3篇
- 台资企业A股上市相关资料
- 电 梯 工 程 预 算 书
- 罗盘超高清图
- 参会嘉宾签到表
- 机械车间员工绩效考核表
- 形式发票格式2 INVOICE
- 2.48低危胸痛患者后继治疗评估流程图
- 人力资源管理之绩效考核 一、什么是绩效 所谓绩效简单的讲就是对
- 山东省医院目录
- 云南地方本科高校部分基础研究
- 废品管理流程图
评论
0/150
提交评论