CRI Sofdec  Last Updated: 2024-01-10 18:57 p
Sofdec1からSofdec2への移行ガイド

ムービーデータの扱いについて

Sofdec1とSofdec2では、ムービーデータの互換性がありません。
すでにSofdec1用のムービーファイル(.sfd)が手元にある場合は、再エンコードを行ってください。
(もし再エンコードが難しい場合は、サポート窓口へご連絡ください。シンプルなムービーであればSFDからUSMに変換できる可能性があります。)

主な動作仕様の変更について

Sofdec2で、Sofdec1とは動作仕様が変更になっているものがいくつかありますので説明します。
単純な関数の置き換えでは移行が出来ない部分ですので、ご注意ください。

再生中のハンドルに対しての別ファイル再生

Sofdec1では再生中のハンドルに対して、別ファイルをいきなり再生開始したり、いきなりハンドル破棄をすることが出来ました。 (代わりに再生開始やハンドル破棄の関数内で処理をブロックしていました。)
Sofdec2では再生開始やハンドル破棄は、再生停止状態のハンドルに対してのみ可能です。 同一ハンドルで別のムービーを再生したい場合は、一旦再生停止状態に遷移させてください。

エラー状態の対応

Sofdec1では、エラー状態になったハンドルをいきなりハンドル破棄することが出来ました。
Sofdec2では、エラー状態のハンドルに対してハンドル破棄や再生開始関数は実行できません。 エラー状態になったら停止リクエストを発行し、STOP状態になるのを待ってからハンドル破棄してください。

連結再生

Sofdec1では、同時に16個まで連結再生ファイルを登録することが出来ました。
Sofdec2では連結再生の仕様が変更になり、ファイル読み込み終了時に発生するファイル要求コールバックで次のファイルを指定します。 つまり同時に複数個のファイルを登録することは出来なくなりましたし、ファイル登録するタイミングもそのコールバックが発生した瞬間のみとなります。
あらかじめアプリケーション側でファイルリストを準備しておいて、コールバック発生時にそこから順次登録するような実装にしてください。

ヘッダー解析

Sofdec1では、ハンドルを作成せずにムービーデータの先頭10セクタをメモリ指定してヘッダー解析をする機能がありました。
Sofdec2では、再生ハンドルでヘッダー解析のみを行うことが可能になりました。 再生ハンドルの作成自体には大きなワークバッファーは必要としませんし、ヘッダー解析のために読み込んだムービーデータの先頭部分はそのまま 再生開始の時にも利用されます。

ポーズスタート

Sofdec1で、ムービー再生(描画)開始のタイミングをコントロールしたい場合は、ポーズをかけて再生を開始するという手順が必要でした。
Sofdec2では、関数として再生準備のみを行うことが出来るようになりました。 criManaPlayer_Prepare 関数を実行すると再生開始の準備(読み込みとデコード)のみ行います。 ハンドル状態が CRIMANAPLAYER_STATUS_READY になった後、 criManaPlayer_Start 関数を呼ぶことで即座にビデオフレームが取得できます。

複数のビデオフレームの同時取得

Sofdec1では、mwPlyGetFrm関数を使用すると、古いフレームをリリースせずに新しいフレームを取得できました。
Sofdec2では、複数フレームの同時取得は未対応です。今後の対応を検討しています。
mwPlyGetCurFrm関数を使っているか、mwPlyGetFrm関数でも同時に1枚しかフレームを保持していない場合は、移行に問題はありません。

再生中のオーディオトラック変更

Sofdec1では、複数のオーディオトラックをインタリーブしたムービーファイルの再生中に、再生するオーディオトラックを切り替えることが出来ました。
Sofdec2では、再生中のオーディオトラック変更は非対応です。 一度ムービー再生を停止してから、再度再生開始するようにしてください。

Sofdec2への移行について

Sofdec1 で実装済みのアプリケーションを Sofdec2に移行する場合、まずは上記仕様の違いについて確認してください。
次に一連のムービー関連処理で移行のキーになりそうな部分を説明します。
(ADX1 からADX2への移行は完了しているものとします。)

ハンドル作成からワークバッファーの指定

