BBRK 10-03-26


TAW4 & PgcEdit で DVDオーサリング  

[分類] ビデコ(笑)

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

BBRK 08-10-31「TD3D & PgcEdit で DVDオーサリング」の続編です。

BBRK には書いていませんでしたが、BDオーサリングのために「TMPGEnc Authoring Works 4」(略称 TAW4)を買ったんですな。
TD3D がなかなか使いやすかったので、その後継として出たソフトなので、まぁハズレはないだろうということで(笑)

で、BDオーサリング以外にも進化している部分があって、この記事に関連することだと、「DVD再生中にメニューボタンを押したときに対応するチャプターの位置にハイライトを表示してメニューが立ち上がる機能」が追加になっていました。
DVDレコーダ等では普通に実現できている機能なのですが、なぜか TD3D にはこのようにオーサリングする機能がありませんでした。メニューボタンを押すと、常に 1枚目のメニュー画面のデフォルトの位置(例えば全トラック再生など)にハイライト(カーソル)が表示されてメニューが立ち上がります。

さっそく、この機能を使って(メニュー作成時に機能の ON/OFF が選択できます)DVD-VIDEO を制作してみたのですが、これがいまいちなんですよねぇ…(苦笑)

例えば、ディスクにタイトルは 1つだけ存在し、その中をいくつかのチャプターで切ってあって、トラックメニューがあって、ディスク挿入時と全再生後に自動的にメニューが立ち上がるように作った場合。

(1) ディスクを入れると チャプター1 にハイライトが表示されてメニューが出る
(2) 最後まで再生が終わると最終チャプターにハイライトが表示されてメニューが出る

(1)、(2)どちらのケースも、こちらの希望はチャプター上ではなくて、全再生の PLAYボタン上にハイライトが表示されて欲しいんですよねぇ。

そんなわけで、またしても PgcEdit を使って細工しちゃいました。

TAW4 の吐き出すコードですが、TD3D に比べると複雑になってます。
まともに解析していませんが、字幕処理関係が強化されているようです。
私が作る DVD には字幕ストリームも入っていなけりゃ音声ストリームの切り替えもないので、ほとんどは不要なコードだと思いますが(苦笑)

でもって修正ですが、ソフトウェアが機械的に出力しているコードなので、明らかに不要な部分もあり、それを残しつつ、所望のことをしようとすると効率が悪いので、明らかに不要な部分をカットしてから修正しました。

■RootM の修正

変更前

VTSM 1 , LU 1 (--) , 1  (dummy)  RootM - チャプター: なし,  プログラム: 0,  セル: 0

********** pre commands:
   1  Set gprm(9) =(mov) 0
   2  Set gprm(9) |=(or) 32768
   3  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
   4  Set gprm(4) =(mov) gprm(9)
   5  Set gprm(4) /=(div) 256
   6  Set gprm(4) &=(and) 127
   7  if ( gprm(9) & 32768 ) then { Goto line 9 }
   8  Goto line 11
   9  if ( gprm(15) == 0 ) then { Goto line 11 }
  10  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) gprm(4) }
  11  Set gprm(0) =(mov) gprm(12)
  12  Set gprm(0) /=(div) 256
  13  Set gprm(0) &=(and) 127
  14  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
  15  Set gprm(1) &=(and) 15
  16  if ( gprm(9) & 32768 ) then { Goto line 18 }
  17  Goto line 21
  18  Set gprm(0) =(mov) gprm(1)
  19  if ( gprm(0) < 0 ) then { Set gprm(1) =(mov) gprm(4) }
  20  if ( gprm(0) > 0 ) then { Set gprm(1) =(mov) gprm(4) }
  21  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
  22  Set gprm(4) =(mov) gprm(9)
  23  Set gprm(4) &=(and) 127
  24  if ( gprm(9) & 128 ) then { Goto line 26 }
  25  Goto line 28
  26  if ( gprm(15) == 0 ) then { Goto line 28 }
  27  if ( gprm(15) != 32768 ) then { Set gprm(2) =(mov) gprm(4) }
  28  Set gprm(0) =(mov) gprm(12)
  29  Set gprm(0) &=(and) 127
  30  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
  31  Set gprm(2) &=(and) 127
  32  if ( gprm(9) & 128 ) then { Goto line 34 }
  33  Goto line 38
  34  Set gprm(0) =(mov) gprm(2)
  35  Set gprm(0) &=(and) 63
  36  if ( gprm(0) < 0 ) then { Set gprm(2) =(mov) gprm(4) }
  37  if ( gprm(0) > 65535 ) then { Set gprm(2) =(mov) gprm(4) }
  38  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
  39  Set gprm(12) =(mov) 0
  40  Set gprm(15) =(mov) 32768
  41  Set gprm(10) =(mov) sprm(7:チャプターまたはプログラム ナンバー)
  42  Set gprm(10) &=(and) 1023
  43  Set gprm(0) =(mov) sprm(4:ボリューム内のタイトル ナンバー)
  44  Set gprm(0) &=(and) 127
  45  if ( gprm(0) < 1 ) then { Set gprm(10) =(mov) 0 }
  46  Set gprm(2) =(mov) sprm(1:音声ストリーム ナンバー)
  47  Set gprm(2) &=(and) 15
  48  Set gprm(2) +=(add) 1
  49  if ( gprm(2) != 1 ) then { Goto line 51 }
  50  Set gprm(11) =(mov) 20480 ; LinkPGCN PGC 4
  51  Set gprm(11) =(mov) 20480 ; LinkPGCN PGC 4
