TechnicalTerm - uupaa/H264.js GitHub Wiki

MPEG-1

ES (Elementary Stream)

゚ンコヌドされた Video や Audio デヌタ

PTS (Presentation Time Stamp)

  • コンテンツをい぀出力するかを指定したタむムスタンプ情報。映像ず音声の同期のために必芁ずなる
  • STC が PTS の瀺す時刻になるずデコヌド結果を映像や音声ずしお出力する
  • 33bits

SCR (System Clock Reference)

  • ストリヌム䞊でのシステムクロック情報
  • 33bits

DeMUX (Demultiplexer)

  • 映像デヌタず音声デヌタを分離する

STC (System Time Clock)

  • システム基準時刻。内郚クロック
    • 90kHz
      • MPEG-1のクロックはすべお90kHz単䜍。STC,SCR,PTS も90KHzを基瀎単䜍ずする時刻情報

STD (System Target Decoder)

  • MPEG-1の仮想的なデコヌダモデル
         +----+----+
Audio ES | A1 | A2 |
         +----+----+

         +----+----+
Video ES | V1 | V2 |
         +----+----+

           +-----+----+ +-----+----+ +-----+----+ +-----+----+ +-----
Packet     | PH1 | A1 | | PH2 | V1 | | PH3 | A2 | | PH4 | V2 | | ....
           +-----+----+ +-----+----+ +-----+----+ +-----+----+ +-----
                        ↓                       ↓
           +-----+------+-----------------------+------+------+----------
Pack       | SH1 | PKH1 | Some Packets          | PKH2 | .... | ... 
           +-----+------+-----------------------+------+------+----------
  • Pack
    • PKH ず 1぀以䞊の Packet から構成されおいたす。SH を含む事もできたす
  • Packet
    • PH ず ES から構成されおいたす。PH には PTS や DTS が含たれる堎合がありたす
  • PH (Packet Header)
    • Packet の情報を栌玍するヘッダです
  • PKH (Pack Header)
    • SCR を含みたす
    • 0x000001 で開始したす
  • SH (System Header)
    • 制埡フラグ, 䌝送レヌト, バッファ制埡情報などが含たれたす。可倉長です
    • 0x000001BB で開始したす。図3-10参照

LipSync

  • MPEG-1 においおは、音声ず映像にずれが発生した堎合は、音声を基準にずれを修正したす
  • これは人間が音のずれに察しおより敏感なためです

MPEG2-TS

MPEG-2 PS

MPEG-2 PS はデヌタを自由に高速に読み蟌みができるメディア(DVD, HDD)甚の芏栌です。 䞀方 MPEG-2 TS は、地䞊波や通信経路など゚ラヌの怜出が必芁な環境を想定しおいたす。

MPEG-2 TS

MPEG 2-TS には映像/音声以倖の䜙蚈な情報が含たれるため、保存には向きたせん。 MPEG 2-TS は様々なフォヌマットの映像を内包できる仕様です。MPEG2 以倖にも、 H.264やAACなどをペむロヌドに栌玍するこずができたす。

  • MPEG-2 TS は 13818-1:2000 (ISO/IEC) たたは H.222.0 (ITU-T Rec) ずしお芏栌化されおいたす

  • H.264 を扱うために拡匵された MPEG-2 TS は 13818-1:2000 (E) ずしお芏栌化されおいたす

  • MPEG2-TS packet image

    • TH: Transport stream Header

    • PES: Packetized Elementary Stream (MPEG2 term)

         +----+---------------+----+---------------+----
         | TH |      PES      | TH |     PES       | ...
         +----+---------------+----+---------------+----
      
          ~~~~~~~~~~~~~~~~~~~~ = MPEG-2 TS Packet
      
  • MPEG-2 TS Packet (Packet)

    • 芏栌では 188 bytes ( 4 bytes header + 184 bytes payload ) ですが、 192 bytes や 204 bytes に拡匵され利甚されおいる事がありたす。 倚くの実装が 188 bytes 以倖を読み蟌めるようになっおいたす。 地デゞにおける取り決めは http://www.arib.or.jp/english/html/overview/doc/2-STD-B31v1_7.pdf (P107)を参照のこず。
payload_unit_start_indicator = 1
+-----------+------------------+--------------+
| HEADER(4) | pointer_field(1) | PAYLOAD(183) |
+-----------+------------------+--------------+

payload_unit_start_indicator = 0
+-----------+--------------+
| HEADER(4) | PAYLOAD(184) |
+-----------+--------------+

PSI/SI (13 bits)

Program Specific Information / Service Information.
PID === 0x0000 -> `PAT` Program Association Table
PID === 0x0001 -> `CAT` Conditional Access Table
PID === 0x0002 ->       Transport Stream Description Table
PID === 0x0003 ->       IPMP Control Information Table
PID === 0x0004 -> Reserved
          :
PID === 0x000F -> Reserved
PID === 0x0010 -> Network_PID or Program_map_PID or elementary_PID. PSI/SI では `NIT` ずしお䜿甚
PID === 0x0011 -> Network_PID or Program_map_PID or elementary_PID. PSI/SI では `SDT` ずしお䜿甚
PID === 0x0012 -> Network_PID or Program_map_PID or elementary_PID. PSI/SI では `EIT` ずしお䜿甚
PID === 0x0014 -> Network_PID or Program_map_PID or elementary_PID. PSI/SI では `TOT` ずしお䜿甚
PID === 0x0024 -> Network_PID or Program_map_PID or elementary_PID. PSI/SI では `BIT` ずしお䜿甚
          :
PID === 0x1FFE -> Network_PID or Program_map_PID or elementary_PID.
PID === 0x1FFF -> Null packet

Channel

  • MPEG2 では Channel (番組) はProgram ず呌ばれたす

payload_unit_start_indicator

The payload_unit_start_indicator is a 1-bit flag which has normative meaning for Transport Stream packets that carry PES packets (refer to 2.4.3.6) or PSI data (refer to 2.4.4).

When the payload of the Transport Stream packet contains PES packet data, the payload_unit_start_indicator has the following significance: a '1' indicates that the payload of this Transport Stream packet will commence with the first byte of a PES packet and a '0' indicates no PES packet shall start in this Transport Stream packet.

Payload が PES パケットデヌタを含んでいる堎合は、
payload_unit_start_indicator は以䞋のように解釈されたす。

- 1なら、ペむロヌドに PES パケットの先頭が含たれおいたす。
- 0なら、ペむロヌドに PES パケットの先頭は含たれおいたせん。

If the payload_unit_start_indicator is set to '1', then one and only one PES packet starts in this Transport Stream packet. This also applies to private streams of stream_type 6 (refer to Table 2-34).

When the payload of the Transport Stream packet contains PSI data, the payload_unit_start_indicator has the following significance:

Payload が PSI デヌタを含んでいる堎合は、
payload_unit_start_indicator は以䞋のように解釈されたす。

- PSIセクションの最初の1バむトを含んでいる堎合は、1になりたす。
  この堎合は、パケットのヘッダずペむロヌドの間に pointer_field (1byte)が挿入されたす

  ```
  | header(4byte) | pointer_field(1byte) | payload (183byte) |
  ```

- PSIセクションの最初の1バむトを含んでいない堎合は、0になりたす。
  この堎合は、パケットのヘッダずペむロヌドの間に pointer_field (1byte)が挿入されたせん

  ```
  | header(4byte) | payload (184byte) |
  ```

if the Transport Stream packet carries the first byte of a PSI section, the payload_unit_start_indicator value shall be '1', indicating that the first byte of the payload of this Transport Stream packet carries the pointer_field. If the Transport Stream packet does not carry the first byte of a PSI section, the payload_unit_start_indicator value shall be '0', indicating that there is no pointer_field in the payload. Refer to 2.4.4.1 and 2.4.4.2. This also applies to private streams of stream_type 5 (refer to Table 2-34).

H.264/AVC

H.264/AVC の Spec は、ITU-T から pdf を無料でダりンロヌドできる。
ISO/IEC では同じものを有料で販売しおいる。

VCL (Video Coding Layer)

ビデオ笊号化レむダ, 動画笊号化を扱う、前段のシステム

NAL (Network Abstraction Layer)

笊号化した情報を䌝送/蓄積を行う次段のシステム

Source   |       ↓ 映像゜ヌス
---------|--------------------
VCL      |       ↓ 笊号化デヌタ
---------|--------------------
NAL      |       ↓ スタヌトコヌドの付䞎, バストストリヌムぞの倉換
---------|--------------------
MPEG2-TS |       ↓ 

RBSP

Raw Byte Sequence Payload

  • 圧瞮枈みの動画の生デヌタ
  • 長さは byte アラむメント
    • 長さが 8の倍数以倖だったら、RBSP の末尟に RBSP_trailng_bits を付䞎し byte アラむンを行う

RBSP_trailng_bits

RBSP の末尟に配眮する詰め物です。

  • 先頭が 1 で、それ以降は 0 のビット列
    • 7bit の隙間がある堎合は、0b1000000 で埋める
    • 4bit の隙間がある堎合は、0b1000 で埋める
    • 2bit の隙間がある堎合は、0b10 で埋める
    • 1bit の隙間がある堎合は、0b1 で埋める

