CRI Sofdec  Last Updated: 2024-09-25 20:36 p
ビデオフレームの取得と表示について

Sofdec でビデオフレームを取得して表示する際の処理の流れについて説明します。

ビデオフレームの取得と描画の切り分け

Sofdec ライブラリはビデオフレームの描画処理は一切行いません。
表示すべきビデオフレームをデコードしてメインメモリに展開するだけです。
これにより、アプリケーションはムービーをフル画面に表示したり、テクスチャに貼り付けたりといった自由な描画を行うことが出来ます。

ムービーのスムーズな再生を行うためには、アプリケーションがメインループから定期的に(毎Vsync)ビデオフレームの取得処理を行って、 表示時刻になったビデオフレームは即座に表示する必要があります。
メインループが定期的に動いてさえいれば、PAL/NTSCの画面更新周期の違いやムービーのフレームレートの違いによって、アプリケーションが 描画タイミングを調整する必要はありません。

ビデオフレームの取得と時刻判定

Sofdec のビデオフレーム取得は次の手順で行ってください。

Sofdec のビデオフレーム取得手順
手順 説明
(1) デコード結果の参照
criManaPlayer_ReferFrame
新しいデコード結果があれば表示時刻とは無関係に参照に成功します。
(2) 表示時刻の判定
criManaPlayer_IsFrameOnTime
参照に成功したフレーム情報を指定して、そのフレームが表示時刻になっているかを確認します。
表示時刻になっていた場合は、すみやかに表示処理を行ってください。
(3) デコード結果の変換/コピー
criManaPlayer_CopyFrame*****
描画にしようしたフォーマットにデコード結果を変換します。ピクセルシェーダーを使用する場合はYUVそれぞれのテクスチャ領域へのコピーを行います。この変換結果は次のフレームが取得できるまで描画を継続できるように、内容を保持してください。
(4) 変換済みビデオフレームの破棄
criManaPlayer_DiscardFrame
描画用の変換が終わったフレームを破棄します。破棄しない限り、次の新しいフレームは取得できません。
CriManaFrameInfo frame_info;
/* (1) デコード済みのフレームがあるか? */
if (criManaPlayer_ReferFrame(mana, &frame_info) == CRI_TRUE) {
/* (2) フレームが表示時刻になっているか? */
if (criManaPlayer_IsFrameOnTime(mana, &frame_info) == CRI_TRUE) {
/* (3) デコード結果をテクスチャ形式に変換 */
criManaPlayer_CopyFrameToBufferARGB32(mana, &frame_info, &texbuf);
/* (4) 変換済みフレームの破棄 */
criManaPlayer_DiscardFrame(mana, &frame_info);
}
}
CriBool criManaPlayer_IsFrameOnTime(CriManaPlayerHn player, const CriManaFrameInfo *frame_info)
フレームの時刻判定
void criManaPlayer_CopyFrameToBufferARGB32(CriManaPlayerHn player, const CriManaFrameInfo *frame_info, CriManaTextureBuffer *frame_buf)
デコード結果の取得 (32bit ARGB形式)
void criManaPlayer_DiscardFrame(CriManaPlayerHn player, const CriManaFrameInfo *frame_info)
フレームの解放
CriBool criManaPlayer_ReferFrame(CriManaPlayerHn player, CriManaFrameInfo *frame_info)
デコード済みのフレーム情報の参照
ビデオフレーム情報
Definition: cri_mana.h:1364

なお、(2)の表示時刻判定は、アプリケーションが表示タイミングを管理する場合は呼び出す必要はありません。
何らかの理由で取得したフレームを表示せずに破棄したい場合は、処理(3)を省略して、いきなりフレームを破棄してください。
本マニュアルではこの処理を「表示スキップ」と呼びます。

参考: 表示スキップが必要になる場合

例えば以下のような場合には、目的の再生速度に合わせたフレーム表示を行うために表示スキップが必要になります。
なお表示スキップを行う際はデコード済みフレームを多く貯める必要があるため、フレームプール数を大きい値に設定する必要があります。

  • アプリケーションのfpsより高いfpsのムービーのフレームを、通常の再生速度で表示しなければいけない場合(*1)
  • デコードスキップ機能を使用せずに、早回しでフレームを表示したい場合(*2)

    【補足】
    (*1): 原則は アプリケーションの描画レート >= 動画のフレームレート になるようにムービーを作成・再生してください。詳細はツールマニュアルの「素材の準備 > 動画素材について > 動画のフレームレートについて」のページをご確認ください。
    (*2): 詳細は「再生速度の変更 > 早回し時の条件」のページを参照して下さい。

ビデオ出力フォーマット

Sofdec ライブラリのデコード結果は、YUV420形式の独自フォーマットで保持されています。
デコード結果を描画するためには、テクスチャフォーマットやシェーダーの入力に適した形式へ変換/コピーを行う必要があります。

サポートしている出力フォーマットは、プラットフォームごとに異なります。
主な例としては以下のようなものがあります。

  • 32bit ARGB テクスチャフォーマット
  • YUV個別バッファーフォーマット(PixelShader用)

実際に使用可能な出力フォーマットについては機種固有マニュアルを参照してください。