********** post commands:
********** cell commands:

41〜50行は不要なのでカット。
39〜40行は gprm変数の値をジャンプ先で読んでいるので、ちょっと残しておきました。
gprm変数の 0〜4 はワークとして使用しているようです。ジャンプ先まで値を保持しておく必要はなさそうなのでカット。

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

gprm変数 5〜8 は、初期化しただけで使用していなかったので、今回の修正では上記のように使いました。
gprm11 には「ボタン番号x1024」の値が入ります。

変更後

VTSM 1 , LU 1 (--) , 1  (dummy)  RootM - チャプター: なし,  プログラム: 0,  セル: 0

********** pre commands:
   1  Set gprm(9) =(mov) 0
   2  Set gprm(9) |=(or) 32768
   3  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
   4  Set gprm(4) =(mov) gprm(9)
   5  Set gprm(4) /=(div) 256
   6  Set gprm(4) &=(and) 127
   7  if ( gprm(9) & 32768 ) then { Goto line 9 }
   8  Goto line 11
   9  if ( gprm(15) == 0 ) then { Goto line 11 }
  10  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) gprm(4) }
  11  Set gprm(0) =(mov) gprm(12)
  12  Set gprm(0) /=(div) 256
  13  Set gprm(0) &=(and) 127
  14  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
  15  Set gprm(1) &=(and) 15
  16  if ( gprm(9) & 32768 ) then { Goto line 18 }
  17  Goto line 21
  18  Set gprm(0) =(mov) gprm(1)
  19  if ( gprm(0) < 0 ) then { Set gprm(1) =(mov) gprm(4) }
  20  if ( gprm(0) > 0 ) then { Set gprm(1) =(mov) gprm(4) }
  21  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
  22  Set gprm(4) =(mov) gprm(9)
  23  Set gprm(4) &=(and) 127
  24  if ( gprm(9) & 128 ) then { Goto line 26 }
  25  Goto line 28
  26  if ( gprm(15) == 0 ) then { Goto line 28 }
  27  if ( gprm(15) != 32768 ) then { Set gprm(2) =(mov) gprm(4) }
  28  Set gprm(0) =(mov) gprm(12)
  29  Set gprm(0) &=(and) 127
  30  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
  31  Set gprm(2) &=(and) 127
  32  if ( gprm(9) & 128 ) then { Goto line 34 }
  33  Goto line 38
  34  Set gprm(0) =(mov) gprm(2)
  35  Set gprm(0) &=(and) 63
  36  if ( gprm(0) < 0 ) then { Set gprm(2) =(mov) gprm(4) }
  37  if ( gprm(0) > 65535 ) then { Set gprm(2) =(mov) gprm(4) }
  38  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
  39  Set gprm(12) =(mov) 0
  40  Set gprm(15) =(mov) 32768
  41  if ( gprm(6) != 0 ) then { Goto line 43 }
  42  Set gprm(11) =(mov) 20480 ; LinkPGCN PGC 4
  43  Set gprm(7) =(mov) sprm(7:チャプターまたはプログラム ナンバー)
  44  Set gprm(5) =(mov) gprm(7)
  45  Set gprm(5) -=(sub) 1
  46  Set gprm(5) /=(div) 18
  47  Set gprm(11) =(mov) gprm(7)
  48  Set gprm(11) -=(sub) 1
  49  Set gprm(11) %=(mod) 18
  50  Set gprm(11) +=(add) 1
  51  Set gprm(11) *=(mul) 1024
  52  if ( gprm(5) == 1 ) then { LinkPGCN PGC 26 }
  53  if ( gprm(5) == 2 ) then { LinkPGCN PGC 47 }
  54  LinkPGCN PGC 4
********** post commands:
********** cell commands:

■TTN の修正

変更前

VTST 1 , 1   TTN 1  (1:30:40)  Title 1 - チャプター: 50,  プログラム: 50,  セル: 51

