1. 程式人生 > >MPEG4標準中的Advanced Simple Profile(ASP)完整的說明-04-2章

MPEG4標準中的Advanced Simple Profile(ASP)完整的說明-04-2章

73 頁共 99InverseQuantisationArithmeticSaturationQF[v][u] F''[v][u] F'[v][u] F[v][u]quant_scale_codeW[w][v][u]MismatchControl 47 逆量化的過程4.3.4.1 第一種反量化方法第一種反量化方法,也就是MPEG 反量化方法,在quant_type 1時被使用。短頭格式不使用這種反量化方法。A) 幀內DC 係數在幀內塊中,F’’[0][0]通過將QF[0][0]乘以一個常量得到,可以用以下公式表示:F’’[0][0] = dc_scaler* QF[0][0]dc_scaler 在表

48中定義,亮度塊和色度塊是分開定義的。B) 其他係數除了幀內塊DC 係數的所有其它係數的反量化在這一部分講述。這裡使用兩個權矩陣:一個對幀內巨集塊使用,另一個對非幀內巨集塊使用。每一個矩陣都有預設值,它們可以由用戶定義的矩陣代替。預設的幀內巨集塊矩陣見前面的語義部分,我們用W[w][v][u]表示權矩陣,這裡w 取值為0 或者1,指示使用何種矩陣。W[0][v][u]對幀內巨集塊使用;而W[1][v][u]對非幀內巨集塊使用。亮度和色度的quantiser_scale vop_quant,dquant,dbquantquant_scale決定。它們的關係可以總結如下:對非短頭格式, quant 值初始化為
VOP頭中給出的vop_quant。對I-VOP或者P-VOP
如果當前巨集塊存在dquant,則當前巨集塊的quantiser_scale 等於當前的quant 值加上dquant 表示的差分值,然後將quant值更新為當前巨集塊的量化值。對B-VOP,同樣quant的初始值為vop_quant,如果當前巨集塊存在dbquant,則當前巨集塊的quantiser_scale 等於當前的quant值加上dbquant表示的差分值,然後quant值更新為當前巨集塊的量化值。如果遇到resync_marker,則將video_packet_header 頭中的quant_scale 值賦給quant
對短頭格式,有類似的結論,不再贅述。下面的算式給出了從QF[v][u]建立F’’[v][u]的算術方法:F' ' [v][u]=((2 ?QF[v][u] +k ) ?W[w][v][u] ?quantiser _ scale) / 16, if QF[v][u] ? 0where :k = 0 intra blocksSign(QF[v][u]) non - intra blocksìí?0, if QF[v][u] = 0 ìí?4.3.4.2 第二種反量化方法這一部分講述了第二種反量化方法,也就是263 反量化方法,它在Quant_type 0 PDF 檔案使用 "pdfFactory Pro" 試用版本建立www.fineprint.cnASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc 74 頁共 99使用。短頭格式只能使用這種量化方法。A) 幀內DC 係數反量化。短頭格式時,dc_scaler 取固定值8;其它情況下,dc_scaler 的定義見表48,亮度塊和色度塊的dc_scaler 時分別定義的。F’’[0][0] = dc_scaler* QF[0][0]B) 其他係數的反量化。量化引數quantiser_scale 是從1 31 的整數,量化步長是quantiser_scale 的兩倍。?? ==? + ? ?? + ? - ?ìí ?? ?F v uQF v uQF v u quantiser scale QF v u quantiser scaleQF v u quantiser scale QF v u quantiser scale[ ][ ], [ ][ ] ,( [ ][ ] ) _ , [ ][ ] , _( [ ][ ] ) _ , [ ][ ] , _ .0 02 1 02 1 1 0ifif is odd,if is evenF"[v][u]的符號由QF[v][u]決定,即F"[v][u]: F"[v][u]= Sign(QF[v][u])?|F"[v][u]|4.3.4.3 飽和逆量化得到的係數要飽和到[-2048,2047]之間,即??ì- < -- ? ? -- > -=+ ++ ++ +bits_per_pixel 3 bits_per_pixel 3bits_per_pixel 3 bits_per_pixel 3bits_per_pixel 3 bits_per_pixel 32 ' '[ ][ ] 2''[ ][ ] 2 ''[ ][ ] 2 12 1 ' '[ ][ ] 2 1'[ ][ ]F v uF v u F v uF v uF v u4.3.4.4 錯誤匹配控制錯誤匹配控制只對第一種逆量化方法適用。錯誤匹配可以使用和下面等價的任意過程,首先對塊中飽和的重建係數F’[v][u]求和,然後考察這個值是奇數還是偶數。如果它是偶數,那麼係數F[7][7]將要被修正。sum = F' [v][u]u =0u <8 ?v=0v <8?F[v][u] = F' [v][u] for all u, v except u = v = 7F[7][7] =F' [7][7] if sum is oddF' [7][7] -1 if F' [7][7] is oddF' [7][7] +1 if F'[7][7] is evenì í ü if sum is evenì í ??  4.3.4.5 逆量化方法總結總的來說,第一種逆量化方法可以用和下面的過程等價的任意方法:PDF 檔案使用 "pdfFactory Pro" 試用版本建立www.fineprint.cnASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc 75 頁共 99for (v=0; v<8;v++) {for (u=0; u<8;u++) {if (QF[v][u] == 0)F’’[v][u] = 0;else if ( (u==0) && (v==0) && (macroblock_intra) ) {F''[v][u] = dc_scaler * QF[v][u];} else {if ( macroblock_intra ) {F''[v][u] = ( QF[v][u] * W[0][v][u] * quantiser_scale * 2 ) / 16;} else {F''[v][u] = ( ( ( QF[v][u] * 2 ) + Sign(QF[v][u]) ) * W[1][v][u]* quantiser_scale ) / 16;}}}}sum = 0;for (v=0; v<8;v++) {for (u=0; u<8;u++) {if ( F’'[v][u] > 2 bits_per_pixel + 3 - 1 ) {F’[v][u] = 2 bits_per_pixel + 3 - 1;} else {if ( F’'[v][u] < -2 bits_per_pixel + 3 ) {F’[v][u] = -2 bits_per_pixel + 3 ;} else {F’[v][u] = F'‘[v][u];}}sum = sum + F’[v][u];F[v][u] = F’[v][u];}}if ((sum & 1) == 0) {if ((F[7][7] & 1) != 0) {F[7][7] = F'[7][7] - 1;} else {F[7][7] = F'[7][7] + 1;}}PDF 檔案使用 "pdfFactory Pro" 試用版本建立www.fineprint.cnASIC-MP4V_VID_MPEG4_ASP_WuBC_01.doc 76 頁共 994.3.5 DCT變換一旦DCT係數F[u][v]被恢復,那麼就可以用逆DCT變換來獲得逆變換值f[y][x],這些只要被飽和到-256≤f[y][x]≤255對短頭格式,由於不存在隔行模式,因此全部用幀DCT變換,就是一般的情況。非短頭格式時,如果使用隔行模式,並且dct_type 等於1,此時使用場DCT 變換,場DCT變換的演算法同幀DCT變換完全一樣,只是輸出的時候需要將按場組織的巨集塊轉換為按幀組織的巨集塊。下面簡單介紹一下DCT變換和逆變換的過程。矩陣大小為NxN的二維DCT變換為:F(u, v) = 2NC(u)C(v)x = 0N -1 ? f (x,y)cos(2x +1)upy =0 2NN-1 ? cos(2y +1)vp2Nu, v, x, y = 0, 1, 2, ?N-1其中x, y 是原始域中的空間座標