dx11硬件解码传递给opencl并行处理

directx11 解码

使用ffmpeg进行directx11 解码
将解码后的NV12格式数据从D3D11 Texture中通过OpenCL处理需要经过几个步骤:首先,确保D3D11 Texture正确设置并与OpenCL上下文关联;然后,将NV12数据分两个步骤处理(Y平面和UV平面);最后,在OpenCL内核中处理这些数据。

将d3d11 texture转换成opencl对象

opencl本身是可以和dx9 dx11 等进行互操作,就是利用这一点来使用opencl来并行处理数据

bool CreateSharedSurface(void* data,  int nView, bool bIsReadOnly,cl_mem* y, cl_mem* uv)
{mfxHDLPair mid_pair = { 0 };mfxStatus sts = m_pAlloc->GetHDL(m_pAlloc->pthis, mid, reinterpret_cast<mfxHDL*>(&mid_pair));if (sts) return 0;ID3D11Texture2D *surf = (ID3D11Texture2D*)data;cl_int error = CL_SUCCESS;cl_mem memY = clCreateFromD3D11Texture2DKHR(m_clcontext, bIsReadOnly ? CL_MEM_READ_ONLY : CL_MEM_READ_WRITE,data, 0, &error);if (error) {log.error() << "clCreateFromD3D11Texture2DKHR failed. Error code: " << error << endl;return -1;}cl_mem memUV = clCreateFromD3D11Texture2DKHR(m_clcontext, bIsReadOnly ? CL_MEM_READ_ONLY : CL_MEM_READ_WRITE,data, 1, &error);if (error) {log.error() << "clCreateFromD3D11Texture2DKHR failed. Error code: " << error << endl;return -1;}*y = memY;*uv = memUV;return 0;
}

以上是转换过程

编写OpenCL内核处理NV12数据

和cuda一样,需要写核函数来处理

__kernel void processNV12(__read_only image2d_t yImage, __read_only image2d_t uvImage, __write_only image2d_t outputImage) {// 这里只是一个示例,实际处理逻辑根据需求编写int2 pos = (int2)(get_global_id(0), get_global_id(1));uchar4 yPixel = read_imageui(yImage, pos); // 读取Y平面像素uchar2 uvPixel = read_imageui(uvImage, pos / 2); // UV平面是Y的一半大小,因此坐标除以2// 这里简单地将YUV转换为RGB,实际应用中会有更复杂的处理float y = yPixel.x;float u = uvPixel.x - 128.0f;float v = uvPixel.y - 128.0f;float r = y + 1.14f * v;float g = y - 0.395f * u - 0.581f * v;float b = y + 2.032f * u;uchar4 outPixel = (uchar4)(saturate(r), saturate(g), saturate(b), 255);write_imageui(outputImage, pos, outPixel);
}

cpp执行OpenCL内核

// 假设outputImage是目标OpenCL图像对象,已根据需要创建
size_t globalWorkSize[2] = { width, height }; // width和height分别为处理图像的宽度和高度
cl_kernel kernel = clCreateKernel(program, "processNV12", &err); // program为编译好的OpenCL程序
clSetKernelArg(kernel, 0, sizeof(cl_mem), &clYImage);
clSetKernelArg(kernel, 1, sizeof(cl_mem), &clUVImage);
clSetKernelArg(kernel, 2, sizeof(cl_mem), &outputImage);err = clEnqueueNDRangeKernel(commandQueue, kernel, 2, nullptr, globalWorkSize, nullptr, 0, nullptr, nullptr);
if (err != CL_SUCCESS) { /* 处理错误 */ }// 同步、读回数据、清理等操作

初始化过程

