비디오 디코딩

Microsoft Direct3D 런타임은 사용자 모드 디스플레이 드라이버의 DecodeBeginFrameDecodeEndFrame 함수를 호출하여 사용자 모드 표시 드라이버가 비디오를 디코딩할 수 있는 이러한 함수 호출 간의 기간을 나타냅니다. 사용자 모드 표시 드라이버가 비디오 디코딩 작업을 수행하기 전에 Microsoft Direct3D 런타임은 사용자 모드 디스플레이 드라이버의 SetDecodeRenderTarget 함수를 호출하여 디코딩 작업에 대한 렌더링 대상 화면을 설정해야 합니다. 그러나 setDecodeRenderTarget 호출은 시작 프레임과 끝 프레임 시간대 외부에서만 발생할 수 있습니다.

보호 모드 및 DecodeBeginFrame호출에서 Direct3D 런타임은 D3DDDIARG_DECODEBEGINFRAME 구조체의 pPVPSetKey 멤버가 가리키는 변수에서 DirectX VA 콘텐츠 키를 설정하거나 변경합니다. 디코딩 디바이스는 이 및 후속 프레임에 대해 압축된 DirectX VA 버퍼의 보호된 전송에 이 키를 사용합니다.

참고 Direct3D 런타임은 오직 키를 변경하거나 설정하기 위해서만 pPVPSetKey 포인터를 설정합니다. 이전에 설정한 키를 계속 사용하기 위해 런타임은 포인터를 NULL 설정하여 동일한 키를 다시 로드하는 데 시간이 많이 소요되는 것을 방지합니다. 드라이버는 중복 설정을 제거하지 않습니다. 디코더 애플리케이션은 중복 설정을 피해야 합니다.

디코딩 작업에 대한 렌더링 대상 화면이 설정되면 사용자 모드 표시 드라이버는 DecodeExecute 함수에 대한 호출을 수신하여 시작 프레임과 끝 프레임 기간 사이에 비디오 디코딩 작업을 수행할 수 있습니다.

DecodeExecute호출에서 D3DDDIARG_DECODEEXECUTE 구조의 pCompressedBuffers 배열의 DXVADDI_DECODEBUFFERDESC 구조체의 CompressedBufferType 멤버에 지정된 모든 버퍼 형식이 D3DDDIARG_DECODEEXECUTE hDecode 멤버가 지정하는 각 디코딩 GUID에 사용되지는 않습니다. 예를 들어, 조각 제어(D3DDDIFMT_SLICECONTROLDATA), 역양자화(D3DDDIFMT_INVERSEQUANTIZATIONDATA) 및 비트 스트림(D3DDDIFMT_BITSTREAMDATA) 버퍼는 VLD(가변 길이 디코딩) 처리에만 필요하며, MPEG-2에서는 블록 제어 버퍼(D3DDDIFMT_DEBLOCKINGDATA)를 전혀 사용하지 않습니다.

보호 모드에서 콘텐츠 키를 사용하여 보호된 전송을 위해 암호화된 버퍼는 초기 카운터 값의 포인터를 해당 버퍼 디스크립터(설명자)에 포함합니다(즉, pCipherCounter가 DXVADDI_DECODEBUFFERDESC 구조체의 멤버를 가리키는 변수에 해당). 각 호출은 사용자 모드 표시 드라이버의 DecodeExecute 함수에 대해, DecodeExecute가 디코딩 작업에서 버퍼의 데이터를 사용하기 전에, 이러한 버퍼를 로컬 비디오 메모리로 보호된 전송을 수행해야 합니다. 그러나 잔차(D3DDDIFMT_RESIDUALDIFFERENCEDATA) 및 비트 스트림(D3DDDIFMT_BITSTREAMDATA) 형식 이외의 형식의 DirectX VA 압축 버퍼를 암호화할 계획은 없습니다.