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.pswp.cn/bicheng/17618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17618.shtml
英文地址,請注明出處:http://en.pswp.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;* };*/ …