English
MOVIE TOOLS GUIDECinepak for SEGASaturn
戻る進む
Cinepak for SEGASaturn/4.Cinepakライブラリ

4.3 プログラミング上の注意事項

 Cinepakライブラリを使ってムービを再生するときの注意事項を次に示します。

(1)アプリケーション作成上の注意

(2)他ライブラリとの関係

(3)バッファの取り方

(4)クロマキー処理

(5)シームレスブランチ

(6)マルチムービ再生

(7)指定フレームの展開

(8)関数使用

(9)エラー処理

 ムービ再生中に、ファイルシステム,またはストリームシステムでエラーが発生すると、それ以降ムービの再生が継続できません。この場合はムービハンドルを消去しファイルをクローズしてください。その後、再度ムービを再生するなどの処理を行ってください。
 各エラー処理関数 GFS_SetErrFunc, STM_SetErrFunc, CPK_SetErrFunc は必ず設定し、エラー検出をしてください。デバッグ効率も向上します。

(10)SCU-DMA使用の注意

 CDブロックからリングバッファへのデータ転送をSCUのDMAで行う場合、ペリフェラル情報が正しく得られなくなることがあります。
 この場合、最大転送セクタ数(デフォルト値 20)を小さく設定することで改善できますが、小さい設定をした場合、それに見合う十分な頻度でタスク関数をコールする必要があります。

[処理例]
CPK_SetTrModeCd(cpk, CPK_TRMODE_SCU);  /* SCU-DMAで転送する         */
CPK_SetLoadNum(cpk, 10);               /* 1回の転送量の最大値 [セクタ] */

 また、SCU-DMAで転送中は、使用するバスが占有されるので、SHはCPUバスをアクセスしようとしたときからウエイト状態になってしまいます。SCU-DMAは、極力使用しないでください。

(11)次ハンドルの登録の変更について

 CPK_EntryNext は、切り替わる前に再度コールするれば、前回の登録をキャンセルする仕組みになっています。しかし、切り替わる直前で内部的には次ハンドルの処理が始まっている状態ではこれをキャンセルすることはできません。
 アプリケーションは、次ハンドルの再生ステータスから、この移行期間であることを判断できます。

if (CPK_GetPlayStatus(cpk_now) == CPK_STAT_PLAY_TIME) {
	if (CPK_GetPlayStatus(cpk_next) != CPK_STAT_PLAY_STOP) {

		/* 今は次ハンドルへの移行期間中だから、決して   */
		/* CPK_EntryNext をコールしてはならない。       */

	} else {

		/* まだ、次ハンドルの処理が始まっていないので   */
		/* 次ハンドルの登録を変更することが可能。       */
		/*【注意】を参照してください。           */

	}
} else {

	/* すでに、登録していたハンドルに切り替わっている。 */
	/* 次ハンドルの登録をすることが可能。               */

}

 次ハンドルへの移行期間中に、目的のハンドルを再生させるには、2つの方法が考えられます。

  1. 移行期間中でもシームレスを保つ方法
     この状況で、シームレスで画面を静止させることなく切り替えるためには、次ハンドルの再生が始まるのを待ち、CPK_EntryNext して、さらに CPK_CheckChange でデータが十分供給されてきたことを確認し, CPK_Change で切り替えます。

  2. 移行期間中に強制的に切り替える方法  シームレスの必要がなければ、再生中ハンドルと次ハンドルを停止(消去)し、再生したいハンドルを CPK_Start で、または CPK_EntryNext と CPK_Change で再生開始させます。

【注意】
 切り替えがシームレスに行えるか否かは、次のハンドルのデータを読むためのシーク時間などに影響されるので、シネパックライブラリが保証することはできません。
 上の判断処理例で「まだ、次ハンドルの処理が始まっていないので、次ハンドルの登録を変更することが可能。」と言っているのは、シネパックライブラリの使い方としては問題ないという意味であって、この判断基準では、シームレスにならない場合があります。

 登録の変更のときに完全なシームレスを保つには、「現在再中のハンドルに備蓄されたデータの残り再生時間を見積もり、これより短い時間でシークとリードができること」を確認します。できなければ登録の変更を行わず、ハンドルが移行するのを待ち、 (1.)の方法で切り替えます。
 この判断を厳密に行うことは困難ですが、CPK_GetStockSize や CPK_GetStockTime で備蓄量を見積ることができるし、シークとリード時間は最悪の時間を想定しておけば安全になります。

(12)フレームサイズと、Cinepak の圧縮方式の関係

 Cinepak は、フレームサイズ(面積)に応じて、1フレームを1から3つに分割して圧縮処理を行います。
 分割される条件の前後では、内部的な圧縮効率と画質が不連続になり、以下のような傾向があると考えられます。

 正確な分割条件は不明ですが、確認した範囲を次に示します。

面積 [pixel]
フレーム分割数(タイル数)
96000 = 480×200 以上
95744 = 352×272 以下
59904 = 208×288 以上
57344 = 256×224 以下

(分割しない)
シネパックライブラリが対応しているのは、2分割以下です。

(13)画像伸張処理の効率

 画像伸張処理は、直接 VRAM に出力するより、WORK RAM-H に出力する方が効率が良いので、この方がタスク関数は高速に動作します。
 一端 WORK RAM-H に出力して SCU-DMA で VRAM に転送した方が、転送時間を加えても短い処理時間になります。

