首页 > 编程语言 >用OLED屏幕播放视频(3): 使用cuda编程加速视频处理

用OLED屏幕播放视频(3): 使用cuda编程加速视频处理

时间:2023-09-08 16:27:07浏览次数:57  
标签:视频 kernel int unsigned OLED cuda 屏幕

下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放:

  1. 项目介绍
  2. 为OLED屏幕开发I2C驱动
  3. 使用cuda编程加速视频处理

这是此系列文章的第3篇, 主要总结和记录了如何使用cuda编程释放GPU的算力. 在此之前尝试过使用python调用opencv直接处理视频数据, 但使用之后发现处理过程效率不高, 处理时间偏长. 后来想到还有一块显卡没利用起来, 毕竟在前司见证了某国产GPGPU芯片从立项, 到流片再到回片验证的整个过程, cuda编程也算是传统艺能了. 最终效果看下面的视频:

跳转到6:48, 直接观看演示

<iframe allowfullscreen="true" border="0" frameborder="no" framespacing="0" height="600" scrolling="no" src="//player.bilibili.com/player.html?aid=788149070&bvid=BV1d14y1k7YR&cid=1260923220&p=1" width="100%"> </iframe>

1). 要用GPU做什么

这里不会介绍cuda的编程模型, cuda开发工具的使用等, 这部分内容可以参考cuda的官方文档, 学习cuda编程的话, 看这个文档就足够了.

原始的视频文件, 每帧画面的分辨率一般不会和我们的屏幕尺寸128x64匹配, 并且视频是彩色的, 使用的OLED屏幕只能显示黑白图像. 所以视频的数据必须经过resize和灰度处理之后才能发送给beaglebone black板子连接的OLED屏幕, 这部分视频处理工作就是在GPU上进行的.

image

在host machine上的python程序使用opencv读取视频文件中的每一帧, 通过socket发送给cuda程序; cuda程序处理完数据之后, 再通过socket把数据发送给beagle board上的用户态程序; beagle board上的用户态程序, 把一帧数据写入屏幕, 完成绘制.

2). kernel函数的算法实现

下面是kernel函数的部分代码, oframe, ow, oh, 分别表示原始画面数据, 原始的宽度和高度, nframe, nw, nh分别表示处理之后的画面数据, 新的宽度和高度.

kernel中的resize操作, 使用最近临方式, (i, j)是新画面中的像素位置, 计算得到对应的原始画面像素位置(oi, oj), 取出原始的rgb值, 使用公式计算出亮度, 最后根据阈值确定(i, j)这个像素的亮灭.

__global__ void resize_frame_kernel(unsigned char *oframe, int ow, int oh,
				    unsigned char *nframe, int nw, int nh,
				    int threshold, unsigned int *locks)
{
	for (int i = blockDim.x * blockIdx.x + threadIdx.x; i < nw;
	     i += blockDim.x * gridDim.x) {
		for (int j = blockDim.y * blockIdx.y + threadIdx.y; j < nh;
		     j += blockDim.y * gridDim.y) {
			int oi = i * ow / nw;
			int oj = j * oh / nh;

			unsigned char b = oframe[oj * ow * 3 + oi * 3];
			unsigned char g = oframe[oj * ow * 3 + oi * 3 + 1];
			unsigned char r = oframe[oj * ow * 3 + oi * 3 + 2];

			unsigned char brightness =
				r * 0.3 + g * 0.59 + b * 0.11;
			brightness = brightness >= threshold ? 1 : 0;
			brightness = brightness << (j % 8);
			// 以下代码实现了一个自旋锁
			bool leaveloop = false;
			while (!leaveloop) {
				if (atomicExch(&locks[j / 8 * nw + i], 1u) ==
				    0u) {
					nframe[j / 8 * nw + i] |= brightness;
					leaveloop = true;
					atomicExch(&locks[j / 8 * nw + i], 0u);
				}
			}
		}
	}
}

3). kernel函数中的并发问题

在上面的代码清单中使用原子交换指令atomicExch实现了一个自旋锁. 在kernel函数中使用锁是因为, nframe的大小是128x8字节, 屏幕分辨率是128x64, nframe的每个bit控制一个像素, 当kernel中更新nframe时, 可能同时有多个线程想更新nframe中的同一个字节. 关于这个自选锁中while循环的写法, 可以参考stack overflow.

4). 文末推广

欢迎关注我的B站账号, 或者加入QQ群838923389, 一起研究计算机底层技术, 一起搞事情:P

