天天看點

[SilkyBible] XviD系列-7

  引用

04-29-2003

關于 XviD 和 DivX5 的比較,我這幾天又做了一點實驗。

我以前壓 XviD 都不用 B- frame,當然也不開 Quarter Pixel 和 GMC,是以和 DivX5 比較的時候,我也不使用 DivX5 的 B- frame 和 Quarter Pixel、GMC 等功能。

今天用新版的 DivX 5.0.5 和 XviD 再做一次比較,同時測試了開啟 B- frame 的效果。

結果發現 DivX 5.0.5 蠻強的,比 5.0.2 進步。

(不過産品上市時間相隔了一年,沒有進步的話就真該打屁股了 :P )

我隻測試了一個 sample,動畫 Kiddy Grade 的片頭,時間長度一分半鐘。

這個影片的色彩很鮮豔,對比強烈,噪聲不多,有很多平移畫面,淡入淡出的畫面,鏡頭慢慢拉近慢慢拉遠的畫面,還有一些動态非常激烈的畫面,不太好壓。

當然,還有動畫的銳利線條、無殘影等特性。

DivX 使用版本

DivX Pro v5.0.5

XviD 使用版本

1. Nic 編譯的版本 30-03-03

Nic 的這一版,有修改 iDCT 的演算法,使用的是 Simple iDCT。

XviD 原本用的 MMX iDCT 演算法是 Intel 的 AP-922,精度似乎不夠。

Simple iDCT 是 FFMPEG 用的 iDCT 演算法,據實驗有很好的效果。

為了解決 Quarter Pixel 解碼,使用不同 iDCT 算式會造成畫面顆粒像液體般流動的瑕疵,XviD 打算将 iDCT 的算式改成和 FFMPEG 一樣。

這樣以後用 ffdshow 來解碼有使用 Quarter Pixel 的 XviD 影片,就不會發生水波紋流動的這種瑕疵了。

============== 無關主題,順便一提 開始 ==============>

播放 Quarter Pixel 的影片時,畫面顆粒像液體般流動的瑕疵,其産生的原因:

1) ISO 修改了 Quarter Pixel 的 rounding 方法,舊版的 FFMPEG 沒有跟着修改,是以解 XviD 的 Quarter Pixel 時,會發生 rounding 錯誤,最新版的 ffdshow 已經修正了這個錯誤。

2) 不同 MPEG-4 Encoder 壓縮時采用不同 iDCT 算式,會造成解壓縮時 iDCT mismatch 的問題(雖然設計上有防止誤差累積的機制)。

由于大家壓 MPEG-4 時 I- frame 的間距通常設得很長,誤差一直累積,是以 iDCT mismatch 的問題會變得更嚴重(連續 P- frame 之後畫面會逐漸劣化)。

而 Quarter Pixel 似乎更加重了這個問題,使得誤差累積的錯誤更明顯。

要避免這個瑕疵,必須

1) 使用 Koepi、Nic 編譯的最新版 XviD 來編碼,他們兩人的版本有修改,使用 Simple iDCT 演算法。

uManiac 編譯的版本沒有修改。

2) 使用最新版的 ffdshow 來播放,或是使用 XviD 自己來播放。

<============== 無關主題,順便一提 結束 ==============

2. 自己編譯的版本,25-04-03 的 CVS Fresh Check,手動修改了 iDCT 的演算法,使用 fdct_mmx + simple_idct_mmx2 的組合(按照我使用的 CPU 旗标設定。我的 CPU 沒有 SSE/SSE2/3DNow!2 指令集,Debug 設定底下還是用自動偵測),根據網友測試,這個組合是 XviD 的 PSNR 品質算出來最高的。

從 Nic 的 03-30,到我編譯的 04-25,XviD 修改了:

================================================

25.4.2003 15:00:

U xvidcore/src/motion/motion_est.c (rev.1.67) syskin:

- b- frames look good in still motion, after all

14.4.2003 15:00:

U xvidcore/src/motion/motion_est.c (rev.1.66) syskin:

- "What bug could i invent today ?"

14.4.2003 13:40:

