BBRK 08-10-31


TD3D & PgcEdit で DVDオーサリング  

[分類] ビデコ(笑)

# ほっとんどの人には興味ないネタだと思いますので、スルーしちゃってください(苦笑)

突然ですが(笑)、撮影したイベントビデオを DVD-Videoにまとめるのに、ペガシス のオーサリングツール「TMPGEnc DVD Author 3 with DivX Authoring」(略称: TD3D)を使ってます。

所有している DVDレコーダ(東芝 RD-XS43)でも DVD-Videoを作ることは出来ますが、メニューのパターンが 1種類だけしかなく、1画面にサムネイル付きで 6個のタイトルまたはチャプターを置くことしかできないんですね。
出場者が多く、チャプター数が 90くらいになってしまうような発表会を撮ることがたまにあるのですが(苦笑)、チャプターをメニューに出してしまうと、15ページ構成という、ページめくりしまくりなメニューになってしまって一覧性も操作性も悪くなってしまいます。
これが我慢できないので、このソフトを購入し、一覧性の良いメニュー(単に出演者名がリスト表示されるだけ(笑))を作って DVD-Videoにしていたりします。

TD3D はいろいろいじれて、思い通りのものを作れたりするのですが、不満点が一つだけあります。
それは、あるチャプター再生中に DVDプレイヤーの「メニューボタン」を押したときに、いま再生していたチャプターにハイライト(カーソル)が当たった状態でメニューが表示されない…ということなんですな。
DVDレコーダでは実現できているので、当然 TD3D でもそうなると思っていたのですが、実際は違いました(苦笑)
TD3D ではどうなるのかというと、再生状態に関係なく常に 1ページ目の「ALL PLAY」のボタンにハイライトが当たった状態でメニューが表示されます。
チャプター名をたよりに連続していない複数のチャプターをチェックするときには、これが出来ないと不便でしょうがないんですな。

で、ネットを検索したところ、DVD-Videoを構成するファイルのうち *.IFO ファイルに書かれているプログラムを PgcEdit というフリーソフトを使って書き換えればいいということが判明、ここ数日は研究の毎日だったのですが、ようやく答えを導くことが出来ましたので、自分の備忘録のために記事にしておきます(笑)

TD3D が吐き出すコードを PgcEdit で解析してみました(…って、簡単に書いてますけど、何の知識も無いところからスタートしたワケでして、このレベルに来るまでにはかなりの時間が掛かってます(苦笑))。

例として、トラック 1つ、その中をチャプターで分けているようなサンプルの場合、フローは こんな感じ になってます。
かなり端折って書いてます。例えば、ページを戻る方向のボタンとか書いてないですし、各ページにはチャプターが 2つしか書いてないですが実際のサンプルには 22コあります。

知っておかねばならないことは、
・タイトルメニューボタンを押すと、VMGMタイトルメニューに飛ぶ。
・ルートメニューボタンを押すと、現在のタイトル(VTS)のVTSM Root メニューに飛ぶ。
ということです。

さて、ここからは、具体的な修正の説明になります。
プレーヤ共通の仕様として、再生中にルートメニューボタンを押すと VTSM RootM(フロー図の「VTSM1, LU(1) RootM」)に飛びますが、TD3D のオーサリングでは、そこで何の条件判断もしておらず、常にチャプターメニュー 1ページ目の「PLAY」ボタンをハイライト表示するような作りになっています(正確に書くと、「PLAY」ボタンがハイライトするように変数を設定したのちに、チャプターメニュー 1ページ目を表示する処理に飛ぶ)。

そこで、VTSM RootM の処理を次のように変更します。
現在再生してるチャプター番号を元にして、
・表示するチャプターメニューページを切り替える
・ハイライトするボタンも対応するチャプターに変更する

ここから、いきなり具体的で詳細な記述になります(苦笑)

「VTSM 1 , LU 1 (--) , 1 (dummy) RootM - チャプター: なし, プログラム: 0, セル: 0」の中身を次のように変更します。

変更前