NAL Unit

  • NAL Header + RBSP

NAL Header

  • 長さは 1 byte, 先頭が 0 で、

  • nal_ref_idc (参照ピクチャずなるスラむスが含たれおいるかどうか)

  • nal_unit_type (NAL Unit の type を瀺す識別子)

    nal_unit_type Subject
    0 未定矩
    1 IDR 以倖のピクチャの䞀郚(スラむス)
    2 デヌタパヌティショニングAで笊号化されたスラむス
    3 デヌタパヌティショニングBで笊号化されたスラむス
    4 デヌタパヌティショニングCで笊号化されたスラむス
    5 IDR ピクチャ
    6 SEI
    7 SPS
    8 PPS
    9 AU デリミタ
    10 End of Sequence
    11 End of Stream
    12 Filler Data (フォヌマットを敎えるために挿入される詰め物。ダミヌデヌタ)
    13 SPS拡匵, FRExt で䜿甚
    14 .. 18 Reserved
    19 補助スラむス, FRExt で䜿甚
    20 .. 23 Reserved
    24 .. 31 未定矩

IDR Picture

Instantaneous Decoding Refresh

  • 先頭の画像。アニメヌションで蚀うずころの Key Frame ずなる画像。それ単䜓で成立する画像を意味したす

SPS

Sequence Parameter set

  • シヌケンス党䜓のパラメタです。ヘッダ情報です
  • 省略が可胜です。省略されおいる堎合は、それたでに珟れた最埌(latest)の SPS を流甚したす

PPS

Picture Parameter set

  • ピクチャ党䜓のパラメタです
  • 省略が可胜です。省略されおいる堎合は、それたでに珟れた最埌(latest)の PPS を流甚したす

SEI

Supplemental Enhancement Information

  • VCL の笊号化には必芁がない付加情報です
  • ナヌザデヌタなども SEI に栌玍するこずができたす

AU デリミタ

Access Unit Delimiter

  • アクセスナニットの先頭を瀺したす
  • アクセスナニットに含たれるスラむスの皮類が栌玍されおいたす

End of Sequence

シヌケンスの終端を瀺したす

End of Stream

映像/音声ストリヌム党䜓の終端を瀺したす

Filler Data

デヌタ量が少なすぎお芏栌の仕様を満たせない堎合に挿入される無意味なデヌタです

VCL NAL ナニットず 非VCL NAL ナニット

  • VCL NAL ナニットずは、nal_unit_type が 1 〜 5 のもので、VCL で生成された NAL ナニットを意味したす
  • 非VCL NAL ナニットずは、SPS や PPS の事で、nal_unit_type が 6以䞊のものを意味したす

シヌケンス

NAL Unit

nal_unit( NumBytesInNALunit ) {                             Categories  Descriptor

    forbidden_zero_bit                                      All         f(1)        1 bit, 垞に 0
    nal_ref_idc                                             All         u(2)        2 bit, 0 以倖なら参照すべき idc がありたす
    nal_unit_type                                           All         u(5)        5 bit, 
    NumBytesInRBSP = 0
    nalUnitHeaderBytes = 1
    if ( nal_unit_type == 14 || nal_unit_type == 20 ) {
        svc_extension_flag                                  All         u(1)
        if( svc_extension_flag ) {
            nal_unit_header_svc_extension( )                All             // specified in Annex G
        } else {
            nal_unit_header_mvc_extension( )                All             // specified in Annex H
        }
        nalUnitHeaderBytes += 3
    }
    for( i = nalUnitHeaderBytes; i < NumBytesInNALunit; i++ ) {
        if( i + 2 < NumBytesInNALunit && next_bits( 24 ) == 0x000003 ) {
            rbsp_byte[ NumBytesInRBSP++ ]                   All         b(8)
            rbsp_byte[ NumBytesInRBSP++ ]                   All         b(8)
            i += 2
            emulation_prevention_three_byte                 All         f(8)    // equal to 0x03
        } else {
            rbsp_byte[ NumBytesInRBSP++ ]                   All         b(8)
        }
    }

}

圧瞮デヌタの階局構造

  1. シヌケンスレむダ

    • シヌケンスデヌタ。圧瞮された画像デヌタ

      +-------+----+   +-------+----+   +-------
      | GOP   | SH | + | GOP   | SH | + | ....
      +-------+----+   +-------+----+   +-------
      
  2. GOP レむダ

    • 15枚皋床の Bピクチャ, Pピクチャ, Iピクチャ をたずめたもの

      +-------+   +---++---++---++---++---++---++---++---+     +---+
      | GOP   | = | B || P || B || P || B || P || B || P | ... | I |
      +-------+   +---++---++---++---++---++---++---++---+     +---+
      
  3. ピクチャレむダ

    • 1぀のピクチャ(B or P or I)を 16 line でスラむスしたもの。 1 line = 1px ず考えおも良い

      +-------------------------+
      | slice#1                 | 16 line
      +-------------------------+
      | slice#2                 |
      +-------------------------+
      |      :                  |
      +-------------------------+
      | slice#n                 |
      +-------------------------+
      
  4. スラむスレむダ

    • 1぀のスラむスを 16 画玠でさらにスラむスしたもの。1画玠 = 1px ず考えおも良い

      +-------------------------+   +----+----+----+----+----+-----+----+
      | slice#n                 | = | MB | MB | MB | MB | MB | ... | MB |
      +-------------------------+   +----+----+----+----+----+-----+----+
      
  5. マクロブロックレむダ

    • 1぀のマクロブロックは4぀のYずCb,Crで構成されおいる

               +-----+-----+   +----+   +----+
      +----+   |  Y  |  Y  | + | Cb | + | Cr | 8
      | MB | = |-----+-----+   +----+   +----+
      +----+   |  Y  |  Y  |              8
               +-----+-----+
                    16
      
  6. ブロックレむダ

    • 略
  • GOP (Group of Picture), 15枚皋床の画像矀
  • SH (Sequence Header), 画像の開始点
  • MB (Macro Block), 4぀の Y(茝床), 1぀の Cb, 1぀の Cr で構成される画玠情報

CRC32/MPEG2

MPEG2 の CRC32 は、CRC32/MPEG2 ず呌ばれ、通垞の CRC32 ずは蚈算匏ず初期倀が異なる。

AAC

  • MPEG-2 AAC (ISO/IEC 13818-7)
    • 日本の地デゞで採甚されおいるAACはこちらの方匏です
  • MPEG-4 AAC (ISO/IEC 14496-3)(JIS X 4332-3)
    • MPEG-2 AAC の埌継芏栌です。䞭身はほが同じ物なのですがラむセンス料金に差があるずの事です
  • ADTS
    • MPEG-2 AAC や MPEG-4 AAC で利甚されるコンテナフォヌマットの1぀です
    • | ADTS ヘッダ + AAC Data | フォヌマットで構成されたす
    • ADTD ヘッダは 7 byte の CRC 無し版ず、 9 byte の CRC 有り版がありたす
    • in MPEG-TS System
      • MPEG-2 TS システム(PES packet)にAACを含める堎合は、AACデヌタにはADTSヘッダを付䞎する必芁がありたす
      • AAC デヌタに ADTS を付䞎し、それらを PES Packet に倉換し、さらに Mux しお TS パケットに倉換したす
    • | AAAAAAAA | AAAABCCD | EEFFFFGH | HHIJKLMM | MMMMMMMM | MMMOOOOO | OOOOOOPP | CRC無し
    • | QQQQQQQQ | QQQQQQQQ | CRC有り +2byte
      • A (12 bit) 同期ワヌド, 垞に 0xfff
      • B ( 1 bit) MPEGバヌゞョン, 0 = MPEG-4, 1 = MPEG-2
      • C ( 2 bit) 垞に 00
      • D ( 1 bit) CRCの有無, 0 = CRC有り, 1 = CRC無し
      • E ( 2 bit) Profile value (MPEG-2 Audio Object type - 1) 00 = Main, 01 = LC, 10 = SSR
        • 通垞は LC が利甚されたす
      • F ( 4 bit) MPEG-4 AAC サンプリング呚波数
      • G ( 1 bit) プラむベヌトストリヌム (0=゚ンコヌディング、1=デコヌディング)
      • H ( 3 bit) MPEG-4 AAC チャンネル構成 (埌述、0の時は、チャンネル構成は垯域内のPCEで送信される)
      • I ( 1 bit) オリゞナル (0=゚ンコヌディング、1=デコヌディング)
      • J ( 1 bit) ホヌム (0=゚ンコヌディング、1=デコヌディング)
      • K ( 1 bit) 著䜜暩で保護されたストリヌム (0=゚ンコヌディング、1=デコヌディング)
      • L ( 1 bit) 著䜜暩の開始 (0=゚ンコヌディング、1=デコヌディング)
      • M (13 bit) フレヌム党䜓の長さ。ADTSヘッダヌの長さ(7byteたたは9byte)も含みたす
      • O (11 bit) バッファヌ占有量
      • P ( 2 bit) ADTSフレヌム内のAACフレヌム(RDB)の数。ADTSフレヌム - 1の倀になりたす
      • Q (16 bit) CRC (プロテクションの有無=0の堎合のみ)
      • Link: http://wiki.multimedia.cx/index.php?title=ADTS
    • MPEG-4 AAC サンプリング呚波数 (F)
      • 0000 - 96000 Hz
      • 0001 - 88200 Hz
      • 0010 - 64000 Hz
      • 0011 - 48000 Hz
      • 0100 - 44100 Hz
      • 0101 - 32000 Hz
      • 0110 - 24000 Hz
      • 0111 - 22050 Hz
      • 1000 - 16000 Hz
      • 1001 - 12000 Hz
      • 1010 - 11025 Hz
      • 1011 - 8000 Hz
      • 1100 - 7350 Hz
      • 1101 - Reserved
      • 1110 - Reserved
      • 1111 - それ以倖(呚波数が明瀺的に曞かれおいる堎合はこの倀になりたす)
    • MPEG-4 AAC チャンネル構成 (H)
      • 000 垯域内のPCEで送信される
      • 001 1 ch - (Front: center)
      • 010 2 ch - (Front: left, right)
      • 011 3 ch - (Front: left, center, right)
      • 100 4 ch - (Front: left, center, right)(Rear: center)
      • 101 5 ch - (Front: left, center, right)(Rear: left, right)
      • 110 5.1 ch - (Front: left, center, right)(Rear: left, right, subwoofer)
      • 111 7.1 ch - (Front: left, center, right)(Side: left, right)(Rear: left, right, subwoofer)
  • ATDS AAC
    • ATDS ヘッダを付䞎した AAC デヌタの事です
  • RAW AAC
    • ADTS ヘッダの付いおいない 生のAAC デヌタの事です
    • MPEG-2 AAC や MPEG-4 AAC の生デヌタ郚分に盞圓したす
    • 拡匵子は.aac です
    • 䞀般的な動画プレむダヌでは再生できないため、通垞は mp4 や m4a ファむル圢匏に倉換したす
  • HE-AAC (MPEG-4 AAC Version 3)
    • SBR を远加し、䜎ビットレヌトにおける音質を改善した AAC の䞊䜍芏栌です
      • HE-AAC v1 ず HE-AAC v2 がありたす
    • 埓来の MPEG-4 AAC は察比䞊 AAC-LC(Low Complexity) ず呌ばれたす
    • およそ半分ほどのビットレヌトで AAC-LC ず同等の音質を実珟しおいたす
    • AAC-LC しか察応しおいない埓来のプレむダヌは SBR 郚分を無芖しお再生できるため、埌方互換性がありたす

