H.264フレーミング-2。結合されたビットストリームの構造を見ます

 フレームは、H.264規格の特定の概念ではなく、NALU、スライス、マクロブロック、等概念的には、実際に細かいのフレーム分割の概念に属する多くの要素のうちのため。フレームがコンセプトの上位層の比較的大きな部分ですので、私は解像度ダウンNAL層を学び始めました。主な参考ITU-T H.264標準案を学ぶここでは、テーブルの文法構造は、使用関連する規格が提案から取得されます。
 勧告は、リンクH.264標準中国語版(ただし、この提案と私は若干の差が見た、それはほとんど影響する必要があります)

1. NALヘッダ解析

 まず、NALユニット構文テーブル、以下の表、チェック
NALユニットの構文テーブル
 前の記事に記載さと略沿って、以下の表のNALユニット。
 それは、3つの重要なNALUシンタックス要素forbidden_​​zero_bitで見られるように、nal_ref_idcを、nal_unit_typeは組成とRBSPバイトストリーム。nal_unit_headerの形成における最初の三つのシンタックス要素、すなわち、NALヘッド。ヘッドは、8ビットで構成されます。
 ビット1 orbidden_​​zero_bit 1のビット値は、通常の状態では、構文エラーを示す禁止はゼロであるべきで、それは詳細には説明しません。
 基準レベルを表すNALは、(後続の参照NALの有無)を廃棄することができるかどうかを示すnal_ref_idcを2〜3ビットが、「00」は何の効果参照が、そのようなBスライスとして、廃棄されなくてもよい示し、SEI等、ゼロ- -を含む"01"、 "10"、 "11" -そのようなSPS、PPS、Iスライス、Pとして、非廃棄NALことを示しているスライスが挙げられます。
 4~8は、nal_unit_typeは(NALユニットタイプ)を参照し、それはNALユニットに含まれるRBSPデータ構造の種類を指します。nal_unit_typeは、対応する整数NALUタイプは、次の表に示します。
NALユニット・タイプ・コード
 nal_unit_typeはがVCL NALユニットと呼ばれている1~5。他のすべてのNALユニットは、非VCL NALユニットと呼ばれます。
 VCL NALユニットはスライスに関連付けられている見やすいが、正確な、データは、画像内のRBSPデータをロードされます。VCL NALユニットは、主画像データを記述するために使用されていません。
 実際には、最初のバイトでNALUの種類を決定し、スタートコード&0x1Fの、対応表を以下。以下のコードストリームデータの部分は、上記の方法に従って符号ストリームを分析しようとする試みであります
データ・ストリーム
 長方形は、スタートコード、NALUタイプのための円形ラベルとしてマーク。第一のタイプは、NALUを得ることができるSPSのNALU、シーケンスパラメータセット、比較NALUタイプのテーブルに示すように、7、0010 0111のバイナリ表現27であり、&が0x1F(バイナリ00011111)、00000111を与えるために、すなわちA小数。NALUタイプは8、PPS、ピクチャパラメータセットが続きます。NALU IDRの第三のタイプ。
 これまでのところ、標準7.4.1.2.3の導入と合わせ、既存の知識と結論フロントに基づきます。フレーミングの方法を得ることができます。

 次のNALユニットのいずれかの一次符号化ピクチャの最後のVCL NALユニットの後に、導入された7.4.1.2.3標準が開始新しいアクセスユニット(すなわち、画像)を表します。
 - NALユニットパーティションアクセス単位(本)
 (存在する場合)シーケンスパラメータは、NALユニットを設定する-
 -ピクチャパラメータは、NALユニット(存在する場合)に設定
 SEI NALユニット(存在する場合) -
 - 14〜18(両端を含む)のnal_unit_typeは値NALユニット
 -一次符号化ピクチャ(常に存在する)の第一VCL NALユニット
 前述の説明から、最初は新規に発見するように、存在しなければならない新しいものの最初のVCL NALユニットを見ることができます時間のVCL NALユニットは、フレーミングを決定するために行われます。

 そして幸いなことに、このセクションでは、第一の所定の一次符号化ピクチャVCL NALユニットを検出するための節7.4.1.2.4に示され記載されています。

 当前访问单元的基本编码图像的任何编码条带NAL单元或编码条带数据分割块A的NAL单元应与前一个访问单元的基本编码图像的任何编码条带NAL单元或编码条带数据分割块A的NAL单元以下列方式中的一种或多种进行区分:
 — frame_num的值不同。不管由于memory_management_control_operation等于5的情况出现而为了在后续解码过程中使用frame_num的值是否已经等于0,该值通常在测试条件中是在条带头的语法中出现的frame_num的值。
