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

opencl色域变换,处理传递显存数据

在使用ffmpeg解码后的多路解码数据非常慢,还要给AI做行的加速方式是在显存处理数据,在视频拼接融合产品的产品与架构设计中,提出了比较可靠的方式是使用cuda,那么没有cuda的显卡如何处理呢
,比较好的方式是使用opencl来提高数据传输效率

核函数

在OpenCL中,将NV12格式转换为BGR格式通常涉及到对UV分量的处理,nv12 是使用ffmpeg等解码后的直接数据,注意linesize对齐

#define GROUP_SIZE 16// OpenCL kernel to convert NV12 to BGR
__kernel void nv12_to_bgr(__global const uchar *nv12,__global uchar *bgr,int width, int height) {int x = get_global_id(0);int y = get_global_id(1);// Make sure we are not out of boundsif (x < width && y < height) {// Calculate Y, U, and V indicesint yIndex = y * width + x;int uvIndex = width * height + (y / 2) * (width) + (x & ~1); // Use '& ~1' to get even X indices for U/V// Load Y, U, and V valuesuchar yValue = nv12[yIndex];uchar uValue = nv12[uvIndex];uchar vValue = nv12[uvIndex + 1];// Convert YUV to RGBuchar bValue = (uchar)((yValue                  + 1.732446 * (uValue - 128));uchar gValue = (uchar)((yValue - 0.344134 * (vValue - 128) - 0.714136 * (uValue - 128));uchar rValue = (uchar)((yValue + 1.402225 * (vValue - 128));// Pack BGR valuesuchar bgrValue = (bValue << 2) | (gValue >> 4) | (rValue << 6);// Store BGR valuebgr[yIndex] = bgrValue;}
}

cpu上继续

注意错误处理

// 设置OpenCL内核参数
size_t global_work_size[2] = {width, height};
cl_kernel nv12_to_bgr_kernel = ...; // 获取你编译的内核// 设置内核参数
clSetKernelArg(nv12_to_bgr_kernel, 0, sizeof(cl_mem), &nv12_buffer);
clSetKernelArg(nv12_to_bgr_kernel, 1, sizeof(cl_mem), &bgr_buffer);
clSetKernelArg(nv12_to_bgr_kernel, 2, sizeof(int), &width);
clSetKernelArg(nv12_to_bgr_kernel, 3, sizeof(int), &height);// 执行内核
cl_event event;
clEnqueueNDRangeKernel(command_queue, nv12_to_bgr_kernel, 2, NULL, global_work_size, NULL, 0, NULL, &event);// 等待命令执行完毕
clWaitForEvents(1, &event);

针对arm,非显存

用128位的寄存器进行处理。
vld1_u8 从内存中读取88位数据到寄存器
vld1q_u8 从内存中读取16
8位数据到寄存器
vld3q_u8 从内存中读取3个168位数据到寄存器中
vst3q_u8 将三个128位寄存器的数据写到内存中
vld4_u8 从内存中读取4个8
8位数据到寄存器中
vmull_u8 执行两个8*8位无符号整数的乘法操作
vshrn_n_u16 16位无符号整数右移指定的位数
vst1_u8 将128位寄存器中的8位无符号整数元素存储到内存中
vshrq_n_s16 16位整数右移指定的位数
举例


void bgr_to_rgb(uint8_t *bgr, uint8_t *rgb, int width, int height)
{// Ensure BGR and BGR buffers are 16-byte aligned for NEONuint8_t *bgr_aligned = (uint8_t *)(((uintptr_t)bgr + 15) & ~15);uint8_t *rgb_aligned = (uint8_t *)(((uintptr_t)rgb + 15) & ~15);for (int q = 0; q < height * width / 16; q++){// Calculate the index for the current pixelint index = q * 16 * 3;// Load 16 BGR pixels into three vectors.uint8x16x3_t bgr_vector = vld3q_u8(bgr_aligned + index);// Shuffle the bytes to convert from BGR to BGR.uint8x16_t b = bgr_vector.val[2]; // Blueuint8x16_t g = bgr_vector.val[1]; // Greenuint8x16_t r = bgr_vector.val[0]; // Red// Combine the shuffled bytes into a single vector.uint8x16x3_t rgb_vector = {b, g, r};// Store the result.vst3q_u8(rgb_aligned + index, rgb_vector);}
}

使用gstreamer

使用gstremaer pipeline技术写好插件,直接操作显存

相关文章:

  • 【PB案例学习笔记】-13 徒手做个电子时钟
  • fast-lio2代码学习
  • GEC6818开发板的环境配置
  • AI界的“拼夕夕”登场,为上万张GPU寻找新使命
  • 磁盘管理后续——盘符漂移问题解决
  • Java进阶学习笔记21——泛型概念、泛型类、泛型接口
  • 风景园林设计乙级资质被撤销后的恢复途径
  • 生意人【着眼于未来、公私分明、有决断又有人情味、立场、享受过程】
  • 部署LAMP平台
  • web刷题记录(1)
  • PADS做CAM文件时,提示填充宽度对于精确的焊盘填充过大
  • 剪映网页版
  • 面向可复用性和可维护性的设计模式 课程学习总结
  • 基于java实现图片中任意封闭区域识别
  • NSSCTF-Web题目4
  • 【Amaple教程】5. 插件
  • Android单元测试 - 几个重要问题
  • Angularjs之国际化
  • CSS 三角实现
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • If…else
  • Java新版本的开发已正式进入轨道,版本号18.3
  • miaov-React 最佳入门
  • Mysql数据库的条件查询语句
  • vue数据传递--我有特殊的实现技巧
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 回顾2016
  • 基于组件的设计工作流与界面抽象
  • 三栏布局总结
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入浅出Node.js
  • 数组大概知多少
  • 微信开源mars源码分析1—上层samples分析
  • 想使用 MongoDB ,你应该了解这8个方面!
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 白色的风信子
  • Spring Batch JSON 支持
  • ​​​​​​​​​​​​​​Γ函数
  • #define与typedef区别
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (附源码)springboot教学评价 毕业设计 641310
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Flask之特殊装饰器详解
  • (五)Python 垃圾回收机制
  • (循环依赖问题)学习spring的第九天
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • *2 echo、printf、mkdir命令的应用
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .htaccess配置常用技巧
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net - 类的介绍