2009년 9월 1일 화요일

H.264 Stream 분석

기본 개념

 

NAL 이란?

  H.264는 시작 단계부터 네트웍 전송을 목적으로 개발되어졌다 따라서 비디오 컨텐츠의 효율적인

  전송을위해 NAL(Network Abstraction Layer)로 구성된다

- NAL = NAL unit + Payloads

- Payloads 에는 RBSP(Raw Byte Sequence Payload)가 위치한다

- RBSP에는 SPS,PPS등의 정보를 알려주는 파라미터 셋과, VCL(Video Coding Layer)에 해당

  하는 Slice 데이터 RBSP가 포함될 수 있다

- VCL(Video Coding Layer)은 실제 H.264 압축된 데이터를 나타내며, VCL 데이터는 NAL Unit을 통

  해 외부와 인터페이스가 이루어지게 된다

- H.264의 모든 데이터는 각각의 NAL Unit으로 구성되어지며 각각의 NAL 은 고유의 일련번호를 가지

  게된다

- NAL Unit의 조합에는 여러개의 구성이 있는데, 여기서는 SPS-PPS-I Slice-P Slice순으로 구성

  된다

 

NAL Unit의 시작 패턴

- 3bytes start pattern : 00000000 00000000 000000XX

- 4bytes start pattern : 00000000 00000000 00000011 000000XX

- 4bytes start pattern : 00000000 00000000 00000000 000000XX

 

 

2) Date Sheet or Source

Data sheet 및 소스에서:::::: Faraday 의 드라이버소스의 주석에도 다음과 같이 표현되어있었다...

ex) u(2)

u : 데이터 타입, (2) : 데이터 크기(bit)

H.264 Baseline Profile에서는 u(n), se(n), ue(v),me(v)가 주로 사용된다.

 

3) NAL Unit

Ex) NAL unit 시작코드 -> "00 00 00 01 67"

- 00 00 00 01 에서 4bytes start pattern임을 알 수 있다

- 67 은 NAL Unit의 정보

   0110 0111

   - forbidden_zero_bit : f(1) : [7] : 항상 0

   - nal_ref_idc : u(2) : [6:5] : 00 :참조픽쳐에 사용되지 않음, 다른: 참조픽쳐 구성하는데 사용

   - nal_unit_type : u(5) :[4:0] : Type정의 (책참조)

- IDR(Instantaneous Decoding Refresh) Picture란?

  참조픽쳐버퍼, 프레임 번호 POC(Picture Order Count) 정보 등의 디코딩을 위한 기본정보가 초기화

  되는 Picture를 의미함. 즉, Reference이미지를 사용하지 않고 독자적으로 디코딩될 수 있는 Intra

  코딩만 수행하는 I Slice나 SI Slice를 나타낸다

 

- H.264 비디오 헤더와 MPEG4비더오 헤더의가장 큰 차이점은 헤더 데이터의 압축 여부이다

  즉, MPEG4비디오 헤더구성 요소에 대해서는 압축하지 않았으나 H.264는 헤더데이터에 대해서도

  Exp-Golomb-code, CAVLC등으로 압축되어있다

 

4) SPS NAL Unit

Ex) H.264 Stream

00 00 00 01 67 .... 00 00 00 01 68.... 00 00 00 01 65.................

 

1st NAL : 00 00 00 01 67....... : SPS(Sequence Parameter Set)

2st NAL : 00 00 00 01 68....... : PPS(Picture Parameter Set)

3st NAL : 00 00 00 01 65....... : Coded slice of a IDR picture

                                           Slice_layer_without_partitioning_rbsp()

 

SPS = NAL start prefix + NAL unit + Payload

 

; SPS NAL unit 에는 프로파일, 레벨 등 시퀀스 전체의 부화화 정보로서 픽쳐 해상도,

  비디오 포멧등 파일 전체에 대한 포괄적인 정보가 포함되며 세부정보는 다음과 같다

  (책의표 참조)

  ① Profile @ Level indicator

  ② Profile constraint indicator

  ③ Sequence Parameter set ID(0~31)

  ④ Number of Reference frames(참조프레임수)

  ⑤ DPB info, - Picture size(디코딩되는 픽쳐크기)

  ⑥ Frame / field coding flag(순차주사/비월주사 결정)

  ⑦ Method for vector derivation of B-direct mode

  ⑧ Frame cropping parameters

  ⑨ VUI_parameters(Annex E, Video usuabliity information)

 

