Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS

D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS

構造体
サイズx64: 232 バイト / x86: 176 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
NumFrameArgumentsDWORD4+0+0FrameArguments配列に含まれるフレーム引数の数。
FrameArgumentsD3D12_VIDEO_DECODE_FRAME_ARGUMENT160/120+8+4コーデック固有のフレーム引数を示すD3D12_VIDEO_DECODE_FRAME_ARGUMENT配列の先頭。
ReferenceFramesD3D12_VIDEO_DECODE_REFERENCE_FRAMES32/16+168+124デコードに用いる参照フレーム群を示すD3D12_VIDEO_DECODE_REFERENCE_FRAMES。
CompressedBitstreamD3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM24+200+144デコード対象の圧縮ビットストリームを示すD3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM。
pHeapID3D12VideoDecoderHeap*8/4+224+168デコードに使用するデコーダヒープ(ID3D12VideoDecoderHeap)へのポインタ。

各言語での定義

#include <windows.h>

// D3D12_VIDEO_DECODE_FRAME_ARGUMENT  (x64 16 / x86 12 バイト)
typedef struct D3D12_VIDEO_DECODE_FRAME_ARGUMENT {
    D3D12_VIDEO_DECODE_ARGUMENT_TYPE Type;
    DWORD Size;
    void* pData;
} D3D12_VIDEO_DECODE_FRAME_ARGUMENT;

// D3D12_VIDEO_DECODE_REFERENCE_FRAMES  (x64 32 / x86 16 バイト)
typedef struct D3D12_VIDEO_DECODE_REFERENCE_FRAMES {
    DWORD NumTexture2Ds;
    ID3D12Resource** ppTexture2Ds;
    DWORD* pSubresources;
    ID3D12VideoDecoderHeap** ppHeaps;
} D3D12_VIDEO_DECODE_REFERENCE_FRAMES;

// D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM  (x64 24 / x86 24 バイト)
typedef struct D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM {
    ID3D12Resource* pBuffer;
    ULONGLONG Offset;
    ULONGLONG Size;
} D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM;

