ホーム › Media.KernelStreaming › KSSTREAM_HEADER
KSSTREAM_HEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Size | DWORD | 4 | +0 | +0 | 本ヘッダ構造体のバイトサイズ。後続データを含む総サイズを示す。 |
| TypeSpecificFlags | DWORD | 4 | +4 | +4 | データ型固有のフラグ。ストリーム種別ごとの属性を示す。 |
| PresentationTime | KSTIME | 16 | +8 | +8 | 提示時刻(KSTIME)。サンプルの表示タイミングを示す。 |
| Duration | LONGLONG | 8 | +24 | +24 | サンプルの継続時間を100ナノ秒単位で示す。LONGLONG型。 |
| FrameExtent | DWORD | 4 | +32 | +32 | バッファ全体のバイト容量。確保された領域サイズを示す。 |
| DataUsed | DWORD | 4 | +36 | +36 | 実際に使用されたデータのバイト数を示す。 |
| Data | void* | 8/4 | +40 | +40 | ストリームデータバッファへのポインタ。実データ領域を指す。 |
| OptionsFlags | DWORD | 4 | +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 Structureimport 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: uint32struct 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