I. Visão geral
A codificação por entropia é um método de codificação sem perdas. O objetivo desse método de codificação é encontrar uma codificação de modo que o comprimento médio do código da palavra de código atinja o limite de entropia. A implementação específica é que um comprimento de código mais curto é usado para símbolos com maior probabilidade de ocorrência e um comprimento de código maior é usado para símbolos com menor probabilidade de ocorrência.
A codificação de entropia usada no H.264 inclui: Codificação exponencial de Columbus, CAVLC, CABAC.
Desta vez, apenas o método de codificação exponencial Columbus é analisado. Existem quatro tipos de códigos Columbus exponenciais definidos em H.264:
tipo | ilustrar |
ue(v) | Código Colombo Exponencial Não Assinado |
costura) | Código Colombo Exponencial Assinado |
te(v) | Código Colombo Exponencial Truncado |
eu(v) | Código Colombo Exponencial Mapeado |
Entre eles, ue(v) é a base de outros algoritmos variantes, e os resultados de outros algoritmos são posteriormente processados pelos resultados de ue(v).
A palavra-código de ue(v) é dividida em três partes: [prefixo] + 1+ [surfixo]
[prefixo] é n 0s consecutivos.
[surfix] é o bit de informação que representa o valor real e seu comprimento é o mesmo que [prefix].
[prefix] e [surfix] são determinados pelo valor do elemento de código.
A figura abaixo mostra os diferentes valores da codificação Columbus e o tamanho do bit ocupado após a codificação:
![](https://img-blog.csdnimg.cn/741d8bff50d64d8b85f1c370d00b9df7.png)
Fórmula de cálculo: (LeadingZeroBits: quantos zeros estão na frente)
Dois, perceba
1. A partir desta conclusão, a realização da codificação Columbus exponencial sem sinal pode ser dividida nas quatro etapas a seguir
2. Exemplos
código_num |
tmp1: código_num + 1 |
tmp2: Número de bits de registro binário convertidos: M |
tmp3: [prefixo] precisa inserir 0 números (M-1) |
Palavra de código |
0 | 1 | 1 | 0 | 1 |
1 | 2 | 10 | 1 | 010 |
2 | 3 | 11 | 1 | 011 |
3 | 4 | 100 | 2 | 00100 |
4 | 5 | 101 | 2 | 00101 |
5 | 6 | 110 | 2 | 00110 |
6 | 7 | 111 | 2 | 00111 |
7 | 8 | 1000 | 3 | 0001000 |
8 | 9 | 1001 | 3 | 0001001 |
Disposição do processo de implementação da codificação X264:
3. Exemplo
Pegue o fluxo de código do SPS acima como exemplo:
00 00 00 01 67 4D 00 29
código inicial nalutype=7 sps profileidc=0x4D=77=nível do perfil principal idc=0x29=41=4.1
8D 8D 40 3C
seq_parameter_set_id: ue(v) (análise 8D é 10001101) o primeiro 1bit é seq_parameter_set_id, de acordo com a tabela 2.2 acima, sabemos que seq_parameter_set_id é 0.
log2_max_frame_num_minus4: ue(v) (análise 8D é 0001101) conforme mostrado abaixo, log2_max_frame_num_minus4 deve ser 12
código_num |
tmp1: código_num + 1 |
tmp2: Número de bits de registro binário convertidos: M |
tmp3: [prefixo] precisa inserir 0 números (M-1) |
Palavra de código |
12 | 13 | 1101 | 3 | 0001101 |
pic_order_cnt_type: ue(v) (análise 8D é 10001101) o primeiro 1 bit é pic_order_cnt_type=0
log2_max_pic_order_cnt_lsb_minus4: ue(v) analisando 8D é 0001101) é 12
num_ref_frames: ue(v) (parse 40 to 01000000): 1
gaps_in_frame_num_value_allowed_flag:u(1):为0
pic_width_in_mbs_minus1: ue(v) (analisar 0x03C01: 0000 0011 1100 0 000 0001)
código_num |
tmp1: código_num + 1 |
tmp2: Número de bits de registro binário convertidos: M |
tmp3: [prefixo] precisa inserir 0 números (M-1) |
Palavra de código |
119 | 120 | 111 1000 | 6 | 0000 0011 1100 0 |
01 13
pic_height_in_map_units_minus1: ue(v) (analisando 0x0113: 000 0001 0001 00 11) é 67
código_num |
tmp1: código_num + 1 |
tmp2: Número de bits de registro binário convertidos: M |
tmp3: [prefixo] precisa inserir 0 números (M-1) |
Palavra de código |
67 | 68 | 100 0100 | 6 | 0000 00 01 0001 00 |
frame_mbs_only_flag:u(1) bit1为1
direct_8x8_inference_flag:u(1) bit1为1
F2C
frame_cropping_flag: u(1) (análise 0xF2: 1 111 0010) bit1 é 1
frame_crop_left_offset: ue(v) (análise 0xF2:1 1 11 0010) bit1 é 0
frame_crop_right_offset: ue(v) (análise 0xF2:11 1 1 0010) bit1 é 0
frame_crop_top_offset: ue(v) (análise 0xF2:111 1 0010) bit1 é 0
frame_crop_bottom_offset: ue(v) (analisando 0x2C: 0010 1 100) é 4
vui_parameters_present_flag: u(1) (analisar 0x2C: 0010 1 1 00) é TRUE
O seguinte precisa resolver as informações VUI
aspect_ratio_info_present_flag: u(1) (analisar 0x2C: 0010 11 0 0) é falso
overscan_info_present_flag: u(1) (analisar 0x2C: 0010 110 0 ) é falso
D C0 40 40 5
video_signal_type_present_flag: u(1) (analisar 0XDC: 1 101 1100) é verdadeiro.
video_format:u(3) (parse 0xdc: 1 101 1100) é 5
video_full_range_flag:u(1) (parse 0xdc 1101 1 100) é verdadeiro
colour_description_present_flag:u(1) (parse 0xdc 1101 1 1 00) é verdadeiro
colour_primaries:u(8) (analisar 0xc040: 11 00 0000 01 00 0000) é 1
transfer_characteristics:u(8) (analisar: 0x4040: 01 00 0000 01 00 0000) é 1
matriz_coeficientes:u(8) (analisar 0x4050: 01 00 0000 01 01 0000) é 1
chroma_loc_info_present_flag:u(1) (analisando 0x4050:0100 0000 01 0 1 0000) é 0
timing_info_present_flag: u(1) (analisando 0x4050:0100 0000 010 1 0000) é verdadeiro
0000 0BB8 0001 5F90 0400 0000 0
num_units_in_tick:u(32) 0x 0000 0BB8
time_scale:u(32) 0x 0001 5F90
fixed_frame_rate_flag:u(1):(解析0x0400:0 000 0100 0000 0000)为false。
nal_hrd_parameters_present_flag: u(1) (analisar 0x0400: 0 0 00 0100 0000 0000 ) é falso.
vcl_hrd_parameters_present_flag: u(1) (analisar 0x0400: 00 0 0 0100 0000 0000 ) é falso.
pic_struct_present_flag: u(1) (analisar 0x0400: 000 0 0100 0000 0000 ) é falso.
bitstream_restriction_flag: u(1) (analisar 0x0400: 0000 0 100 0000 0000 ) é falso.
Seguido por trailing_bits()
rbsp_stop_one_bit: f(1) (analisar 0x0400: 0000 0 1 00 0000 0000 ) é verdadeiro.
Ele é seguido por bits de preenchimento complementados para alinhamento de bytes.
4. Referência
Codificação H264 - Columbus Parsing SPS Information - Short Book
análise de codificação h264 - Columbus encoding_h264 Columbus encoding_fantasy_arch's blog-CSDN blog
H.264 (quatro) Codificação Exponencial Columbus (codificação)_13257193's blog técnico_51CTO blog