// 満月をさがして 上2ラインを次のフレームから持ってくるフィルタ // for AviUtl ver0.96e以降 #include #include "../filter.h" //--------------------------------------------------------------------- // フィルタ構造体定義 //--------------------------------------------------------------------- // トラックバーの数 #define TRACK_N 2 // トラックバーの名前 TCHAR *track_name[TRACK_N] = { "ライン数", "コピー元" }; int track_default[TRACK_N] = { 2, 1 }; // トラックバーの初期値 int track_s[TRACK_N] = { 0, -5 }; // トラックバーの下限値 int track_e[TRACK_N] = { 10, 5 }; // トラックバーの上限値 // チェックボックスの数 #define CHECK_N 0 FILTER_DLL filter = { FILTER_FLAG_EX_DATA | FILTER_FLAG_EX_INFORMATION, // フィルタのフラグ 0,0, // 設定ウインドウのサイズ(無意味) "満月をさがして", // フィルタの名前 TRACK_N, // トラックバーの数 track_name, // トラックバーの名前群へのポインタ track_default, // トラックバーの初期値群へのポインタ track_s, track_e, // トラックバーの数値の下限上限 CHECK_N, // チェックボックスの数 NULL, // チェックボックスの名前群へのポインタ NULL, //チェックボックスの初期値群へのポインタ func_proc, // フィルタ処理関数 NULL, // 開始時に呼ばれる関数 NULL, // 終了時に呼ばれる関数 NULL, // 設定が変更されたときに呼ばれる関数 NULL, // 設定ウィンドウにウィンドウメッセージが来た時に呼ばれる関数 NULL,NULL, // システムで使用 NULL, // 拡張データ領域(なし) 0, // 拡張データサイズ(なし) "ラインコピー by JOE", // フィルタ情報 NULL, // セーブが開始される直前に呼ばれる関数 NULL, // セーブが終了した直後に呼ばれる関数 }; //--------------------------------------------------------------------- // フィルタ構造体のポインタを渡す関数 //--------------------------------------------------------------------- EXTERN_C FILTER_DLL __declspec(dllexport) * __stdcall GetFilterTable( void ) { return &filter; } //--------------------------------------------------------------------- // フィルタ処理関数 //--------------------------------------------------------------------- BOOL func_proc( FILTER *fp, FILTER_PROC_INFO *fpip ) { // fp->track[n] : トラックバーの数値 // fp->check[n] : チェックボックスの数値 // fpip->w : 実際の画像の横幅 // fpip->h : 実際の画像の縦幅 // fpip->max_w : 画像領域の横幅 // fpip->max_h : 画像領域の縦幅 // fpip->ycp_edit : 画像領域へのポインタ // fpip->ycp_temp : テンポラリ領域へのポインタ // fpip->ycp_edit[n].y : 画素(輝度 )データ ( 0 〜 4095 ) // fpip->ycp_edit[n].cb : 画素(色差(青))データ ( -2048 〜 2047 ) // fpip->ycp_edit[n].cr : 画素(色差(赤))データ ( -2048 〜 2047 ) // // 画素データは範囲外に出ていることがあります。 // また範囲内に収めなくてもかまいません。 // // 画像サイズを変えたいときは fpip->w や fpip->h を変えます。 // // テンポラリ領域に処理した画像を格納したいときは // fpip->ycp_edit と fpip->ycp_temp を入れ替えます。 PIXEL_YC *psrc, *pdest; int f; f = fpip->frame + fp->track[1]; if ( f < 0 || fpip->frame_n <= f ) return TRUE; // 指定されたオフセットのフレームを取得 // psrc = fp->exfunc->get_ycp_ofs(fpip->editp, fpip->frame, fp->track[1]); psrc = fp->exfunc->get_ycp(fpip->editp, f); // 失敗したら放棄。 if (psrc==NULL) return TRUE; // 指定されたラインぶんを memcopy でひっぱる。 pdest = fpip->ycp_edit; memcpy(pdest,psrc,fpip->max_w * fp->track[0] * sizeof(fpip->ycp_edit[0])); return TRUE; }