Sofdec1では、ハンドル作成時にムービーの最大解像度や最大ビットレートを指定する必要がありました。
Sofdec2では、ハンドル作成自体にはパラメーターの指定はありません。 ヘッダー解析後に、そのムービーを再生するのに最適なパラメーターを取得してワークバッファーを追加で確保することになります。
※ワークバッファーの計算や設定の詳細については、 メモリ管理 を参照してください。

もし、アプリケーションで事前にムービーのパラメーターを把握している場合は、あらかじめ再生用ワークバッファーを計算して設定しておくことも可能です。

/* Manaハンドルの作成 */
hn_work_size = criManaPlayer_CalculateHanldeWorkSize();
hn_work = malloc(hn_work_size);
mana = criManaPlayer_Create(hn_work, hn_work_size);
/* 再生用ワークの手動パラメーター設定 */
memset(&config_b, 0, sizeof(config_b));
config_b.common_params.readbuf_size_byte = 4*1000*1000/8; /* ビットレートから計算 */
config_b.video_params.video_flag = CRI_TRUE;
config_b.video_params.max_width = 320;
config_b.video_params.max_height = 240;
config_b.main_audio_params.audio_flag = CRI_TRUE;
config_b.main_audio_params.sampling_rate = 480000;
/* 再生用ワークの計算と確保 */
ply_work_size = criManaPlayer_CalculatePlaybackWorkSize(mana, &config_b, NULL);
ply_work = malloc(ply_work_size);
criManaPlayer_SetPlaybackWork(mana, &config_b, NULL, ply_work, ply_work_size);
/* (必要なら)再生オプションの設定 */
criManaPlayer_SetAudioTrack(mana, AUDIO_TRACK_NO);
/* ムービー指定と再生開始 */
criManaPlayer_SetNativeFile(mana, FILE_PATH);
CriManaPlayerHn criManaPlayer_Create(void *work, CriSint32 work_size)
Manaプレーヤーの作成(コンフィグ指定なし)
void criManaPlayer_Start(CriManaPlayerHn player)
再生開始
CriSint32 criManaPlayer_CalculatePlaybackWorkSize(CriManaPlayerHn player, const CriManaPlaybackBasicWorkConfig *config_basic, const CriManaPlaybackExWorkConfig *config_ex)
再生用ワーク領域のサイズ計算
void criManaPlayer_SetPlaybackWork(CriManaPlayerHn player, const CriManaPlaybackBasicWorkConfig *config_basic, const CriManaPlaybackExWorkConfig *config_ex, void *work, CriSint32 work_size)
再生ワーク領域の設定
CriManaPlayerObj * CriManaPlayerHn
プレーヤーハンドル
Definition: cri_mana.h:802
void criManaPlayer_SetAudioTrack(CriManaPlayerHn player, CriSint32 track)
メインオーディオトラック番号の設定
CriSint32 output_buffer_samples
Definition: cri_mana.h:902
CriUint32 num_channels
Definition: cri_mana.h:898
CriUint32 sampling_rate
Definition: cri_mana.h:894
CriBool audio_flag
Definition: cri_mana.h:890
再生ワーク用パラメーター構造体 (基本)
Definition: cri_mana.h:980
CriManaPlaybackCommonParams common_params
Definition: cri_mana.h:983
CriManaPlaybackAudioParams main_audio_params
Definition: cri_mana.h:991
CriManaPlaybackVideoParams video_params
Definition: cri_mana.h:987
CriSint32 readbuf_size_byte
Definition: cri_mana.h:820
CriBool video_flag
Definition: cri_mana.h:842
CriSint32 max_width
Definition: cri_mana.h:846
CriSint32 max_height
Definition: cri_mana.h:850
CriSint32 num_frame_pools
Definition: cri_mana.h:854

なお、Sofdec1 でメモリ関数を登録して利用していた場合は、Sofdec2でもメモリ関数の登録を利用するのが簡単です。

フレームの取得と描画

Sofdec1 では、フレーム取得関数が成功する=フレーム表示時刻になっている、という条件でした。
Sofdec2 では、デコード結果の参照と表示時刻の判定が別関数になりました。 Sofdec1の方式ではフレーム取得に失敗した場合の原因がわかりにくかったためです。 大きな処理の流れ自体は Sofdec1 と変わりません。
※フレーム取得手順の詳細については、 ビデオフレームの取得と表示について を参照してください。