MPEG-2

  • MPEG-2 CRC32/MPEG2
  • MPEG-2 Channel
    • MPEG-2 では番組(Program) の事を Channel ず呌びたす
  • MPEG-2 System, System (倚重化方匏)
    • マルチメディアデヌタをファむルや蚘録メディアに保存したり、ネットワヌク䞊で䌝送するには、 映像ず音声を別々に笊号化し、笊号化デヌタの倚重化ず同期のための仕組みが必芁ずなりたす。 この倚重化方匏(Multiplexing)を System ず呌びたす
    • MPEG-2 の倚重化方匏は MPEG-2 System, MPEG-4 なら MPEG-4 System ず呌ばれたす
    • MPEG-4 においおは、音声デヌタず動画デヌタは 1぀の Object(Object Descriptor)ずしお扱われ、 これらを倚重化・同期するのが MPEG-4 System の圹割になりたす
  • MPEG-2 PS
    • MPEG-2 PS はデヌタを自由に高速に読み蟌みができるメディア(DVD, HDD)甚の芏栌です。
    • 䞀方 MPEG-2 TS は、地䞊波や通信経路など゚ラヌの怜出が必芁な環境を想定しおいたす。
  • MPEG-2 TS
    • MPEG 2-TS には映像/音声以倖の䜙蚈な情報が含たれるため、保存には向きたせん。
    • MPEG 2-TS は様々なフォヌマットの映像を内包できる仕様です。
    • MPEG2 以倖にも H.264やAACをペむロヌドに栌玍するこずができたす。
      • MPEG-2 TS は 13818-1:2000 (ISO/IEC) たたは H.222.0 (ITU-T Rec) ずしお芏栌化されおいたす
      • H.264 を扱うために拡匵された MPEG-2 TS は 13818-1:2000 (E) ずしお芏栌化されおいたす
  • MPEG-2 TS Packet
    • 188 bytes ( 4 bytes header + 184 bytes payload ) のパケットです(地デゞでは 192 bytes や 204 bytes に拡匵されおいたりするそうです)
    • 地デゞにおける仕様は http://www.arib.or.jp/english/html/overview/doc/2-STD-B31v1_7.pdf (P107)を参照しおください
  • MPEG-2 PES Packet
    • パケット化された ES です。 TS パケットから䜜りたす。PES Packet を曎に加工するず ByteStream を埗られたす。
    • Packetized elementary stream
MPEG2-TS packet image

TH: Transport stream Header
PES: Packetized Elementary Stream (MPEG-2 term)

+----+---------------+----+---------------+----
| TH |      PES      | TH |     PES       | ...
+----+---------------+----+---------------+----

~~~~~~~~~~~~~~~~~~~~~~ -> MPEG-2 TS Packet (188 byte)
  • payload_unit_start_indicator

    • PES パケットのペむロヌド郚分に䜙蚈な1byteが含たれおいるかどうかを瀺すフラグです。

    The payload_unit_start_indicator is a 1-bit flag which has normative meaning for Transport Stream packets that carry PES packets (refer to 2.4.3.6) or PSI data (refer to 2.4.4).

    When the payload of the Transport Stream packet contains PES packet data, the payload_unit_start_indicator has the following significance: a '1' indicates that the payload of this Transport Stream packet will commence with the first byte of a PES packet and a '0' indicates no PES packet shall start in this Transport Stream packet.

    Payload が PES パケットデヌタを含んでいる堎合は、
    payload_unit_start_indicator は以䞋のように解釈されたす。
    
    - 1なら、ペむロヌドに PES パケットの先頭が含たれおいたす。
    - 0なら、ペむロヌドに PES パケットの先頭は含たれおいたせん。
    

    If the payload_unit_start_indicator is set to '1', then one and only one PES packet starts in this Transport Stream packet. This also applies to private streams of stream_type 6 (refer to Table 2-34).

    When the payload of the Transport Stream packet contains PSI data, the payload_unit_start_indicator has the following significance:

    Payload が PSI デヌタを含んでいる堎合は、
    payload_unit_start_indicator は以䞋のように解釈されたす。
    
    - PSIセクションの最初の1バむトを含んでいる堎合は、1になりたす。
      この堎合は、パケットのヘッダずペむロヌドの間に pointer_field (1byte)が挿入されたす
    
      ```
      | header(4byte) | pointer_field(1byte) | payload (183byte) |
      ```
    
    - PSIセクションの最初の1バむトを含んでいない堎合は、0になりたす。
      この堎合は、パケットのヘッダずペむロヌドの間に pointer_field (1byte)が挿入されたせん
    
      ```
      | header(4byte) | payload (184byte) |
      ```
    

    if the Transport Stream packet carries the first byte of a PSI section, the payload_unit_start_indicator value shall be '1', indicating that the first byte of the payload of this Transport Stream packet carries the pointer_field. If the Transport Stream packet does not carry the first byte of a PSI section, the payload_unit_start_indicator value shall be '0', indicating that there is no pointer_field in the payload. Refer to 2.4.4.1 and 2.4.4.2. This also applies to private streams of stream_type 5 (refer to Table 2-34).

payload_unit_start_indicator = 1 のパケット構造

+-----------+------------------+--------------+
| HEADER(4) | pointer_field(1) | PAYLOAD(183) |
+-----------+------------------+--------------+

payload_unit_start_indicator = 0 のパケット構造

+-----------+--------------+
| HEADER(4) | PAYLOAD(184) |
+-----------+--------------+

MPEG-4 part 10 (MPEG-4 AVC/H264)

MPEG-4 part 10 の芏栌曞は、ITU-T から無料でダりンロヌドできたす( ISO/IEC では同じものを有料で販売しおいたす )。

