前回のジューム対応が終わっての続き。
・スキップ(±15秒、±1分、±3分)ができるようにする(済)
・ジューム再生の対応(済)
・ワンセグ的サブストリームが再生されるコンテンツの対策(今回はこれ)
・音声多重(デュアルモノ)の切り替えの対応
・音の出ないコンテンツの対策
ワンセグ的サブストリームが再生されるコンテンツの対策
この現象はよくあるパターンでSIを無視して、最初に見つかったサービス(プログラム)を再生する、または最初に見つかったビデオESを再生するプレーヤで起こる。
なので大昔に作った(不完全だけど簡易的に)全パケットのPIDとPAT、PMTの内容をダンプするジャンクプログラム ()でSIを見てみる。
(ダンプの先頭の数字はパケットの個数目、カッコ内はファイルの中のバイト位置、その後はPID。PATのパケットはサービスID(プログラム番号)、PMTのPID等、PMTのパケットはストリーム種別等を表示してる)
PATが来て、その後プライマリのサービスから順に来てるからうまくいきそうなもんなんだけど。。。
0000(0x0000): 0x01110001(0x00bc): 0x01110002(0x0178): 0x01110003(0x0234): 0x01110004(0x02f0): 0x01110005(0x03ac): 0x01110006(0x0468): 0x01110007(0x0524): 0x01110008(0x05e0): 0x01110009(0x069c): 0x01110010(0x0758): 0x06120011(0x0814): 0x01110012(0x08d0): 0x06130013(0x098c): 0x01110014(0x0a48): 0x01110015(0x0b04): 0x01110016(0x0bc0): 0x01110017(0x0c7c): 0x01110018(0x0d38): 0x01110019(0x0df4): 0x01110020(0x0eb0): 0x01110021(0x0f6c): 0x01110022(0x1028): 0x01110023(0x10e4): 0x01110024(0x11a0): 0x06110025(0x125c): 0x01110026(0x1318): 0x05510027(0x13d4): 0x01110028(0x1490): 0x01110029(0x154c): 0x01110030(0x1608): 0x01110031(0x16c4): 0x01110032(0x1780): 0x01110033(0x183c): 0x01110034(0x18f8): 0x01110035(0x19b4): 0x01110036(0x1a70): 0x01110037(0x1b2c): 0x0000 PATPAT_section_length : 25program_number:0x0000(000), program_map_PID(PMT):0x0010program_number:0x0410(1040), program_map_PID(PMT):0x0110program_number:0x0411(1041), program_map_PID(PMT):0x0120program_number:0x0590(1424), program_map_PID(PMT):0x1fc8program_number:0x7c87(31879), program_map_PID(PMT):0x1c0a0038(0x1be8): 0x01110039(0x1ca4): 0x01110040(0x1d60): 0x01110041(0x1e1c): 0x01110042(0x1ed8): 0x01110043(0x1f94): 0x01110044(0x2050): 0x01110045(0x210c): 0x0111:省略:0067(0x3134): 0x0110 PMT(0x0110)PMT_section_length:0x00f1(241), PMT_program_info_length:0x0013(19)stream_type:0x02:MPEG2 VIDEOelementary_PID:0x0111ES_info_length:0x0006stream_type:0x0f:MPEG2 AACelementary_PID:0x0112ES_info_length:0x0003stream_type:0x06:字幕・文字スーパーelementary_PID:0x0116ES_info_length:0x0008stream_type:0x06:字幕・文字スーパーelementary_PID:0x0117ES_info_length:0x0014stream_type:0x0d:データカルーセルelementary_PID:0x0511ES_info_length:0x000fstream_type:0x0d:データカルーセルelementary_PID:0x0512ES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x0513ES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x051fES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x0711ES_info_length:0x0016stream_type:0x0d:データカルーセルelementary_PID:0x0611ES_info_length:0x0200:省略:0090(0x4218): 0x01110091(0x42d4): 0x0120 PMT(0x0120)PMT_section_length:0x00f1(241), PMT_program_info_length:0x0013(19)stream_type:0x02:MPEG2 VIDEOelementary_PID:0x0111ES_info_length:0x0006stream_type:0x0f:MPEG2 AACelementary_PID:0x0112ES_info_length:0x0003stream_type:0x06:字幕・文字スーパーelementary_PID:0x0116ES_info_length:0x0008stream_type:0x06:字幕・文字スーパーelementary_PID:0x0117ES_info_length:0x0014stream_type:0x0d:データカルーセルelementary_PID:0x0511ES_info_length:0x000fstream_type:0x0d:データカルーセルelementary_PID:0x0512ES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x0513ES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x051fES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x0711ES_info_length:0x0016stream_type:0x0d:データカルーセルelementary_PID:0x0611ES_info_length:0x02000092(0x4390): 0x0111:省略:0532(0x186b0): 0x06130533(0x1876c): 0x1fc8 PMT(0x1fc8)PMT_section_length:0x0064(100), PMT_program_info_length:0x0007(7)stream_type:0x1b:H.264ワンセグelementary_PID:0x0151ES_info_length:0x0003stream_type:0x0f:MPEG2 AACelementary_PID:0x0152ES_info_length:0x0003stream_type:0x06:字幕・文字スーパーelementary_PID:0x0156ES_info_length:0x0008stream_type:0x0d:データカルーセルelementary_PID:0x0551ES_info_length:0x000fstream_type:0x0d:データカルーセルelementary_PID:0x0552ES_info_length:0x000astream_type:0x0d:データカルーセルelementary_PID:0x0553ES_info_length:0x0003stream_type:0x0d:データカルーセルelementary_PID:0x0554ES_info_length:0x00030534(0x18828): 0x0111::
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
何にしても最初にPIDフィルタに届いたサービスを選択するというVLCの実装を変えるのはかなり面倒そうだったので、上記の処理の前段に以下の処理を追加した。
・PATを受信し、
・PATに書かれているプライマリ(先頭のサービス)のPMTを取得するまでのデータは捨てる
これでめでたくプライマリサービスが再生されるようになった。
使い方/仕様
仕様的にはPATに書かれているプライマリ(先頭)のサービスを再生する。
使い方的には意識する必要なし。
コード
スキップ対応と同じく整理してから。。。
気が向いたら感想をお願いします。(ログイン不要、ボタンを押すだけです)