aviutl2_sys/
filter2.rs

1#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
2
3use std::{ffi::c_void, mem::MaybeUninit};
4
5use crate::{common::LPCWSTR, plugin2::EDIT_SECTION};
6
7#[repr(C)]
8pub union FILTER_ITEM {
9    pub track: FILTER_ITEM_TRACK,
10    pub checkbox: FILTER_ITEM_CHECKBOX,
11    pub color: FILTER_ITEM_COLOR,
12    pub select: FILTER_ITEM_SELECT,
13    pub file: FILTER_ITEM_FILE,
14    pub data: FILTER_ITEM_DATA,
15    pub group: FILTER_ITEM_GROUP,
16    pub button: FILTER_ITEM_BUTTON,
17    pub string: FILTER_ITEM_STRING,
18    pub text: FILTER_ITEM_TEXT,
19    pub folder: FILTER_ITEM_FOLDER,
20}
21
22/// トラックバー項目構造体
23#[repr(C)]
24#[derive(Clone, Copy)]
25pub struct FILTER_ITEM_TRACK {
26    /// 設定の種別(L"track")
27    pub r#type: LPCWSTR,
28    /// 設定名
29    pub name: LPCWSTR,
30    /// 設定値(フィルタ処理の呼び出し時に現在の値に更新されます)
31    pub value: f64,
32    /// 設定値の最小
33    pub s: f64,
34    /// 設定値の最大
35    pub e: f64,
36    /// 設定値の単位(1.0 / 0.1 / 0.01 / 0.001)
37    pub step: f64,
38}
39
40/// チェックボックス項目構造体
41#[repr(C)]
42#[derive(Clone, Copy)]
43pub struct FILTER_ITEM_CHECKBOX {
44    /// 設定の種別(L"check")
45    pub r#type: LPCWSTR,
46    /// 設定名
47    pub name: LPCWSTR,
48    /// 設定値(フィルタ処理の呼び出し時に現在の値に更新されます)
49    pub value: bool,
50}
51
52/// 色選択項目構造体
53#[repr(C)]
54#[derive(Clone, Copy)]
55pub struct FILTER_ITEM_COLOR {
56    /// 設定の種別(L"color")
57    pub r#type: LPCWSTR,
58    /// 設定名
59    pub name: LPCWSTR,
60    /// 設定値(フィルタ処理の呼び出し時に現在の値に更新されます)
61    pub value: FILTER_ITEM_COLOR_VALUE,
62}
63
64/// 色選択項目の設定値の色
65#[repr(C)]
66#[derive(Clone, Copy)]
67pub union FILTER_ITEM_COLOR_VALUE {
68    pub code: u32,
69    pub bgrx: [u8; 4],
70}
71
72/// 選択リスト項目構造体
73#[repr(C)]
74#[derive(Clone, Copy)]
75pub struct FILTER_ITEM_SELECT {
76    /// 設定の種別(L"select")
77    pub r#type: LPCWSTR,
78    /// 設定名
79    pub name: LPCWSTR,
80    /// 設定値(フィルタ処理の呼び出し時に現在の値に更新されます)
81    pub value: i32,
82    /// 選択肢リスト (FILTER_ITEM_SELECT_ITEMを列挙して名前がnullのFILTER_ITEM_SELECT_ITEMで終端したリストへのポインタ)
83    pub items: *const FILTER_ITEM_SELECT_ITEM,
84}
85
86/// 選択リスト項目構造体の選択肢項目
87#[repr(C)]
88#[derive(Clone, Copy)]
89pub struct FILTER_ITEM_SELECT_ITEM {
90    /// 選択肢の名前
91    pub name: LPCWSTR,
92    /// 選択肢の値
93    pub value: i32,
94}
95
96/// ファイル選択項目構造体
97#[repr(C)]
98#[derive(Clone, Copy)]
99pub struct FILTER_ITEM_FILE {
100    /// 設定の種別(L"file")
101    pub r#type: LPCWSTR,
102    /// 設定名
103    pub name: LPCWSTR,
104    /// 設定値(フィルタ処理の呼び出し時に現在の値に更新されます)
105    pub value: LPCWSTR,
106    /// ファイルフィルタ
107    pub filefilter: LPCWSTR,
108}
109
110/// 汎用データ項目構造体
111/// `default_value` は最大1024バイトまでの任意のデータを格納できます。
112#[repr(C)]
113#[derive(Clone, Copy)]
114pub struct FILTER_ITEM_DATA {
115    /// 設定の種別(L"data")
116    pub r#type: LPCWSTR,
117    /// 設定名
118    pub name: LPCWSTR,
119    /// 設定値(フィルタ処理の呼び出し時に現在の値のポインタに更新されます)
120    pub value: *mut c_void,
121    /// 汎用データのサイズ(1024バイト以下)
122    pub size: i32,
123    /// デフォルト値(sizeで指定した長さまで有効)
124    pub default_value: [MaybeUninit<u8>; 1024],
125}
126
127/// 設定グループ項目構造体
128/// 自身以降の設定項目をグループ化することが出来ます
129/// ※設定名を空にするとグループの終端を定義することが出来ます
130#[repr(C)]
131#[derive(Clone, Copy)]
132pub struct FILTER_ITEM_GROUP {
133    /// 設定の種別(L"group")
134    pub r#type: LPCWSTR,
135    /// 設定名
136    pub name: LPCWSTR,
137    /// デフォルトの表示状態
138    pub default_visible: bool,
139}
140
141/// ボタン項目構造体
142/// ボタンを押すとコールバック関数が呼ばれます
143/// ※plugin2.hの編集のコールバック関数と同様な形になります
144#[repr(C)]
145#[derive(Clone, Copy)]
146pub struct FILTER_ITEM_BUTTON {
147    /// 設定の種別(L"button")
148    pub r#type: LPCWSTR,
149    /// 設定名
150    pub name: LPCWSTR,
151    /// コールバック関数
152    pub callback: extern "C" fn(edit_section: *mut EDIT_SECTION),
153}
154
155/// 文字列項目構造体
156/// ※1行の文字列
157#[repr(C)]
158#[derive(Clone, Copy)]
159pub struct FILTER_ITEM_STRING {
160    /// 設定の種別(L"string")
161    pub r#type: LPCWSTR,
162    /// 設定名
163    pub name: LPCWSTR,
164    /// 設定値(フィルタ処理の呼び出し時に現在の値のポインタに更新されます)
165    pub value: LPCWSTR,
166}
167
168/// テキスト項目構造体
169/// ※複数行の文字列
170#[repr(C)]
171#[derive(Clone, Copy)]
172pub struct FILTER_ITEM_TEXT {
173    /// 設定の種別(L"text")
174    pub r#type: LPCWSTR,
175    /// 設定名
176    pub name: LPCWSTR,
177    /// 設定値(フィルタ処理の呼び出し時に現在の値のポインタに更新されます)
178    pub value: LPCWSTR,
179}
180
181/// フォルダ選択項目構造体
182#[repr(C)]
183#[derive(Clone, Copy)]
184pub struct FILTER_ITEM_FOLDER {
185    /// 設定の種別(L"folder")
186    pub r#type: LPCWSTR,
187    /// 設定名
188    pub name: LPCWSTR,
189    /// 設定値(フィルタ処理の呼び出し時に現在の値のポインタに更新されます)
190    pub value: LPCWSTR,
191}
192
193/// RGBA32bit構造体
194#[repr(C)]
195pub struct PIXEL_RGBA {
196    pub r: u8,
197    pub g: u8,
198    pub b: u8,
199    pub a: u8,
200}
201
202/// シーン情報構造体
203#[repr(C)]
204pub struct SCENE_INFO {
205    /// シーンの解像度(幅)
206    pub width: i32,
207    /// シーンの解像度(高さ)
208    pub height: i32,
209    /// シーンのフレームレート
210    pub rate: i32,
211    /// シーンのフレームレート(スケール)
212    pub scale: i32,
213    /// シーンのサンプリングレート
214    pub sample_rate: i32,
215}
216
217/// オブジェクト情報構造体
218#[repr(C)]
219pub struct OBJECT_INFO {
220    /// オブジェクトのID (アプリ起動毎の固有ID)
221    pub id: i64,
222    /// オブジェクトの現在のフレーム番号
223    pub frame: i32,
224    /// オブジェクトの総フレーム数
225    pub frame_total: i32,
226    /// オブジェクトの現在の時間(秒)
227    pub time: f64,
228    /// オブジェクトの総時間(秒)
229    pub time_total: f64,
230    /// オブジェクトの現在の画像サイズの幅 (画像フィルタのみ)
231    pub width: i32,
232    /// オブジェクトの現在の画像サイズの高さ (画像フィルタのみ)
233    pub height: i32,
234    /// オブジェクトの現在の音声サンプル位置 (音声フィルタのみ)
235    pub sample_index: i64,
236    /// オブジェクトの総サンプル数 (音声フィルタのみ)
237    pub sample_total: i64,
238    /// オブジェクトの現在の音声サンプル数 (音声フィルタのみ)
239    pub sample_num: i32,
240    /// オブジェクトの現在の音声チャンネル数 (音声フィルタのみ) ※通常2になります
241    pub channel_num: i32,
242    /// オブジェクトの内の対象エフェクトのID (アプリ起動毎の固有ID)
243    /// ※処理対象のフィルタ効果、オブジェクト入出力の固有ID
244    pub effect_id: i64,
245}
246
247/// 画像フィルタ処理用構造体
248#[repr(C)]
249pub struct FILTER_PROC_VIDEO {
250    /// シーン情報
251    pub scene: *const SCENE_INFO,
252
253    /// オブジェクト情報
254    pub object: *const OBJECT_INFO,
255
256    /// 現在の画像のデータを取得する(VRAMからデータを取得します)
257    /// buffer: 画像データの格納先へのポインタ
258    pub get_image_data: unsafe extern "C" fn(buffer: *mut PIXEL_RGBA),
259
260    /// 現在の画像のデータを設定します(VRAMへデータを書き込みます)
261    /// buffer: 画像データへのポインタ
262    /// width,height: 画像サイズ
263    pub set_image_data: unsafe extern "C" fn(buffer: *const PIXEL_RGBA, width: i32, height: i32),
264
265    // 現在のオブジェクトの画像データのポインタを取得する (ID3D11Texture2Dのポインタを取得します)
266    // 戻り値		: オブジェクトの画像データへのポインタ
267    //				  ※現在の画像が変更(set_image_data)されるかフィルタ処理の終了まで有効
268    pub get_image_texture2d: unsafe extern "C" fn() -> *mut c_void,
269
270    // 現在のフレームバッファの画像データのポインタを取得する (ID3D11Texture2Dのポインタを取得します)
271    // 戻り値		: フレームバッファの画像データへのポインタ
272    //				  ※フィルタ処理の終了まで有効
273    pub get_framebuffer_texture2d: unsafe extern "C" fn() -> *mut c_void,
274}
275
276/// 音声フィルタ処理用構造体
277#[repr(C)]
278pub struct FILTER_PROC_AUDIO {
279    /// シーン情報
280    pub scene: *const SCENE_INFO,
281
282    /// オブジェクト情報
283    pub object: *const OBJECT_INFO,
284
285    /// 現在の音声のデータを取得する
286    /// buffer: 音声データの格納先へのポインタ ※音声データはPCM(float)32bit
287    /// channel: 音声データのチャンネル ( 0 = 左チャンネル / 1 = 右チャンネル )
288    pub get_sample_data: unsafe extern "C" fn(buffer: *mut f32, channel: i32),
289
290    /// 現在の音声のデータを設定する
291    /// buffer: 音声データへのポインタ ※音声データはPCM(float)32bit
292    /// channel: 音声データのチャンネル ( 0 = 左チャンネル / 1 = 右チャンネル )
293    pub set_sample_data: unsafe extern "C" fn(buffer: *const f32, channel: i32),
294}
295
296impl FILTER_PLUGIN_TABLE {
297    /// 画像フィルタをサポートする
298    pub const FLAG_VIDEO: i32 = 1;
299    /// 音声フィルタをサポートする
300    pub const FLAG_AUDIO: i32 = 2;
301    /// メディアオブジェクトの初期入力をする (メディアオブジェクトにする場合)
302    pub const FLAG_INPUT: i32 = 4;
303    /// フィルタオブジェクトをサポートする (フィルタオブジェクトに対応する場合)
304    /// フィルタオブジェクトの場合は画像サイズの変更が出来ません
305    pub const FLAG_FILTER: i32 = 8;
306}
307
308/// フィルタプラグイン構造体
309#[repr(C)]
310pub struct FILTER_PLUGIN_TABLE {
311    /// フラグ
312    /// 画像と音声のフィルタ処理は別々のスレッドで処理されます
313    pub flag: i32,
314    /// プラグインの名前
315    pub name: LPCWSTR,
316    /// ラベルの初期値 (nullptrならデフォルトのラベルになります)
317    pub label: LPCWSTR,
318    /// プラグインの情報
319    pub information: LPCWSTR,
320
321    /// 設定項目の定義 (FILTER_ITEM_XXXポインタを列挙してnull終端したリストへのポインタ)
322    pub items: *const *const c_void,
323
324    /// 画像フィルタ処理関数へのポインタ (FLAG_VIDEOが有効の時のみ呼ばれます)
325    pub func_proc_video: Option<extern "C" fn(video: *mut FILTER_PROC_VIDEO) -> bool>,
326
327    /// 音声フィルタ処理関数へのポインタ (FLAG_AUDIOが有効の時のみ呼ばれます)
328    pub func_proc_audio: Option<extern "C" fn(audio: *mut FILTER_PROC_AUDIO) -> bool>,
329}