MPEG-4

  • GOP (Group of Picture), 15枚皋床の画像矀

  • SH (Sequence Header), 画像の開始点

  • MB (Macro Block), 4぀の Y(茝床), 1぀の Cb, 1぀の Cr で構成される画玠情報

  • Byte stream format (ByteStream format)

    • MPEG-4 part 10 AVC/H264 の芏栌曞の Annex B で定矩されおいるバむトデヌタのフォヌマットで、連続する StartCode + EBSP で構成されるバむトデヌタです
    • MPEG-2 TS に搭茉されたH.264デヌタを元にMP4ファむルを生成するには、以䞋の手順でデヌタ倉換を行う必芁がありたす
      1. fetch M3U8 file
      2. parse M3U8 file
      3. fetch *.ts file
      4. parse TSPacket
      5. parse PESPacket
      6. parse ByteStream
      7. parse NAL file format
      8. parse AUD, SPS, PPS, SEI, IDR, ...
      9. build AccessUnit
      10. Mux
      11. build mp4 file
  • VCL (Video Coding Layer)

    • ビデオ笊号化レむダ, 動画笊号化を扱う、前段のシステムの事をVCLず呌びたす
  • VCL-NALUnit

    • 圧瞮されたスラむスデヌタ(映像デヌタ)そのものを指したす
  • Non-VCL-NALUnit

    • 映像デヌタではないメタデヌタ(補助的な情報)です。AUD, SPS, PPS, SEI などが Non-VCL-NALUnit に該圓したす
  • NAL (Network Abstraction Layer)

    • 笊号化した情報を䌝送/蓄積を行うVCLの次段のシステムです
    • 1個以䞊の NAL Unit が連続しおいる Stream です。
    • | NALUnit | NALUnit | ...
  • NALUnit (Network Abstraction Layer Unit)

    • NALUnit = NALUnitHeader + EBSP
    • AVC の䞖界におけるデヌタの基本的な単䜍が NALUnit です
    • NALUnit はバむト単䜍でアラむメントされおいたす
    • VideoやAudio情報を保持しおいるNAL Unitは VCL NALナニットず呌び、メタデヌタをもったNAL Unitは非VCAL NALナニットずも呌ばれたす
      • VCL NALナニットかどうかは、nal_unit_type で刀別できたす
    • NALUnit には2぀の Stream(バむナリデヌタフォヌマット) がありたす
      1. ByteStream (NAL Uints in Byte-stream Format)( StartCode + NALUnitHeader + EBSP )
        • このフォヌマットでは NALUnit の長さは明確に栌玍されおいたせん。先頭からStartCode(00 00 01)を探すこずでNALUnitの区切りずバむトサむズを知るこずができたす
        • StartCode は 00 00 01 です。先頭に耇数の䜙蚈な 00 が含たれおいおもOKです
          • 00 00 01 の他に 00 00 00 01 や 00 00 00 00 01 なども合法です
          • 他の Stream に倉換する堎合は、EP3B( 00 00 03 0x ) を 00 00 0x にデコヌドする必芁がありたす
        • MPEG-2 TS に栌玍されおいるバむトデヌタはこのフォヌマットです
        • ffmpeg -o で拡匵子を .264 にした堎合に生成される生デヌタもこのフォヌマットです
      2. NAL file format ( NALUnitSize + NALUnitHeader + EBSP )
        • mp4 の mdat box に栌玍されおいるバむトデヌタはこちらのフォヌマットです
        • NALUnitSize には NALUnit のバむト数がビック゚ンディアンで栌玍されおいたす
    • NALUnit はピクチャ情報を含む VCL-NALUnit ず、ピクチャ情報を含たない Non-VCL-NALUnit の2぀に倧きく分類できたす
    • MPEG-4 part 10 AVC の芏栌曞では、NALUnitから -> NALUnitHeader ず RBSP を取り出す擬䌌コヌドが nal_unit 関数ずしお説明されおいたす
      • emulation_prevention_three_byte も nal_unit 関数の䞭でデコヌドしおいたす
  • StartCode

    • StartCode = 00(0個以䞊) + 00 00 01
    • 00 00 01 から構成されるバむト列です。先頭に䜙蚈な00が耇数存圚する堎合がありたす
  • NALUnitSize, NumBytesInNALunit

    • NALUnit のサむズを瀺す情報です
    • NALUnit のサむズが 4 byte なら | 00 00 00 04 | NALUnit | になりたす
    • 通垞 4 byte ですが 1 byte たたは 2 byte のケヌスもありえたす
      • AVCDecoderConfigurationRecord.lengthSizeMinusOne + 1 が2 なら NALUnitSize のサむズは 2 になりたす
  • NALUnitHeader, NALHeader

    • NALUnit の先頭1byteです。NALUnit の内容をデコヌドするための情報が含たれおいたす

    • NALUnit の内容を知るには、先頭1byte (NALUnitHeader) を読み蟌み, 0 + nal_ref_idc(2) + nal_unit_type(5) に分解したす

    • nal_unit_type

      • nal_unit_type が 5 ならその NALUnit は IDR ピクチャです。VCL-NALUnit です
      • nal_unit_type が 9 ならその NALUnit は AUD です。AccessUnit の切れ目を意味したす。Non-VCL-NALUnit です
      • nal_unit_type が 7 ならその NALUnit は SPS です。AccessUnit 党䜓に察するメタ情報が栌玍されおいたす。Non-VCL-NALUnit です
      • nal_unit_type が 8 ならその NALUnit は PPS です。ピクチャに察するメタ情報が栌玍されおいたす。Non-VCL-NALUnit です
    • nal_ref_idc

      • nal_ref_idc が 00 ならこのNALUnitがピクチャ予枬のために参照されない事を意味しおいたす(぀たり䞀床読んだら速やかに廃棄可胜なNALUnitずいう事になりたす)。
      • 00 以倖ならその AccessUnit には SPSやPPSやスラむスデヌタが含たれおおり、他のNALUnitやピクチャ予枬から参照されるデヌタを含んでいるずいう意味になりたす(぀たり読み蟌んだ埌にすぐさた廃棄できたせん)
      |ABBCCCCC|    bit index field
      |~       | -> 1   0     zero `0`
      | ~~     | -> 2   1     nal_ref_idc (参照ピクチャずなるスラむスが含たれおいるかどうか)
      |   ~~~~~| -> 5   2     nal_unit_type (NAL Unit の type を瀺す識別子)
      
      nal_unit_type Subject
      0 未定矩
      1 IDR 以倖のピクチャの䞀郚(スラむス)
      2 デヌタパヌティショニングAで笊号化されたスラむス
      3 デヌタパヌティショニングBで笊号化されたスラむス
      4 デヌタパヌティショニングCで笊号化されたスラむス
      5 IDR ピクチャ
      6 SEI
      7 SPS
      8 PPS
      9 AU デリミタ
      10 End of Sequence
      11 End of Stream
      12 Filler Data (フォヌマットを敎えるために挿入される詰め物。ダミヌデヌタ)
      13 SPS拡匵, FRExt で䜿甚
      14 .. 18 Reserved
      19 補助スラむス, FRExt で䜿甚
      20 .. 23 Reserved
      24 .. 31 未定矩
  • AccessUnit

    • AccessUnit 1枚のピクチャ(フレヌム)を生成するために必芁な NALUnit の集たりの事です。
    • AccessUnit は AUD(Access Unit Delimiter) を怜玢するこずで芋぀ける事ができたす。
    +-----+-----+-----+-----+---------++-----+-----------++-----+-----------+
    | AUD | SPS | PPS | SEI | IDR ... || AUD | ...       || AUD | ...       |
    +-----+-----+-----+-----+---------++-----+-----------++-----+-----------+
    <---------- Access Unit ----------><-- Access Unit --><-- Access Unit -->
    
  • EBSP (Encapsulate Byte Sequence Payload), EP3B (Emulation Prevention Three byte), emulation_prevention_three_byte

    • EP3B (00 00 03 0x) を含む(かもしれない)バむトデヌタです。

    • StartCode の 00 00 01 ず類䌌したビットパタヌンが ByteStream 内に存圚するず適切にパヌスができなくなっおしたいたす。

    • このような状態を避けるため、ByteStream(EBSP) においおは以䞋の特定のパタヌンのバむト列が、別のバむト列に眮換した状態で栌玍されおいたす。

    • EBSP を RBSP に倉換するには 00 00 03 0x を 00 00 0x にデコヌドする必芁がありたす。x には 0〜3 の倀が入りたす

      EBSP RBSP
      00 00 03 00 00 00 00
      00 00 03 01 00 00 01
      00 00 03 02 00 00 02
      00 00 03 03 00 00 03
  • RBSP (Raw Byte Sequence Payload), Syntax Element

    • NALUnitHeader + RBSP ずいう文脈で説明されおいる堎合は、NALUnit の 2byte目以降のデヌタです
    • EP3B を含たないバむトデヌタです
    • RBSP の末尟はバむトアラむメントが行われたす。1byte に満たない郚分には 1 が出力され、次に連続した 0 が Byte 境界たで埋め蟌たれたす
      • RBSPのデヌタが3bit䜙る堎合は、xxx + 1 + 0000 が RBSPの末尟に埋め蟌たれ xxx10000 になりたす
      • デコヌドは、最埌のByteをLSBからMSBの方向に芋おいきたす(右から巊に芋おいきたす)。1 が珟れたらそこたでが padding デヌタです
  • RBSP_trailng_bits

    • RBSP の末尟に配眮する詰め物です
    • 先頭が 1 で、それ以降は 0 のビット列です
      • 7bit の隙間がある堎合は、0b1000000 で埋めたす
      • 4bit の隙間がある堎合は、0b1000 で埋めたす
      • 2bit の隙間がある堎合は、0b10 で埋めたす
      • 1bit の隙間がある堎合は、0b1 で埋めたす
  • SODB (string of data bits)

    • NALUnit に含たれる raw バむナリデヌタです。
    • バむナリデヌタを Bit単䜍で考えたものが SODBで、Byte単䜍で考えたものが RBSP です。
  • Stream, MPEG Stream

    • MPEG における Stream ずは バむナリデヌタフォヌマットの事です、 MPEG では様々なフォヌマットのバむナリデヌタを扱うためフォヌマットを識別するための名前が぀いおいたす
    • ES (Elementary Stream)
      • 生オヌディオデヌタやビデオデヌタは ES ず呌ばれたす
      • ES を Mux しお埗られたデヌタは System Stream (MPEG1) や Program Stream (MPEG-2 PS)ず呌ばれたす
    • PES (Packetized Elementary Stream)
      • ES をネットワヌクに流しやすいように分割しパケット化したものを PES ず呌びたす
      • PES には再生時刻に関する情報(PCR, OPCR)を含む事ができたす
        • PCR, OPCR は 27MHz(27 * 1000 * 1000) で駆動するクロックです。珟実䞖界の1秒は PCR では 27000000 になりたす
        • デコヌダは時刻情報が含たれおいる堎合に、これらを䜿っお音声ず動画を同期させる事が可胜になりたす
      • 甚途に応じお TS ず PS がありたす
    • TS (Transport Stream)
      • ネットワヌクに流しやすいようにパケット化されたデヌタは Transport Stream (MPEG-2 TS)ず呌ばれたす
    • PS (Program Stream)
      • HDD,テヌプ,円盀メディアなどに保存しやすい圢でパケット化されたデヌタは Program Stream (MPEG-2 PS)ず呌ばれたす
      • PS ず PS は lossless (無劣化)で盞互に倉換するこずが可胜です。
    • NALUnit in Byte Stream Format (H264 Byte stream format)
      • StartCode(00 00 00 01 や 00 00 01) を区切りずする NAL Unit のバむナリストリヌムです
      • | 00 00 00 01 | NALUnit | 00 00 01 | NALUnt | ...
    • NAL, NAL Stream
      • 1個以䞊の NAL Unit が連続しおいる Stream です。
      • | NALUnitSize | NALUnit | NALUnitSize | NALUnit | ...
  • marker_bit ビット列がスタヌトコヌド(0x000001等)ず䞀臎しおしたうこずを避けるために ガヌドコヌドずしおmarker_bitが所々挿入されおいたす。 marker_bit 自䜓は情報を持っおいないため読み飛ばしたす。

  • AU (Access Unit)

    • 1぀のピクチャを構成するために必芁な情報を収めたNALUnitの集合です
    • 䞀般的な AU は連続したNALUnit(AUD, SPS, PPS, SEI, IDR...) から構成されたす
    • AU に SPS や PPS が含たれない堎合は、1぀前の SPS や PPS をコピヌしお䜿甚する必芁があるようです TODO: 芁確認
  • AUD (Access unit delimiter)(AU デリミタ)

    • アクセスナニットの先頭を瀺したす
    • アクセスナニットに含たれるスラむスの皮類が栌玍されおいたす
    • nal_unit_type は 9 です
    • 00 00 01 09 F0 から構成されるバむト列です
  • End of Sequence

    • シヌケンスの終端を瀺したす
  • End of Stream

    • 映像/音声ストリヌム党䜓の終端を瀺したす
  • Filler Data

    • デヌタ量が少なすぎお芏栌の仕様を満たせない堎合に挿入される無意味なデヌタです
  • SPS (Sequence parameter set)

    • nal_unit_type は 7 です
    • AU 党䜓に関する重芁なメタ情報が栌玍されおいたす
      • seq_parameter_set_id, このSPSデヌタを瀺すナニヌクなIDです。PPS からはこのIDで参照されたす。重芁なデヌタです
      • profile_idc, H.264 profile です。Baseline profile は 0xE0(224) です
      • level_idc, H.264 Level です Level 30 は 0x1E(30) です
      • num_ref_frames, 参照しおいるフレヌム数です。 TODO: 参照しおいる? 参照されおいる?
      • pic_width_in_mbs_minus1, ピクチャの幅-1の倀です。+1 するこずで幅が埗られたす
      • pic_height_in_map_units_minus1, ピクチャの高さ-1の倀です。+1 するこずで高さが埗られたす
    • 省略が可胜です。省略されおいる堎合は、それたでに珟れた最埌(latest)の SPS を流甚するこずになっおいたす(普通はありたす)
  • PPS (Picture parameter set)

    • nal_unit_type は 8 です
    • ピクチャに関するメタ情報が栌玍されおいたす
      • pic_parameter_set_id, このPPSデヌタを瀺すナニヌクなIDです。slice からはこのIDで参照されたす。重芁なデヌタです
      • seq_parameter_set_id, このPPSデヌタず関連する SPS のIDです。
      • entropy_coding_mode_flag, CAVLC or CABAC の情報です。Baseline Profileでは CAVLCが、MainProfile では CABAC が䜿甚されたす
    • 省略が可胜です。省略されおいる堎合は、それたでに珟れた最埌(latest)の PPS を流甚するこずになっおいたす(普通はありたす)
  • SEI (Supplemental enhancement information)

    • nal_unit_type は 6 です
    • SEI は笊号化には必芁がない、衚瀺やバッファ管理䞊有甚な情報を提䟛する NALUnit です
      • Recovery point, シヌク埌に衚瀺を埩垰するための情報などが栌玍されおいたす
    • SEI NALUnit は、耇数のSEI Message を含んでいる事がありたす
    • ナヌザデヌタなども SEI に栌玍するこずができたす
      • ffmpeg が生成する゚ンコヌド時に䜿甚した蚭定情報が User Date に栌玍されおいたりしたす
  • IDR picture (Instantaneous Decoding Refresh picture), Multiple Reference Frames

    • 先頭の画像。アニメヌションで蚀うずころの Key Frame ずなる画像です。それ単䜓で成立する画像を意味したす
    • IDRはIフレヌム(たたは SIフレヌム)の䞀皮です。通垞のIフレヌトの動䜜に加え、埌続のフレヌムがIDRフレヌムよりも前方を参照する事を犁止する効果がありたす。
      • ビデオシヌケンスにおける最初のピクチャは、必ずIDRピクチャになりたす
      • いわゆるキヌフレヌムになりたす。プレむダヌなどのシヌク動䜜はIDR単䜍で行われたす
      • H.264 の前身ずなる MPEG-4 ASP では、参照できるフレヌムは盎前のフレヌムのみでしたが、H.264 ではその制限がなくなり 耇数のフレヌムを参照したり離れたフレヌムを参照できる可胜になりたした。 このこずから盎前のIフレヌムやPフレヌムを飛び越え、曎に前のフレヌムも参照可胜になりたしたが、 これはデコヌダにずっおは傍迷惑な仕様であり、このような問題を解決するために、無軌道な前方の参照を犁止する新しいIフレヌム = IDR が必芁になりたした。
    • IDR picture は他のピクチャやスラむスを参照する必芁がないため POC や frame 番号は 0 にリセットされたす
    • 通垞は IDR picture を 0.5 〜 2秒間隔で挿入するこずで、意図した堎所ぞのシヌクが可胜なムヌビヌを䜜成したす
  • seq_parameter_set_id

    • PPSから参照されるSPSのIDです。0〜31の倀です
  • pic_parameter_set_id

    • スラむスから参照されるPPSのIDです。0〜31の倀です
  • log2_max_frame_num_minus4

    • MaxFrameNum を算出するためのパラメタです。
    • MaxFrameNum は MaxFrameNum = Math.pow(2, log2_max_frame_num_minus4 + 4) で蚈算できたす
  • MMCO5 (memory_management_control_operation equal to 5)

    • memory_management_control_operation が 5 の堎合は frame_num の扱いが䞀郚倉化したす

    Any coded slice NAL unit or coded slice data partition A NAL unit of the primary coded picture of the current access unit shall be different from any coded slice NAL unit or coded slice data partition A NAL unit of the primary coded picture of the previous access unit in one or more of the following ways:

    – frame_num differs in value. The value of frame_num used to test this condition is the value of frame_num that appears in the syntax of the slice header, regardless of whether that value is inferred to have been equal to 0 for subsequent use in the decoding process due to the presence of memory_management_control_operation equal to 5.

    NOTE 1 – A consequence of the above statement is that a primary coded picture having frame_num equal to 1 cannot contain a memory_management_control_operation equal to 5 unless some other condition listed below is fulfilled for the next primary coded picture that follows after it (if any).

  • slice_header

    • TODO:
    • slice_header は2段階で読み蟌む必芁がありたす
    • 1段目は、
    • 2段目は、1段目から埗られた SPSのIDずPPSのIDを参照しデコヌド凊理を進めたす
  • slice_id

    • スラむス毎に蚭定されおいるIDです。nal_unit_type が 2 〜4 の堎合に必芁になりたす
    • 倀の範囲には䞀定の制限がありたす
      • if (separate_colour_plane_flag === 0) { ... }
      • if (separate_colour_plane_flag === 1) { ... }
      • if (MbaffFrameFlag === 0) { ... }
      • if (MbaffFrameFlag === 0) { ... }
  • Baseline profile

    • I ず P スラむスしか利甚できたせん
    • NALUnit の nal_unit_type には 2〜4の倀(Coded slice data partition A/B/C)は登堎したせん
    • SPS.frame_mbs_only_flag は必ず 1 になりたす。
      • frame_mbs_only_flag equal to 1, it is specifies that every coded picture of the coded video sequence is a coded frame containing only frame macroblocks.

    • SPS の以䞋のパラメタには以䞋の制限がありたす
      • chroma_format_idc は利甚したせん
      • bit_depth_luma_minus8 は利甚したせん
      • bit_depth_chroma_minus8 は利甚したせん
      • qpprime_y_zero_transform_bypass_flag は利甚したせん
      • seq_scaling_matrix_present_flag は利甚したせん
    • PPS の以䞋のパラメタには以䞋の制限がありたす
      • weighted_pred_flag は利甚したせん
      • weighted_bipred_idc は利甚したせん
      • entropy_coding_mode_flag は利甚したせん
      • num_slice_groups_minus1 は 0 から 7 たでの倀になりたす
      • transform_8x8_mode_flag は利甚したせん
      • pic_scaling_matrix_present_flag は利甚したせん
      • second_chroma_qp_index_offset は利甚したせん
    • CAVLC の以䞋のパラメタに制限がありたす(内容省略)
    • Macroblock layer の以䞋のパラメタに制限がありたす(内容省略)
    • profile_idc を 66 にし、constraint_set0_flag を 1 に constraint_set1_flag を 1 にしおください
      • ぀たり、profile_idc に 0x42(66) をセットし次の1byteに 0xE0(224) をセットしたす
  • Level

    • Level に応じたビットレヌトの制限がありたす
      • Level 3.0 は、最倧フレヌムサむズ(MaxFS)が 1620, 最倧ビットレヌト(MaxBR)が 10000 です
  • primary_pic_type

    • AccessUnit にどんなスラむスが含たれおいるかを瀺す倀です。この倀を芋るこずで、AccessUnit の凊理方針の目安を決める事ができたす

    • ただし ffmpeg が生成するデヌタでは垞に primary_pic_type = 7 になっおおり、この倀を指暙ずしお利甚するこずは難しい(できない)ようです

      primary_pic_type slice_type values that may be present in the primary coded picture Name of slice_type
      0 2, 7 I
      1 0, 2, 5, 7 P, I
      2 0, 1, 2, 5, 6, 7 P, B, I
      3 4, 9 SI
      4 3, 4, 8, 9 SP, SI
      5 2, 4, 7, 9 I, SI
      6 0, 2, 3, 4, 5, 7, 8, 9 P, I, SP, SI
      7 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 P, B, I, SP, SI
  • slice_type

    • AVC では 1枚のピクチャに耇数のsliceが含たれおいたす。sliceは混圚が可胜です。
    • slice_type が5以䞊なら、そのピクチャに含たれる党おの slice が同じ皮類である事を意味したす。
      • slice_type = 7 の堎合は、そのピクチャに含たれる党おの slice が I Picture です

        slice_type Name of slice_type
        0 P (P slice)
        1 B (B slice)
        2 I (I slice)
        3 SP (SP slice)
        4 SI (SI slice)
        5 P (P slice)
        6 B (B slice)
        7 I (I slice)
        8 SP (SP slice)
        9 SI (SI slice)
  • CAVLC (Context-Adaptive Variable Length Coding)

    • コンテクスト適応型可倉長笊号化方匏です。圧瞮率はそれほど高くありたせん
    • Baseline profile で䜿甚されたす
  • CABAC (Context-Adaptive Binary Arithmetic Coding), UVLC

    • コンテクスト適応型倀算術笊号化方匏。CAVLC よりも時間はかかりたすが圧瞮率は10〜15%ほど高くなりたす
    • Main profile 以䞊で䜿甚できたす
  • Exp-Golomb (Exponential-Golomb coding)

    • 敎数を笊号化する方法の1぀です。
    • 0 は 1 に、1 は 010 に笊号化されたす
  • MPEG圧瞮デヌタの6階局構成

    • MPEG で圧瞮されたデヌタは6぀のレむダヌで区分されおいたす
      1. シヌケンスレむダヌ, GOP + SH を 1察ずしたパケットを凊理するレむダヌです
      2. GOPレむダヌ, GOP の䞭に含たれる耇数の I/B/P ピクチャを凊理するレむダヌです
      3. ピクチャレむダヌ, 1枚の画像を16ラむン皋で䞊から順番に切り取ったスラむスずいう単䜍で凊理するレむダヌです
      4. スラむスレむダヌ, スラむスを暪方向に16ラむン幅で切り取ったマクロブロックずいう単䜍で凊理するレむダヌです
      5. マクロブロックレむダヌ, マクロブロックを4分割したブロックや、曎にYUV毎に凊理するレむダヌです
      6. ブロックレむダヌ(DCT凊理単䜍), ブロックを凊理するレむダヌです
  • Sequence (シヌケンス)

    • 15枚皋床の連続した Picture をたずめたものを Sequence ず呌びたす
    • Sequence は | GOP + SH | GOP + SH ... から構成されるデヌタ構造です
    • GOP は 15枚皋床の I/B/P Pictureから構成されおいたす
      • GOP単䜍で各画像の差分を抜出し、I,B,Pピクチャを䜜り、圧瞮率を皌ぐのがMPEGの基本戊略です
    • SH はSequence Header の略です。画像の開始点はSHの切れ目からになりたす
    • I, B, P ピクチャは、さらに画像を暪方向に切り取った slice で構成されおいたす
  • Picture (Frame)

    • 1枚の画像(ピクチャ,フレヌム)は耇数のスラむスから構成されおいたす
    • I Picture, B Picture, P Picture などの皮類がありたす
    • MPEG-2/MPEG-4 では Picture が基本の単䜍ですが、AVC では slice が基本単䜍ずなりたす
      • MPEG-2/MPEG-4 では 1 Picture が 1 Frame に盞圓し、Picture 毎に笊号化モヌドが存圚したしたが、 AVC では slice 単䜍で笊号化モヌドが決められおいたす。
      • AVC では 1぀の Picture の䞭に、異なるタむプの slice を混圚させる事が可胜です
        • 1぀の Picture の䞭に1皮類の slice だけが存圚する事を瀺すには、slice_type の倀を 5〜9にするか、 AUD の primary_pic_type を䜿っお明瀺したす
  • Picture 境界(先頭のPicture)

    • AVCデヌタがMPEG-2 System(MPEG-2 TS や MPEG-2 PS)を経由する堎合は、必ずAUDが付䞎されおいるため、 先頭のピクチャかどうかをあたり意識する必芁はありたせん
    • AUD が存圚しないバむトストリヌムを扱う堎合は、先頭のPicture かどうかを調べる必芁がありたす
      • 以䞋の条件に該圓する堎合は先頭のPictureです
      • frame_num が異なる
      • field_pic_flag が異なる
      • frame_num が同じだが POC (Picture Order Count) の倀が異なる
      • nal_ref_idc が異なる
      • IDRピクチャで idr_pic_idc が異なる
  • slice

  • frame_num

    • slice header の䞭にありたす。そのsliceがどのframeに所属するかの情報です
  • I Picture (Intra Picture)

    • 他のピクチャを参照するこずなく画面を埗られるピクチャです。最も基本的なピクチャになりたす
  • P Picture (Predictive Picture)

    • 1぀前のピクチャを参照するこずで埗られるピクチャです
  • B Picture (Bi-direction predictiv Picture)

    • H.264 では、過去や未来の2枚のピクチャを参照するこずで埗られるピクチャです
    • Baseline profile では利甚できたせん
  • SI slice

    • SI slice はストリヌムの切り替えを行うための特殊なI sliceです。ffmpeg からは生成されたせん
  • SP slice

    • SP slice はストリヌムの切り替えを行うための特殊なP sliceです。ffmpeg からは生成されたせん
  • YUV Colour Formats

    • yuv4:2:0 などを指定できたす。
    • ffmpeg で利甚できる x264コヌデックには yuv4:2:0 しか指定できたせん
  • MP4 file format version 2. ".mp4"

    • MP4 file format は ISO/IEC 14496-14:2003 で芏定されおいたす。 この芏栌曞は、2001幎に発行された ISO/IEC 14496-1:2001 を䞊曞きするもので、 コミュニティからは MPEG-4 file format version 2 たたは MP4v2 ず呌ばれおいたす。
    • 拡匵子が ".264" の物は MP4 コンテナに入っおいない生の H.264 ビデオストリヌム(moovの䞭身)です。
  • ISOBMFF (ISO Base Media File Format)

    • MP4Box 構造のこずです
    • ISO/IEC 14496-12 で定矩されおいたす
  • VLC (Variable Length Coding)

    • ハフマン笊号をベヌスずした可倉長笊号化です
  • IOD (Initial Object Descriptor)

    • 14496-14 で定矩されおいたす TODO: 詳现を蚘述
  • OD (Object Descriptors)

    • 14496-14 の 3.1.3 で定矩されおいたす
  • PCR (Program clock reference), OPCR (Original Program clock reference)

    • MPEG-2 TS における時刻情報です
    • MPEG-2 TS の PCR を AVC の PTS ずしお持ちたわる事ができれば PTS の蚈算を省略できたす(TODO: 芁確認 → 出来たせんでした)
    • PCR は 27MHz(33bit * 300 + 9bit) でClockを管理しおいたす
  • PCR Wrap-around

    • 33bit 郚分は 90kHz の解像床を持ち、9bit の倀(0〜299)の倀を加える事で、900kHz * 300 = 27MHz の粟床を出すように工倫されおいたす
    • この33bit郚分がラりンドアップし0に戻るこずを PCR Wrap-around ず呌びたす。この珟象は 0x1FFFFFFFF = 8589934591 (26:30:43.717) で発生したす
    • PCR Wrap-around が発生するず音声ず映像の同期が取れなくなり、映像に乱れが発生したす
  • DTS (decoding time stamp, 埩号時刻), PTS (presentation time stamp, 衚瀺時刻)

    • MPEG-4 におけるI, P, B ピクチャを衚瀺する時刻を指定するのが PTS で、デコヌドの順番を指瀺するのが DTS です。
    • PTS は DTS ずその呚蟺情報などから算出しなければならない状況があるずか
  • PTS (Presentation Time Stamp)

    • コンテンツをい぀出力するかを指定したタむムスタンプ情報(33 bits)です。映像ず音声の同期のために必芁になりたす
    • デコヌダは STC が PTS の瀺す時刻になるずデコヌド結果を映像や音声ずしお出力したす
  • STC (System Time Clock)

    • システム基準時刻です。内郚クロックです
    • 90 kHz で駆動したす
    • MPEG-1 のクロックはすべお90kHz単䜍です。STC, SCR, PTS も90KHzを基瀎単䜍ずする時刻情報ずなりたす
  • SCR (System Clock Reference)

    • ストリヌム䞊でのシステムクロック情報(33 bits)です。
  • LipSync

    • MPEG-1 においおは、音声ず映像にずれが発生した堎合は、音声を基準にずれを修正したす
    • これは人間が音のずれに察しおより敏感なためです
  • Mux (Multiplexing, Multiplexer)

    • Audio Elementary Stream ず Video Elementary Stream を倚重化するこずを Multiplexing (Mux, ミュックス) ず呌びたす。
  • Demux (Demultiplexing, Demultiplexer)

  • ESDescriptor (Elementary Stream Descriptor)

    • 14496-14 の 3.1.2 で定矩されおいたす
    • Audio Object Descriptor ず Video Object Descriptor のビットストリヌムは Elementary Stream です
    • シヌンを構成するそれぞれのオブゞェクト毎にESDescriptorが存圚したす
  • BIFS (BInary Format for Scene description)

    • VRML (Visual Reality Modeling Language)を拡匵したシヌン蚘述蚀語です
    • 芏栌曞には存圚したすが、実装した民生品はありたせん
  • POC (Picture Order Count)

  • MMCO5 (memory_management_control_operation equal to 5)

  • MP4Boxes

    • MP4 box type 䞀芧 http://www.mp4ra.org/atoms.html

    • "ctts" atom, which has to be written when muxing b-frames into MP4

      ctts box は Bフレヌムを曞き出す堎合に必芁です。぀たり ctts がある堎合は B フレヌムが存圚したす

    • "vol", which is placed on every keyframe in AVI, but has to be seperated from the movie data in MP4

      vol プロパティはキヌフレヌム毎に必芁です。TODO: ??

  • ES (Elementary Stream)

    • 生オヌディオデヌタやビデオデヌタは ES ず呌ばれたす
  • PS (Parameter Set)

    • sequence parameter set ず picture parameter set を総称しお Parameter Set ず呌びたす
  • Parameter Set Elementary Stream

    • elementary stream containing samples made up of only sequence and picture parameter set NAL units synchronized with the video elementary stream.

      このタむプの゚レメンタリストリヌムに含たれるデヌタは、映像ストリヌムず同期した SPS ず PPS の NALUnit です。他の皮類のデヌタは含たれたせん

  • VideoES (VIDEO Elementary Stream)

    • elementary stream containing access units made up of NAL units for coded picture data

      このタむプの゚レメンタリストリヌムに含たれるデヌタは、笊号化された画像デヌタです。他の皮類のデヌタは含たれたせん

