パケットの内容2

ITU-T Rec. H.222.0(2000E), ISO/IEC 13818-1:2000(E)の拾い読み.

参考箇所

  • Annex F Graphics of Syntax for this Recommendation|International Standard
    • (付録F 勧告と国際規格の図解,pp.125-130)
    • TSファイル(とPSファイル)の全体構成図が載っています.特に,F.0.1〜F.0.6 がTSファイルです.
    • 大雑把な図ですし,フラグで可変する部分などは割愛されています.本文を読む際の手がかりです.
  • 2.4.3 Specification of the Transport Stream syntax and semantics
    • (Transport Stream の文法と意味, pp.18-20)
    • この項以降から,データ構造の説明が始まります.
  • 2.1 Definitions,2.2 Symbols and abbreviations
    • (定義,記号,略語, pp.2-7)
    • 用語の定義や計算記号(演算子),略語の説明です.「DIV」などという変則的な計算方法などがあるので,本文を読むときに首を傾げないように,一度目を通しておきます.

用語・記号

文書読解に必要な用語や略語が数多ありますが,全体構成を把握するために必要なのは取り敢えず次のような項目です.

PES Packetized Element Stream 通信・放送用に(番組の)動画を小分け(packetize)したもの.(2.1.35)
program   (ほぼ)番組のこと.(2.1.41)
PSI Program Specific Information 音声と動画を再合成・再構成する情報.(2.1.44)
bslbf Bit string, left bit first ビット列,左が最初(2.2.6)
uimsbf Unsigned integer, most significant bit first 符号無し整数,最上位ビットが最初(2.2.6)

付録F.0.1 図F.1転載

TSファイルの構成を表しています.TSファイルは,188バイトのパケット単位で構成されていて,パケットは「ヘッダ+ペイロード」で構成され,ヘッダには adaptation field(含 PCR,OPCR)があり,ペイロードと呼ばれるデータ部分が続いているという様子が読み取れます.動画データはペイロード部分に(分割されて)格納されます.ペイロードには動画データだけではなく,分割された動画データを再構成する情報なども含まれます(これをPSI -Program Specific Information- と言います).

パケット概要

adaptation field とペイロード は両方ある場合と片方しかない場合があります(adaptation_field_control),adaptation field は1種類ですが,ペイロードPESやPSIなどの種類があります.PESは動画データ用で,PSIはパケットを視聴可能な動画に変換するための情報です.PSIには,PAT,PMT,CATなどがあり,ARIB B10の 図4-1(p.67)には地デジ規格の全種類をまとめた図版があります.PAT,PMT,CAT はISO規格側に詳細があり,残りはARIB B10の規格になります.

実際のパケット

TSファイルのパケット(188バイト)のダンプです.図F.1の sync_byte(0x47) がパケットの先頭にあることがわかります.このパケットは,adaptation field を持たず,PATをペイロードとして持っています.PID=0x0000がPATであることを示しています*1.ISO13818-1の表2-3(p.19)にISO規格の一覧があり,B10の図4-1には地デジ規格全体のPIDがあります.

$ ./TestTS.exe sample.ts 0
sync_byte: .................. 0x47
transport_error_indicator: .. 0x00
payload_unit_start_indicator: 0x01
transport_priority: ......... 0x00
PID: ........................ 0x0000
transport_scrambling_control: 0x00
adaption_field_control: ..... 0x01
continuity_counter: ......... 0x00
#0 offset:0
0000: 47 40 00 10 00 00 b0 0d  7f e0 c1 00 00 00 01 e0
0001: 10 a5 d8 17 31 ff ff ff  ff ff ff ff ff ff ff ff
0002: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0003: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0004: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0005: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0006: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0007: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0008: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0009: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0010: ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff
0011: ff ff ff ff ff ff ff ff  ff ff ff ff

自作ツール

上記のようなパケットの中身を調べるツールを自作しています.例えばヘッダ部分は,つぎのようなコードで解析できます.

  TransportPacket tp;
  tp.sync_byte                    =packet[0];
  tp.transport_error_indicator    =(packet[1]&0x80)>>7;
  tp.payload_unit_start_indicator =(packet[1]&0x40)>>6;
  tp.transport_priority           =(packet[1]&0x20)>>5;
  tp.PID                          =((packet[1]&0x1F)>>8)|packet[2];
  tp.transport_scrambling_control =(packet[3]&0x60)>>6;
  tp.adaption_field_control       =(packet[3]&0x30)>>4;
  tp.continuity_counter           =packet[3]&0x0F;


このコードは通常ならば,Cの構造体(ビットフィールド)一発で読めそうな気もするのですが,TSファイルはビット順序がネット用になっているので,マスク(&)とシフト(>>)を使って所望のビットを取り出すのが手っ取り早いようです.

*1:これは間違いかな?と思いましたが,テーブル自体がPATであることを示していることも事実ですが(table_id),PATの場合は,PID=0x0000のパケットはPATしか含まないようです.しかし,SDT,BAT は同一PIDに含むことができます.「ARIB B10 第5章 表5-1 PIDの割り当て」にPID・テーブルの対応表があります.