// D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS  (x64 232 / x86 176 バイト)
typedef struct D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS {
    DWORD NumFrameArguments;
    D3D12_VIDEO_DECODE_FRAME_ARGUMENT FrameArguments[10];
    D3D12_VIDEO_DECODE_REFERENCE_FRAMES ReferenceFrames;
    D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM CompressedBitstream;
    ID3D12VideoDecoderHeap* pHeap;
} D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3D12_VIDEO_DECODE_FRAME_ARGUMENT
{
    public int Type;
    public uint Size;
    public IntPtr pData;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3D12_VIDEO_DECODE_REFERENCE_FRAMES
{
    public uint NumTexture2Ds;
    public IntPtr ppTexture2Ds;
    public IntPtr pSubresources;
    public IntPtr ppHeaps;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
{
    public IntPtr pBuffer;
    public ulong Offset;
    public ulong Size;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS
{
    public uint NumFrameArguments;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] public D3D12_VIDEO_DECODE_FRAME_ARGUMENT[] FrameArguments;
    public D3D12_VIDEO_DECODE_REFERENCE_FRAMES ReferenceFrames;
    public D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM CompressedBitstream;
    public IntPtr pHeap;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3D12_VIDEO_DECODE_FRAME_ARGUMENT
    Public Type As Integer
    Public Size As UInteger
    Public pData As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3D12_VIDEO_DECODE_REFERENCE_FRAMES
    Public NumTexture2Ds As UInteger
    Public ppTexture2Ds As IntPtr
    Public pSubresources As IntPtr
    Public ppHeaps As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
    Public pBuffer As IntPtr
    Public Offset As ULong
    Public Size As ULong
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS
    Public NumFrameArguments As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=10)> Public FrameArguments() As D3D12_VIDEO_DECODE_FRAME_ARGUMENT
    Public ReferenceFrames As D3D12_VIDEO_DECODE_REFERENCE_FRAMES
    Public CompressedBitstream As D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
    Public pHeap As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class D3D12_VIDEO_DECODE_FRAME_ARGUMENT(ctypes.Structure):
    _fields_ = [
        ("Type", ctypes.c_int),
        ("Size", wintypes.DWORD),
        ("pData", ctypes.c_void_p),
    ]

class D3D12_VIDEO_DECODE_REFERENCE_FRAMES(ctypes.Structure):
    _fields_ = [
        ("NumTexture2Ds", wintypes.DWORD),
        ("ppTexture2Ds", ctypes.c_void_p),
        ("pSubresources", ctypes.c_void_p),
        ("ppHeaps", ctypes.c_void_p),
    ]

class D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM(ctypes.Structure):
    _fields_ = [
        ("pBuffer", ctypes.c_void_p),
        ("Offset", ctypes.c_ulonglong),
        ("Size", ctypes.c_ulonglong),
    ]

class D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS(ctypes.Structure):
    _fields_ = [
        ("NumFrameArguments", wintypes.DWORD),
        ("FrameArguments", D3D12_VIDEO_DECODE_FRAME_ARGUMENT * 10),
        ("ReferenceFrames", D3D12_VIDEO_DECODE_REFERENCE_FRAMES),
        ("CompressedBitstream", D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM),
        ("pHeap", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct D3D12_VIDEO_DECODE_FRAME_ARGUMENT {
    pub Type: i32,
    pub Size: u32,
    pub pData: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct D3D12_VIDEO_DECODE_REFERENCE_FRAMES {
    pub NumTexture2Ds: u32,
    pub ppTexture2Ds: *mut core::ffi::c_void,
    pub pSubresources: *mut core::ffi::c_void,
    pub ppHeaps: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM {
    pub pBuffer: *mut core::ffi::c_void,
    pub Offset: u64,
    pub Size: u64,
}

#[repr(C)]
pub struct D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS {
    pub NumFrameArguments: u32,
    pub FrameArguments: [D3D12_VIDEO_DECODE_FRAME_ARGUMENT; 10],
    pub ReferenceFrames: D3D12_VIDEO_DECODE_REFERENCE_FRAMES,
    pub CompressedBitstream: D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM,
    pub pHeap: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type D3D12_VIDEO_DECODE_FRAME_ARGUMENT struct {
	Type int32
	Size uint32
	pData uintptr
}

type D3D12_VIDEO_DECODE_REFERENCE_FRAMES struct {
	NumTexture2Ds uint32
	ppTexture2Ds uintptr
	pSubresources uintptr
	ppHeaps uintptr
}

type D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM struct {
	pBuffer uintptr
	Offset uint64
	Size uint64
}

type D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS struct {
	NumFrameArguments uint32
	FrameArguments [10]D3D12_VIDEO_DECODE_FRAME_ARGUMENT
	ReferenceFrames D3D12_VIDEO_DECODE_REFERENCE_FRAMES
	CompressedBitstream D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
	pHeap uintptr
}
type
  D3D12_VIDEO_DECODE_FRAME_ARGUMENT = record
    Type: Integer;
    Size: DWORD;
    pData: Pointer;
  end;

  D3D12_VIDEO_DECODE_REFERENCE_FRAMES = record
    NumTexture2Ds: DWORD;
    ppTexture2Ds: Pointer;
    pSubresources: Pointer;
    ppHeaps: Pointer;
  end;

  D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM = record
    pBuffer: Pointer;
    Offset: UInt64;
    Size: UInt64;
  end;

  D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS = record
    NumFrameArguments: DWORD;
    FrameArguments: array[0..9] of D3D12_VIDEO_DECODE_FRAME_ARGUMENT;
    ReferenceFrames: D3D12_VIDEO_DECODE_REFERENCE_FRAMES;
    CompressedBitstream: D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM;
    pHeap: Pointer;
  end;
const D3D12_VIDEO_DECODE_FRAME_ARGUMENT = extern struct {
    Type: i32,
    Size: u32,
    pData: ?*anyopaque,
};

const D3D12_VIDEO_DECODE_REFERENCE_FRAMES = extern struct {
    NumTexture2Ds: u32,
    ppTexture2Ds: ?*anyopaque,
    pSubresources: ?*anyopaque,
    ppHeaps: ?*anyopaque,
};

const D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM = extern struct {
    pBuffer: ?*anyopaque,
    Offset: u64,
    Size: u64,
};

const D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS = extern struct {
    NumFrameArguments: u32,
    FrameArguments: [10]D3D12_VIDEO_DECODE_FRAME_ARGUMENT,
    ReferenceFrames: D3D12_VIDEO_DECODE_REFERENCE_FRAMES,
    CompressedBitstream: D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM,
    pHeap: ?*anyopaque,
};
type
  D3D12_VIDEO_DECODE_FRAME_ARGUMENT {.bycopy.} = object
    Type: int32
    Size: uint32
    pData: pointer

  D3D12_VIDEO_DECODE_REFERENCE_FRAMES {.bycopy.} = object
    NumTexture2Ds: uint32
    ppTexture2Ds: pointer
    pSubresources: pointer
    ppHeaps: pointer

  D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM {.bycopy.} = object
    pBuffer: pointer
    Offset: uint64
    Size: uint64

  D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS {.bycopy.} = object
    NumFrameArguments: uint32
    FrameArguments: array[10, D3D12_VIDEO_DECODE_FRAME_ARGUMENT]
    ReferenceFrames: D3D12_VIDEO_DECODE_REFERENCE_FRAMES
    CompressedBitstream: D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
    pHeap: pointer
struct D3D12_VIDEO_DECODE_FRAME_ARGUMENT
{
    int Type;
    uint Size;
    void* pData;
}

struct D3D12_VIDEO_DECODE_REFERENCE_FRAMES
{
    uint NumTexture2Ds;
    void* ppTexture2Ds;
    void* pSubresources;
    void* ppHeaps;
}

struct D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
{
    void* pBuffer;
    ulong Offset;
    ulong Size;
}

struct D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS
{
    uint NumFrameArguments;
    D3D12_VIDEO_DECODE_FRAME_ARGUMENT[10] FrameArguments;
    D3D12_VIDEO_DECODE_REFERENCE_FRAMES ReferenceFrames;
    D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM CompressedBitstream;
    void* pHeap;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS サイズ: 176 バイト(x86)
dim st, 44    ; 4byte整数×44(構造体サイズ 176 / 4 切り上げ)
; NumFrameArguments : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; FrameArguments : D3D12_VIDEO_DECODE_FRAME_ARGUMENT (+4, 120byte)  varptr(st)+4 を基点に操作(120byte:入れ子/配列)
; ReferenceFrames : D3D12_VIDEO_DECODE_REFERENCE_FRAMES (+124, 16byte)  varptr(st)+124 を基点に操作(16byte:入れ子/配列)
; CompressedBitstream : D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM (+144, 24byte)  varptr(st)+144 を基点に操作(24byte:入れ子/配列)
; pHeap : ID3D12VideoDecoderHeap* (+168, 4byte)  st.42 = 値  /  値 = st.42   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS サイズ: 232 バイト(x64)
dim st, 58    ; 4byte整数×58(構造体サイズ 232 / 4 切り上げ)
; NumFrameArguments : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; FrameArguments : D3D12_VIDEO_DECODE_FRAME_ARGUMENT (+8, 160byte)  varptr(st)+8 を基点に操作(160byte:入れ子/配列)
; ReferenceFrames : D3D12_VIDEO_DECODE_REFERENCE_FRAMES (+168, 32byte)  varptr(st)+168 を基点に操作(32byte:入れ子/配列)
; CompressedBitstream : D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM (+200, 24byte)  varptr(st)+200 を基点に操作(24byte:入れ子/配列)
; pHeap : ID3D12VideoDecoderHeap* (+224, 8byte)  qpoke st,224,値 / qpeek(st,224)  ※IronHSPのみ。3.7/3.8は lpoke st,224,下位 : lpoke st,228,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global D3D12_VIDEO_DECODE_FRAME_ARGUMENT
    #field int Type
    #field int Size
    #field intptr pData
#endstruct

#defstruct global D3D12_VIDEO_DECODE_REFERENCE_FRAMES
    #field int NumTexture2Ds
    #field intptr ppTexture2Ds
    #field intptr pSubresources
    #field intptr ppHeaps
#endstruct

#defstruct global D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM
    #field intptr pBuffer
    #field int64 Offset
    #field int64 Size
#endstruct

#defstruct global D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS
    #field int NumFrameArguments
    #field D3D12_VIDEO_DECODE_FRAME_ARGUMENT FrameArguments 10
    #field D3D12_VIDEO_DECODE_REFERENCE_FRAMES ReferenceFrames
    #field D3D12_VIDEO_DECODE_COMPRESSED_BITSTREAM CompressedBitstream
    #field intptr pHeap
#endstruct

stdim st, D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTS        ; NSTRUCT 変数を確保
st->NumFrameArguments = 100
mes "NumFrameArguments=" + st->NumFrameArguments