우선 앞서 기술한 바와 같이, H.264는 MPEG-4와 달리 헤더부분 즉, NAL unit 대부분의 요소를

압축하였다. 따라서 위에 작성된 표에서의 Mapping Type에 따라 복호하여 각각의 비트열이 어떤

의미를 지니는지 따라가보면 될거 같다~! SPS of RBSP syntax  및  교재참조!!!! 하면

 

 

 

★ SPS of RBSP syntax ★

 

음영처리    :  XXXX 모델 H.264 Drvier 에서 입력하는 syntax항목

 

Profile_idc (u(8)) : Contents의 Profile

    Baseline profile :66

    Main profile : 77

    Extended Profile : 88

Constraint_set0_flag (u(1)) : Baseline profile 의 제한 조건을 충족하는지를 나타냄

Constraint_set1_flag (u(1)) : Main profile 의 제한 조건을 충족하는지를 나타냄

Constraint_set2_flag (u(1)) : Extended Profile 의 제한 조건을 충족하는지를 나타냄

Reserved_zero_5bit (u(5)) : dummy bit

Level_idc (u(8)) : Profile 설정 후 Level 결정 (표참조)

Seq_parameter_set_id (ue(v)) : 이 값은 Picture parameter set에의해 0~31까지 정해질수있다

Log_max_frame_num_minus4 (ue(v)) : Max Frame number표시. 인자는 0 ~12 가능

    MaxFrameNum = 2^(Log_max_frame_num_minus4 +4) 로 계산됨

Pic_order_cnt_type (ue(v)) : B Slice에서 초기 참조 픽쳐의 순서를 정하기 위한 필드

 

if(Pic_order_cnt_type == 0)

{

Log2_max_pic_order_cnt_lab_minus4(ue(v)) : MaxPicOrderCntLsb의 값을 구하기 위한 계수로

    사용된다. 0~12 가능

    MaxPicOrderCntLsb = 2^(Log2_max_pic_order_cnt_lab_minus4 + 4) 로 계산됨

}

else if(Pic_order_cnt_type == 1)

{

▶ Delta_pic_order_always_zero_flag (u(1)) :

▶ Offset_for_non_ref_pic (se(v)) :

▶ Offset_for_top_to_bttom_field (se(v)) :

▶ Num_ref_frame_in_pic_order_cnt_cycle (ue(v)) :

for(i=0 ; i<Num_ref_frame_in_pic_order_cnt_cycle ;i++)

{

▶ Offset_for_ref_frame[i] (se(v)) :

}

}

Num_ref_frames (ue(v)) : H.264는 Multi reference frame의 참조가 가능하므로 사용되는

    reference frame의 수를 (1~16)까지 입력하여야 한다

Gaps_in_frame_num_value_allowed_flag (u(1)) : 이 필드의 값이 1이면 현재픽쳐의 frame

    num 에 차이가 존재하는 것이 허용이됨

    frame_num = ( PrevRefFrameNum + 1) / MacFrameNum

Pic_width_in_mbs_minus1 (ue(v)) : Picture의 가로 크기를 나타내는 것으로 codeNume으로

    다음 값들을 계산할 수 있다

    Ex) ue(0001011) -> codeNum '10'을 얻는다

    - Macro Block의 개수 :

       PicWidthMbs = Pic_width_in_mbs_minus1(10) + 1 = 11

    - 픽쳐 Luma component 가로 크기 :

       PicWidthSamplesL = PicWidthMbs(11) x 16 = 176

    - 픽쳐 Chroma component 가로 크기 :

       PicWidthSamplesC = PicWidthMbs(11) x 8 = 88

Pic_height_in_mbs_minus1 (ue(v)) : Picture의 세로 크기를 나타내는 것으로 codeNume으로

    다음 값들을 계산할 수 있다

    Ex) ue(0001001) -> codeNum '8'을 얻는다

    - Macro Block의 개수 :

       PicHeightMbs = Pic_height_in_mbs_minus1(8) + 1 = 9

    - 픽쳐 Luma component 가로 크기 :

       PicHeightSamplesL = PicHeightMbs(9) x 16 = 144

    - 픽쳐 Chroma component 가로 크기 :

       PicHeightSamplesC = PicHeightMbs(9) x 8 = 72

