解码视频

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 成员的 CompressedBufferType 成员中指定的所有缓冲区类型都用于D3DDDIARG_DECODEEXECUTE的 hDecode 成员指定的每个解码 GUID。 例如,只有可变长度解码 (VLD) 处理时才需要切片控制 (D3DDDIFMT_SLICECONTROLDATA) 、反量化 (D3DDDIFMT_INVERSEQUANTIZATIONDATA) 和位流 (D3DDDIFMT_BITSTREAMDATA) 缓冲区,MPEG-2 根本不使用去块控制缓冲区 (D3DDDIFMT_DEBLOCKINGDATA) 。

在保护模式下,使用内容密钥为受保护传输加密的缓冲区在其缓冲区描述符 (即DXVADDI_DECODEBUFFERDESC结构的pCipherCounter 成员指向) 的变量中,包含指向初始计数器值的指针。 每次调用用户模式显示驱动程序的 DecodeExecute 函数都必须执行此类缓冲区到本地视频内存的受保护传输,然后 DecodeExecute 在解码操作中使用缓冲区的数据。 但是,不存在加密除残差 (D3DDDIFMT_RESIDUALDIFFERENCEDATA) 和位流 (D3DDDIFMT_BITSTREAMDATA) 类型以外的 DirectX VA 压缩缓冲区的计划。