(14)非圧縮ビデオ対応

  1. 概要
     24ビット非圧縮のムービーを再生できるようになりました。画像サイズやフレームレートを抑え、画質を優先させたい場合に利用します。
     15ビット色のムービーには対応していません、24ビットのデータの3万2千色表示には対応していますが、クオリティの高いデータを無駄にすることになります。
     非圧縮の QuickTime Movie を MovieToSaturn_J でコンバートします。非圧縮ムービーの再生のために追加された関数はいっさいありません。ファイルヘッダを解釈して処理するので、全く同じ手続きで再生できます。ただし、リングバッファだけは圧縮した場合より大きく確保しなければなりません。

  2. リングバッファサイズ
     リングバッファは次の条件を満たすように確保する必要があります。

    ring ≧ header + sound + frame

     ring :リングバッファサイズ  header :ファイルヘッダサイズ(セクタサイズバウンダリに切り上げ換算)  sound :サウンド0.5秒分のサイズ  frame :1フレーム非圧縮サイズ

  3. 動画性能
     CDからのデータ転送レートから、次に示す程度の動画性能になります。
    オーディオの条件限界動画性能
    44kHz, 16bit, ステレオ
    320×224[dot] 0.60[fps]
    22kHz,  8bit, モノラル
    320×224[dot] 1.32[fps]
    ビデオのみムービー
    320×224[dot] 1.42[fps]
    ビデオのみムービー
    160×112[dot] 5.71[fps]

(15)デバッグ用実行履歴出力

 シネパックライブラリの主要な処理の実行履歴を出力します。
 スムーズに再生できないなどの動作不良がある場合、原因究明に役立ちます。
 タスクのコールを定期的に行っているか、データの供給が滞っていないか、コマ落ちが発生していないかなどを調べることができます。
 動作不良の再現性を確認してから、よりシンプルな実行履歴を作ったほうが履歴の解析か容易になります。

[履歴を出力するシネパックライブラリの内部処理]
 エラー発生時,タスク関数のコール時,リングバッファデータ供給時と消費時,表示要求フラグのON/OFF時,コマ落とし処理,PCMスタート/ストップ

[出力の指定]
・本番用のプログラムをそのまま使用する場合
 CPK_Init の処理後にブレークします。
 リンク時に作成されるマップファイルで、CpkdSys 型の構造体 cpkd_sys のアドレスを調べ、ICE のコマンドで、cpkd_sys.mode の値を 0x00000001 に設定してください。

 :m 060XXXXX 1;l

 出力アドレスは、0x04000000 〜 0x047fffff になります。

・デバッグ出力するプログラムを作成する場合  CPK_Init のあとで CPKD_SetMode(ON) とします。
 CPKD_SetPrintAddr により、出力アドレスの設定ができます。
 CPKD_PrintStr 及び CPKD_PrintData により、アプリ側の処理の実行履歴を追加して出力することが可能です。追加出力する場合、履歴情報を読みやすくするために出力するサイズは16byteの整数倍にしてください。

[出力情報の確認]
 出力アドレスを ICE のコマンドでダンプ表示します。表示内容をテキストファイルとして保存し、テキストエディタで見ると、動作の解析が容易になります。

 :> hist.txt [RET]
 :d 04000000 04001000;l [RET]
 :>- [RET]

[出力情報のフォーマット]
========+============================================+
ADDRESS : 0 1  2 3   4 5  6 7   8 9  A B   C D  E F  :
========+============================================+
04000000: AAAA_AAAA  ---- ----  ---- ----  ---- ---- :
04000010: "Err "     ---- VVVV  ---- ----  EEEE_EEEE : Error 
04000020: "Task"     PPPP VVVV  HHHH_HHHH  CCCC_CCCC : start of CPK_MeTask
04000030: "RWri"     WWWW VVVV  HHHH_HHHH  DDDD_DDDD : WRIte Ringbuffer
04000040: "RRea"     RRRR VVVV  HHHH_HHHH  DDDD_DDDD : REAd Ringbuffer
04000050: "DOn "     FFFF VVVV  LLLL_LLLL  TTTT_TTTT : set Disp flag On
04000060: "DOff"     FFFF VVVV  HHHH_HHHH  TTTT_TTTT : set Disp flag Off
04000070: "PcmS"     MODE VVVV  HHHH_HHHH  ADDR SIZE : PCM Start
04000080: "PcmE"     MODE VVVV  HHHH_HHHH  ---- ---- : PCM Stop
04000090: "LosF"     FFFF VVVV  LFLF_LFLF  SSSS_SSSS : LOse Frame
        :
        :

[出力情報の内容説明]
AAAA_AAAA : 現在の履歴情報出力アドレス。
---- VVVV : Vblカウンタ。おおよその時刻がわかる。
EEEE_EEEE : エラーコード。
PPPP ---- : 再生ステータス [-1, 0, 1, 2, 3, 4, 5]。
HHHH_HHHH : シネパックハンドル。
CCCC_CCCC : シネパックタスクコールカウンタ。
DDDD_DDDD : リングバッファのデータの残量 [byte]。供給が滞ってないかわかる。
WWWW ---- : リングバッファへの書き込みサイズ [sector]。
RRRR ---- : リングバッファからの読み取りサイズ [byte]。
FFFF ---- : フレーム番号。
LLLL_LLLL : 遅延時間。(現在時刻 − フレーム表示時刻)
TTTT_TTTT : フレーム時刻。(フレーム表示時刻 + フレーム表示持続時間)
LFLF_LFLF : コマ落ちカウンタ。
SSSS_SSSS : サンプルカウンタ。
MODE ---- : 0x80##:ステレオ,0x10##:8bit,0x##03:PCMストリーム再生番号3
             (PCM Stop の場合は、PCMストリーム再生番号だけ表示)
ADDR ---- : PCMバッファスタートアドレス(4bit右シフト値)
SIZE ---- : PCMバッファサイズ [sample/1ch]


戻る進む
MOVIE TOOLS GUIDECinepak for SEGASaturn
Copyright SEGA ENTERPRISES, LTD,. 1997