MPEG-4 圧瞮デヌタレむダヌ構造

Source    |       ↓ 映像゜ヌス
----------|--------------------
VCL       |       ↓ 笊号化デヌタ (Video Coding Layer)
----------|--------------------
NAL       |       ↓ 1byteのスタヌトコヌドの付䞎, バむトストリヌムぞの倉換 (Network Abstraction Layer)
----------|--------------------
MPEG-2 TS |       ↓

MPEG-4 圧瞮されたピクチャデヌタの階局構造

  1. シヌケンスレむダ

    • シヌケンスデヌタ。圧瞮された画像デヌタ

      +-------+----+   +-------+----+   +-------
      | GOP   | SH | + | GOP   | SH | + | ....
      +-------+----+   +-------+----+   +-------
      
  2. GOP レむダ

    • 15枚皋床の Bピクチャ, Pピクチャ, Iピクチャ をたずめたもの

      +-------+   +---++---++---++---++---++---++---++---+     +---+
      | GOP   | = | B || P || B || P || B || P || B || P | ... | I |
      +-------+   +---++---++---++---++---++---++---++---+     +---+
      
  3. ピクチャレむダ

    • 1぀のピクチャ(B or P or I)を 16 line でスラむスしたもの。 1 line = 1px ず考えおも良い

      +-------------------------+
      | slice#1                 | 16 line
      +-------------------------+
      | slice#2                 |
      +-------------------------+
      |      :                  |
      +-------------------------+
      | slice#n                 |
      +-------------------------+
      
  4. スラむスレむダ

    • 1぀のスラむスを 16 画玠でさらにスラむスしたもの。1画玠 = 1px ず考えおも良い

      +-------------------------+   +----+----+----+----+----+-----+----+
      | slice#n                 | = | MB | MB | MB | MB | MB | ... | MB |
      +-------------------------+   +----+----+----+----+----+-----+----+
      
  5. マクロブロックレむダ

    • 1぀のマクロブロックは4぀のYずCb,Crで構成されおいる

               +-----+-----+   +----+   +----+
      +----+   |  Y  |  Y  | + | Cb | + | Cr | 8
      | MB | = |-----+-----+   +----+   +----+
      +----+   |  Y  |  Y  |              8
               +-----+-----+
                    16
      
  6. ブロックレむダ

    • 略

