サンプルプログラム
Development Kitにはこのドキュメントに記載されているファンクションの具体的な使用例として Visual Basic
および Visual C++ 用に以下のサンプルが含まれています。作成しようとしているアプリケーションに組み込む機能に応じて各サンプルを参照することができます。
Capture |
キャプチャプログラム |
Overlay |
2画面オーバーレイ |
Videoout |
ビデオ出力プログラム |
Visual C++ 用のサンプルは C 言語で記述されています。
開発キットに含まれるソースコードの取り扱いについて
開発キットに含まれるサンプルプログラムはドキュメントを補うための資料となっています。サンプルプログラムのソースコード(以下、「ソースコード」といいます)自体を改変したり、その一部をお客様のアプリケーションに組み込んで利用してください。ただし、お客様のアプリケーションとそこに組み込まれたソースコードの一部との適合性に関してサポートの範囲を限定させていただくこともございますのでご了承ください。
カノープス株式会社はソースコードの使用と変更に関して完全に自由な権利をお客様に許諾いたします。ただし、お客様の営利を目的としたソフトウェア製品にこれらのコードをソースコードもしくはこれを変更したものの形態のままで含めることはご遠慮願います。
また、最終的に作成されたアプリケーションの運用結果および目的への適合性につき、カノープス株式会社では一切の責任を負いかねますので予めご了承ください。
プログラム作成時の注意事項
開発キットでプログラムを作成する場合の注意事項です。
- 対応言語
Visual Basic |
Version 4.0以降(32bit版のみ) |
Visual C++ |
Version 4.0以降 |
- 対応OS
Microsoft Windows 95/98/98SE/Me 日本語版
Microsoft Windows NT 4.0 日本語版(SP3以降)
Microsoft Windows 2000 Professional 日本語版
Microsoft Windows XP Home/Professional 日本語版
- Windows 9x用ドライバは含まれていません。Power Movie PCI本体に付属するものをお使いください。
- プログレッシブJPEGでエンコードされたファイルは扱えません。
- 複数枚のPower Movie PCIを制御することはできません。
- 複数のアプリケーションからの同時使用はできません。
- Multi
Threadには対応していません。
- Power
Movie
MP/V開発キットおよびPower
Movie開発キットとの互換性はありません。
プログラム作成の流れ
実際に開発キットを使用してプログラムを作成する流れを、2つのアプリケーションを例に説明します。
ビデオ表示アプリケーションの作成
ビデオ表示アプリケーションでは、
- Power Movie PCIの使用開始
- ビデオウィンドウの生成
- ビデオ映像の表示開始
- ウィンドウの移動およびサイズの変更
- ビデオ映像の取り込みおよび静止
- ビデオ映像の表示終了
- ビデオウィンドウの破棄
- Power Movie PCIの使用終了
などの機能が必要となります。
●Power Movie PCIの使用開始
Power Movie PCIを使用するアプリケーションは、その使用開始をドライバに許可してもらう必要があります。アプリケーションの初期化時に
MGE_Initialize およびMGE_SetCooperativeLevel ファンクションを呼び出してPower Movie PCIの使用を開始します。
HWND _hWndApp; // Applicationのメインウィンドウハンドル(グローバル変数)
HMGE g_hmge; // Power Movie PCIの使用権を保持するハンドル(グローバル変数)
MGERESULT mr;
mr = MGE_Initialize(0, g_hWndApp, &g_hmge);
if(mr != MGE_S_OK) {
// Power Movie PCIが使用できない
エラー処理
}
mr = MGE_SetCooperativeLevel(g_hmge, MGE_SCL_EXCLUSIVE);
if(mr != MGE_S_OK) {
// Power Movie PCIが使用できない
エラー処理
}
●ビデオウィンドウの生成
アプリケーションのウィンドウ生成終了後( CreateWindow実行後)、クライアント領域をVideo Windowとして使用します。ただし、DirectDraw
Overlayの制限に触れるような場合は事前にウィンドウのサイズを変更しておく必要があります。
HMGEVSRC g_hmgevsDDraw; //Video Decoderのハンドル(グローバル変数)
HMGESURFACE g_hmgesrfSurfaceDDraw;
//Ddraw Overlay Surfaceのハンドル(グローバル変数)
HMGESTREAM g_hmgestmStreamDDraw;
//Ddraw Overlay Streamのハンドル(グローバル変数)
RECT rcCrop, rcFrame, rcWindow, rcView;
RECT rcClient;
DWORD dwWindowWidth;
DWORD dwViewWidth;
DWORD dwWindowHeight;
DWORD dwViewHeight;
DWORD dwCropWidth;
DWORD dwCropHeight;
//現在のClient領域の大きさを取得
GetClientRect(g_hWndApp, &rcClient);
ClientToScreen(g_hWndApp, (LPPOINT)&rcClient);
ClientToScreen(g_hWndApp, (LPPOINT)&rcClient + 1
//Crop用の領域初期化
rcCrop.left = 0;
rcCrop.top = 0;
rcCrop.right =640;
rcCrop.bottom = 480;
rcFrame.left = 0;
rcFrame.top = 0;
rcFrame.right = 640;
rcFrame.bottom =480;
// View用の領域初期化
rcView.left = 0;
rcView.top = 0;
rcView.right = 640;
rcView.bottom = 480;
●ビデオ映像の表示開始
ビデオ映像をアプリケーションウィンドウのクライアント領域に表示させます。
他のウィンドウが上に重なった場合に、オーバーレイされるビデオ映像がそのウィンドウの上に表示されないようにキーカラー(Color Key)を有効にします。
キーカラーを有効にするためには、ウィンドウのクライアント領域をキーカラーで塗りつぶす必要があります。これはウィンドウのバックグラウンドカラーをキーカラーと同じ色にすることで簡単に実現できます。
ビデオオーバーレイの表示開始後にウィンドウ内のキーカラーで塗りつぶすようにすれば、キーカラーそのものの色が見える内容にすることもできます。
MGECOLORKEY ck;
HBRUSH hBrush;
// キーカラーをマゼンタにして表示を開始する
ck.dwColorLow = 0x00ff00ff; // マゼンタ
ck.dwColorHigh = 0x00ff00ff;
MGE_SurfaceSetColorKey(g_hmgesrfSurfaceDDraw, &ck);
MGE_VStreamStart(g_hmgestmStreamDDraw);
MGE_SurfaceStartOverlay(g_hmgesrfSurfaceDDraw);
hBrush = CreateSolidBrush(RGB(255, 0, 255));
SetClassLong(g_hWndApp, GCL_HBRBACKGROUND, (LONG)hBrush);
InvalidateRect(g_hWndApp, NULL, TRUE);
UpdateWindow(g_hWndApp);
●ウィンドウの移動およびサイズ変更
ユーザーの操作により、アプリケーションのウィンドウを移動させた時や、ウィンドウのサイズを変更した場合には、ビデオウィンドウを新しい位置に移動させたり、サイズを変更します。
case WM_WINDOWPOSCHANGED:
{
RECT rcWindow;
RECT rcView;
RECT rcCrop;
DWORD dwWindowWidth;
DWORD dwViewWidth;
DWORD dwWindowHeight;
DWORD dwViewHeight;
DWORD cwCropWidth;
DWORD dwCropHeight;
GetClientRect(g_hWndApp, &rcWindow);
ClientToScreen(g_hWndApp, (LPPOINT)&rcWindow);
ClientToScreen(g_hWndApp, (LPPOINT)&rcWindow + 1);
MGE_VStreamGetRect(g_hmgestmStreamDDraw, MGEStreamRectCrop, &rcCrop);
rcView = rcCrop;
// DirectDraw Overlayの制限を回避するために各矩形を補正する。
dwWindowWidth = rcWindow.right - rcWindow.left;
dwViewWidth = rcView.right - rcView.left;
dwCropWidth = rcCrop.right - rcCrop.left;
while(dwViewWidth > dwWindowWidth) {
dwViewWidth /= 2;
if(dwViewWidth * 4 < dwCropWidth) {
/* we can not */
return;
}
}
rcView.right = rcView.left + dwViewWidth;
●ビデオ映像の取り込みおよび静止
ビデオ映像の取り込みおよび静止を行ないます。
この例では現在の状態を取得して、取り込みと静止を交互に切り替えます。
MGESTREAMSTATE ss;
MGE_VStreamGetState(g_hmgestmStreamDDraw, &ss);
if(ss == MGEStreamStatePause) {
MGE_VStreamRestart(g_hmgestmStreamDDraw);
}
else if(ss == MGEStreamStateStarted) {
MGE_VStreamPause(g_hmgestmStreamDDraw);
}
else {
// ビデオがスタートしていない。
}
●ビデオ映像の表示終了
ビデオ映像の表示を終了させます。
ビデオオーバーレイの表示終了前にウィンドウ内を適当な色で塗りつぶすようにすれば、キーカラーそのものの色を見えないようにすることができます。
HBRUSH hBrush;
// バックグラウンドカラーを黒にする
hBrush = GetStockObject(BLACK_BRUSH);
hBrush = (HBRUSH)SetClassLong(g_hWndApp, GCL_HBRBACKGROUND, (LONG)hBrush);
InvalidateRect(g_hWndApp, NULL, TRUE);
UpdateWindow(g_hWndApp);
// 表示を終了させる。
MGE_SurfaceStopOverlay(g_hmgesrfSurfaceDDraw);
MGE_VStreamStop(g_hmgestmStreamDDraw);
// キーカラーのブラシを削除する
if(hBrush)
DeleteObject(hBrush);
●ビデオウィンドウの破棄
ビデオウィンドウを破棄します。WM_DESTROYなどで実行します。
MGE_VStreamDisconnect(g_hmgestmStreamDDraw, g_hmgesrfSurfaceDDraw);
MGE_DestroyVideoStream(g_hmgestmStreamDDraw);
MGE_DestroySurface(g_hmgesrfSurfaceDDraw);
MGE_DestroyVideoDecoder(g_hmgevsDDraw);
●Power Movie PCIの使用終了
Power Movie PCIを使用するアプリケーションは、その使用終了をドライバに通知する必要があります。アプリケーションの終了時などに
MGE_Uninitialize ファンクションを呼び出してPower Movie PCIの使用を終了します。
MGE_Uninitialize(g_hmge);
ビデオ出力アプリケーションの作成
ビデオ出力アプリケーションでは、
- Power Movie PCIの使用開始
- ビデオへの出力の準備
- ビデオへ出力するものを描画する
- ビデオへの出力の開始
- ビデオへの出力の終了
- ビデオへの出力の後処理
- Power Movie PCIの使用終了
などの機能が必要となります。
この項では静止画像をビデオ出力するアプリケーションの作成について説明します。本文中では C 言語を用いて説明していますが、Visual
Basic でも同様のシーケンスでコーディングを行います。
●Power Movie PCIの使用開始
Power Movie PCIを使用するアプリケーションは、その使用開始をドライバに許可してもらう必要があります。アプリケーションの初期化時に
MGE_Initialize およびMGE_SetCooperativeLevel ファンクションを呼び出してPower Movie PCIの使用を開始します。
HWND g_hWndApp; // Applicationのメインウインドウハンドル(グローバル変数)
HMGE g_hmge; // Power Movie PCIの使用権を保持するハンドル(グローバル変数)
MGERESULT mr;
mr = MGE_Initialize(0, g_hWndApp, &g_hmge);
if(mr != MGE_S_OK) {
// Power Movie PCIが使用できない
エラー処理
}
mr = MGE_SetCooperativeLevel(g_hmge, MGE_SCL_EXCLUSIVE);
if(mr != MGE_S_OK) {
// Power Movie PCIが使用できない
エラー処理
}
●ビデオへの出力の準備
静止画像をビデオ出力する準備を行ないます。
HMGEVDST g_hmgevdVideoOut; // Video Encoderへのハンドル(グローバル変数)
HMGESTREAM g_hmgestmStreamVideoOut;
// Video out Streamへのハンドル(グローバル変数)
HMGESURFACE g_hmgesrfSurfaceMemory;
// Memory Surfaceへのハンドル(グローバル変数)
RECT rcWindow, rcView;
MGEPFINFO pfinfo;
rcView.left = 0;
rcView.top = 0;
rcView.right = 640;
rcView.bottom = 480;
rcWindow.left = 0;
rcWindow.top = 0;
rcWindow.right = 640;
rcWindow.bottom = 480;
//
// Video outするための各オブジェクトの生成
//
MGE_CreateVideoEncoder(g_hmge, MGEChannel1, &g_hmgevdVideoOut);
MGE_CreateVideoOutStream(g_hmgevdVideoOut, &g_hmgestmStreamVideoOut);
pfinfo.dwSize = sizeof(pfinfo);
MGE_GetPixelFormatInfo(MGEPixelFormatYUY2, &pfinfo);
MGE_CreateMemorySurface(g_hmge, &g_hmgesrfSurfaceMemory, 640, 480, 640
* pfinfo.dwBytesPerPixel, MGEPixelFormatYUY2);
MGE_VStreamConnect(g_hmgestmStreamVideoOut, g_hmgesrfSurfaceMemory);
MGE_VStreamSetRect(g_hmgestmStreamVideoOut, MGEStreamRectView, &rcView,
FALSE);
MGE_VStreamSetRect(g_hmgestmStreamVideoOut, MGEStreamRectWindow, &rcWindow,
TRUE);
●ビデオへ出力するものを描画する
ビデオへ出力するものを用意します。ここで MGE_SurfaceFillBuffer、MGE_SurfaceSetBitmapBits、
MGE_SurfaceLoadDIB や MGE_SurfaceLoadJPEG などを使用して、オブジェクト(静止画)をサーフェスに描画します。 ここでは
MGE_SurfaceFillBuffer を使用します。
DWORD s_ardwColor[] = {
0x00ffffff,
0x00ff0000,
0x0000ff00,
0x000000ff,
0x00000000,
0x00ffff00,
};
RECT rc;
int i;
rc.left = 0;
rc.top = 0;
rc.right = 640;
rc.bottom = 480;
for(i = 0;i < 6;i++) {
MGE_SurfaceFillBuffer(g_hmgesrfSurfaceMemory, &rc, s_ardwColor[i]);
rc.left += 40;
rc.right -= 40;
rc.top += 30;
rc.bottom -= 30;
}
●ビデオへの出力の開始
MGE_VStreamStart(g_hmgestmStreamVideo)
●Power Movie PCIの使用終了
Power Movie PCIを使用するアプリケーションは、その使用終了をドライバに通知する必要があります。アプリケーションの終了時などに
MGE_Uninitialize ファンクションを呼び出してPower Movie PCIの使用を終了します。
MGE_Uninitialize(g_hmge);
API Quick Reference