【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃

崩溃的信息如下:

1 OpenCV(4.1.0-dev) Error: Gpu API call (invalid configuration argument) in videoDecPostProcessFrame, file /home/admin/opencv/opencv_contrib-master/modules/cudacodec/src/cuda/nv12_to_rgb.cu, line 203
2 terminate called after throwing an instance of 'cv::Exception'
3   what():  OpenCV(4.1.0-dev) /home/admin/opencv/opencv_contrib-master/modules/cudacodec/src/cuda/nv12_to_rgb.cu:203: error: (-217:Gpu API call) invalid configuration argument in function 'videoDecPostProcessFrame'
4 
5 Aborted (core dumped)

比较奇怪的点如下:
1. 同样的程序,解码720P视频/480P视频,并调用CUDA核函数做进一步处理,正常;
    但是换1080P视频就出现以上错误。

2.1080P视频解码第一帧,并计算,正常;
   但是第二帧的时候就发生以上错误。

3.写一个空的核函数,什么也不错,1080P视频在解码第二帧的时候仍然发生错误。
   如果完全不调用核函数,一切正常。

看起来不是我自己的代码的锅,要提交给OPENCV团队才能解决。

==================================

2019-05-16 15:00 补充,问题已解决

关键问题是核函数中线程开太多了。我把代码修改成了如下:

1     if (rows>500){
2         _hsv_cacl_hist<<<1, rows/2>>>(data, cols, rows/2, step, channels, (uint32_t*)out->hist);
3         _hsv_cacl_hist<<<1, rows/2>>>(data+step*(rows/2), cols, rows/2, step, channels, (uint32_t*)out->hist);
4     } else {
5         _hsv_cacl_hist<<<1, rows>>>(data, cols, rows, step, channels, (uint32_t*)out->hist);
6     }

(虽然很丑陋)以上代码解决了崩溃的问题。

但是奇怪的是,为什么不在这个函数里崩溃,而要在视频解码里崩溃?

 

posted on 2019-05-16 12:18  ahfuzhang  阅读(1061)  评论(0编辑  收藏  举报