シネパックデータを任意の位置から再生することは可能か?
可能ならどういった方法で行えるのか。
音だけの(画像データを持たない)シネパックデータでもそれは可能か?
の2点に関して教えてください。
シネパックデータを任意の位置から再生する方法は、メモリ上にある場合で かつ、音はなく、かつすべてキーフレームである条件で可能です。
できません。
1つ目は、CPK_Pause関数にはVer1.10以降戻り値を返すようにしており、 正しくPauseできない場合、エラーコードを出力するようになっています。
TRUE | :コマンドが受け付けられた |
FALSE | :コマンドは受け付けられなかった |
上記のエラーコードを必ずチェックするようにしてください。
2つ目は、ムービーの変わり目でこのCPK_Pause関数を実行すると、関数内では
変わり目が判断できないので、1つ目のチェックを行っても同現象がおこる
可能性があります。
CPK_Pause関数を実行する前に行う処理については Cinepakユーザーズマニュアルの「(11) 次ハンドルの登録の変更について」を
参照してください。
Movie2 が登録されている状態でポーズをかける時、Movie1 と Movie2 の 両方にたいして CPK_Pause 関数を呼んでいるのですが、Movie1 を再生中 (Movie2 が再生される前)にポーズをかけると、Movie1 は TRUE を返し、 Movie2 はまだ再生してないため FALSE を返すのですが、正しくポーズ できたかを判断するには、どの様な処理をすればよいのでしょうか。
そして、CPK_EntryNextを実行した場合は、CPK_EntryNext関数の次のハンドルの 移行期間をチェックして、確実にMovie2がplay状態になるまで、CPK_Pause関数を 実行しないでください。
また、シネパックの再生で、"FLOP"初期値が小さすぎるといったエラー (エラーコード0x301)が発生したのですが、"FLOP"とは何でしょうか。 また大きくするにはどうすればよいのでしょうか。
このエラーコードが出力されるケースとして、
CPK_SetPanという関数がありますがこれはいわゆる、左右のバランスに 当たります。従ってシネパックのサウンドのステレオ/モノラルにするものでは ありません。
例えば、A、B、C、3つのムービーをシームレスで再生する際、AとCを同じバッファで 共有できないのでしょうか。
(PALは1/60から1/50にV-Blankの回数が減っているので、単純に
増やしてみる)
(アプリケーションでSlave CPUを使用していると、Cinepakライブラリが
誤動作する可能性があります。)
の2つが考えられます。
今回のトラブルの場合、(1)の対応でクリアする可能性が
あります。実際1/60から1/50への変更(NTSCからPALへの)でタイミングの違いに
よって御社のような症状がでています。
プログラム変更による対応としてグラフィックスの転送タイミングや転送方法の を変更することが考えられます。
その他はデータをPAL用に修正して対応することが考えられ、修正方法としては コマ落としやキーフレームを変更(30〜25など)することが考えられます。
> /* ムービ開始 */ > CPK_Start( cpk[0] ) ; > > /* 次に再生するムービの登録 */ > for ( i = 1 ; i < FILE_MAX ; i++ ) > { > CPK_EntryNext( cpk[i] ) ; > }
と、いったようにするのではないようですので、2番目のムービーが再生開始した ら登録する場合、1番目のムービー終了を検知し、その後 CPK_EntryNext を発行するといった動作になるのでしょうか?
各エラー処理関数 GFS_SetErrFunc、STM_SetErrFunc、CPK_SetErrFunc は必ず 設定し、エラー検出をしてください。デバッグ効率も向上します。
CPK_SetTrModeCd(cpk, CPK_TRMODE_SCU); /* SCU-DMAで転送する */ CPK_SetLoadNum(cpk, 10); /* 1回の転送量の最大値 [sector]*/
また、SCU-DMAで転送中は使用するバスが占有されるので、SH2はCPUバスを
アクセスしようとしたときからウエイト状態になってしまいます。
SCU-DMAは、極力使用しないでください。
分割される条件の前後では、内部的な圧縮効率と画質が不連続になり、 以下のような傾向があると考えられます。
正確な分割条件は不明ですが、確認した範囲を次に示します。
面積 [pixel] | フレーム分割数(タイル数) |
---|---|
96000 = 480×200 以上 | 3 |
95744 = 352×272 以下 59904 = 208×288 以上 | 2 |
57344 = 256×224 以下 | 1 (分割しない) |
15ビット色のムービーには対応していません。24ビットのデータの 32K色表示には対応していますが、クオリティの高いデータを無駄にする ことになります。
非圧縮の QuickTime Movie を MovieToSaturn_J でコンバートします。
非圧縮ムービーの再生のために追加された関数はいっさいありません。
ファイルヘッダを解釈して処理するので、全く同じ手続きで再生できます。
ただし、リングバッファだけは圧縮した場合より大きく確保しなければ
なりません。
オーディオの条件 | 限界動画性能 |
---|---|
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] |
動作不良の再現性を確認してから、よりシンプルな実行履歴を作ったほうが
履歴の解析か容易になります。
なお、この機能はSIMM領域に対して結果を出力します。したがって、
SIMMのささらないCartDev + DevSaturnでは動作しません。
その場合、
SIMMの使えるタイプのバッファカードを別途購入する必要があります。
CPK_Init の処理後にブレークします。リンク時に作成される
マップファイルで、CpkdSys 型の構造体 cpkd_sys のアドレスを調べ、
デバッガのコマンドでcpkd_sys.mode の値を 0x00000001 に
設定してください。
例. E7000/EVAボードのコマンドラインからの操作
:m 060XXXXX 1;l
出力アドレスは、0x04000000 〜 0x047fffff になります。
(Programming BoxのSW2-5<SIMMCART>をOFFにしてください。)
CPK_Init のあとで CPKD_SetMode(ON) とします。CPKD_SetPrintAddr
により、出力アドレスの設定ができます。CPKD_PrintStr 及び
CPKD_PrintDataにより、アプリ側の処理の実行履歴を追加して出力する
ことが可能です。
追加出力する場合、履歴情報を読みやすくするために出力するサイズは 164byteの整数倍にしてください。
:> 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 : :
通常、市販のアプリケーションは最大精度の1/600秒を使用します。
Author EditorもTimeScaleを600と想定して動画を扱います。
ただし、
Adobe Premiereなどアプリケーションによっては必ずしもTimeScaleを600と
固定していません。
従って、でき上がったムービーが、TimeScaleを600として扱っていない場合、
再生時間(QuickTimeでは DurationTimeと呼んでいる)が違って見えます。
(但し、再生にはなんら影響はありません。)
下に例を示します。
TimeScale | TimeCode | DurationTime | ||
---|---|---|---|---|
1. | 600 | 00:00:30:00 | 18000 | 通常のムービー |
2. | 30 | 00:00:30:00 | 900 | TimeScaleが30のムービー |
3. | 20 | 00:00:30:00 | 600 | TimeScaleが20のムービー |
よって、本来は30秒の再生時間を1.5秒と勘違いしてしまいます。
さらにDuration, Track Dur, sampDurを TimeScaleの変更と整合が 取れるように直します。(これらも複数あるものはすべて直す)修正が 終わったらSaveして終了します。
その外の圧縮ツール(MovieConverter, ConvertToMovie, Movie Conversion, MovieShop, CoSA AfterEffects等)では確認した限りでは 600の値を必ず 示していました。
従って、どうしてもPremiereを使わなければいけないという必然性が なければその外の圧縮ツールを使って本障害を回避するのが一番よい方法 でしょう。