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

KSSTREAM_HEADER

構造体
サイズx64: 56 バイト / x86: 48 バイト

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

フィールド

フィールドサイズx64x86説明
SizeDWORD4+0+0本ヘッダ構造体のバイトサイズ。後続データを含む総サイズを示す。
TypeSpecificFlagsDWORD4+4+4データ型固有のフラグ。ストリーム種別ごとの属性を示す。
PresentationTimeKSTIME16+8+8提示時刻(KSTIME)。サンプルの表示タイミングを示す。
DurationLONGLONG8+24+24サンプルの継続時間を100ナノ秒単位で示す。LONGLONG型。
FrameExtentDWORD4+32+32バッファ全体のバイト容量。確保された領域サイズを示す。
DataUsedDWORD4+36+36実際に使用されたデータのバイト数を示す。
Datavoid*8/4+40+40ストリームデータバッファへのポインタ。実データ領域を指す。
OptionsFlagsDWORD4+48+44ストリームオプションフラグ。タイムスタンプ有効等を示す。

各言語での定義

#include <windows.h>

// KSTIME  (x64 16 / x86 16 バイト)
typedef struct KSTIME {
    LONGLONG Time;
    DWORD Numerator;
    DWORD Denominator;
} KSTIME;

// KSSTREAM_HEADER  (x64 56 / x86 48 バイト)
typedef struct KSSTREAM_HEADER {
    DWORD Size;
    DWORD TypeSpecificFlags;
    KSTIME PresentationTime;
    LONGLONG Duration;
    DWORD FrameExtent;
    DWORD DataUsed;
    void* Data;
    DWORD OptionsFlags;
} KSSTREAM_HEADER;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KSTIME
{
    public long Time;
    public uint Numerator;
    public uint Denominator;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct KSSTREAM_HEADER
{
    public uint Size;
    public uint TypeSpecificFlags;
    public KSTIME PresentationTime;
    public long Duration;
    public uint FrameExtent;
    public uint DataUsed;
    public IntPtr Data;
    public uint OptionsFlags;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KSTIME
    Public Time As Long
    Public Numerator As UInteger
    Public Denominator As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure KSSTREAM_HEADER
    Public Size As UInteger
    Public TypeSpecificFlags As UInteger
    Public PresentationTime As KSTIME
    Public Duration As Long
    Public FrameExtent As UInteger
    Public DataUsed As UInteger
    Public Data As IntPtr
    Public OptionsFlags As UInteger
End Structure
import ctypes
from ctypes import wintypes

class KSTIME(ctypes.Structure):
    _fields_ = [
        ("Time", ctypes.c_longlong),
        ("Numerator", wintypes.DWORD),
        ("Denominator", wintypes.DWORD),
    ]

class KSSTREAM_HEADER(ctypes.Structure):
    _fields_ = [
        ("Size", wintypes.DWORD),
        ("TypeSpecificFlags", wintypes.DWORD),
        ("PresentationTime", KSTIME),
        ("Duration", ctypes.c_longlong),
        ("FrameExtent", wintypes.DWORD),
        ("DataUsed", wintypes.DWORD),
        ("Data", ctypes.c_void_p),
        ("OptionsFlags", wintypes.DWORD),
    ]
#[repr(C)]
pub struct KSTIME {
    pub Time: i64,
    pub Numerator: u32,
    pub Denominator: u32,
}

#[repr(C)]
pub struct KSSTREAM_HEADER {
    pub Size: u32,
    pub TypeSpecificFlags: u32,
    pub PresentationTime: KSTIME,
    pub Duration: i64,
    pub FrameExtent: u32,
    pub DataUsed: u32,
    pub Data: *mut core::ffi::c_void,
    pub OptionsFlags: u32,
}
import "golang.org/x/sys/windows"

type KSTIME struct {
	Time int64
	Numerator uint32
	Denominator uint32
}

type KSSTREAM_HEADER struct {
	Size uint32
	TypeSpecificFlags uint32
	PresentationTime KSTIME
	Duration int64
	FrameExtent uint32
	DataUsed uint32
	Data uintptr
	OptionsFlags uint32
}
type
  KSTIME = record
    Time: Int64;
    Numerator: DWORD;
    Denominator: DWORD;
  end;

  KSSTREAM_HEADER = record
    Size: DWORD;
    TypeSpecificFlags: DWORD;
    PresentationTime: KSTIME;
    Duration: Int64;
    FrameExtent: DWORD;
    DataUsed: DWORD;
    Data: Pointer;
    OptionsFlags: DWORD;
  end;
const KSTIME = extern struct {
    Time: i64,
    Numerator: u32,
    Denominator: u32,
};

const KSSTREAM_HEADER = extern struct {
    Size: u32,
    TypeSpecificFlags: u32,
    PresentationTime: KSTIME,
    Duration: i64,
    FrameExtent: u32,
    DataUsed: u32,
    Data: ?*anyopaque,
    OptionsFlags: u32,
};
type
  KSTIME {.bycopy.} = object
    Time: int64
    Numerator: uint32
    Denominator: uint32

  KSSTREAM_HEADER {.bycopy.} = object
    Size: uint32
    TypeSpecificFlags: uint32
    PresentationTime: KSTIME
    Duration: int64
    FrameExtent: uint32
    DataUsed: uint32
    Data: pointer
    OptionsFlags: uint32
struct KSTIME
{
    long Time;
    uint Numerator;
    uint Denominator;
}

struct KSSTREAM_HEADER
{
    uint Size;
    uint TypeSpecificFlags;
    KSTIME PresentationTime;
    long Duration;
    uint FrameExtent;
    uint DataUsed;
    void* Data;
    uint OptionsFlags;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; KSSTREAM_HEADER サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Size : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; TypeSpecificFlags : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; PresentationTime : KSTIME (+8, 16byte)  varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; Duration : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; FrameExtent : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; DataUsed : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Data : void* (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; OptionsFlags : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; KSSTREAM_HEADER サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Size : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; TypeSpecificFlags : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; PresentationTime : KSTIME (+8, 16byte)  varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; Duration : LONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; FrameExtent : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; DataUsed : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Data : void* (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; OptionsFlags : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global KSTIME
    #field int64 Time
    #field int Numerator
    #field int Denominator
#endstruct

#defstruct global KSSTREAM_HEADER
    #field int Size
    #field int TypeSpecificFlags
    #field KSTIME PresentationTime
    #field int64 Duration
    #field int FrameExtent
    #field int DataUsed
    #field intptr Data
    #field int OptionsFlags
#endstruct

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