비디오 디코딩
Microsoft Direct3D 런타임은 사용자 모드 표시 드라이버의 DecodeBeginFrame 및 DecodeEndFrame 함수를 호출하여 사용자 모드 표시 드라이버가 비디오를 디코딩할 수 있는 이러한 함수 호출 간의 기간을 나타냅니다. 사용자 모드 표시 드라이버가 비디오 디코딩 작업을 수행하려면 먼저 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_DECODEEXECUTEhDecode 멤버가 지정하는 각 디코딩 GUID에 사용되지는 않습니다. 예를 들어 조각 제어(D3DDDIFMT_SLICECONTROLDATA), 역수량화(D3DDDIFMT_INVERSEQUANTIZATIONDATA) 및 비트 스트림(D3DDDIFMT_BITSTREAMDATA) 버퍼는 VLD(가변 길이 디코딩) 처리에만 필요하며 MPEG-2에서는 deblocking-control 버퍼(D3DDDIFMT_DEBLOCKINGDATA)를 전혀 사용하지 않습니다.
보호 모드에서 콘텐츠 키를 사용하여 보호된 전송을 위해 암호화된 버퍼에는 버퍼 설명자의 초기 카운터 값에 대한 포인터(즉, DXVADDI_DECODEBUFFERDESC 구조체의 pCipherCounter 멤버가 가리키는 변수)가 포함됩니다. DecodeExecute가 디코딩 작업에서 버퍼의 데이터를 사용하기 전에 사용자 모드 표시 드라이버의 DecodeExecute 함수에 대한 각 호출은 이러한 버퍼를 로컬 비디오 메모리로 보호된 전송을 수행해야 합니다. 그러나 잔차(D3DDDIFMT_RESIDUALDIFFERENCEDATA) 및 비트 스트림(D3DDDIFMT_BITSTREAMDATA) 형식 이외의 형식의 DirectX VA 압축 버퍼를 암호화할 계획이 없습니다.