PC-6001で動画再生

  • 投稿日:
  • 更新日:2015/02/09
  • by
  • カテゴリ:
SDカードの大容量とせっかく作ったSD-OSを生かしたアプリケーションとして、 動画再生を試してみました。名づけて、Pico Movie(ベタベタ)。
1. 現在のバージョン

とりあえずBELUGAのカートリッジを利用していますが、 RAMのみで動作させることも可能です。 取れるバッファの大きさが変わるので、後述のバーストモードで違いが出ます。 もちろん、SDカードアダプタは必須です。

準備ができ次第、ダウンロード可能にする予定ですので、少々お待ちください。
2. ツール

以下のツールから構成されます。

2.1. 専用エンコーダ(pmvenc)

Windows上でffmpegと一緒に動作させ、 ムービーの独自形式(pmv形式)へのエンコードを行います。

2.2. プレイヤー(pmv)

SD-OSのmp6フォーマット(SD-OSの実行バイナリ)の実行ファイルで、 pmv形式の再生を行います。

3. エンコード

3.1 エンコード方法


サポートしている解像度は以下のとおりで、すべて2色です。

  1. 64x48 (スクリーンモード2)
    % ffmpeg -i <ムービーファイル> -s 64x48 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp -s [-r <fps>] [-t <カットオフ>] -o <pmvファイル>
  2. 128x96
    ffmpeg -i <ムービーファイル> -s 128x96 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp [-r <fps>] [-t <カットオフ>] -o <pmvファイル>
  3. 256x192 (スクリーンモード4)
    % ffmpeg -i <ムービーファイル> -s 256x192 -f image2pipe -vcodec bmp [-ss <再生開始>] [-t <長さ>] [-r <fps>] tmp % pmvenc tmp [-r <fps>] [-t <カットオフ>] -o <pmvファイル>

pmvenc -hでヘルプが出ます。現在プレイヤーではサポートしていないグレイスケールやpbmの出力もおまけでつけてあります。

ポイントはカットオフで、入力されたピクセルの輝度(グレイスケール)がこの数値より大きなもののみビット出力します。 輝度は、入力映像の24ビットRGBの平均値で、0〜255です。 そのため、設定数値が高いほど暗い映像になります。

3.2. 使用例とレポート


エンコードの実際を以下に示します。

% ffmpeg -i source.mpg -s 128x192 -f image2pipe -vcodec bmp -r 15 tmp.bmp
% pmvenc tmp.bmp -r 15 -o movie.pmv
size= 128x 96, 522941 bytes( 27.02%), 1260 frames
bpf= 415.03(max: 1134), fps= 15 white= 37.42%

pmvencの出力は以下を表しています。

  • 解像度が128x96
  • ヘッダ部分(16バイト)を除く映像のエンコード後のサイズが522,941バイト
  • 圧縮率が27.02%(元ファイルに対して27.02%になった)
  • フレーム数が1260
  • 1フレームあたり平均415.03バイト
  • 最大サイズのフレームが1134バイト
  • ヘッダに15fpsを指定
  • white pixelsが全体の37.42%あった

モノクロエンコードによりどのくらいの映像になったかの参考にするため、エンコーダはホワイトレシオをレポートします。

4. 再生
4.1. プレイヤーの実行


あらかじめ、SDカードにpmvコマンドとエンコード済みムービーファイルを入れておきます。
PC-6001起動後、sdコマンドでSD-OSに入り、以下でムービーを再生します。 ちなみに、プログラム内で画面のアトリビュートや表示をムービーファイルや オプション指定に従って完全にコントロールするため、 "How Many Pages?"に対するページ数は何でもかまいません。

% pmv % ex pmv% <pmvファイル> [オプション]

サブディレクトリのpmvファイルを指定する場合は、ex実行前にcdでカレントディレクトリを移動してください。pmvファイル指定時に直接/相対ディレクトリを指定することはできません。

途中で止めるときにはSTOPキーが使えます。再度実行するときは、sdコマンド実行後、以下のようにします。

% ex 6431 pmv% <pmvファイル> [オプション]

4.2. プレイヤーのオプション

オプションは以下の3種類をサポートしています。 対応していないオプション文字を入力しても無視されます。

s (シングルスクリーン指定)
通常、これを指定しなければ2画面使って裏画面に描画するのでより滑らかですが、バッファが21.5kBに減ります.
b (バーストモード指定)
フルバッファモード指定で、指定しないとバッファが満杯になるのを待たず、 画面がロード出来次第再生します。 現在のSDカードアダプタのスピードが遅いので、 これだとロード時間が断続的に発生し、コマ送りのような映像になります。
c (CRT-OFF指定)
常にロード時はDMAを止めます。ロード実行中は画面が乱れますが、 bオプションと一緒に使うことにより、あとで結合編集する際に 「ムービー再生中ではない時間」がわかりやすくなります。
5. 今後の予定

5.1. SDカードドライバ

現在のバージョンのSDカードドライバがスタック領域を大きくとっているため、メモリの有効活用のため、pmvではそのスタックを塗りつぶしてしまいます。 そのため、いったん実行するとSD-OSに戻れなくなっています。 また、再度実行時に開始アドレス(6431)指定が必要です。 これらは、次のバージョンで改善予定です。

5.2. SDカードアダプタ

SDカードアダプタがジョイスティックポートを使っているため、 転送速度に限界があります。 現在、拡張カードにSDカードアダプタを実装するための開発を行っています。 拡張カード上にAVRを乗せ、FATの管理はこちらに任せるという方法をとる予定です。 こうすると、かなりの高速化が期待できます。

5.3. 手っ取り早く安く高速化?

AVRバージョンのアダプタは開発中ですが、拡張カードとして実装するために多少コストが上がります。まぁ、部品代は1000円くらいでしょうが。ただ、ROM/RAMカートリッジと共存させるためにPC-6011拡張ユニットが必要です。これはフロッピーインタフェースを無視すれば簡単に自作可能ですが、それでも面倒ですよね。実際私も持っていませんし...。

そのため、いくつか考え中です。
  • バイト単位I/Oによるストリーミング
  • プリンタポートを使う

まぁ、気長にやります。

6. その他

できれば音楽も一緒に再生したいのですが、 さすがにPSGでのPCM再生を並行して行うのはCPUパワー、 メモリの両方の面からつらいです。 音楽再生はAVRに任せてPC-6001本体と同期を取るようにするのが妥当でしょうかね。

技術情報は別に書きます。

こちらもよく読まれています