図5.1 分岐再生のシナリオ例
#define BSTM_MAX 3 /* 分岐ストリームの総数 (BSTM1.MPG, BSTM2.MPG, BSTM3.MPG) */ #define BRANCH_MAX 2 /* 分岐の総数(図5.1の矢印の数) */ #define KEY_MAX 2 /* ストリームキーの種類の総数 */ #define A_BTN 0 /* Aボタンの分岐番号 */ #define B_BTN 1 /* Bボタンの分岐番号 */ #define BR_NUM 2 /* ストリーム当たりの分岐数 */ #define BSTM1_ID 0 /* BSTM1.MPGの分岐ストリーム識別子 */ #define BSTM2_ID 1 /* BSTM2.MPGの分岐ストリーム識別子 */ #define BSTM3_ID 2 /* BSTM3.MPGの分岐ストリーム識別子 */ /* 分岐再生ライブラリの作業領域 */ Sint32 work_bpl[BPL_WORK_SIZE(BSTM_MAX, BRANCH_MAX, KEY_MAX)/sizeof(Sint32)]; void setScenario(void) { StmKey key[KEY_MAX]; /* ストリームキーを設定するための領域 */ Sint32 brtbl[BR_NUM]; /* 分岐先を設定するための領域 */ Sint32 fid; /* ファイル識別子 */ /* 分岐再生の初期化 */ BPL_Init(BSTM_MAX, BRANCH_MAX, KEY_MAX, work_bpl); /* 分岐ストリーム情報の設定 */ STM_KEY_CN(key + 0) = STM_KEY_CIMSK(key + 0) = STM_KEY_NONE; STM_KEY_CN(key + 1) = STM_KEY_CIMSK(key + 1) = STM_KEY_NONE; STM_KEY_SMMSK(key + 0) = STM_KEY_SMVAL(key + 0) = STM_SM_VIDEO; STM_KEY_SMMSK(key + 1) = STM_KEY_SMVAL(key + 1) = STM_SM_AUDIO; fid = GFS_NameToId("BSTM1.MPG"); BPL_SetStmInfo(BSTM1_ID, fid, KEY_MAX, key); fid = GFS_NameToId("BSTM2.MPG"); BPL_SetStmInfo(BSTM2_ID, fid, KEY_MAX, key); fid = GFS_NameToId("BSTM3.MPG"); BPL_SetStmInfo(BSTM3_ID, fid, KEY_MAX, key); /* 分岐先情報の設定 */ brtbl[A_BTN] = BSTM2_ID; /* Aボタンが押されたらBSTM2.MPGに分岐する */ brtbl[B_BTN] = BSTM3_ID; /* Bボタンが押されたらBSTM3.MPGに分岐する */ BPL_SetBranchInfo(BSTM1_ID, BR_NUM, brtbl); /* BSTM1.MPGの分岐先の設定 */ }
Sint32 work_gfs[GFS_WORK_SIZE(BSTM_MAX*KEY_MAX)/sizeof(Sint32)]; Sint32 work_stm[STM_WORK_SIZE(GRP_MAX, BSTM_MAX*KEY_MAX)/sizeof(Sint32)]; Sint32 brno; /* 分岐番号 */ StmHn stmtbl[KEY_MAX]; /* ストリームハンドルのテーブル */ Sint32 bpl_stat; /* 分岐再生状態 */ Sint32 decode_stat; /* デコーダの動作状態 */ DecodeHn dc_hn = NULL; /* デコーダのハンドル */ Bool chgsw = OFF; /* 分岐実行スイッチ */ Bool endflag = FALSE; Sint32 ret; /* 各ライブラリの初期化 */ GFS_Init(・・・); /* ファイルシステムの初期化 */ STM_Init(・・・); /* ストリームシステムの初期化 */ initDecoder(); /* デコーダの初期化 */ setScenario(); /* シナリオの設定(5.1を参照) */ /* 分岐再生 */ BPL_SetStart(BSTM1_ID); /* 再生開始ストリームの指定 */ BPL_GetCurStm(KEY_MAX, stmtbl); /* 最初の分岐ストリームの取得 */ dc_hn = createDecodeHn(stmtbl); /* デコーダのハンドルの作成 */ while (endflag == FALSE) { bpl_stat = BPL_ExecServer(chgsw); /* 分岐再生サーバの実行 */ chgsw = OFF; STM_ExecServer(); /* ストリームサーバの実行 */ decode_stat = execDecoder(dc_hn); /* デコーダのサーバ関数の実行 */ switch (bpl_stat) { case BPL_SVR_COMPLETED: /* 分岐再生終了状態 */ endflag = TRUE; break; case BPL_SVR_WAITSEL: /* 分岐先選択待ち状態 */ /* パッド入力の取得 (0:Aボタン, 1:Bボタン, 負の場合:入力がない */ brno = getPadEvent(); if (brno >= 0) { BPL_SelectBranch(brno); /* 分岐先の選択 */ } break; case BPL_SVR_SELECT: /* 分岐先決定状態 */ case BPL_SVR_NOBRN: /* 分岐先なし状態 */ if (decode_stat != COMPLETED) { /* デコード完了のチェック */ break; } chgsw = ON; /* 分岐実行スイッチON */ ret = BPL_GetNextStm(KEY_MAX, stmtbl); /* 分岐先のストリームの取得 */ if (ret >= 0) { /* 分岐先がある場合 */ destroyDecodeHn(dc_hn); /* デコーダのハンドルの消去 */ dc_hn = createDecodeHn(stmtbl); /* デコーダのハンドルの作成 */ } break; } } destroyDecodeHn(dc_hn); /* デコーダのハンドルの消去 */