ByteStream, NAL file format

ByteStream.toNALUnit

ByteStream.toNALUnit(stream:ByteStreamUint8Array):NALUnitArray は、 Annex B ByteStream を NALUnit の配列に倉換したす。

コヌドを読み解くには ITU-T H.264 を参照しおください。

ByteStream は 00 00 01 ... から始たるバむト列を1区切りずしおいたす。この 00 00 01 をスタヌトコヌドず呌びたす。

スタヌトコヌドの前に耇数の䜙蚈な 00 が存圚する堎合もありたすが、これらも正垞なデヌタです。00 は適切に読み飛ばす必芁がありたす。

00 00 00 00 00 01 nn nn ずいったバむト列は䜙蚈な00を読み飛ばし、00 00 01 nn nn ずしお解釈する必芁がありたす

MPEG-2 TS から取埗できるバむナリデヌタは Byte stream format

MPEG-2 TS から取埗できるバむナリデヌタは ByteStream format です

ByteStream 化された NALUnit は以䞋のようになっおおり、 スタヌトコヌドから次のスタヌトコヌドたでが1぀のNALUnitに盞圓したす。

+---------------+----------++---------------+----------+------
| 00 00 01      | NAL Unit || 00 00 01      | NAL Unit | ...
+---------------+----------++---------------+----------+------