标签:视频,kernel,int,unsigned,OLED,cuda,屏幕
From: https://www.cnblogs.com/kfggww/p/17672944.html

相关文章

  • 以视频监控平台 EasyCVR为例分析视频汇聚平台在汛期防洪场景中能起到什么样的作用
    华夏千载悠悠,江河淮济东流,曾兹润泽九州,却患祸无止不休。水可以是人类文明的起源,但同样也可以轻而易举的让人们流离失所。每逢夏季,我国各省市也进入汛期,夏季雨水较多,暴雨等极端天气时有发生,因此抗洪防汛任务艰巨。在汛期加大对河道、湖泊、坝区、水库等重点关注区域的密切监控与管理......
  • 关于国标EHOME视频平台EasyCVR云边端协同与算力调度在AI视频检测场景中的应用意义
    AI在医疗卫生、能源动力、交通航天、语言图像识别等领域发挥着重要作用,并且在安防领域也具有巨大潜力。应用人工智能、深度学习、视频结构化技术、物联网技术和大数据分析等创新技术,使得安防视频监控具备强大的能力。基于AI的智能识别分析技术已经成为视频监控的标准配置。通过智能......
  • 视频汇聚平台EasyCVR如何完成多设备平台视频监控向应急中心播放的实现
    将各种智能分析和预防功能汇聚起来,并与省级视频和感知数据共享平台进行对接,以获取视频资源。通过整合雪亮工程、"天翼应急"视频和其他厅局资源,形成一个视频资源池,并集中提供给与应急业务相关的特殊场景监控,例如森林防火、地震、危化品大中小企业、无人机/单兵和应急指挥中心大楼。......
  • 视频汇聚平台EsayNVR基于国网B接口的设备注册流程与鉴权技术分享
    国网B接口是用于国家电网视频监控系统内部的接入协议,主要用于视频监控系统与前端系统之间的交互。我们最近一直在研究该接口的接入开发,现在分享一些技术干货。1、接口描述①注册属于数据接口,采用SIP标准协议,URI中的用户名应为下级平台的地址编码。②注册过程需要进行鉴权,使......
  • 关于国标GB28181视频平台EasyNVR的一些简单介绍与科普
    国标的由来:GB28181国标的产生是为了解决平台与平台之间的对接问题。比如,A平台的大连交警系统需要查看B平台(如南京、上海交警系统)的视频,这就需要对接两个平台,实现视频的调度。但是由于各个厂家都自定义了不同的协议,所以这个过程非常繁琐。为了解决这个问题,国家制定了GB28181国标,该标......
  • 国标EHOME视频平台EasyCVR更新后首页无法打开原因分析
    EasyCVR是一款安防视频监控平台,具有强大的可拓展性、灵活的视频能力和轻快的部署特性。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,并能够接入各个厂家的私有协议与SDK,例如海康Ehome、海大宇等设备的SDK。该平台不仅具备传统安防视频监控的功能,如视频监控直播、云......
  • GB国标28181协议下设备接入EasyCVR后,如何调用接口获取RTMP和RTSP视频流
    EasyCVR是一款安防视频监控平台,具有强大的可拓展性、灵活的视频能力和轻快的部署特性。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,并能够接入各个厂家的私有协议与SDK,例如海康Ehome、海大宇等设备的SDK。该平台不仅具备传统安防视频监控的功能,如视频监控直播、云......
  • TSINGSEE视频监控汇聚平台EasyCVR提供的三种视频监控录像方式
    EasyCVR视频融合汇聚平台是基于云边端智能协同的安防监控视频解决方案。它支持海量视频的轻量化接入与汇聚、转码与处理,以及全网智能分发等功能。作为一款具有强大拓展性的音视频流媒体平台,EasyCVR提供丰富的视频能力,包括视频监控直播、视频轮播、视频录像、云存储、回放与检索、智......
  • 带您了解智能视频监控系统EasyCVR的工作原理和广泛应用场景。
    EasyCVR国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、集群、智能AI分析以及平台级......
  • 智能视频与分析技术构建可视化消防风险预警视频监控平台EasyCVR
    TSINGSEE青犀视频提出了智慧消防解决方案,以多维感知、数据共享和业务联动为理念,旨在改善消防安全管理。通过整合消防与安防资源,利用视频监控和智能分析技术实时监测火灾风险,并提供火灾报警和现场视频资料供消防人员快速响应和处置。该方案还支持数据可视化,以直观方式展示火灾风险状......