2013-08-21 3 views
1

CUDA 디코더 프로젝트의 코드를 사용하여 디코딩 된 이미지 파일을 BMP 이미지로 다시 저장하려고합니다.출력 파일을 이미지 파일로 저장 CUDA 디코더

  if (g_bReadback && g_ReadbackSID) 
      { 
       CUresult result = cuMemcpyDtoHAsync(g_bFrameData[active_field], pDecodedFrame[active_field], (nDecodedPitch * nHeight * 3/2), g_ReadbackSID); 



       long padded_size = (nWidth * nHeight * 3); 
       CString output_file; 
       output_file.Format(_T("image/sample_45.BMP")); 
       SaveBMP(g_bFrameData[active_field],nWidth,nHeight,padded_size,output_file); 

       if (result != CUDA_SUCCESS) 
       { 
        printf("cuMemAllocHost returned %d\n", (int)result); 
       } 
      } 

는 그러나 저장된 이미지는 아무도 내가 뭘 잘못 여기에 나를 도와 드릴까요 .. 감사이 enter image description here

것 같습니다.

+1

'cuMemcpyDtoHAsync'보다는'cuMemcpyDtoH '를 사용하여 차이가 있는지 확인하십시오. – talonmies

+0

아니, 출력은 여전히 ​​ – Hadi

+0

입니다.이 경우 내가 볼 수있는 CUDA 프로그래밍 문제가 없습니다. 분명히 잘못 될 수있는 유일한 점은 프레임 저장을 시작하기 전에 완료되지 않은 비동기식 메모리 전송을 사용한다는 것입니다. 그러나 그것은 도움이되지 않았습니다. 따라서 두 가지 선택 중 하나가 있습니다. GPU에서 데이터가 이미 잘못 전달 되었기 때문에 GPU에서 데이터가 잘못 전달 된 것입니다. 그렇지 않으면 세이브 루틴에서받은 데이터가 전달중인 데이터와 다른 것으로 예상됩니다. 여기에 나와있는 것은이 두 가지 문제 중 하나를 해결하는 데 도움이되지 않습니다. – talonmies

답변

3

추가 조사를 마친 후 내가 수정 한 몇 가지 수정 사항이 있습니다.

  • pDecodedFrame 일부가 아닌 RGB 형식으로 실제로, 나는 그것이 내가 particular YUV variant이라고 생각 NV12 형식으로 생각합니다.
  • pDecodedFrame 특정 CUDA 커널을 사용하여 GPU에서 RGB 형식으로 변환 된 도착
  • 이러한 변환에 대한 목표 버퍼는 하나의 OpenGL 의해 제공된 표면 g_bUseInterop 지정하거나, 다른 드라이버 API에 의해 할당 통상 영역 인 것 경우
  • interop이 지정되지 않은 경우 cudaMalloc 버전

위에서 언급 한 대상 버퍼는 pInteropFrame (비 interop 경우에도)입니다. 그래서 당신을 위해 예제를 만들기 위해 간단히 non-interop 케이스 만 사용하기로했습니다.이 경우 RGB 버퍼 (pInteropFrame)를 잡는 것이 훨씬 쉽기 때문입니다.

cudaPostProcessFrame으로 적절한 RGB 이미지로 채운 다음 여기에서 메서드는 pInteropFrame을 호스트에 복사합니다. 이미지를 비트 맵 파일로 저장하는 루틴도 있습니다. 모든 수정 사항은 RMC을 포함하는 주석으로 표시되어 있으므로 변경 사항/추가 사항을 모두 찾으려면 검색하십시오.

videoDecodeGL.cpp 소스 파일 대신에 cudaDecodeGL 프로젝트에서이 파일을 사용하십시오. 그런 다음 프로젝트를 다시 빌드하십시오. 그런 다음 실행 파일을 정상적으로 실행하여 비디오를 표시하십시오. 특정 프레임을 캡처하려면 nointerop 명령 줄 스위치와 함께 실행 파일을 실행하십시오. cudaDecodGL nointerop이고 비디오는 표시되지 않지만 디코드 작업과 프레임 캡처가 수행되고 프레임은 framecap.bmp 파일에 저장됩니다. 캡쳐 된 특정 프레임 번호를 변경하려면 g_FrameCapSelect = 37; 변수를 37 이외의 다른 번호로 수정하고 다시 컴파일하십시오.

Here is the replacementvideoDecodeGL.cpp SO에는 질문 본문에 입력 할 수있는 문자 수에 제한이 있으므로 pastebin을 사용했습니다.

내 접근 방식은 리드 백이 지정되었는지 여부와는 별개입니다. 이 시퀀스에 대해 리드 백을 사용하지 않는 것이 좋습니다.