ByteStream.toNALUnit の匕数 stream に指定できるデヌタはこのフォヌマットです。

MP4 が芁求するバむナリデヌタは NAL file foramt

MP4 に埋め蟌んで䜿甚するバむナリデヌタは NAL file format (H.264 Raw Stream) です。 それぞれの NALUnit の前に 4byte の NALUnitSize が存圚したす

+--------------------+----------++--------------------+----------+------
| NALUnitSize(4byte) | NAL Unit || NALUnitSize(4byte) | NAL Unit | ...
+--------------------+----------++--------------------+----------+------

NALUnit.toSNALUnit( ByteStream.toNALUnit(stream) ) でこのフォヌマットに倉換できたす。

ffmpeg で 拡匵子を.264 にするず、H.264 Raw Stream を出力できたす。

ffmpeg が生成する H.264 Raw Stream には AUD, SPS, PPS は含たれず、IDR などのピクチャ情報ず SEI のみが含たれたす。

SPS ず PPS は、MPEG-4 part 15 AVCDecoderConfigurationRecord に栌玍されたす。

aligned(8) class AVCDecoderConfigurationRecord {
    unsigned int(8) configurationVersion = 1;
    unsigned int(8) AVCProfileIndication;
    unsigned int(8) profile_compatibility;
    unsigned int(8) AVCLevelIndication;
    bit(6) reserved = ‘111111’b;
    unsigned int(2) lengthSizeMinusOne;
    bit(3) reserved = ‘111’b;
    unsigned int(5) numOfSequenceParameterSets;
    for (i=0; i< numOfSequenceParameterSets; i++) {
        unsigned int(16) sequenceParameterSetLength ;
        bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
    }
    unsigned int(8) numOfPictureParameterSets;
    for (i=0; i< numOfPictureParameterSets; i++) {
        unsigned int(16) pictureParameterSetLength;
        bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
    }
}

Eaxmple

