どんぶらアニマル さんぽ道

CBR250RR(MC22)とNSR80(HCO6)とAPE50(AC16)を中心とした備忘録。

TSを(実用的に)再生できるようにVLCを改造:ワンセグ的サブストリームが再生されるコンテンツの対策

  前回のジューム対応が終わっての続き。

・スキップ(±15秒、±1分、±3分)ができるようにする(済)
・ジューム再生の対応(済)
・ワンセグ的サブストリームが再生されるコンテンツの対策(今回はこれ)
・音声多重(デュアルモノ)の切り替えの対応
・音の出ないコンテンツの対策

VLCでワンセグが再生される

ワンセグ的サブストリームが再生されるコンテンツの対策

この現象はよくあるパターンでSIを無視して、最初に見つかったサービス(プログラム)を再生する、または最初に見つかったビデオESを再生するプレーヤで起こる。

なので大昔に作った(不完全だけど簡易的に)全パケットのPIDとPAT、PMTの内容をダンプするジャンクプログラム ()でSIを見てみる。

(ダンプの先頭の数字はパケットの個数目、カッコ内はファイルの中のバイト位置、その後はPID。PATのパケットはサービスID(プログラム番号)、PMTのPID等、PMTのパケットはストリーム種別等を表示してる)

PATが来て、その後プライマリのサービスから順に来てるからうまくいきそうなもんなんだけど。。。


 
0000(0x0000): 0x0111
0001(0x00bc): 0x0111
0002(0x0178): 0x0111
0003(0x0234): 0x0111
0004(0x02f0): 0x0111
0005(0x03ac): 0x0111
0006(0x0468): 0x0111
0007(0x0524): 0x0111
0008(0x05e0): 0x0111
0009(0x069c): 0x0111
0010(0x0758): 0x0612
0011(0x0814): 0x0111
0012(0x08d0): 0x0613
0013(0x098c): 0x0111
0014(0x0a48): 0x0111
0015(0x0b04): 0x0111
0016(0x0bc0): 0x0111
0017(0x0c7c): 0x0111
0018(0x0d38): 0x0111
0019(0x0df4): 0x0111
0020(0x0eb0): 0x0111
0021(0x0f6c): 0x0111
0022(0x1028): 0x0111
0023(0x10e4): 0x0111
0024(0x11a0): 0x0611
0025(0x125c): 0x0111
0026(0x1318): 0x0551
0027(0x13d4): 0x0111
0028(0x1490): 0x0111
0029(0x154c): 0x0111
0030(0x1608): 0x0111
0031(0x16c4): 0x0111
0032(0x1780): 0x0111
0033(0x183c): 0x0111
0034(0x18f8): 0x0111
0035(0x19b4): 0x0111
0036(0x1a70): 0x0111
0037(0x1b2c): 0x0000  PAT
    PAT_section_length : 25
    program_number:0x0000(000), program_map_PID(PMT):0x0010
    program_number:0x0410(1040), program_map_PID(PMT):0x0110
    program_number:0x0411(1041), program_map_PID(PMT):0x0120
    program_number:0x0590(1424), program_map_PID(PMT):0x1fc8
    program_number:0x7c87(31879), program_map_PID(PMT):0x1c0a
 
0038(0x1be8): 0x0111
0039(0x1ca4): 0x0111
0040(0x1d60): 0x0111
0041(0x1e1c): 0x0111
0042(0x1ed8): 0x0111
0043(0x1f94): 0x0111
0044(0x2050): 0x0111
0045(0x210c): 0x0111
省略
0067(0x3134): 0x0110  PMT(0x0110)
    PMT_section_length:0x00f1(241), PMT_program_info_length:0x0013(19)
      stream_type:0x02:MPEG2 VIDEO
        elementary_PID:0x0111
        ES_info_length:0x0006
      stream_type:0x0f:MPEG2 AAC
        elementary_PID:0x0112
        ES_info_length:0x0003
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0116
        ES_info_length:0x0008
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0117
        ES_info_length:0x0014
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0511
        ES_info_length:0x000f
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0512
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0513
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x051f
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0711
        ES_info_length:0x0016
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0611
        ES_info_length:0x0200
省略
0090(0x4218): 0x0111
0091(0x42d4): 0x0120  PMT(0x0120)
    PMT_section_length:0x00f1(241), PMT_program_info_length:0x0013(19)
      stream_type:0x02:MPEG2 VIDEO
        elementary_PID:0x0111
        ES_info_length:0x0006
      stream_type:0x0f:MPEG2 AAC
        elementary_PID:0x0112
        ES_info_length:0x0003
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0116
        ES_info_length:0x0008
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0117
        ES_info_length:0x0014
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0511
        ES_info_length:0x000f
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0512
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0513
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x051f
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0711
        ES_info_length:0x0016
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0611
        ES_info_length:0x0200
 
0092(0x4390): 0x0111
省略
0532(0x186b0): 0x0613
0533(0x1876c): 0x1fc8  PMT(0x1fc8)
    PMT_section_length:0x0064(100), PMT_program_info_length:0x0007(7)
      stream_type:0x1b:H.264ワンセグ
        elementary_PID:0x0151
        ES_info_length:0x0003
      stream_type:0x0f:MPEG2 AAC
        elementary_PID:0x0152
        ES_info_length:0x0003
      stream_type:0x06:字幕・文字スーパー
        elementary_PID:0x0156
        ES_info_length:0x0008
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0551
        ES_info_length:0x000f
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0552
        ES_info_length:0x000a
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0553
        ES_info_length:0x0003
      stream_type:0x0d:データカルーセル
        elementary_PID:0x0554
        ES_info_length:0x0003
 
0534(0x18828): 0x0111
 
 
はて。VLCの中の動きを見てみよう。
PIDフィルタのESを選択するところにログを入れてみた。(ここに行きつくまでが長かった。。。)
 
siba_native: es_out.c:EsOutProgramAdd i_group = 1424
siba_native: es_out.c:EsOutProgramAdd i_group = 1040
siba_native: es_out.c:EsOutProgramAdd i_group = 1044
 
なぜかサービスID 1424(0x0590)が最初に登録されている。このあたりのコードを見たところ、最初に見つけたサービスを選択する実装になってるみたい。その後、フィルタを通過するようにサービス内のESのフラグを立ててる。MPEG2-TSファイル上は1040(0x0410)が最初に出てくるはずなんだけど、他の処理で捨てられてるのか?
 
何にしても最初にPIDフィルタに届いたサービスを選択するというVLCの実装を変えるのはかなり面倒そうだったので、上記の処理の前段に以下の処理を追加した。
・PATを受信し、
・PATに書かれているプライマリ(先頭のサービス)のPMTを取得するまでのデータは捨てる
 
これでめでたくプライマリサービスが再生されるようになった。
 

使い方/仕様

仕様的にはPATに書かれているプライマリ(先頭)のサービスを再生する。
使い方的には意識する必要なし。
 

コード

スキップ対応と同じく整理してから。。。
 
 
 
気が向いたら感想をお願いします。(ログイン不要、ボタンを押すだけです)