U xvidcore/src/motion/motion_est.c (rev.1.65) syskin:

- improved vhq (does not decrease psnr anymore - at least for low quants) and tweaked p/b/i decision again

9.4.2003 12:20:

U xvidcore/src/encoder.c (rev.1.99) syskin:

- b frame_threshold works again - I didn't know anyone uses it ;>

U vfw/src/codec.c (rev.1.28) syskin:

- b frame_threshold = 0;

8.4.2003 11:40:

U xvidcore/src/encoder.c (rev.1.98) syskin:

- b frame_threshold not supported -> disabled

U xvidcore/src/motion/motion_est.c (rev.1.64) syskin:

- faster; better vhq; b frame-decision changed again

U xvidcore/src/motion/motion_est.h (rev.1.6) syskin:

- faster; better vhq; b frame-decision changed again

5.4.2003 16:20:

U xvidcore/src/motion/motion_est.c (rev.1.63) syskin:

- a bit faster + a small bugfix

U xvidcore/src/motion/motion_est.h (rev.1.5) syskin:

- a bit faster + a small bugfix

5.4.2003 02:40:

U xvidcore/src/global.h (rev.1.22) edgomez:

- Fixes 32 bit misaligned reads on ARM (+ some sync work with old 0.9.x tree for cleanups)

U xvidcore/src/bitstream/bitstream.h (rev.1.18) edgomez:

- Fixes 32 bit misaligned reads on ARM (+ some sync work with old 0.9.x tree for cleanups)

4.4.2003 11:00:

U vfw/src/codec.c (rev.1.27) Isibaar:

- set b frame threshold to 255 by default

4.4.2003 03:40:

U xvidcore/src/encoder.c (rev.1.97) Isibaar:

- CBR + b- frames bugfix

U xvidcore/src/utils/ratecontrol.c (rev.1.20) Isibaar:

- CBR + b- frames bugfix

================================================ 引用

04-29-2003

測試一: 固定品質 quantizer 2 壓縮,壓出來檔案越小,壓縮效率越高。

然而檔案小,可能是壓縮時舍棄較多系數換來的(會造成畫面模糊、細節損失、誤差增加、畫質下降),是以同時計算 PSNR,測量品質。

PSNR(Peak Signal to Noise Ratio)是和原始影片比較的結果,PSNR 越高,代表和原來的畫面接近,品質越高。

DivX 5.0.5 的設定:

1-pass quality-based

Quantizer: 2

不使用 Psychovisual Enhancements

Max Key frame interval: 132

Scene change threshold: 50%

Performance/quality: Slowest

Encode as Progressive

XviD 的設定:

1 Pass - quantizer: 2

Motion search precision: 6 - Ultra High

Quantization Type: H.263

VHQ mode: 1 - Mode Decision

Maximum I- frame interval: 132

Minimum I- frame interval: 1

不使用 Lumi masking

Use Chroma motion

Chroma Optimizer(pre-filter) <- 這個選項會降低 PSNR,但是可以減少紅色部分鋸齒的現象

壓出來檔案大小

DivX 5.0.5: 36,706,304 bytes ( 100%)

XviD Nic's: 33,916,928 bytes (92.4%)

XviD 04-25: 33,153,024 bytes (90.3%)

接下來測定 PSNR,這裡要說明一下:

為了公平起見,所有壓縮版本的源檔案都是統一由 Avisynth 做 RGB -> YV12 的轉換,用 VirtualDubMod,直接送 YV12 的資料給 Codec 壓縮。Avisynth 的文法是

avisource("Kiddy Grade NCOP_aup_vfapi.avi").ConvertToYV12()

比較的時候,是用這個源檔案,和各個壓縮的版本比較。

各個壓縮版本的 AVI 開啟的時候,強制 Codec 輸出 YV12 的資料,是以我們計算的是 YUV 的 PSNR。

為什麼不比較 RGB 的 PSNR 呢?因為:

1. MPEG-4 本來存的就是 YUV 格式,要比較 RGB 的 PSNR,要經過 YUV -> RGB 轉換,轉換會有損失,應盡量避免。