注1—上述情况的一个推理是一个包含frame_num值等于1的基本编码图像不能包含一个等于5的memory_management_control_operation,除非跟随其后的下一个基本编码图像(如果有的话)能够满足下面列出的其它条件。
 — pic_parameter_set_id 值不同。
 — field_pic_flag 值不同。
 — bottom_field_flag 在两个访问单元中都出现而且值不同。
 — nal_ref_idc 值不同,而且其中一个的nal_ref_idc 值等于0。
 — 两个访问单元的pic_order_cnt_type 都等于0,并且两个pic_order_cnt_lsb值不同或delta_pic_
order_cnt_bottom 值不同。
 — 两个访问单元的pic_order_cnt_type都等于1,并且两个delta_pic_order_cnt[ 0 ] 值不同或者delta_pic_order_cnt[ 1 ] 值不同。
 — nal_unit_type 值不同,而且其中一个的nal_unit_type 值等于5。
 — 两个访问单元的nal_unit_type都等于5,并且idr_pic_id 值不同。

 追踪至此,发现一下子出现了许多没接触过的参数,而这些参数需要多重判断并且未在NALU层出现。于是,往下进入slice层的解析。

2. slice头解析

 按照前文所述,数据由数据头和数据体组成。数据头即是对数据体的描述。所以进入slice层后,先跟踪slice头的信息,查看其语法结构,果然发现了frame_num这个语法元素。见下图,因slice头语法结构庞大,只给出部分语法结构表。
slice_headerテーブルセクションの構文構造
 进入建议书7.4.3节,查看条带头语义,

7.4.3 条带头语义
 如果存在,条带头语法元素pic_parameter_set_id、 frame_num、 field_pic_flag、bottom_field_flag、
idr_pic_id、 pic_order_cnt_lsb、 delta_pic_order_cnt_bottom、delta_pic_order_cnt[ 0 ]、delta_pic_order_cnt[ 1 ]、sp_for_switch_flag和 slice_group_change_cycle 的值在一个编码图像的所有条带头中都应一样。
 first_mb_in_slice 表示在条带中第一个宏块的地址。当如附件A 中规定的那样不允许任意的条带顺序时,本条带的first_mb_in_slice 的值应不小于当前图像的任何在该条带之前(按解码顺序)的其他条带的first_mb_in_slice 的值。

 段落セクションから明らかでは(存在する場合)構文要素によって決定されてもよいフレーミングに(任意スライス順序で許可されていない)first_mb_in_sliceが単調増加するかどうか1項又は第2項判定するに等しいです。
 分析NALヘッダと併せて1は、2つの解決策に分けることができ、一方は第二のVCL NALのfirst_mb_in_sliceの存在は常に単調任意許可に(増加するかどうかであり、スライスヘッダシンタクス要素(存在する場合)の数が多いと判断されましたスライス順序)が決定されたとき。

概要

 ここで、選択方法I、first_mb_in_sliceフレーミングの選択されたスライスヘッダを決定することによって行われます。書き込みフレーミングツールへの参照附属書A勧告と実際の状況、以来、必ずしもASOをサポートしていない、したがって、私は、任意のスライス順序を決定する必要はありません。さらに理解することで、我々は、構文要素が画像アドレスでのマクロブロック内の最初のスライスを表していることがわかります。言い換えれば、私は単調に増加する抵抗なく彼を判断し、その値が0であれば、あなたがプログラムをフレーミングされた画像のNALU新たな始まりかどうかを知ることができるかを決定するだけです。

公開された60元の記事 ウォン称賛18 ビュー20000 +

おすすめ

転載: blog.csdn.net/BadAyase/article/details/103488206