MPEG-2 TS について Part 2
前回に引き続き, MPEG-2 TS について.
前回記事
参考資料・サイト
MPEG-2 TS について
- 標準規格の入手について(STD-B10)|一般社団法人 電波産業会
一般社団法人電波産業会(ARIB)の規格書.昔は日本語版も無料だったらしいけど,現在は英語版のみ無料.(無料だった頃の日本語版(少し古いかも)が芝◯工大のサーバにミラーされている.) - http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf
MPEG-2に関する規格書. - 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書
MPEG-2 TS パケットのヘッダ,アダプテーションフィールドの構造についての備忘録に使ったサイト. - http://www.jushin-s.co.jp/michi/download/97_t43.pdf
MPEG-2 TS パケットのペイロードの先頭にあるポインタ・フィールドに関するわかりやすい資料.
MPEG-2 TS パケットのヘッダ,アダプテーションフィールド
MPEG-2 TS のパケットのペイロードにはパケットごとに ES, PSI, SI の様々なデータが含まれており,それぞれデータの種類によって構造が異なるが,ヘッダとアダプテーションフィールドはデータの種類によらず同じ構造をもつ.
そこで,ここではヘッダおよびアダプテーションフィールドの構造について記していく.
ヘッダの構造
http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-2 や 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書 を参照するとよい.
ヘッダは MPEG-2 TS のパケット (188 Byte) のうちの先頭の 4 Byte であり,下図のような構造をしている.
sync byte
MPEG-2 TS パケットの同期をとるための情報. 常に 0x47 であり, 188 Byte (または 192 Byte や 204 Byte)ごとに繰り返される 0x47 をもとにパケットを見つける.transport error indicator
必ず '0' で送信されるが,通信中のエラーなどで '1' になってしまっている場合にはそのパケットに訂正不可能なエラーが存在すると言える.payload unit start indicator
意味のあるデータのかたまり(セクション)を分割してパケット化するが,新しいセクションの先頭データを含む場合に '1' とする. このとき,前回記事に書いたポインタフィールドがペイロードの先頭 1 Byte 目に現れる. 逆にセクションの先頭データを含まない場合は '0' とする.transport priority
'1' が設定されていると,関連パケット(同じ PID のパケット)の '0' に設定されているものよりも高い優先度をもつ. 通信システムの中でデータに優先順位がつけられるらしいが具体的な利用方法は不明.PID (Packet IDentifier)
13 bit の符号なし整数値であり,ペイロードに格納されているデータの種類を示す. いくつかのデータの種類では PID は固定値をとる.transport scrambling control
スクランブル処理(データの乱雑化処理)が施されていない場合には '00' とし,施されている場合は '00' 以外とする.adaptation field control
1 bit 目はアダプテーションフィールドの存在を示すフラグで, 2 bit 目はペイロードの存在を示すフラグである. つまり,
'01' のとき「アダプテーションフィールドはなく,ペイロードのみ存在」,
'10' のとき「アダプテーションフィールドのみ存在,ペイロードはない」,
'11' のとき「アダプテーション,ペイロードともに存在」
である. ちなみに '00' は将来のために予約されている.continuity counter
4 bit の符号なし整数値であり,ペイロードが存在する同じ PID の連続パケットではこのカウンタ値が 1 ずつ加算されていく(ペイロードが存在しない場合には加算されないので注意). 15 (=0xF) が最大値であり,その次はラップアラウンドにより 0 (=0x0) に戻る.
同じ PID の連続パケットでカウンタ値が不連続になればドロップしたとみなすことができるが, MPEG-2 TS ではパケットの重複送信は一度だけ認められているため,カウンタ値が等しいパケットが続いた場合には重複送信なのか,16の倍数分のパケットがドロップしたのかの判定はこの値だけでは判断できない.
また,例外として(後で詳しく説明するが)アダプテーションフィールド内の discontinuity indicator が '1' であるとき,カウンタ値が不連続になることを示すのでカウンタ値が不連続であっても正常となる.
アダプテーションフィールドの構造
http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-6 や 7.3.4 MPEG-2 TS (Transport Stream)パケット - テレビ会議教科書 - テレビ会議教科書 を参照するとよい.
アダプテーションフィールドはヘッダ内の adaptation field control の 1 bit 目が '1' のときのみヘッダの直後に存在する.
前回記事にも書いた通り,アダプテーションフィールドの末尾にスタッフィングが挿入可能であることや,ほかにも可変長のフィールドを多数内包しているので,解析はアダプテーションフィールドの全体の長さや内包する可変長フィールドの長さの情報を正確に読み取りながら行う必要がある. 簡単な構造は図2に示すが,解析する場合は http://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-1.pdf の Table 2-6 など詳細な資料を参照してほしい.
- adaptation field length
adaptation field length の直後からのアダプテーションフィールドのバイト数である.
adaptation field length が 0 より大きいときのみ後続のフィールドが存在する.
discontinuity indicator
'1' のときパケットが不連続であることを示し,ヘッダの continuity counter が不連続であっても正常となる.random access indicator
'1' のとき現在のパケットまたは後続の(同じ PID の)パケットにこのポイントにおけるランダムアクセスを助けるための何らかの情報が存在することを示す.elementary stream priority indicator
'1' のときそのパケットのペイロードが他のパケットのペイロードよりも高い優先度をもつことを示す. '0' のときはこのフィールドが '0' である他のパケットのペイロードと優先度は同じである.OPCR flag
'1' であれば option field 内に OPCR フィールド存在することを示す.splicing point flag
'1' であれば option field 内に splicing countdown フィールド存在することを示す.transport private data flag
'1' であれば option field 内に transport private data フィールド存在することを示す.adaptation field extension flag
'1' であれば option field 内に adaptation field extension フィールド存在することを示す.
後半の5項目(PCR flag ~ adaptation field extension flag)は上記の通り,オプションフィールド内に含まれるフィールドを示すフラグである.
PCR (Program Clock Reference)
PCR (Program Clock Reference) は復号器のタイミングを示すタイムスタンプであり, 33 bit の PCR base と 9 bit の PCR extention (と 6 bit の将来のためにリザーブされたビット) の 48 bit で構成されている. PCR base は 90 kHz (= 27 MHz / 300) クロックカウンタ, PCR extention は 27 MHz クロックカウンタであり, PCR は PCR = (PCR base) × 300 + (PCR extention) により求めることができ, PCR 自体は 27 MHz クロックカウンタとなる.OPCR (Original Program Clock Reference)
OPCR (Original Program Clock Reference) の構造は PCR と同様である. OPCR は他のトランスポートストリームから単一プログラムのトランスポートストリームを再構成する際に用いられるらしいが具体的には不明. ちなみに OPCR は復号器に無視される.splicing countdown
8 bit の符号つき整数値であり,正の値の場合は編集点が到着するまでの同じ PID のパケットの数(ペイロードをもたないパケットなどは除外)を表し,負の値の場合は編集点からパケット数を表す. splicing countdown が 0 のとき,ペイロードの最終バイトは画像または音声フレームの最後のバイトでなければならず,このパケットの最終バイトの直後に編集点がくる.transport private data
可変長フィールドであり,フィールド内の先頭 1 Byte 目が 2 Byte 目以降のフィールドのバイト数を与える. ITU-T | ISO/IEC はこのフィールドのデータを規定してはならない.adaptation field extension
可変長フィールドであり,フィールド内の先頭 1 Byte 目が 2 Byte 目以降のフィールドのバイト数を与える. 拡張されたアダプテーションフィールドである.
adaptation field length の直後からここまでのバイト数の合計が adaptation field length に達していないとき,残りのバイト数分スタッフィングバイト (0xFF) が挿入される.
次回記事
PSI / SI の具体的な種類について次回記事に記そうと思う.