Frame_mbs_only_flag (u(1)) :

    0 : 부호화된 비디오 시퀀스의 부호화된 화면이 부호화된 필드나 프레임이 될 수 있음을 나타냄

    1 : 부호화된 비디오 시퀀스의 모든 부호화된 화면은 단지 프레임 매크로 블록을 포함하는 부호화

         된 프레임을 나타냄

    무슨 말인지 ?????????????

if(! Frame_mbs_only_flag)

{

▶ Mb_adaptive_frame_field_flag (u(1)) :

}

Direct_8x8_inference_flag (u(1)) : B_skip, Direct_16x16, Direct_8x8 의 밝기 모션 벡터가

    유도되는 방법을 나타낸다

Frame_cropping_flag (u(1)) : Cropping Offset 파라미터들이 SPS NAL에 존재하는지를 나타냄

if(Frame_cropping_flag)

{

▶ Frame_crop_left_offset (ue(v)) :

▶ Frame_crop_right_offset (ue(v)) :

▶ Frame_crop_top_offset (ue(v)) :

▶ Frame_crop_bottom_offset (ue(v)) :

}

Vui_parameters_present_flag (u(1)) : vui_parameters가 SPS NAL에 존재하는 지를 나타내는

    플래그. VUI(Video Usablility Information)는 비디오의 확장된 정보를 알려주는 syntax인데

    ISO/IEC에서 필수적으로 지정된 부분은 아니므로 분석 파일에서는 존재하지 않는다

if(vui_parameters_present_flag)

{

▶ viu_parameters() :

}

Rbsp_trailing_bists() : NAL Unit의 디코딩을 용이하도록 하기 위해 바이트 Align을 수행하기

    위한 함수

    rbsp_trailing_bits()

    {

       rbsp_stop_one_bit(); // RBSP의 끝을 알려주는 플래그로 항상 1을 셋팅

       while(!byte_aligned())

           rbsp_alignment_zero_bit(); // Byte Align을 위해 마지막까지 0으로 채운다

    }

 

 

4) PPS NAL Unit 

; PPS 는 SPS가 정의하는 내용의 범위보다 조금 더 세부적인 내용인 전체 파일에서 사용되는 픽쳐의 부호화 정보, 즉 디코딩되는 픽쳐에 적용되는 파라미터를 포함한다. PPS의 데이터는 정보 변경을 위해 새로운 PPS가 나오기 전까지 유효하다.

 

  ① Picture parameter ID (0~255)

  ② Sequence Parameter ID (0~31)

  ③ Entropy Coding mode flag (CABAC / CAVLC)

  ④ Slice POC info presence flag

  ⑤ Slice group map parameters

  ⑥ Max. number(1...16) of ref. frames used for decoding slices

  ⑦ Weighted prediction flags

  ⑧ Quantization scales (qp minus 26, range -26 .....+25)

  ⑨ Chroma QP offset for loop-filter (-12 .... +12)

  ⑩ Slice loop filter control flag (Alpha / Beta table offsets)

  ⑪ INTRA prediction using pixels of INTER neighboring MBs

  ⑫ Slice redundant pic. Parameters persence flag

 

★ PPS of RBSP syntax ★

 

음영처리    :  XXXX 모델 H.264 Drvier 에서 입력하는 syntax항목

 

 

Pic_parameter_set_id (ue(v)) : Picture Parameter Set ID (0~255)

Seq_parameter_set_id (ue(v)) : active sequence parameter set의 ID를 나타냄 (0~31)

Entropy_coding_mode_flage (u(1)) : Entropy coding type지정

    0 : CAVLC

    1 : CABAC

Pic_order_present_flag (u(1)) : 슬라이스 헤더 내에 다른 Picture 순서가 변동되는지를 알려줌

    0 이면, 슬라이스 내 코딩은 순차적인 것임을 나타낸다