VTSM 1 , LU 1 (--) , 1  (dummy)  RootM - チャプター: なし,  プログラム: 0,  セル: 0
********** pre commands:
 1  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
 2  Set gprm(1) &=(and) 15
 3  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
 4  Set gprm(2) &=(and) 127
 5  Set gprm(3) =(mov) gprm(2)
 6  Set gprm(3) &=(and) 64
 7  Set gprm(11) =(mov) 25600 ; LinkPGCN PGC 4
********** post commands:
********** cell commands:

変更後

VTSM 1 , LU 1 (--) , 1  (dummy)  RootM - チャプター: なし,  プログラム: 0,  セル: 0
********** pre commands:
 1  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
 2  Set gprm(1) &=(and) 15
 3  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
 4  Set gprm(2) &=(and) 127
 5  Set gprm(3) =(mov) gprm(2)
 6  Set gprm(3) &=(and) 64
 7  if ( gprm(6) != 0 ) then { Goto line 9 }
 8  Set gprm(11) =(mov) 25600 ; LinkPGCN PGC 4
 9  Set gprm(7) =(mov) sprm(7:チャプターまたはプログラム ナンバー)
10  Set gprm(5) =(mov) gprm(7)
11  Set gprm(5) -=(sub) 1
12  Set gprm(5) /=(div) 22
13  Set gprm(11) =(mov) gprm(7)
14  Set gprm(11) -=(sub) 1
15  Set gprm(11) %=(mod) 22
16  Set gprm(11) +=(add) 1
17  Set gprm(11) *=(mul) 1024
18  if ( gprm(5) == 0 ) then { LinkPGCN PGC 4 }
19  if ( gprm(5) == 1 ) then { LinkPGCN PGC 31 }
20  if ( gprm(5) == 2 ) then { LinkPGCN PGC 57 }
21  if ( gprm(5) == 3 ) then { LinkPGCN PGC 82 }
********** post commands:
********** cell commands:

変更したのは 7行目以降。

gprm変数の内容は次の通り。
gprm(5) : 表示させるべきチャプターメニューページ番号-1
gprm(6) : 再生後のメニュー呼び出しかどうか。0:No、1:Yes
gprm(7) : RootMに来たときのチャプター値を保持
gprm(11) : ハイライトボタン情報

TD3D のオーサリングでは、gprm変数のうち 4〜10 は、初期化しただけで使用していなかったので、今回の修正では上記のように使いました。

gprm(11)ですが、ここにハイライトボタン情報をセットして各ページ表示処理にジャンプすると、指定されたボタンがハイライトされるように作ってあるので、それを利用しています。

表示するメニューページ番号は、( ( chap - 1 ) / 22 ) + 1 で算出できます。
ハイライトすべきボタン番号は、( ( chap - 1 ) mod 22 ) + 1 で算出できます。

なお、1ページに表示するチャプター数を変えた場合、上の式の 22 を変更すれば OK。

さて、以上の修正でメニューページの切り替えやチャプターボタンのハイライトはうまくいきますが、もうひとつ小細工が必要なことがわかりました。
どうやら、現在再生しているチャプターの番号が得られるレジスタ sprm(7) は、ディスクローディング時にプレーヤが 1に初期化するようです。
つまり、ディスクを入れてメニューが表示されるときには、再生もしていないのにチャプター1 がハイライトされてしまいます。ディスクを入れたときは、「PLAY」ボタンがハイライトされて欲しいので、工夫が必要になります。

いろんな方法が考えられると思いますが、フラグ(今回の例では gprm(6))を用意し、ディスク挿入時にそれをクリアし、再生を開始したらセットするようにしてみました。
ディスク挿入時にのみ実行される「First-Play PGC」には既にクリアする処理が書いてあるので、再生開始時に値を 1にする処理を追加するだけで済みます。

「VTST 1 , 1 TTN 1 (1:42:43) Title 1 - チャプター: 87, プログラム: 87, セル: 88」の中身を次のように変更します。

変更前

