;============================================================ ; iron_camera_mf.hsp — Webcam Preview (pure Media Foundation) ; ; hspmfcam.dll を経由して Media Foundation の SourceReader から ; Webcam フレームを取得する HSP ラッパ。OpenCV 不要。 ; ; 特徴: ; - 内部で worker thread + child window を作成 (MFPlay と同じ方式) ; - HSP main thread が title bar drag 等で止まっても prefetch 継続 ; - アスペクト比固定モード対応 ; - リサイズ対応 (set_pos) ; - 最大 256 台のカメラを同時に open 可 (ハンドル管理) ; - PNG/JPEG/BMP/GIF/TIFF スナップショット保存 ; - カメラ/オーディオデバイスの列挙 + friendly name 取得 ; ; API (列挙系 - インスタンス無しで呼べる): ; n = iron_cam_count() ; iron_cam_name idx, name_var ; カメラ friendly name (ANSI) ; n = iron_cam_audio_count() ; iron_cam_audio_name idx, name_var ; オーディオ friendly name ; ; API (ハンドル管理): ; h = iron_cam_open(dev_idx, x, y, w, h) ; dev_idx 番目のカメラを HSP window 内 (x,y,w,h) に ; child window として開く。worker thread + プレビュー自動開始。 ; 戻り値 h: ハンドル (>=0 成功) / -1 失敗 ; ; iron_cam_size h, var_w, var_h ; カメラのネイティブ解像度 ; iron_cam_set_pos h, x, y, w, h ; child window 位置/サイズ変更 ; iron_cam_set_aspect h, mode ; 0=stretch / 1=letterbox ; s = iron_cam_state(h) ; 0=FREE 1=OPENING 2=READY 3=ERROR ; iron_cam_save h, "snap.png" ; PNG/JPG/BMP/GIF/TIFF ; iron_cam_read h, buf ; BGRA byte配列にコピー ; iron_cam_close h ; ; 例 (シンプル): ; #include "iron_camera_mf.hsp" ; screen 0, 800, 600 ; h = iron_cam_open(0, 0, 0, 800, 600) ; iron_cam_set_aspect h, 1 ; stop ; ; 例 (2 台同時): ; #include "iron_camera_mf.hsp" ; screen 0, 1300, 500 ; h1 = iron_cam_open(0, 0, 0, 2560, 480) ; h2 = iron_cam_open(1, 660, 0, 2560, 480) ; stop ; ; 依存: ; hspmfcam.dll / hspmfcam_256.dll を実行ファイルと同じディレクトリに配置 ;============================================================ #ifndef __iron_camera_mf_hsp__ #define __iron_camera_mf_hsp__ #module iron_camera_mf #uselib "hspmfcam.dll" #cfunc _mfcam_count "mfcam_count" #func _mfcam_get_name "mfcam_get_name" int, var, int #func _mfcam_get_id "mfcam_get_id" int, var, int #cfunc _mfcam_audio_count "mfcam_audio_count" #func _mfcam_audio_get_name "mfcam_audio_get_name" int, var, int #func _mfcam_audio_get_id "mfcam_audio_get_id" int, var, int #cfunc _mfcam_format_count "mfcam_format_count" int #func _mfcam_format_get "mfcam_format_get" int, int, var, var, var, var, var, int #func _mfcam_open "mfcam_open" int, int, int, int, int, int, var, var #func _mfcam_open_ex "mfcam_open_ex" int, int, int, int, int, int, int, int, int, int, var, var #func _mfcam_set_pos "mfcam_set_pos" int, int, int, int, int #func _mfcam_set_aspect "mfcam_set_aspect" int, int #cfunc _mfcam_get_state "mfcam_get_state" int #func _mfcam_read "mfcam_read" int, var #func _mfcam_save_snapshot "mfcam_save_snapshot" int, str #func _mfcam_prop_get "mfcam_prop_get" int, int, var, var, var, var, var, var #func _mfcam_prop_set "mfcam_prop_set" int, int, int, int #func _mfcam_record_start "mfcam_record_start" int, str, str, int #func _mfcam_record_start_av "mfcam_record_start_av" int, str, str, int, int, str, int #func _mfcam_record_stop "mfcam_record_stop" int #func _mfcam_close "mfcam_close" int ; --- audio-only capture (Phase 2-G) --- #cfunc _mfcam_audio_open "mfcam_audio_open" int, int, int, int #func _mfcam_audio_close "mfcam_audio_close" int #func _mfcam_audio_get_format "mfcam_audio_get_format" int, var, var, var #cfunc _mfcam_audio_pcm_avail "mfcam_audio_pcm_avail" int #func _mfcam_audio_read_pcm "mfcam_audio_read_pcm" int, var, int #func _mfcam_audio_save_wav_start "mfcam_audio_save_wav_start" int, str #func _mfcam_audio_save_wav_stop "mfcam_audio_save_wav_stop" int #func _mfcam_audio_record_start "mfcam_audio_record_start" int, str, str, int #func _mfcam_audio_record_stop "mfcam_audio_record_stop" int ;------------------------------------------------------------ ; カメラプロパティ ID 定数 ;------------------------------------------------------------ #define global IRON_CAM_PROP_BRIGHTNESS 0 #define global IRON_CAM_PROP_CONTRAST 1 #define global IRON_CAM_PROP_HUE 2 #define global IRON_CAM_PROP_SATURATION 3 #define global IRON_CAM_PROP_SHARPNESS 4 #define global IRON_CAM_PROP_GAMMA 5 #define global IRON_CAM_PROP_COLOR_ENABLE 6 #define global IRON_CAM_PROP_WHITE_BALANCE 7 #define global IRON_CAM_PROP_BACKLIGHT 8 #define global IRON_CAM_PROP_GAIN 9 #define global IRON_CAM_PROP_PAN 10 #define global IRON_CAM_PROP_TILT 11 #define global IRON_CAM_PROP_ROLL 12 #define global IRON_CAM_PROP_ZOOM 13 #define global IRON_CAM_PROP_EXPOSURE 14 #define global IRON_CAM_PROP_IRIS 15 #define global IRON_CAM_PROP_FOCUS 16 #define global IRON_CAM_PROP_AUTO 1 #define global IRON_CAM_PROP_MANUAL 2 ;------------------------------------------------------------ ; State 定数 ;------------------------------------------------------------ #define global IRON_CAM_FREE 0 #define global IRON_CAM_OPENING 1 #define global IRON_CAM_READY 2 #define global IRON_CAM_ERROR 3 ;------------------------------------------------------------ ; 列挙系 (インスタンス不要) ;------------------------------------------------------------ #defcfunc iron_cam_count return _mfcam_count() #deffunc iron_cam_name int idx, var out_name sdim out_name, 256 _mfcam_get_name idx, out_name, 255 return #deffunc iron_cam_id int idx, var out_id sdim out_id, 1024 _mfcam_get_id idx, out_id, 1023 return #defcfunc iron_cam_audio_count return _mfcam_audio_count() #deffunc iron_cam_audio_name int idx, var out_name sdim out_name, 256 _mfcam_audio_get_name idx, out_name, 255 return #deffunc iron_cam_audio_id int idx, var out_id sdim out_id, 1024 _mfcam_audio_get_id idx, out_id, 1023 return ;------------------------------------------------------------ ; フォーマット列挙 ;------------------------------------------------------------ #defcfunc iron_cam_format_count int dev_idx return _mfcam_format_count(dev_idx) #deffunc iron_cam_format_get int dev_idx, int fmt_idx, var ow, var oh, var ofn, var ofd, var ofcc sdim ofcc, 32 _mfcam_format_get dev_idx, fmt_idx, ow, oh, ofn, ofd, ofcc, 31 return ;------------------------------------------------------------ ; ハンドル管理 API ;------------------------------------------------------------ #defcfunc iron_cam_open int dev_idx, int px, int py, int pw, int ph, local _w, local _h, local _h_id _w = 0 _h = 0 _mfcam_open dev_idx, hwnd, px, py, pw, ph, _w, _h _h_id = stat if _h_id < 0 : return -1 if _h_id < 256 { _icm_w(_h_id) = _w _icm_h(_h_id) = _h } return _h_id ;------------------------------------------------------------ ; iron_cam_open_ex — 任意フォーマット指定 open ; dev_idx, x, y, w, h : 表示位置 ; desired_w, desired_h : 望む解像度 (0=デフォルト) ; desired_fps_num, desired_fps_den : 望む fps (0=デフォルト, 例: 30/1) ; 戻り値: ハンドル / -1 失敗 ;------------------------------------------------------------ #defcfunc iron_cam_open_ex int dev_idx, int px, int py, int pw, int ph, int des_w, int des_h, int des_fn, int des_fd, local _w, local _h, local _h_id _w = 0 _h = 0 _mfcam_open_ex dev_idx, hwnd, px, py, pw, ph, des_w, des_h, des_fn, des_fd, _w, _h _h_id = stat if _h_id < 0 : return -1 if _h_id < 256 { _icm_w(_h_id) = _w _icm_h(_h_id) = _h } return _h_id #deffunc iron_cam_size int h, var ow, var oh if (h < 0) | (h >= 256) { ow = 0 oh = 0 return } ow = _icm_w(h) oh = _icm_h(h) return #deffunc iron_cam_set_pos int h, int x, int y, int w, int hh if h < 0 : return _mfcam_set_pos h, x, y, w, hh return #deffunc iron_cam_set_aspect int h, int mode if h < 0 : return _mfcam_set_aspect h, mode return #defcfunc iron_cam_state int h if h < 0 : return IRON_CAM_FREE return _mfcam_get_state(h) #deffunc iron_cam_save int h, str path if h < 0 : return _mfcam_save_snapshot h, path return #deffunc iron_cam_read int h, var buf if h < 0 : return _mfcam_read h, buf return #deffunc iron_cam_close int h if h < 0 : return _mfcam_close h if h < 256 { _icm_w(h) = 0 _icm_h(h) = 0 } return ;------------------------------------------------------------ ; カメラプロパティ ;------------------------------------------------------------ #deffunc iron_cam_prop_get int h, int prop_id, var val, var minv, var maxv, var step, var defv, var flags val = 0 : minv = 0 : maxv = 0 : step = 0 : defv = 0 : flags = 0 if h < 0 : return -1 _mfcam_prop_get h, prop_id, val, minv, maxv, step, defv, flags return stat #deffunc iron_cam_prop_set int h, int prop_id, int val, int flags if h < 0 : return -1 _mfcam_prop_set h, prop_id, val, flags return stat ;------------------------------------------------------------ ; 録画 ; iron_cam_record h, "out.mp4" [, "H264", bitrate] ; 映像のみ。codec="" でデフォルト H.264。bitrate=0 で 4Mbps。 ; ; iron_cam_record_av h, "out.mp4", audio_dev, "H264", vbr, "AAC", abr ; 音声同時録画。 ; ; iron_cam_record_stop h ;------------------------------------------------------------ #deffunc iron_cam_record int h, str path, str vcodec, int vbr if h < 0 : return -1 _mfcam_record_start h, path, vcodec, vbr return stat #deffunc iron_cam_record_av int h, str path, int audio_dev, str vcodec, int vbr, str acodec, int abr if h < 0 : return -1 _mfcam_record_start_av h, path, vcodec, vbr, audio_dev, acodec, abr return stat #deffunc iron_cam_record_stop int h if h < 0 : return -1 _mfcam_record_stop h return stat ;------------------------------------------------------------ ; マイク単独 audio-only キャプチャ (Phase 2-G) ;------------------------------------------------------------ ; iron_mic_open(dev_idx, sample_rate, channels, bits) → ハンドル / -1 失敗 ; sample_rate=0 で 48000、channels=0 で 2、bits=0 で 16 がデフォルト #defcfunc iron_mic_open int dev_idx, int sr, int ch, int bits return _mfcam_audio_open(dev_idx, sr, ch, bits) #deffunc iron_mic_close int h if h < 0 : return _mfcam_audio_close h return ; 実際に取得された format を返す (要求と違うかもしれない) #deffunc iron_mic_get_format int h, var ow_sr, var ow_ch, var ow_bits ow_sr = 0 : ow_ch = 0 : ow_bits = 0 if h < 0 : return _mfcam_audio_get_format h, ow_sr, ow_ch, ow_bits return ; リングバッファ内の PCM byte 数 (defcfunc) #defcfunc iron_mic_avail int h if h < 0 : return 0 return _mfcam_audio_pcm_avail(h) ; リングから PCM を読み出す。out_buf には事前に sdim で領域確保しておく ; 戻り値: 実際に読めた byte 数 #deffunc iron_mic_read int h, var out_buf, int max_bytes if h < 0 : return -1 _mfcam_audio_read_pcm h, out_buf, max_bytes return stat ; WAV ファイル直書き (生 PCM をそのまま書く、軽量) #deffunc iron_mic_save_wav int h, str path if h < 0 : return -1 _mfcam_audio_save_wav_start h, path return stat #deffunc iron_mic_save_wav_stop int h if h < 0 : return -1 _mfcam_audio_save_wav_stop h return stat ; エンコード録音 (AAC/MP3/WMA/FLAC) — codec="" で AAC デフォルト #deffunc iron_mic_record int h, str path, str codec, int bitrate if h < 0 : return -1 _mfcam_audio_record_start h, path, codec, bitrate return stat #deffunc iron_mic_record_stop int h if h < 0 : return -1 _mfcam_audio_record_stop h return stat #global ;------------------------------------------------------------ ; ハンドル別解像度キャッシュ (256 スロット = MAX_CAMS in hspmfcam.dll) ;------------------------------------------------------------ dim _icm_w@iron_camera_mf, 256 dim _icm_h@iron_camera_mf, 256 #endif