********** pre commands:
   1  Set gprm(9) =(mov) 0
   2  Set gprm(9) |=(or) 32768
   3  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
   4  Set gprm(4) =(mov) gprm(9)
   5  Set gprm(4) /=(div) 256
   6  Set gprm(4) &=(and) 127
   7  if ( gprm(9) & 32768 ) then { Goto line 9 }
   8  Goto line 11
   9  if ( gprm(15) == 0 ) then { Goto line 11 }
  10  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) gprm(4) }
  11  Set gprm(0) =(mov) gprm(12)
  12  Set gprm(0) /=(div) 256
  13  Set gprm(0) &=(and) 127
  14  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
  15  Set gprm(1) &=(and) 15
  16  if ( gprm(9) & 32768 ) then { Goto line 18 }
  17  Goto line 21
  18  Set gprm(0) =(mov) gprm(1)
  19  if ( gprm(0) < 0 ) then { Set gprm(1) =(mov) gprm(4) }
  20  if ( gprm(0) > 0 ) then { Set gprm(1) =(mov) gprm(4) }
  21  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
  22  Set gprm(4) =(mov) gprm(9)
  23  Set gprm(4) &=(and) 127
  24  if ( gprm(9) & 128 ) then { Goto line 26 }
  25  Goto line 28
  26  if ( gprm(15) == 0 ) then { Goto line 28 }
  27  if ( gprm(15) != 32768 ) then { Set gprm(2) =(mov) gprm(4) }
  28  Set gprm(0) =(mov) gprm(12)
  29  Set gprm(0) &=(and) 127
  30  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
  31  Set gprm(2) &=(and) 127
  32  if ( gprm(9) & 128 ) then { Goto line 34 }
  33  Goto line 38
  34  Set gprm(0) =(mov) gprm(2)
  35  Set gprm(0) &=(and) 63
  36  if ( gprm(0) < 0 ) then { Set gprm(2) =(mov) gprm(4) }
  37  if ( gprm(0) > 65535 ) then { Set gprm(2) =(mov) gprm(4) }
  38  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
  39  Set gprm(12) =(mov) 0
  40  Set gprm(15) =(mov) 32768
  41  Set gprm(10) =(mov) sprm(7:チャプターまたはプログラム ナンバー)
  42  Set gprm(10) &=(and) 1023
  43  Set gprm(0) =(mov) sprm(4:ボリューム内のタイトル ナンバー)
  44  Set gprm(0) &=(and) 127
  45  if ( gprm(0) < 1 ) then { Set gprm(10) =(mov) 0 }
********** 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:30:40)  Title 1 - チャプター: 50,  プログラム: 50,  セル: 51

********** pre commands:
   1  Set gprm(6) =(mov) 1
   2  Set gprm(9) =(mov) 0
   3  Set gprm(9) |=(or) 32768
   4  Set gprm(1) =(mov) sprm(1:音声ストリーム ナンバー)
   5  Set gprm(4) =(mov) gprm(9)
   6  Set gprm(4) /=(div) 256
   7  Set gprm(4) &=(and) 127
   8  if ( gprm(9) & 32768 ) then { Goto line 10 }
   9  Goto line 12
  10  if ( gprm(15) == 0 ) then { Goto line 12 }
  11  if ( gprm(15) != 32768 ) then { Set gprm(1) =(mov) gprm(4) }
  12  Set gprm(0) =(mov) gprm(12)
  13  Set gprm(0) /=(div) 256
  14  Set gprm(0) &=(and) 127
  15  if ( gprm(12) & 32768 ) then { Set gprm(1) =(mov) gprm(0) }
  16  Set gprm(1) &=(and) 15
  17  if ( gprm(9) & 32768 ) then { Goto line 19 }
  18  Goto line 22
  19  Set gprm(0) =(mov) gprm(1)
  20  if ( gprm(0) < 0 ) then { Set gprm(1) =(mov) gprm(4) }
  21  if ( gprm(0) > 0 ) then { Set gprm(1) =(mov) gprm(4) }
  22  Set gprm(2) =(mov) sprm(2:字幕ストリーム ナンバー)
  23  Set gprm(4) =(mov) gprm(9)
  24  Set gprm(4) &=(and) 127
  25  if ( gprm(9) & 128 ) then { Goto line 27 }
  26  Goto line 29
  27  if ( gprm(15) == 0 ) then { Goto line 29 }
  28  if ( gprm(15) != 32768 ) then { Set gprm(2) =(mov) gprm(4) }
  29  Set gprm(0) =(mov) gprm(12)
  30  Set gprm(0) &=(and) 127
  31  if ( gprm(12) & 128 ) then { Set gprm(2) =(mov) gprm(0) }
  32  Set gprm(2) &=(and) 127
  33  if ( gprm(9) & 128 ) then { Goto line 35 }
  34  Goto line 39
  35  Set gprm(0) =(mov) gprm(2)
  36  Set gprm(0) &=(and) 63
  37  if ( gprm(0) < 0 ) then { Set gprm(2) =(mov) gprm(4) }
  38  if ( gprm(0) > 65535 ) then { Set gprm(2) =(mov) gprm(4) }
  39  (SetSTN) Set Audio stream = gprm(1) ; Set Sub-picture stream = gprm(2)
  40  Set gprm(12) =(mov) 0
  41  Set gprm(15) =(mov) 32768
  42  Set gprm(10) =(mov) sprm(7:チャプターまたはプログラム ナンバー)
  43  Set gprm(10) &=(and) 1023
  44  Set gprm(0) =(mov) sprm(4:ボリューム内のタイトル ナンバー)
  45  Set gprm(0) &=(and) 127
  46  if ( gprm(0) < 1 ) then { Set gprm(10) =(mov) 0 }
********** 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」のボタンにハイライトを表示させるためです。

# たいしたこと書いてないんだけど、こんなに長い記事になっちゃうんだよなぁ(苦笑)


BBRK に戻る / BBRK 10-03-26 の全記事に戻る