VTST 1 , 1   TTN 1  (1:42:43)  Title 1 - チャプター: 87,  プログラム: 87,  セル: 88
********** pre commands:
 1  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
 2  if ( gprm(15) == 0 ) then { Goto line 4 }
 3  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) 0 }
 4  Set gprm(0) =(mov) gprm(12)
 5  Set gprm(0) &=(and) 3840
 6  Set gprm(0) /=(div) 256
 7  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
 8  Set gprm(1) &=(and) 15
 9  if ( gprm(1) < 0 ) then { Set gprm(1) =(mov) 0 }
10  if ( gprm(1) > 0 ) then { Set gprm(1) =(mov) 0 }
11  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
12  Set gprm(0) =(mov) gprm(12)
13  Set gprm(0) &=(and) 127
14  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
15  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
16  Set gprm(12) =(mov) 0
17  Set gprm(15) =(mov) 32768
********** post commands:
 1  if ( gprm(14) & gprm(14) ) then { (CallSS) Call the VMGM PGC 4, resume cell 1 }
 2  Set gprm(14) =(mov) 0
 3  Set gprm(13) =(mov) 0
 4  Set gprm(12) =(mov) 0
 5  Set gprm(11) =(mov) 0
 6  (CallSS) Call the VTSM Root menu of the current VTS, resume cell 1
********** cell commands:

変更後

VTST 1 , 1   TTN 1  (1:42:43)  Title 1 - チャプター: 87,  プログラム: 87,  セル: 88
********** pre commands:
 1  Set gprm(6) =(mov) 1
 2  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
 3  if ( gprm(15) == 0 ) then { Goto line 5 }
 4  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) 0 }
 5  Set gprm(0) =(mov) gprm(12)
 6  Set gprm(0) &=(and) 3840
 7  Set gprm(0) /=(div) 256
 8  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
 9  Set gprm(1) &=(and) 15
10  if ( gprm(1) < 0 ) then { Set gprm(1) =(mov) 0 }
11  if ( gprm(1) > 0 ) then { Set gprm(1) =(mov) 0 }
12  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
13  Set gprm(0) =(mov) gprm(12)
14  Set gprm(0) &=(and) 127
15  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
16  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
17  Set gprm(12) =(mov) 0
18  Set gprm(15) =(mov) 32768
********** post commands:
 1  Set gprm(6) =(mov) 0
 2  if ( gprm(14) & gprm(14) ) then { (CallSS) Call the VMGM PGC 4, resume cell 1 }
 3  Set gprm(14) =(mov) 0
 4  Set gprm(13) =(mov) 0
 5  Set gprm(12) =(mov) 0
 6  Set gprm(11) =(mov) 0
 7  (CallSS) Call the VTSM Root menu of the current VTS, resume cell 1
********** cell commands:

修正は二ヶ所、pre commands の 1行目と、post commands の 1行目を追加です。
post commands の追加は、映像を最後まで再生後メニューが自動表示されるときに、1ページ目の「ALL PLAY」のボタンにハイライトが当たった状態にさせるためです。

PgcEdit は、コマンドを挿入して行番号が変化したりすると Goto の飛び先も自動的に修正してくれるので便利です。

参考までに、修正前後の コマンドをテキスト化したもの を Up しておきます。

てなわけで、長々と書きましたが、以上で、所望の動きをするようになりました。めでたしめでたし(笑)

なお、ページあたり表示するチャプター数やページの数が異なる場合は、次のポイントを合うように変更してください。
VTSM1 RootM
・12,15行目の 22 をページあたり表示するチャプター数に変更。
・18〜21行目の if 文をページ数に合うように増減する。
・18〜21行目のジャンプ先(PGC 4,31,57)を TD3D が割り当てた PGC番号に合うように変更。

■関連URL
PgcEdit(本家)
PgcEdit(日本語版)
PgcEditで編集DVD焼焼き別館
DVDFreedom

+   +   +   +   +

略称 TD3D について。
メーカーが使用していた「TMPGEnc DVD Author 3 with DivX Authoring」の略称は、以前は TDA3D でしたが、後継バージョンである「TMPGEnc Authoring Works 4」(略称: TAW4)がリリースされてからは、TD3D に変更になったようです。


BBRK に戻る