2. MPEG-4 存的 YUV,是 YUV 4:2:0 格式,也就是 Y 的情報量是 UV 的四倍,取樣時四點共享一個 UV 值。

是以轉成 RGB 時,要經過 upsampling,YUV 4:2:0 -> 4:2:2 -> 4:4:4 -> RGB24。

upsampling 的工作,一般播放時是由顯示卡的硬體來做,是以每種 Codec upsample 的效果都一樣。

但是我們在做測試時,使用 Codec 自行解碼輸出做比較,不會用顯示卡硬體的 upsample,而是由各家的 Codec 自行 upsample,這時各家 Codec 的 upsample 好壞,就會影響測試成績。

然而我們不想比較各家 Codec 解碼時 upsample 的好壞,隻想比較 Codec 壓縮時的功力,誰儲存的資料最接近源檔案。

因為各家 Codec upsample 的好壞,不影響實際播放時畫面的結果;實際播放時,upsample 是由顯示卡來做的。

是以我們隻比較 upsample 前,MPEG-4 檔内儲存的 YUV 4:2:0 資料。

如果考慮 Codec upsample 的話,XviD 大概會是最差的。

因為 XviD 的 YUV 4:2:0 -> 4:4:4,完全沒有做任何内插,而是直接将解出來的 UV copy 給四個點使用。

3. 因為 XviD 有 Chroma motion(動作搜尋同時考慮 UV)和 Chroma Optimizer(減少紅色鋸齒,會讓 PSNR 下降)等功能,是以分開計算 YUV,看看這些功能對 UV 造成的影響。

Avisynth 的文法是

# 原始檔 orig

orig=avisource("Kiddy Grade NCOP_aup_vfapi.avi").ConvertToYV12()

# 壓縮檔 encoded,強制 YV12 輸出

encoded=avisource("Kiddy Grade NCOP_XviD_H.263.avi", false, "YV12")

# 計算 Y PSNR,輸出 LOG 檔案

compare(encoded, orig, "Y", "PSNR-XviD_Y.LOG", false)

代碼 (輕按兩下代碼複制到粘貼闆)

Average PSNR (dB)

                   Y         U         V        YUV
========================================================
DivX 5.0.5:     47.7101   47.6905   47.6547   47.6851
XviD Nic's:     47.5616   47.5750   47.4824   47.5397 <- V(Cr/Chroma Red) 的 PSNR 特别低
XviD 04-25:     47.7279   47.7397   47.6475   47.7050 <- V(Cr/Chroma Red) 的 PSNR 特别低      

人眼對 Y 較敏感,Y 的影響力較大,Chroma 比較不重要,分析資料時應以 Y 為主。

XviD 有開啟 Chroma Optimizer,這個 pre-filter 會改變 Chroma 的值,使得 Chroma 和原來的差距較大,是以 PSNR 會降低。

不過它可以減少紅色部分看起來的鋸齒現象,讓紅色部分看起來較平滑。

考慮檔案大小和 PSNR 比 (YUV PSNR/檔案大小%) 調整後的分數

DivX 5.0.5: 47.6851

XviD Nic's: 51.4499

XviD 04-25: 52.8295

XviD 大勝 :D

引用

04-29-2003

測試二:接下來測試開啟 B- frame 的效果

DivX 5.0.5 的設定:

和測試一相同,多加使用 B- frame

DivX 5 B- frame 的預設值,當 I/P Frame quantizer 為 2 時,B- frame quantizer 為 4

XviD 的設定:

和測試一相同,多加使用 B- frame

配合 DivX 5,将 B- frame ratio 設為 100,offset 設為 200,也就是同樣使用 quantizer 4

最大 B- frame 個數 4 個

壓出來檔案大小

DivX 5.0.5: 29,198,336 bytes (100%)

XviD Nic's: 29,896,704 bytes (102.4%)

XviD 04-25: 27,856,896 bytes (95.4%)

XviD Nic's 的 B- frame 壓縮率不如 DivX 5。

原因可能有:

1. XviD 的 VHQ 功能目前對 B- frame 沒作用。

