連載2 画像転送システム その11
固有ステータスと言うのは各コーデックにより内容が異なる為一概に言えませんが多くの場合はコーデックの設定内容を含んでいます。例えばAMVコーデックで言えばハーフサイズのON/OFFやマルチスレッドの設定など設定画面の内容が含まれています。これらのステータスをコーデックから取得したり、逆にアプリケーション側からコーデックへステータスを設定したりする事ができます。
コーデックからステータスを取得するにはICM_GETSTATEメッセージを使います。
第1パラメータにステータスを格納するバッファのアドレス、第2パラメータにバッファのサイズを設定しますが、第1パラメータをNULLにするとステータスを格納するのに必要なバッファサイズを返すので最初はバッファサイズの取得、次にバッファの確保、最後にステータスの取得と三段階で処理しましょう。
次に、ステータスの設定です。利用するのはICM_SETSTATEメッセージです。
こちらは第1パラメータにステータスが格納されたバッファのアドレス、第2パラメータにバッファサイズを指定するだけです。
BOOL GetSetState( void ) { HIC hic = ICOpen( ICTYPE_VIDEO, dwFcc, ICMODE_COMPRESS ); if (hic == NULL)return FALSE; // 1.バッファサイズの取得 DWORD dwSize = ICSendMessage( hic, ICM_GETSTATE, (DWORD)NULL, (DWORD)NULL ); if (dwSize) { // 2.バッファの確保 void *lpState = malloc( dwSize ); if (lpState == NULL) { ICClose( hic ); return FALSE; } // 3.ステータスの取得 ICSendMessage( hic, ICM_GETSTATE, (DWORD)lpState, (DWORD)dwSize ); // ステータスを設定 ICSendMessage( hic, ICM_SETSTATE, (DWORD)lpState, (DWORD)dwSize ); free( lpState ); } ICClose( hic ); return TRUE; } |
上の例では取得したステータスをそのまま設定するので意味ないですが、アマレココの場合には設定Aから設定Dまで別々にコーデックのステータスを取得し管理する事で同じコーデックに対しても異なる設定で録画できるようになっています。
また、ファンタジーリモートではクライアント側でコーデックの管理を一括しています。
その為、接続時にクライアント側のコーデックのステータスを取得しそれをサーバーへ送信、サーバー側は受信したステータスをコーデックに設定という流れになっています。
このようにステータスを上手く管理する事でアプリケーションの利便性が向上しますので是非とも活用したい機能です。但し全てのコーデックがステータスの取得、設定に対応しているわけではないのでその点は気を付けましょう。
- 関連記事
trackback
コメントの投稿