Num_slice_groups_minus1 (ue(v)) : 화면의 슬라이스 그룹에 대한번호를 나타낸다. minus1은

    해당 값에 1을 더한 데이터를 의미한다. 만약 코드값이 1(0+1)이라면 화면의 모든 슬라이스는

    같은 그룹, 즉 1개의 슬라이스가 1개의 프레임이 된다

 

if(Num_slice_groups_minus1 >0)

{

    ▶ Slice_group_map_type (ue(v)) :

    if( slice_group_map_type == 0 )

    {

        for(iGroup =0; iGroup <= num_slice_groups_minus1;iGroup++)

           ▶ Run_length_minus1[iGroup] (ue(v)) : 

    }

    else if( slice_group_map_type == 2 )

    {

        for(iGroup =0; iGroup < num_slice_groups_minus1;iGroup++)

        {

           ▶ Top_left [iGroup] (ue(v)) :       

           ▶ Bottom_right [iGroup] (ue(v)) :  

        }

    }

    else if ( slice_group_map_type ==3||slice_group_map_type ==4 ||slice_group_map_type ==5 )

    {

        ▶ Slice_group_change_direction_flag (u(1)) :       

        ▶ Slice_group_change_rate_minus1 (ue(v)) :       

    }

    else if (slice_group_map_type == 6)

    {

        ▶ Pic_size_in_map_units_minus1 (ue(v)) :

        for( i=0 ; i <= Pic_size_in_map_units_minus1; i++)

        {

            ▶ Slice_group_id[i] (u(v)) :

        }

    }

}

 

Num_ref_idx_I0_active_minus1 (ue(1)) : 참조 영상 인덱스 0 에대한 최대 참조 인덱스를 나타내며

    코드값 +1을 실제 데이터로 사용한다 (0~31)

Num_ref_idx_I1_active_minus1 (ue(1)) : 참조 영상 인덱스 1 에대한 최대 참조 인덱스를 나타내며

    코드값 +1을 실제 데이터로 사용한다 (0~31)

Weighted_pred_flag (u(1)) : P Slice와 SP Slice에 대해 가중 예측을 사용할 것인지에 대한 필드

     0 : 적용안함, 1 : 가중예측 적용함

Weighted_bipred_idc (u(2)) : B Slice에 대한 가중 예측을 나타낸다

     0 : 적용안함, 1 : 가중예측 적용함

Pic_init_qp_minus26 (se(v)) : 각 Slice에 대한 초기 휘도 Slice QPy값을 (실제값 -26)으로 설정

    한다. 즉 (코드값 +26)이 실제 SliceQPy값이 된다. 이값은 Slice 디코딩시 참조된다 (-26 ~ +26)

Pic_init_qs_minus26 (se(v)) : SP Slice와 SI Slice에 대한 초기 SliceQPy값을 -26으로 설정

    한다. 이값은 이후 slice_qs_delta 필드에 의해 실제 Slice 디코딩시 참조된다 (-26 ~ +26)

Chroma_qp_jndex_offset (se(v)) : QPc 주소표를 통해 QPy와 QSy에 Offset이 더해지게 된다

    (-12 ~ +12)

Deblocking_filter_control_present_flag (u(1)) : 코드값이 1이면 화면내에서 디블록킹 필터의

    특성을 변화하는 파라미터가 전송된다

Constrained_intra_pred_flag (u(1)) : 코드값이 1이면 Picture내에서 부호화 예측시 Picture간

    부호화 매크로 블록을 참조하는 것이 금지된다. 참조 영상 인덱스 0에 대한 최대 참조 인덱스를

    나타낸다. (0~31)

Redundant_pic_cnt_present_flag (u(1)) : 코드값이 1이면 Redundant Picture(중복 픽쳐)에

    대한 POC가 부호화 되는 지의 여부를 나타냄

Rbsp_trailing_bists() : NAL Unit의 디코딩을 용이하도록 하기 위해 바이트 Align을 수행하기

    위한 함수

    rbsp_trailing_bits()

    {

       rbsp_stop_one_bit(); // RBSP의 끝을 알려주는 플래그로 항상 1을 셋팅

       while(!byte_aligned())

           rbsp_alignment_zero_bit(); // Byte Align을 위해 마지막까지 0으로 채운다

    }

댓글 없음:

댓글 쓰기