Mã hóa luồng bit nén hay mã hóa Entropy

Một phần của tài liệu MÔ HÌNH CHỨNG THỰC BỀN VỮNG TRÊN VIDEO H.264/AVC DỰA TRÊN ĐẶC TRƯNG VÂN TAY (Trang 46 - 50)

Trong quá trình nén video, một số giá trị phải được mã hóa để tạo thành luồng bit nén để lưu trữ hoặc truyền dẫn nhằm phục vụ cho bộ giải nén. Các giá trị

này bao gồm:

• Các hệ số sau khi đã biến đổi và lượng tử.

• Các thông tin liên quan nhằm giúp cho bộ giải nén tái tạo lại block dự đoán.

• Thông tin về cấu trúc của dữ liệu nén. • Thông tin về chuỗi video hoàn chỉnh.

• Thông tin về mode dựđoán trong các maroblock trong dựđoán Intra. • Giá trị biến lượng tử (QP).

Các giá trị này và một số thành phần khác sẽ được mã hóa thành luồng bit nhị phân bằng cách dùng các thuật toán mã hóa độ dài thay đổi CAVLC và/hoặc mã hóa số học CABAC. Luồng bit nhị phân này sẽ thay thế cho thông tin video ban đầu với kích thước nhỏ nên hiệu quả hơn trong việc lưu trữ hoặc truyền dẫn.

Có 3 loại mã hóa entropy được sử dụng trong H.264 đó là mã hóa Exp- Golomb, mã hóa CAVLC, và mã hóa CABAC.

Mã hóa Entropy Exp-Golomb

Mã hóa Exp-Golomb được dùng để nén hầu như các thành phần dữ liệu của luồng video cần mã hóa ngoại trừ phần dữ liệu của block khác biệt.

Các mã Exp-Golomb (Exponential Golomb Codes) là các mã với chiều dài thay đổi. Các mã này được xây dựng trên cùng một nguyên tắc.

Bảng 2. 7: Các từ mã Exp-Golomb

Trong bảng 2.7, với một vài từ mã (codeword) đầu tiên có thể biết được các từ mã này được xây dựng theo cách logic như sau:

[M zeros] [1] [INFO] (2.23)

Trong đó, INFO là một trường gồm có M bit mang thông tin cho giá trị

code_num cần thay thế. Chiều dài của mỗi từ mã Exp-Golomb là (2.M +1) bit. Mỗi từ mã có thểđược bộ nén xây dựng dựa trên chỉ sốcode-num của nó

INFO = code_num + 1 – 2M

Một từ mã có thểđược giải mã để tạo thành số mà nó thay thế trong bộ giải nén như sau:

• Đọc tổng số zero trong M zeros đứng trước 1 • Tính giá trị của M bit INFO sau 1.

• Giá trị code_num = 2M + INFO - 1

Tuy nhiên, mã Exp-Golomb được dùng để mã hóa các thành phần dữ liệu khác nhau trong H.264, nhưng không phải tất cả chúng là các số nguyên dương. Vì vậy, đối với một số thành phần dữ liệu, một bảng phụ được thêm vào để thay thế

cho các giá trị này.

Bảng 2. 8: Ánh xạ các codeNum cho các syntax elements có dấu

Đối với các bảng ánh xạ này, có giá trị thông dụng hơn của các thành phần mã hóa được ánh xạ tới các codeNum nhỏ, vì thế việc mã hóa sẽ đạt hiệu quả nén cao hơn.

Mã hóa chiều dài thay đổi ứng ngữ cảnh CAVLC

CAVLC (Context-based Adaptive Variable Length Coding): mã hóa chiều dài thay đổi ứng ngữ cảnh. Đây là một dạng mã hóa entropy mà bảng từ mã (codeword table) áp dụng cho block hiện tại cần mã hóa sẽ có chiều dài thay đổi

dựa vào các phần dữ liệu đã được mã hóa trước đó (các block lân cận đã được mã hóa). CAVLC là phương pháp mã hóa entropy của profile cơ bản của H.264. Nó

được dùng để mã hóa các block khác biệt 4x4 hoặc 2x2 gồm các hệ số đã lượng tử

sau khi block được tái sắp xếp. Mã hóa CAVLC dựa trên các đặc điểm sau của một block sau quá trình lượng tử:

• Sau các quá trình dự đoán, biến đổi và lượng tử, các block thường mang tính chất ‘thưa’ (chứa hầu hết các hệ số mang giá trị 0). CAVLC dùng mã hóa đường chạy thế thay thế chuỗi các 0 làm cho hiệu quả nén tốt hơn. • Tổng số các hệ số khác zero trong các block kề nhau là tương đương với

nhau. Các hệ sốđược nén dựa trên một bảng tìm kiếm (look-up table) và sự lựa chọn của bảng này phụ thuộc vào số các hệ số khác zero trong các block lân cận của block cần mã hóa.

• Sau quá trình tái sắp xếp, giá trị level (độ lớn) của các hệ số khác zero thường có khuynh hướng lớn tại các vị trí bắt đầu của mảng (gần các hệ

số DC) và giảm dần khi đi về phía cuối mảng. CAVLC lợi dụng điểm này bằng cách lựa chọn bảng tìm kiếm (look-up table) phụ thuộc vào độ lớn các levelđược mã hóa gần nhất cho level hiện tại cần mã hóa.

Trong CAVLC, việc mã hóa một block gồm các hệ số biến đổi được thực hiện theo thứ tự sau [24] :

coeff_token: mã hóa các hệ số khác 0 (TotalCoeff) và các Trailing Ones

(các hệ số với giá trị tuyệt đối bằng 1).

trailing_one_sign_flag: dấu của các giá trịTrailing One.

level_prefix: phần đầu của mã các hệ số khác 0 (một giá trị cho một hệ

số).

level_suffix: phần thứ 2 của mã các hệ số khác 0 (một giá trị cho một hệ

số).

total_zeros: tổng số zero tính từ đầu mảng cho đến hệ số khác zero cuối cùng.

run_before: số các zero trước mỗi hệ số khác 0. Việc mã hóa các

run_befoređược thực hiện theo thứ tự ngược từ cuối mảng.

Mã hóa nhị phân số học ứng ngữ cảnh CABAC

CABAC (Context-based Adaptive Binary Arithmetic Coding): mã hóa nhị

phân số học ứng ngữ cảnh. Giống như CAVLC, CABAC sẽ mã hóa phần dữ liệu hiện tại dựa trên phần dữ liệu trước đó đã được mã hóa trong các block lân cận. CABAC đạt được tỉ lệ nén tốt dựa vào việc lựa chọn mô hình thích hợp cho mỗi dữ

liệu cần mã hóa theo ngữ cảnh của nó và sựước lượng hợp lý dựa trên các thống kê cục bộ và dùng mã hóa số học (arithmetic coding) thay cho mã hóa chiều dài thay

đổi (variable-length coding) như trong CAVLC. CABAC dùng mã hóa số học có nghĩa là chỉ có 2 giá trị nhị phân (0 và 1) được mã hóa. Nếu một giá trị không phải là nhị phân (chẳng hạn các hệ số biến đổi, các vector chuyển động) thì sẽđược ‘nhị phân hóa’ để chuyển thành dạng nhị phân trước khi dùng mã hóa số học. Mã hóa CABAC được dùng trong profile chính.

Một phần của tài liệu MÔ HÌNH CHỨNG THỰC BỀN VỮNG TRÊN VIDEO H.264/AVC DỰA TRÊN ĐẶC TRƯNG VÂN TAY (Trang 46 - 50)

Tải bản đầy đủ (PDF)

(114 trang)