BREW でカメラ (前編) - 1 / 3 -
BREW とカメラ
「何時でも何処でも誰もがカメラマン」と言ってよいくらい、最近の携帯電話にはカメラが標準搭載されています。
BREW でも、バージョン 2.1 からカメラ機能がサポートされました。
けれども、実際のところは、
- BREW 2.1 のエミュレータは、カメラ機能をサポートしていない
- カメラの制御方法をわかりやすいドキュメントがない
- カメラ制御は非同期処理である
などの事情もあって、「いますぐカメラアプリを BREW プログラミング」という風にはいきません。
動作モード
BREW のカメラには次の 3 つのモードがあります。
- プレビュー モード : プレビューを表示するためのモード
- スナップショット モード : 静止画を撮影するモード
- ムービー モード : 動画を記録するモード
デジカメに置き換えると、プレビュー モードはリアルタイムに被写体が画面に表示されている状態、スナップショット モードはシャッター ボタンが押されてシャッターが切れてから、写真がメモリ カードに記録されるまでの状態です。
ムービー モードはこのモードだけ単独で使います。プレビュー モードとスナップショット モードは組み合わせて使います。
以下では、プレビュー モードとスナップショット モードについて解説します。
ICamera インターフェース
BREW のカメラ制御インターフェースは、ICamera です。ICamera インターフェースを使用するためには、AEECamera.h をインクルードします。
ICamera インターフェースは、IShell や IDisplay などの BREW 標準インターフェースではありません。予めインスタンスの生成が必要です。これには ISHELL_CreateInstance を使用します。このとき、第 2 引数には、AEECLSID_CAMERA を使用します。
ISHELL_CreateInstance(pMe->m_pIShell, AEECLSID_CAMERA, (void **)&(pMe->_camera));
カメラ イベントとコールバック関数
カメラの動作は、基本的には非同期です。
例えば、ICamera インターフェースの関数 ICAMERA_Preview を呼び出しても、実際にプレビューが開始するのは暫くしてからです。
BREW では、カメラ動作に変化が起こった時点でそれがイベントとして通知されます。イベントを受け取る関数のことをコールバック関数と呼びます。
このときのコールバック関数の型は次のようになります。
void foo(void *pUser, AEECameraNotify *pNotify);
このコールバック関数は、ICAMERA_RegisterNotify 関数を使って登録します。
ICAMERA_RegisterNotify 関数は定義されます。
int ICAMERA_RegisterNotify( IMedia *pICamera, // ICamera インターフェースへのポインタ PFNCAMERANOTIFY pfnNotify, // コールバック関数へのポインタ void *pUser // ユーザー データ );
第 3 引数に指定したものが、コールバック関数の第 1 引数に渡されます。コールバック関数は、ここ以外からアプリケーションに関するデータを受け取る手段がないので、アプレット構造体へのポインタを渡します。
第 2 引数の pNotify には、AEECameraNotify 構造体へのポインタが渡されます。
AEECameraNotify 構造体の定義です。
typedef struct AEECameraNotify { ICamera *pCam; // このコールバック関数を呼び出した // ICamera オブジェクト int16 nCmd; // コマンド コード int16 nSubCmd; // サブ コマンド コード int16 nStatus; // ステータス コード int16 nReserved; // 予約済み void * pData; // コンテキスト依存データ uint32 dwSize; // pData のサイズ } AEECameraNotify;
このうち nStatus 変数に、現在のカメラの状態が「カメラ ステータス コード」として格納されます。このステータス コードのうち、プレビュー モードとスナップショット モードで重要なのは、次の 2 つです。
ステータス コード | 意味 |
---|---|
CAM_STATUS_FRAME | プレビュー用の画像の取得が完了した |
CAM_STATUS_DONE | 何らかの処理が完了した |
CAM_STATUS_DONE は、各モードでの動作終了、プレビュー モードの終了、スナップショット モードでの撮影完了などを意味します。
デジカメのような静止画撮影では、2 つのステータス コードに関して然るべき処理をします。
関連情報:"第 11 回 TCP / IP ネットワークプログラミング − コールバック −"
プレビュー 画像の表示
プレビュー モードでは、 BREW はカメラから画像が取得可能になったイベントをコールバック関数に通知するだけで、BREW はプレビュー画像を表示しません。コールバック関数にプレビュー画像を表示する処理を記述します。
プレビュー画像は ICAMERA_GetFrame 関数で取得できます。プレビュー画像を表示には、ビットマップを画面に転送する IDISPLAY_BitBlt 関数を使います。