void initializeContextFromD3D11Device(ID3D11Device* pD3D11Device)
{
CV_UNUSED(pD3D11Device);
cl_uint numPlatforms;
cl_int status = clGetPlatformIDs(0, NULL, &numPlatforms);
if (status != CL_SUCCESS)
CV_Error(cv::Error::OpenCLInitError, "OpenCL: Can't get number of platforms");
if (numPlatforms == 0)
CV_Error(cv::Error::OpenCLInitError, "OpenCL: No available platforms");std::vector<cl_platform_id> platforms(numPlatforms);
status = clGetPlatformIDs(numPlatforms, &platforms[0], NULL);
if (status != CL_SUCCESS)CV_Error(cv::Error::OpenCLInitError, "OpenCL: Can't get number of platforms");// TODO Filter platforms by name from OPENCV_OPENCL_DEVICEint found = -1;
cl_device_id device = NULL;
cl_uint numDevices = 0;
cl_context context = NULL;// try with CL_PREFERRED_DEVICES_FOR_D3D11_NV
for (int i = 0; i < (int)numPlatforms; i++)
{clGetDeviceIDsFromD3D11NV_fn clGetDeviceIDsFromD3D11NV = (clGetDeviceIDsFromD3D11NV_fn)clGetExtensionFunctionAddressForPlatform(platforms[i], "clGetDeviceIDsFromD3D11NV");if (!clGetDeviceIDsFromD3D11NV)continue;device = NULL;numDevices = 0;status = clGetDeviceIDsFromD3D11NV(platforms[i], CL_D3D11_DEVICE_NV, pD3D11Device,CL_PREFERRED_DEVICES_FOR_D3D11_NV, 1, &device, &numDevices);//CL_PREFERRED_DEVICES_FOR_D3D11_NVif (status != CL_SUCCESS)continue;if (numDevices > 0){cl_context_properties properties[] ={CL_CONTEXT_D3D11_DEVICE_NV, (cl_context_properties)pD3D11Device,CL_CONTEXT_PLATFORM, (cl_context_properties)platforms[i],//CL_CONTEXT_INTEROP_USER_SYNC, CL_FALSE,0};context = clCreateContext(properties, 1, &device, NULL, NULL, &status);if (status != CL_SUCCESS){clReleaseDevice(device);}else{found = i;break;}}
}
if (found < 0)
{// try with CL_ALL_DEVICES_FOR_D3D11_NVfor (int i = 0; i < (int)numPlatforms; i++){clGetDeviceIDsFromD3D11NV_fn clGetDeviceIDsFromD3D11NV = (clGetDeviceIDsFromD3D11NV_fn)clGetExtensionFunctionAddressForPlatform(platforms[i], "clGetDeviceIDsFromD3D11NV");if (!clGetDeviceIDsFromD3D11NV)continue;device = NULL;numDevices = 0;status = clGetDeviceIDsFromD3D11NV(platforms[i], CL_D3D11_DEVICE_NV, pD3D11Device,CL_ALL_DEVICES_FOR_D3D11_NV, 1, &device, &numDevices);//CL_ALL_DEVICES_FOR_D3D11_NVif (status != CL_SUCCESS)continue;if (numDevices > 0){cl_context_properties properties[] ={CL_CONTEXT_D3D11_DEVICE_NV, (cl_context_properties)pD3D11Device,CL_CONTEXT_PLATFORM, (cl_context_properties)platforms[i],//CL_CONTEXT_INTEROP_USER_SYNC, CL_FALSE,0};context = clCreateContext(properties, 1, &device, NULL, NULL, &status);if (status != CL_SUCCESS){clReleaseDevice(device);}else{found = i;break;}}}if (found < 0)CV_Error(cv::Error::OpenCLInitError, "OpenCL: Can't create context for DirectX interop");
}//cv::ocl::Context& ctx = cv::ocl::Context::getDefault(false);
//cv::ocl::initializeContextFromHandle(ctx, platforms[found], context, device);
///As you say,`initializeContextFromHandle()` symbol is not in the exported list. So I use attachContext() instead for test.
cv::ocl::attachContext("NVIDIA CUDA", platforms[found], context, device);//Test passed//return ctx;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调试面对面翻译小程序

调试面对面翻译小程序 文章目录 调试面对面翻译小程序预览1.拉取项目2.在微信开发者工具打开使用 微信版本要求微信同声传译插件支持功能 此demo用于学习 预览 1.拉取项目 git clone https://github.com/Tencent/Face2FaceTranslator或者&#xff08;加速镜像&#xff09; git …

Warning: Each child in a list should have a unique “key“ prop.

问题描述&#xff1a; 使用ProTable的时候&#xff0c;报错如下 原因分析&#xff1a; 根据报错内容可以分析出&#xff0c;表格数据缺少唯一key&#xff0c; <PaginationTablecolumns{columns}pagination{{pageSize: 10,current: 1,showSizeChanger: true,showQuickJum…

kafka 可以脱离 zookeeper 单独使用吗?为什么?

Kafka是一个分布式的流式处理平台&#xff0c;它依赖于Zookeeper来管理集群元数据、选举Leader以及故障恢复。在Kafka集群中&#xff0c;Zookeeper负责保存和维护分布式系统的信息。 虽然理论上可以将Kafka与Zookeeper分开&#xff0c;但实际上&#xff0c;Kafka在设计时就与Z…

JavaScript中的相等操作符(== vs ===)选择指南

在使用JavaScript进行比较时,我们经常会遇到相等操作符 == 和严格相等操作符 ===。本文将深入探讨这两者之间的区别,并说明在何种情况下应使用 === 而不是 ==。 相等操作符(==) 相等操作符 == 会在进行比较之前对其两个操作数进行必要的类型转换。这意味着即使两个操作数…

网络安全行为可控定义以及表现内容简述

在数字化快速发展的今天&#xff0c;网络安全已成为国家和企业不可或缺的防线。据统计&#xff0c;网络攻击事件频发&#xff0c;给全球经济带来了巨大损失。因此&#xff0c;确保网络安全行为可控显得尤为重要。今天我们来聊聊网络安全行为可控定义以及表现内容。 网络安全行为…

摸鱼大数据——Hive表操作——分区表

1、介绍 特点: 分区表会在HDFS上产生目录。查询数据的时候使用分区字段筛选数据&#xff0c;可以避免全表扫描&#xff0c;从而提升查询效率 注意: 如果是分区表&#xff0c;在查询数据的时候&#xff0c;如果没有使用分区字段&#xff0c;它回去进行全表扫描&#xff0c;会降低…

说一下 ACID 是什么?

ACID 是数据库事务的四个特性的首字母缩写&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。 原子性&#xff08;Atomicity&…

什么是NAND Flash ECC?

在存储芯片行业&#xff0c;数据完整性和可靠性是至关重要的。为了确保数据的准确性和防止数据丢失&#xff0c;ECC&#xff08;错误校正码&#xff09;在NAND Flash存储中扮演了关键角色。MK米客方德将为您解答NAND Flash ECC的基本概念、工作原理及其在实际应用中的重要性。 …

重绘和重排

重绘&#xff08;Repaint&#xff09;和重排&#xff08;Reflow&#xff09;是与网页渲染和布局密切相关的两个概念。以下是关于这两个概念的详细解释&#xff1a; 重绘&#xff08;Repaint&#xff09; 定义&#xff1a; 当一个元素的外观发生改变&#xff0c;但没有改变布…

C#【进阶】俄罗斯方块

俄罗斯方块 文章目录 Test1_场景切换相关BeginScene.csBegionOrEndScene.csEndScene.csGame.csGameScene.csISceneUpdate.cs Test2_绘制对象基类和枚举信息DrawObject.csIDraw.csPosition.cs Test3_地图相关Map.cs Test4_坐标信息类BlockInfo.cs Test5_板砖工人类BlockWorker.…

数据库中字符串相加需要换行

数据库中字符串相加需要换行&#xff0c;这个需求在现在项目中很常见&#xff0c;特别是备注内容的追加&#xff0c;因此把Oracle/SQLServer/MySQL这几种数据库的使用进行简单的总结一下 1、本文内容 Oracle中实现字符串相加需要换行SQLServer中实现字符串相加需要换行MySQL中…

VMware的网络不通?这一篇给你一定的参考.虚拟机网络配置

如果你的虚拟机莫名其妙ping不通网络了&#xff0c;可以参考一下我的配置。这不是一篇教程&#xff0c;你可以核对一下自己的bug。 虚拟网络配置器中&#xff1a; 使用管理员权限更改设置&#xff0c;会跳出来vmnet0 桥接、仅主机和NAT都必须要有 vment0&#xff1a; vmnet1:…

【乐吾乐3D可视化组态编辑器】相机与视角

系统默认的相机为环绕旋转相机&#xff0c;它可以环绕一个中心点做上下左右的旋转&#xff0c;来从不同角度观察场景。当然&#xff0c;您也可以把一些特定角度的信息保存下来&#xff0c;在系统中我们把这个信息称作视角。通过交互中的切换视角动作&#xff0c;您就可以实现把…

英语新概念2-回译法-lesson1 和 lesson17

Lesson 1 私人谈话A private conversation 翻译&#xff1a; Last Sunday I went to the theater. My seat was good and the play was interesting, but I can not enjoy it. A young man and a young woman sat behind me and they were talking loudly. I felt angry becau…

2024年电子、电气与信息科学国际会议(EEIS 2024)

2024年电子、电气与信息科学国际会议&#xff08;EEIS 2024&#xff09; 2024 International Conference on Electronics, Electrical and Information Science 【重要信息】 大会地点&#xff1a;昆明 大会官网&#xff1a;http://www.iceeis.com 投稿邮箱&#xff1a;iceeis…

振弦式土压力计:功能优势与专业应用

振弦式土压力计&#xff0c;作为一种广泛应用于土木工程领域的测量仪器&#xff0c;具有多种功能优势&#xff0c;使得它成为了解被测结构物内部土压力变化的有效工具。下面我将详细介绍振弦式土压力计的功能优势及其在土木工程中的应用。 点击输入图片描述&#xff08;最多30字…

【运维项目经历|021】Spark大数据分析平台建设项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;项目周期多久&#xff1f; 问题2&#xff1a;服务器部署架构方式及数量和配置…

FTP协议——Pure-Ftpd安装(Linux)

1、简介 Pure-FTPd是一个高效、免费且开源的FTP服务器软件&#xff0c;广泛应用于各种Unix/Linux系统。它以其易用性、高安全性和功能丰富而闻名&#xff0c;适用于个人和企业的文件传输需求。 2、步骤 环境&#xff1a;Ubuntu 22.04.4 下载地址&#xff1a;Index of /pub/p…

3D Web轻量化平台HOOPS Web Platform在数字工厂中的应用实例

今天我们来聊聊HOOPS工具对大型数据的处理和可视化管理。这里是一个数字工厂的仪表盘展示&#xff0c;您可以在仪表盘上看到包括工厂的能源消耗、计划产量等数据信息&#xff0c;以及各种制造机器的生产量。 HOOPS中文网http://techsoft3d.evget.com/ 我们的HOOPS工具&#xf…

链表带环问题的思考

判断链表是否带环 思路&#xff1a;快慢指针 慢指针走一步&#xff0c;快指针走两步&#xff0c;当快指针追上慢指针时&#xff0c;代表该链表带环。代码如下: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ …