当前位置: 首页 > news >正文

简单网站建设老师找学生做网站是什么心态

简单网站建设,老师找学生做网站是什么心态,灰色关键词排名优化,常州网站建设公司巧誉友网络1. 前言 限于作者能力水平#xff0c;本文可能存在谬误#xff0c;因此而给读者带来的损失#xff0c;作者不做任何承诺。 2. 概述 VPU 是用来进行图像、视频数据进行硬件编、解码的硬件模块。内部集成了 Encoder、Decoder 功能部件进行图像、视频数据进行硬件编、解码本文可能存在谬误因此而给读者带来的损失作者不做任何承诺。 2. 概述 VPU 是用来进行图像、视频数据进行硬件编、解码的硬件模块。内部集成了 Encoder、Decoder 功能部件进行图像、视频数据进行硬件编、解码以加速处理。 3. VPU 工作原理 3.1 VPU 编码工作流程 ---------------| --------- | 输入数据 --|-| Encoder |-|- 编码后的输出数据| --------- || || --------- || | Decoder | || --------- |---------------3.2 VPU解码工作流程 ---------------| --------- || | Encoder | || --------- || || --------- |输入数据 --|-| Decoder |-|- 解码后的输出数据| --------- |---------------4. Linux 下的 VPU 4.1 驱动架构 VPU驱动 可基于 V4L2子系统 框架完成。 1. 分别为 Encoder 和 Decoder 各注册1个 /dev/videoX 设备(总共2个video设备)。 /* 注册 Encoder 设备 */ vfd-vfl_dir VFL_DIR_M2M; video_register_device(vfd, VFL_TYPE_GRABBER, ...)/* 注册 Decoder 设备 */ vfd-vfl_dir VFL_DIR_M2M; video_register_device(vfd, VFL_TYPE_GRABBER, ...)设备数据传输方向为 VFL_DIR_M2M , 表明设备是设备完成的功能内存间的数据传输拷贝。 2. 在 open() 调用中在打开文件句柄的私有数据 file_private 绑定设备 buffer 队列(vb2_queue)的类型、接口、IO模式、数据传输方向等。 这里以 Encoder 的 open() 调用为例加以说明: /* Encoder【输入】数据队列初始化 */ encoder_vq_input.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; encoder_vq_input.io_modes VB2_MMAP | VB2_USERPTR | VB2_DMABUF; encoder_vq_input.ops xxx_vpu_encoder_qops; encoder_vq_input.mem_ops vb2_dma_contig_memops; ... vb2_queue_init(encoder_vq_input);/* Encoder【输出】数据队列初始化 */ encoder_vq_output.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; encoder_vq_output.io_modes VB2_MMAP | VB2_USERPTR | VB2_DMABUF; encoder_vq_output.ops xxx_vpu_encoder_qops; encoder_vq_output.mem_ops vb2_dma_contig_memops; ... vb2_queue_init(encoder_vq_output);...4.2 用户空间编程框架(Encoder编码示例) /* 打开设备(/dev/videoX为Encoder设备) */ fd open(/dev/videoX, O_RDWR);/* 设置输入、输出数据格式 *//* 设置编码【输入】数据格式 */ fmt.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ... ioctl(fd, VIDIOC_S_FMT, fmt); /* 设置编码【输出】数据格式 */ fmt.type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ... ioctl(fd, VIDIOC_S_FMT, fmt);/* 请求输入、输出buffer然后映射内核buffer到用户空间(IO模式为 V4l2_MEMORY_MMAP) *//* 请求【输入】buffer并映射到用户空间 */ rb.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; rb.memory V4l2_MEMORY_MMAP; rb.count 1; ioctl(fd, VIDIOC_REQBUFS, rb);buf.index i; buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; buf.memory V4l2_MEMORY_MMAP; buf.length num_input_planes; buf.m.planes input_planes; ioctl(fd, VIDIOC_QUERYBUF, buf);input_buffer.start mmap(0, ..., PROT_READ|PROT_WRITE, ...); input_buffer.length ...;/* 请求【输出】buffer并映射到用户空间 */ rb.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; rb.memory V4l2_MEMORY_MMAP; rb.count 1; ioctl(fd, VIDIOC_REQBUFS, rb);buf.index i; buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; buf.memory V4l2_MEMORY_MMAP; buf.length num_output_planes; buf.m.planes output_planes; ioctl(fd, VIDIOC_QUERYBUF, buf);output_buffer.start mmap(0, ..., PROT_READ|PROT_WRITE, ...); output_buffer.length ...;/* 将【输出】buffer入队然后开启【输出流】 */ buf.index i; buf.type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; buf.memory V4l2_MEMORY_MMAP; buf.length num_output_planes; buf.m.planes output_planes; output_planes[i].bytesused output_planes[i].length; ioctl(fd, VIDIOC_QBUF, buf);type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ioctl(fd, VIDIOC_STREAMON, type);/* 设置编码输入数据将【输入】buffer入队然后开启【输入流】 */ /* 设置编码输入数据 */ memcpy(input_buffer.start, input_data, input_data_size);buf.index i; buf.type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; buf.memory V4l2_MEMORY_MMAP; buf.length num_input_planes; buf.m.planes input_planes; input_planes[i].bytesused input_planes[i].length; ioctl(fd, VIDIOC_QBUF, buf);type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ioctl(fd, VIDIOC_STREAMON, type);/* 出队编码队列(vb2_queue)中就绪的【输出缓冲】 */ (vb2_buffer/v4l2_buffer, vb2_plane/v4l2_plane) buf.type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; buf.memory V4L2_MEM_TYPE; buf.length num_output_planes; buf.m.planes output_planes; ioctl(fd, VIDIOC_DQBUF, buf);/* 拷贝编码好的数据到目的缓冲(假定 output plane 数目为1) */ memcpy(output_data, output_buffer.start, buf.m.planes[0].bytesused);/* 关闭设备 */ close(fd);4.3 VPU 驱动工作流程小结 VPU-----------------------------| ----------------------- || | Encoder | || | ----------------- | |---|-|-| encoding buffer |-|-|---^ | | ----------------- | | |输入数据队列(vb2_queue) | | ----------------------- | | 输出数据队列(vb2_queue)----------------------- | | | | -----------------------| vb2_buffer[] |--| | ----------------------- | |-- | vb2_buffer[] |----------------------- | | | Decoder | | | -----------------------v | | ----------------- | | |---|-|-| decoding buffer |-|-|---| | ----------------- | || ----------------------- |-----------------------------Encoder/Decoder完成编、解码动作后: (1) 拷贝编、解码后的数据到输出队列中某个vb2_buffer的缓冲: memcpy(output_buffer, input_buffer, size); (2) 标记输入数据队列中某个vb2_buffer中的数据编、解码完成: vb2_buffer_done(in_vb, VB2_BUF_STATE_DONE); (3) 设置输出缓冲负载(输出数据大小): vb2_set_plane_payload(out_vb, 0, size); (4) 标记输出数据队列中某个vb2_buffer中的数据编、解码输出数据就绪: vb2_buffer_done(out_vb, VB2_BUF_STATE_DONE);4.4 示例 这是一个实际的范例来自开源方案 FrienlyARMVPU范例 。 该方案基于 S5P6818 的 SoC 。 4.4.1 FrienlyARM的方案内核NX VPU驱动补丁 /** drivers/media/platform/nx-vpu/nx_vpu_enc_v4l2.c */ void vpu_enc_get_seq_info(struct nx_vpu_ctx *ctx) {.../* 注释下面这一段代码 *//*{struct nx_vpu_buf *dst_mb;unsigned long flags;spin_lock_irqsave(ctx-dev-irqlock, flags);dst_mb list_entry(ctx-strm_queue.next, struct nx_vpu_buf,list);list_del(dst_mb-list);ctx-strm_queue_cnt--;vb2_set_plane_payload(dst_mb-vb, 0, ctx-strm_size);vb2_buffer_done(dst_mb-vb, VB2_BUF_STATE_DONE);spin_unlock_irqrestore(ctx-dev-irqlock, flags);}*/ }static void nx_vpu_enc_buf_queue(struct vb2_buffer *vb) {...if (vq-type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {...} else if (vq-type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {buf-used 0;if (ctx-img_fmt.num_planes 1)NX_DbgMsg(INFO_MSG, adding to src: %p(%08lx)\n,vb, (unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 0));else if (ctx-img_fmt.num_planes 2)NX_DbgMsg(INFO_MSG, adding to src: %p(%08lx, %08lx)\n,vb, (unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 0),(unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 1));else if (ctx-img_fmt.num_planes 3)NX_DbgMsg(INFO_MSG, adding to src: %p(%08lx, %08lx, %08lx)\n,vb, (unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 0),(unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 1),(unsigned long)nx_vpu_mem_plane_addr(ctx, vb, 2));}... }int nx_vpu_enc_open(struct nx_vpu_ctx *ctx) {...ctx-vq_img.io_modes VB2_MMAP | VB2_USERPTR | VB2_DMABUF;......ctx-vq_strm.io_modes VB2_MMAP | VB2_USERPTR | VB2_DMABUF;... }/** drivers\media\platform\nx-vpu\nx_vpu_v4l2.c*/ #define DST_QUEUE_OFF_BASE (1 30)int vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *buf) {struct nx_vpu_ctx *ctx fh_to_ctx(file-private_data);int ret 0;FUNC_IN();...if (buf-type V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {...} else if (buf-type V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {...//buf-m.planes[0].m.mem_offset DST_QUEUE_OFF_BASE;/* Adjust MMAP memory offsets for the CAPTURE queue */if (buf-memory V4L2_MEMORY_MMAP /* !V4L2_TYPE_IS_OUTPUT(ctx-vq_img-type)*/) {if (V4L2_TYPE_IS_MULTIPLANAR(ctx-vq_img.type)) {int i;for (i 0; i buf-length; i)buf-m.planes[i].m.mem_offset DST_QUEUE_OFF_BASE;} else {buf-m.offset DST_QUEUE_OFF_BASE;}}} else {...}return ret; }我为 S5P6818 的 VPU 编写了一个测试程序 nxvpu-yuv2jpg.c 该程序用于将 YUV420 或 GREY 格式数据转换为 MJEPG 格式数据实现代码见 S5P6818 VPU测试范例代码 。 5. 参考资料 https://wiki.friendlyelec.com/wiki/index.php/NanoPC-T3_Plus/zh
http://www.hkea.cn/news/14526894/

相关文章:

  • 站长网站素材网spring mvc 做网站
  • 南昌响应式网站建设水滴信用企业查询官网
  • 网站白名单 是什么怎样做网络推广营销方案
  • 网页制作与网站建设期末考试购物网站每个模块主要功能
  • 绍兴网站建设技术外包中国最新消息新闻
  • 网站推广的平台排名super cache wordpress
  • wp做网站需要多久广告传媒公司
  • 网站在线备案北京律师网站建设推荐
  • 网络网站建设推广微网站和微信
  • 校园网站建设宣传网站建设工程师的职位要求
  • 横沥建设网站广告设计公司属于什么行业
  • 网站建设说课ppt网站建设实训的目的
  • 做国外有那些网站网站建设 中企动力福州阀门
  • 怎么做视频平台网站删除自豪地采用wordpress
  • 西安网站建设培训学校微信网站有什么作用
  • 丹东谁做微网站二手网站怎么做
  • 如何把jQuery特效做网站背景一站式服务大厅
  • 牛天下网站建设北京 网站建设 招标信息
  • 搜狗网站优化软件手机网站内容管理
  • 建立中文网站的英文wordpress婚礼主题公园
  • 网站建设需要了解的智慧门店管理服务平台
  • 渭南网站建设公司定制网站建设公司手机网站大全1
  • 同仁微网站建设工作室工业设计在线官网
  • 建设部机关服务中心网站哪个网站可以做视频
  • 丰台深圳网站建设公司如何辨别官方网站
  • 网站常规seo优化步骤建设网站cms
  • 如何做电影网站赚钱wordpress搜索结果页样式
  • 大学专业网站wordpress 手机维修
  • 运营什么网站好拍摄网
  • 宝塔面板怎么建设网站网站建站费用多少钱