DXVA2_ConfigPictureDecode
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| guidConfigBitstreamEncryption | GUID | 16 | +0 | +0 | ビットストリームデータバッファーの暗号化プロトコルの種類を定義します。暗号化を適用しない場合、値は DXVA_NoEncrypt です。ConfigBitstreamRaw が 0 の場合、値は DXVA_NoEncrypt でなければなりません。 |
| guidConfigMBcontrolEncryption | GUID | 16 | +16 | +16 | マクロブロック制御データバッファーの暗号化プロトコルの種類を定義します。暗号化を適用しない場合、値は DXVA_NoEncrypt です。ConfigBitstreamRaw が 1 の場合、値は DXVA_NoEncrypt でなければなりません。 |
| guidConfigResidDiffEncryption | GUID | 16 | +32 | +32 | 残差差分デコードデータバッファー(空間領域のデータ、またはアクセラレーターベースの IDCT 用の変換領域係数の集合を含むバッファー)の暗号化プロトコルの種類を定義します。暗号化を適用しない場合、値は DXVA_NoEncrypt です。ConfigBitstreamRaw が 1 の場合、値は DXVA_NoEncrypt でなければなりません。 |
| ConfigBitstreamRaw | DWORD | 4 | +48 | +48 | ホストデコーダーが生のビットストリームデータを送信するかどうかを示します。値が 1 の場合、ピクチャーのデータは生のビットストリームの内容としてビットストリームバッファーで送信されます。値が 0 の場合、ピクチャーデータはマクロブロック制御コマンドバッファーを使用して送信されます。ConfigResidDiffHost または ConfigResidDiffAccelerator のいずれかが 1 の場合、値は 0 でなければなりません。 |
| ConfigMBcontrolRasterOrder | DWORD | 4 | +52 | +52 | マクロブロック制御コマンドがラスタースキャン順であるか、任意の順序であるかを指定します。値が 1 の場合、各マクロブロック制御コマンドバッファー内のマクロブロック制御コマンドはラスタースキャン順です。値が 0 の場合、順序は任意です。ビットストリームの種類によっては、ラスター順を強制すると、処理しなければならないマクロブロック制御バッファーの数が大幅に増加するか、ホスト側で制御情報を並べ替える必要が生じます。そのため、任意の順序をサポートする方が効率的な場合があります。 |
| ConfigResidDiffHost | DWORD | 4 | +56 | +56 | ホスト側の残差差分の構成を格納します。値が 1 の場合、一部の残差差分デコードデータが空間領域のブロックとしてホストから送信されることがあります。値が 0 の場合、空間領域のデータは送信されません。 |
| ConfigSpatialResid8 | DWORD | 4 | +60 | +60 | ホストベースの残差差分デコードを使用する場合に、予測(非イントラ)ピクチャーの残差差分空間領域ブロックを表すために使用されるワードサイズを示します。 ConfigResidDiffHost が 1 で ConfigSpatialResid8 が 1 の場合、ホストは非イントラマクロブロックの残差差分空間領域ブロックを 8 ビット符号付きサンプルで送信し、予測(非イントラ)ピクチャー内のイントラマクロブロックについては ConfigIntraResidUnsigned の値に応じた形式で送信します。
イントラピクチャーの場合、空間領域ブロックは、1 ピクセルあたりのビット数 (BPP) が 8 であれば 8 ビットサンプルを使用し、BPP > 8 であれば 16 ビットサンプルを使用して送信しなければなりません。ConfigIntraResidUnsigned が 0 の場合、これらのサンプルは 2^(BPP–1) という定数の基準値に対する符号付き整数値として送信され、ConfigIntraResidUnsigned が 1 の場合は、0 という定数の基準値に対する符号なし整数値として送信されます。 |
| ConfigResid8Subtraction | DWORD | 4 | +64 | +64 | 値が 1 の場合、8 ビットの差分オーバーフローブロックは加算ではなく減算されます。ConfigSpatialResid8 が 1 でない限り、値は 0 でなければなりません。 差分を加算するのではなく減算できることにより、8 ビットの差分デコードは、ビデオデコーダーの仕様で要求される ±255 の全範囲の値に完全に準拠できます。これは、+255 を 2 つの符号付き 8 ビット数の加算で表現することはできませんが、±255 の範囲の任意の数は 2 つの符号付き 8 ビット数の差として表現できるためです (+255 = +127 マイナス –128)。 |
| ConfigSpatialHost8or9Clipping | DWORD | 4 | +68 | +68 | 値が 1 の場合、イントラマクロブロックの空間領域ブロックはホスト側で 8 ビットの範囲にクリップし、非イントラマクロブロックの空間領域ブロックはホスト側で 9 ビットの範囲にクリップしなければなりません。値が 0 の場合、ホストによるそのようなクリッピングは不要です。 ConfigSpatialResid8 が 0 かつ ConfigResidDiffHost が 1 でない限り、値は 0 でなければなりません。 |
| ConfigSpatialResidInterleaved | DWORD | 4 | +72 | +72 | 値が 1 の場合、空間領域の残差差分データは、YUV 形式の彩度インターリーブパターンに一致する彩度インターリーブ形式で送信しなければなりません。ConfigResidDiffHost が 1 で、かつ YUV 形式が NV12 または NV21 でない限り、値は 0 でなければなりません。 |
| ConfigIntraResidUnsigned | DWORD | 4 | +76 | +76 | ホストベースの差分デコードを使用する場合に、イントラブロックの残差差分データの空間領域ブロックの表現方法を示します。 ConfigResidDiffHost が 1 で ConfigIntraResidUnsigned が 0 の場合、イントラマクロブロックの空間領域残差差分データブロックは次のように送信しなければなりません。
|
| ConfigResidDiffAccelerator | DWORD | 4 | +80 | +80 | 値が 1 の場合、アクセラレーターベースの IDCT のために、変換領域の係数データブロックがホストから送信されることがあります。値が 0 の場合、アクセラレーターベースの IDCT は使用されません。ConfigResidDiffHost と ConfigResidDiffAccelerator の両方が 1 の場合は、マクロブロックレベルの制御コマンドで示されるとおり、残差差分デコードの一部がホストで、一部がアクセラレーターで実行されることを示します。 ConfigBitstreamRaw が 1 の場合、値は 0 でなければなりません。 |
| ConfigHostInverseScan | DWORD | 4 | +84 | +84 | 値が 1 の場合、変換領域ブロック処理の逆スキャンはホストで実行され、変換係数については代わりに絶対インデックスが送信されます。値が 0 の場合、逆スキャンはアクセラレーターで実行されます。 ConfigResidDiffAccelerator が 0 の場合、または Config4GroupedCoefs が 1 の場合、値は 0 でなければなりません。 |
| ConfigSpecificIDCT | DWORD | 4 | +88 | +88 | 値が 1 の場合、ITU-T 勧告 H.263 の Annex W で規定されている IDCT が使用されます。値が 0 の場合、ホスト外の IDCT には準拠した任意の IDCT を使用できます。 この H.263 の附属書は MPEG-2 corrigendum 2 の IDCT 要件に準拠していないため、MPEG-2 ビデオで使用する場合、値を 1 にしてはなりません。 ConfigResidDiffAccelerator が 0 の場合、値は 0 でなければならず、これは完全にホストベースの残差差分デコードであることを示します。 |
| Config4GroupedCoefs | DWORD | 4 | +92 | +92 | 値が 1 の場合、ホスト外の IDCT 用の変換係数は DXVA_TCoef4Group 構造体を使用して送信されます。値が 0 の場合は DXVA_TCoefSingle 構造体が使用されます。ConfigResidDiffAccelerator が 0 の場合、または ConfigHostInverseScan が 1 の場合、値は 0 でなければなりません。 |
| ConfigMinRenderTargetBuffCount | WORD | 2 | +96 | +96 | デコーダーデバイスが一度に処理するフレーム数を指定します。 |
| ConfigDecoderSpecific | WORD | 2 | +98 | +98 | デコーダー固有の構成情報を格納します。 |
公式ドキュメント
DXVA デコーダーデバイスの構成について説明します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// DXVA2_ConfigPictureDecode (x64 100 / x86 100 バイト)
typedef struct DXVA2_ConfigPictureDecode {
GUID guidConfigBitstreamEncryption;
GUID guidConfigMBcontrolEncryption;
GUID guidConfigResidDiffEncryption;
DWORD ConfigBitstreamRaw;
DWORD ConfigMBcontrolRasterOrder;
DWORD ConfigResidDiffHost;
DWORD ConfigSpatialResid8;
DWORD ConfigResid8Subtraction;
DWORD ConfigSpatialHost8or9Clipping;
DWORD ConfigSpatialResidInterleaved;
DWORD ConfigIntraResidUnsigned;
DWORD ConfigResidDiffAccelerator;
DWORD ConfigHostInverseScan;
DWORD ConfigSpecificIDCT;
DWORD Config4GroupedCoefs;
WORD ConfigMinRenderTargetBuffCount;
WORD ConfigDecoderSpecific;
} DXVA2_ConfigPictureDecode;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DXVA2_ConfigPictureDecode
{
public Guid guidConfigBitstreamEncryption;
public Guid guidConfigMBcontrolEncryption;
public Guid guidConfigResidDiffEncryption;
public uint ConfigBitstreamRaw;
public uint ConfigMBcontrolRasterOrder;
public uint ConfigResidDiffHost;
public uint ConfigSpatialResid8;
public uint ConfigResid8Subtraction;
public uint ConfigSpatialHost8or9Clipping;
public uint ConfigSpatialResidInterleaved;
public uint ConfigIntraResidUnsigned;
public uint ConfigResidDiffAccelerator;
public uint ConfigHostInverseScan;
public uint ConfigSpecificIDCT;
public uint Config4GroupedCoefs;
public ushort ConfigMinRenderTargetBuffCount;
public ushort ConfigDecoderSpecific;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DXVA2_ConfigPictureDecode
Public guidConfigBitstreamEncryption As Guid
Public guidConfigMBcontrolEncryption As Guid
Public guidConfigResidDiffEncryption As Guid
Public ConfigBitstreamRaw As UInteger
Public ConfigMBcontrolRasterOrder As UInteger
Public ConfigResidDiffHost As UInteger
Public ConfigSpatialResid8 As UInteger
Public ConfigResid8Subtraction As UInteger
Public ConfigSpatialHost8or9Clipping As UInteger
Public ConfigSpatialResidInterleaved As UInteger
Public ConfigIntraResidUnsigned As UInteger
Public ConfigResidDiffAccelerator As UInteger
Public ConfigHostInverseScan As UInteger
Public ConfigSpecificIDCT As UInteger
Public Config4GroupedCoefs As UInteger
Public ConfigMinRenderTargetBuffCount As UShort
Public ConfigDecoderSpecific As UShort
End Structureimport ctypes
from ctypes import wintypes
class DXVA2_ConfigPictureDecode(ctypes.Structure):
_fields_ = [
("guidConfigBitstreamEncryption", GUID),
("guidConfigMBcontrolEncryption", GUID),
("guidConfigResidDiffEncryption", GUID),
("ConfigBitstreamRaw", wintypes.DWORD),
("ConfigMBcontrolRasterOrder", wintypes.DWORD),
("ConfigResidDiffHost", wintypes.DWORD),
("ConfigSpatialResid8", wintypes.DWORD),
("ConfigResid8Subtraction", wintypes.DWORD),
("ConfigSpatialHost8or9Clipping", wintypes.DWORD),
("ConfigSpatialResidInterleaved", wintypes.DWORD),
("ConfigIntraResidUnsigned", wintypes.DWORD),
("ConfigResidDiffAccelerator", wintypes.DWORD),
("ConfigHostInverseScan", wintypes.DWORD),
("ConfigSpecificIDCT", wintypes.DWORD),
("Config4GroupedCoefs", wintypes.DWORD),
("ConfigMinRenderTargetBuffCount", ctypes.c_ushort),
("ConfigDecoderSpecific", ctypes.c_ushort),
]#[repr(C)]
pub struct DXVA2_ConfigPictureDecode {
pub guidConfigBitstreamEncryption: GUID,
pub guidConfigMBcontrolEncryption: GUID,
pub guidConfigResidDiffEncryption: GUID,
pub ConfigBitstreamRaw: u32,
pub ConfigMBcontrolRasterOrder: u32,
pub ConfigResidDiffHost: u32,
pub ConfigSpatialResid8: u32,
pub ConfigResid8Subtraction: u32,
pub ConfigSpatialHost8or9Clipping: u32,
pub ConfigSpatialResidInterleaved: u32,
pub ConfigIntraResidUnsigned: u32,
pub ConfigResidDiffAccelerator: u32,
pub ConfigHostInverseScan: u32,
pub ConfigSpecificIDCT: u32,
pub Config4GroupedCoefs: u32,
pub ConfigMinRenderTargetBuffCount: u16,
pub ConfigDecoderSpecific: u16,
}import "golang.org/x/sys/windows"
type DXVA2_ConfigPictureDecode struct {
guidConfigBitstreamEncryption windows.GUID
guidConfigMBcontrolEncryption windows.GUID
guidConfigResidDiffEncryption windows.GUID
ConfigBitstreamRaw uint32
ConfigMBcontrolRasterOrder uint32
ConfigResidDiffHost uint32
ConfigSpatialResid8 uint32
ConfigResid8Subtraction uint32
ConfigSpatialHost8or9Clipping uint32
ConfigSpatialResidInterleaved uint32
ConfigIntraResidUnsigned uint32
ConfigResidDiffAccelerator uint32
ConfigHostInverseScan uint32
ConfigSpecificIDCT uint32
Config4GroupedCoefs uint32
ConfigMinRenderTargetBuffCount uint16
ConfigDecoderSpecific uint16
}type
DXVA2_ConfigPictureDecode = record
guidConfigBitstreamEncryption: TGUID;
guidConfigMBcontrolEncryption: TGUID;
guidConfigResidDiffEncryption: TGUID;
ConfigBitstreamRaw: DWORD;
ConfigMBcontrolRasterOrder: DWORD;
ConfigResidDiffHost: DWORD;
ConfigSpatialResid8: DWORD;
ConfigResid8Subtraction: DWORD;
ConfigSpatialHost8or9Clipping: DWORD;
ConfigSpatialResidInterleaved: DWORD;
ConfigIntraResidUnsigned: DWORD;
ConfigResidDiffAccelerator: DWORD;
ConfigHostInverseScan: DWORD;
ConfigSpecificIDCT: DWORD;
Config4GroupedCoefs: DWORD;
ConfigMinRenderTargetBuffCount: Word;
ConfigDecoderSpecific: Word;
end;const DXVA2_ConfigPictureDecode = extern struct {
guidConfigBitstreamEncryption: GUID,
guidConfigMBcontrolEncryption: GUID,
guidConfigResidDiffEncryption: GUID,
ConfigBitstreamRaw: u32,
ConfigMBcontrolRasterOrder: u32,
ConfigResidDiffHost: u32,
ConfigSpatialResid8: u32,
ConfigResid8Subtraction: u32,
ConfigSpatialHost8or9Clipping: u32,
ConfigSpatialResidInterleaved: u32,
ConfigIntraResidUnsigned: u32,
ConfigResidDiffAccelerator: u32,
ConfigHostInverseScan: u32,
ConfigSpecificIDCT: u32,
Config4GroupedCoefs: u32,
ConfigMinRenderTargetBuffCount: u16,
ConfigDecoderSpecific: u16,
};type
DXVA2_ConfigPictureDecode {.bycopy.} = object
guidConfigBitstreamEncryption: GUID
guidConfigMBcontrolEncryption: GUID
guidConfigResidDiffEncryption: GUID
ConfigBitstreamRaw: uint32
ConfigMBcontrolRasterOrder: uint32
ConfigResidDiffHost: uint32
ConfigSpatialResid8: uint32
ConfigResid8Subtraction: uint32
ConfigSpatialHost8or9Clipping: uint32
ConfigSpatialResidInterleaved: uint32
ConfigIntraResidUnsigned: uint32
ConfigResidDiffAccelerator: uint32
ConfigHostInverseScan: uint32
ConfigSpecificIDCT: uint32
Config4GroupedCoefs: uint32
ConfigMinRenderTargetBuffCount: uint16
ConfigDecoderSpecific: uint16struct DXVA2_ConfigPictureDecode
{
GUID guidConfigBitstreamEncryption;
GUID guidConfigMBcontrolEncryption;
GUID guidConfigResidDiffEncryption;
uint ConfigBitstreamRaw;
uint ConfigMBcontrolRasterOrder;
uint ConfigResidDiffHost;
uint ConfigSpatialResid8;
uint ConfigResid8Subtraction;
uint ConfigSpatialHost8or9Clipping;
uint ConfigSpatialResidInterleaved;
uint ConfigIntraResidUnsigned;
uint ConfigResidDiffAccelerator;
uint ConfigHostInverseScan;
uint ConfigSpecificIDCT;
uint Config4GroupedCoefs;
ushort ConfigMinRenderTargetBuffCount;
ushort ConfigDecoderSpecific;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DXVA2_ConfigPictureDecode サイズ: 100 バイト(x64)
dim st, 25 ; 4byte整数×25(構造体サイズ 100 / 4 切り上げ)
; guidConfigBitstreamEncryption : GUID (+0, 16byte) varptr(st)+0 を基点に操作(16byte:入れ子/配列)
; guidConfigMBcontrolEncryption : GUID (+16, 16byte) varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; guidConfigResidDiffEncryption : GUID (+32, 16byte) varptr(st)+32 を基点に操作(16byte:入れ子/配列)
; ConfigBitstreamRaw : DWORD (+48, 4byte) st.12 = 値 / 値 = st.12 (lpoke/lpeek も可)
; ConfigMBcontrolRasterOrder : DWORD (+52, 4byte) st.13 = 値 / 値 = st.13 (lpoke/lpeek も可)
; ConfigResidDiffHost : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; ConfigSpatialResid8 : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ConfigResid8Subtraction : DWORD (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; ConfigSpatialHost8or9Clipping : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; ConfigSpatialResidInterleaved : DWORD (+72, 4byte) st.18 = 値 / 値 = st.18 (lpoke/lpeek も可)
; ConfigIntraResidUnsigned : DWORD (+76, 4byte) st.19 = 値 / 値 = st.19 (lpoke/lpeek も可)
; ConfigResidDiffAccelerator : DWORD (+80, 4byte) st.20 = 値 / 値 = st.20 (lpoke/lpeek も可)
; ConfigHostInverseScan : DWORD (+84, 4byte) st.21 = 値 / 値 = st.21 (lpoke/lpeek も可)
; ConfigSpecificIDCT : DWORD (+88, 4byte) st.22 = 値 / 値 = st.22 (lpoke/lpeek も可)
; Config4GroupedCoefs : DWORD (+92, 4byte) st.23 = 値 / 値 = st.23 (lpoke/lpeek も可)
; ConfigMinRenderTargetBuffCount : WORD (+96, 2byte) wpoke st,96,値 / 値 = wpeek(st,96)
; ConfigDecoderSpecific : WORD (+98, 2byte) wpoke st,98,値 / 値 = wpeek(st,98)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
#field int Data1
#field short Data2
#field short Data3
#field byte Data4 8
#endstruct
#defstruct global DXVA2_ConfigPictureDecode
#field GUID guidConfigBitstreamEncryption
#field GUID guidConfigMBcontrolEncryption
#field GUID guidConfigResidDiffEncryption
#field int ConfigBitstreamRaw
#field int ConfigMBcontrolRasterOrder
#field int ConfigResidDiffHost
#field int ConfigSpatialResid8
#field int ConfigResid8Subtraction
#field int ConfigSpatialHost8or9Clipping
#field int ConfigSpatialResidInterleaved
#field int ConfigIntraResidUnsigned
#field int ConfigResidDiffAccelerator
#field int ConfigHostInverseScan
#field int ConfigSpecificIDCT
#field int Config4GroupedCoefs
#field short ConfigMinRenderTargetBuffCount
#field short ConfigDecoderSpecific
#endstruct
stdim st, DXVA2_ConfigPictureDecode ; NSTRUCT 変数を確保
st->ConfigBitstreamRaw = 100
mes "ConfigBitstreamRaw=" + st->ConfigBitstreamRaw