B- frame 可供選擇的壓縮模式更多,從 VHQ 能得到的好處更多,不能用非常可惜。

B- frame 少了 VHQ 輔助,原本大勝的差距就被 DivX 5 追上。

由此可見 VHQ 很重要,一定要開。

2. XviD 的 B- frame 是動态地插入,會視畫面做判斷要不要使用 B- frame。

而 DivX 5 的 B- frame 則是固定的,一定要維持 IBPBPB... 的形式。

是以遇到不适合使用 B- frame 的畫面,DivX 5 還是要使用 B- frame,并且以高 quantizer 壓縮,畫質會較差。

而 XviD 的動态判斷還在改良,插入的判斷較保守,遇到這種高動态、無殘影的動畫訊源,插入的 B- frame 個數較少,以高 quantizer 壓縮的 B- frame 個數減少,壓縮率自然下降。

Koepi 編譯的版本有加入一個設定,可以讓你控制插入 B- frame 的判斷,将 threshold 設得越高,B- frame 插得越多。

Nic 的版本沒有開放這個選項,用的是内定的預設值 0。

然而經過 sysKin 這一個月來的改進,04-25 的 XviD B- frame 壓縮效率大增,檔案小了快 2MB !!

那麼畫質有沒有下降呢?

測定 PSNR。

這裡要說明一下,由于加入 B- frame,解碼時會産生 delayed frame,XviD 開頭多一張 frame,DivX 結尾多一張 frame,要把這些多出來的 frame 切掉,才能對齊比對,算出來的 PSNR 才會正确。

例如 XviD 開頭多一張,Avisynth 處理的文法

encoded=avisource("Kiddy Grade NCOP_XviD_H.263-B4.avi", false, "YV12").Trim(1,0)

算出來的結果:

代碼 (輕按兩下代碼複制到粘貼闆)

Average PSNR (dB)

                   Y         U         V        YUV
========================================================
DivX 5.0.5:     46.5597   46.5629   46.4920   46.5382
XviD 04-25:     46.9404   46.9653   46.8575   46.9211      

赢得比不用 B- frame 的時候更多。

考慮檔案大小和 PSNR 比 (YUV PSNR/檔案大小%) 調整後的分數

DivX 5.0.5: 46.5382

XviD 04-25: 49.1835

還是大勝 :D

============== 無關主題,順便一提 開始 ==============>

用了 B- frame、Quarter Pixel、GMC 等進階功能壓縮率和畫質就會變得比較好嗎?

不一定。

B- frame 因為提高 quantizer 壓縮,通常來說使用 B- frame 後檔案都會縮小,但是品質确有可能降得非常快。

使用 B- frame PSNR 會下降可以了解(因為 B- frame quantizer 較高),但是如果降得太離譜,視覺品質也會很明顯的跟着下降。

XviD 的三位大神之一 gruel 曾做過測試,VQEG 的測試 sample 中,有一個影片隻要一開 B- frame,PSNR 會整整掉 12.5dB !!

(根據經驗,CG 動畫類的通常不太适合開 B- frame,不過也有反例,要看素材的内容)

是以哪些影片适合使用 B- frame,哪些不适合用,這正是 XviD 正在努力研究的方向。

Quarter Pixel 也是,根據理論 Quarter Pixel 可以提高壓縮率,但是據許多人的測試,開了 Quarter Pixel 後檔案有時反而會變大。這也是 XviD 的開發人員正在研究的課題。

同理 GMC 也是,用了不一定會提高壓縮率、促進品質。

XviD 希望能夠歸納出各種功能适當的使用時機,在适當的時候才使用這些功能,讓這些工具能發揮最大的效率。

是以在此之前,如果你的碼率夠,不計壓出來的大小,或是檔案很好壓縮,可以試着不用 B- frame。

然而 B- frame、Quarter Pixel 使用後都有一些視覺上的作用,例如 B- frame 具有減少噪聲的作用,Quarter Pixel 會讓顔色變深。

如果希望具有這些視覺效果,那麼就開啟這些功能吧。

<============== 無關主題,順便一提 結束 ==============