1 本文詞匯約定
宏塊:H264編碼基本單元,16x16像素(或采樣)構成
塊: 由8x8像素(或采樣)構成的單位
子塊: 由4x4像素(或采樣)構成的單位
2 幀內亮度預測模式
H264規范中,宏塊有4種幀內亮度預測模式,模式編號為0,1,2,3;塊與子塊分別有9種幀內亮度預測模式,模式編號從0至9,即0,1,2,.......,8。具體不細說了,可查H264標准。下文以子塊為例說明其亮度預測模式如何編碼進碼流中的。
3 子塊亮度預測模式編碼的句法元素
prev_intra4x4_pred_mode_flag:是否使用該子塊的上左子塊亮度預測模式編號的最小值,在計算出該子塊的最佳亮度預測模式后,若基編號與該子塊上左子塊亮度預測模式編號的最小值相等,prev_intra4x4_pred_mode_flag為1,否則為0。
rem_intra4x4_pred_mode:prev_intra4x4_pred_mode_flag為0時,指示計算出的該子塊的最佳亮度預測模式編號或該子塊的最佳亮度預測模式編號減1。
4 子塊亮度預測模式編碼的句法元素賦值的偽代碼過程
for( luma4x4BlkIdx=0; luma4x4BlkIdx<16; luma4x4BlkIdx++ ) { MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx] = (如果左邊子塊或上邊子塊不可用,比如跨片片界或為非幀內編碼模式) ? 2 : Min(MinModeOfLeftSubBlock,MinModeOfUpSubBlock); BestMode[luma4x4BlkIdx] = 計算子塊的最佳亮度預測模式(); if(BestMode[luma4x4BlkIdx] == MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx]) { prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] = 1; } else { prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] = 0; } if(!prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ]) { if(BestMode[luma4x4BlkIdx] < MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx]) { rem_intra4x4_pred_mode[ luma4x4BlkIdx ] = BestMode[luma4x4BlkIdx]; } else { rem_intra4x4_pred_mode[ luma4x4BlkIdx ] = BestMode[luma4x4BlkIdx] - 1;//標注4 } } }
5 為什么要計算MinModeBetwennLeftAndUpSubBlock
每個4×4 塊幀內亮度預測模式編號必須編碼傳給解碼器以便解碼。該信息可能需大量比特表示,但鄰
的幀內模式通常是相關的。例如,A、B 、E 分別為左邊、上邊和當前塊,如果 A 和B 預測模式
式1 ,E 的最佳預測模式很可能也為模式 1 。所以通常利用這種關聯性編碼 4×4 幀內亮度預測模式編號。
6 體會H264之博大精深
幀內亮度預測模式有9種,其編號為0,1,......,8,其范圍上界(8)用2進制數表示需要4位,通過標注4可將rem_intra4x4_pred_mode的值的范圍的上界限定為7,從而3位即可表達。少了一位,H264就是通過這樣的巧妙設計達到提升編碼效率的目的的。