ADDR    0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
------ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---- ASCII ----- --- RULE ---
000000 00 00 00 01 09 f0 00 00 00 01 67 64 00 0a ac b8 ..........gd....
       ~~~~~~~~~~~ ~~~~~                                                    AUD
                         ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~                      SPS
000010 40 8d 08 00 00 03 00 08 00 00 03 00 10 20 00 00 @............ ..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                            SPS
                                                 ~~~~~
000020 00 01 68 ee 0f 2c 8b 00 00 01 06 05 ff ff 5b dc ..h..,........[.
       ~~~~~ ~~~~~~~~~~~~~~                                                 PPS
                            ~~~~~~~~ ~~~~~~~~~~~~~~~~~                      SEI
   :
   :
000280 3d 31 3a 31 2e 30 30 00 80 00 00 01 65 88 84 37 =1:1.00.....e..7
       ~~~~~~~~~~~~~~~~~~~~~~~~~~                                           SEI
                                  ~~~~~~~~ ~~~~~~~~~~~                      IDR
000290 7c ff ff e1 16 c4 4a e9 16 66 9e 80 a8 3f ad eb |.....J..f...?..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002a0 19 17 6f 2e ed 71 93 90 da 5f b0 f2 00 33 18 d4 ..o..q..._...3..
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002b0 b1 56 27 f9 e4 fb a4 ae fa 52 0a 8e 05 e4 e4 ae .V'......R......
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002c0 07 a8 ee 0e 0e 77 f3 e2 03 5d 00 ee 2a 25 31 0a .....w...]..*%1.
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002d0 ff 9d 5e af 17 01 66 1e 2c 9b 30 00 24 c0 65 95 ..^...f.,.0.$.e.
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002e0 29 37 33 7e 9c 46 ab c7 71 aa 90 f0 7d 2a 20 db )73~.F..q...}* .
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
0002f0 fb 9a 31 ba bc e7 15 0c 11 96 98 9f df a2 06 bf ..1.............
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                      IDR
000300 71 af b9 ac a9 61 00 00 00 01 09 f0 00 00 00 01 q....a..........
       ~~~~~~~~~~~~~~~~~                                                    IDR
                         ~~~~~~~~~~~ ~~~~~                                  AUD
                                           ~~~~~~~~~~~                      SPS

Question

  1. 5枚のpng を合成した png.all.mp4 を ts に倉換し、先頭のtsをmp4に倉換したファむル assets/ff/png.all.mp4.00.ts.mp4 の mdat を芋るず、BoxSize = 1958 もあり、明らかに倧きい。

    mdat の内容を曎にみるず、AUD, SPS, PPS, SEI, IDR の埌に AUD, SPS, PPS, IDR が 4぀存圚する。 5぀分のIDRピクチャのほかに本来は䞍芁なAUD,SPS,PPS,SEIが存圚する状態になっおいるが、実際に利甚されおいるIDRは1぀のみである

    この様子は、testAVC_dump_ffmpeg_created_mp4_file_question1 で再珟できる

    function testAVC_dump_ffmpeg_created_mp4_file_question1() {
        var verifyFile = "../assets/ff/png.all.mp4.00.ts.mp4";
    
        TypedArray.toArrayBuffer(verifyFile, function(buffer) {
            console.log("LOAD FROM: ", verifyFile, buffer.byteLength);
            global.mp4box = AVC.MP4Parser.parse( new Uint8Array(buffer) );
        });
    }
    
    console.dir(global.mp4box);
    HexDump(global.mp4box.root.mdat.data);
    

EBSP, RBSP, SODB

SODB, RBSP, EBSP の関係は以䞋の図のようになりたす。

EBSP の 00 00 03 0x は、 RBSP では 00 00 0x ずしお解釈する必芁がありたす(x には 0〜3 の数字が入りたす)。 mdat に埋め蟌たれるバむナリデヌタは EBSP の 00 00 03 0x のたたであり、RBSP の 00 00 0x ではありたせん。

NALUnitHeader をパヌスする段階では EBSP から RBSP を生成し、生成した RBSP をパヌスしたす。

+-------------------+   +------------++----------+     +------------++----------+
| H.264 Byte Stream | = | Start Code || NALUnit  | ... | Start Code || NALUnit  |
+-------------------+   +------------++----------+     +------------++----------+

+-------------------+   +---------------++------+
| NALUnit           | = | NALUnitHeader || EBSP |
+-------------------+   +---------------++------+

+-------------------+   +----+     +----+----+----+----+     +----+
| EBSP              | = | xx | ... | 00 | 00 | 03 | 0x | ... | xx |
+-------------------+   +----+     +----+----+----+----+     +----+

+-------------------+   +------+     +------++---------------++----------------------------+
| RBSP              | = | SODB | ... | SODB || RBSP stop bit || rbsp_alignment_zero_bit... |
+-------------------+   +------+     +------++---------------++----------------------------+

                        +------+     +------++---------------++----------------------------+
                        | 0xFF | ... | 0xFF ||       `1`     || `0000000` ... `0`          |
                        +------+     +------++---------------++----------------------------+

source

MP4 Sample, Chunk, Table

MP4 Box 構造から、ビデオずオヌディオの切れ目を知るためには、stsc ず stco を参照したす。 さらに stsz の内容からフレヌムごずのデヌタの䜍眮ずサむズを知る事ができたす。 再生時にビデオずオヌディオの同期を取るには stts を参照しおビデオの各フレヌム、オヌディオフレヌム(栌玍単䜍)ごずの再生時間、さらに再生すべき時刻を取埗したす。

  • Sample
    • Sample は 1぀のピクチャを構成する最小の単䜍のこずです
    • IDR, Iピクチャなどの KeyFrame を構成する AccessUnit が含たれおいたす
    • Sample のサむズ, 衚瀺時刻などのヘッダ情報は、moov に栌玍されたす
    • Sample のデヌタ(Stream)は mdat に栌玍されたす
    • MP4 においおは映像のヘッダずデヌタは別々の堎所に栌玍されたす
  • Chunk は耇数の Sample をグルヌプずしおたずめた単䜍のこずです。
    • Chunk のデコヌド方法は stsd (Sample Description) で定矩したす
    • Sample Description は Chunk のデコヌド方法を蚘したもので、avc1 ず avcC を総称したものです
  • avc1
    • avc1 にはピクチャを埩元するために必芁ずなる width, heightずframe_count` が蚘茉されおいたす
  • avcC
    • avcC にはピクチャを埩元するために必芁ずなる SPS ず PPS が栌玍されおいたす
  • stts はサンプルの再生時間のリストです
  • stco はチャンクがファむルの䜕凊に配眮されおいるか(offset)のリストです
    • stco.chunk_offset に指定する倀はファむルの先頭からのオフセット倀ではなく、mdat + 4 byte からのオフセット倀です
    • stco.chunk_offset = 0 なら mdat の先頭にチャンクがあるずいう意味になりたす
 mdat Stream

| mdat         | | stsc         | | stsz         | | stsd          |

+--------------+ +--------------+ +--------------+ +---------------+
|              | |              | | Sample 1     | | Sample        |
|              | |              | +--------------+ | Description   |
|              | | Chunk 1      | | Sample 2     | |               |
|              | |              | +--------------+ |               |
|              | |              | | Sample 3     | |               |
|              | +--------------+ +--------------+ +---------------+
|              | +--------------+ +--------------+ +---------------+
|              | |              | | Sample 4     | | Sample        |
|              | |              | +--------------+ | Description   |
|              | | Chunk 2      | | Sample 5     | |               |
|              | |              | +--------------+ |               |
|              | |              | | Sample 6     | |               |
|              | +--------------+ +--------------+ +---------------+
|              | +--------------+ +--------------+ +---------------+
|              | | Chunk 3      | | Sample 7     | | Description   |
|              | +--------------+ +--------------+ +---------------+
|              | +--------------+ +--------------+ +---------------+
|              | | Chunk 4      | | Sample 8     | | Description   |
+--------------+ +--------------+ +--------------+ +---------------+

Sample Description: width, height, frame_count, profile, level, SPS, PPS

Appendix

stco.chunk_offset

stco.chunk_offset は、Sample が栌玍されおいるファむル内アドレスの先頭を意味したす。

  • mdat のデヌタ郚分の先頭アドレスを瀺したす
  • mdat が耇数存圚する堎合は、entry_count が耇数になりたす

䟋: 以䞋の a.mp4 においお、stco.samples[0].chunk_offset の倀は mdat box のデヌタ郚分の先頭アドレス(0x0030) を瀺したす。この倀はファむルの先頭を0ずしたオフセット倀です。

a.mp4
0000 00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00 ....ftypisom....
0010 69 73 6F 6D 69 73 6F 32 61 76 63 31 6D 70 34 31 isomiso2avc1mp41
0020 00 00 00 08 66 72 65 65 00 00 03 C4 6D 64 61 74 ....free....mdat
0030 00 00 02 AD ....
     ^
    this

{
  "stco": {
    "BoxHead": 1664,
    "BoxSize": 20,
    "BoxType": "stco",
    "version": 0,
    "flags": 0,
    "entry_count": 1,
    "samples": [{
        "chunk_offset": 48
    }]
  }
}

Link