1.1.
kd_compressed_stats
1.1.1.
???
功能
監(jiān)視壓縮過(guò)程統(tǒng)計(jì)狀態(tài)的類,一個(gè)應(yīng)用就是與在圖像完全壓縮之后通過(guò)
PCRD-opt
率分配算法找到的失真長(zhǎng)度斜率門限相關(guān)的碼塊編碼器的反饋。這允許編碼器跳過(guò)幾乎是肯定拋棄的編碼過(guò)程。
當(dāng)前非常簡(jiǎn)單的時(shí)間就是假定所有子帶樣本的可壓縮性是相同的,而不管子帶或分辨率層。這對(duì)于那些被處理的子帶樣本與子帶的大小成比率是可行的,因?yàn)槠骄鶋嚎s性對(duì)于使用預(yù)測(cè)率控制屬性是容易度量的。
1.1.2.
???
數(shù)據(jù)成員
名稱
|
類型
|
說(shuō)明
|
Target_rate
|
double
|
目標(biāo)碼率,用字節(jié)
/
樣本來(lái)表示
|
Total_samples
|
int
|
整個(gè)圖像中的總子帶樣本樹(shù)
|
Next_trime
|
int
|
下個(gè)應(yīng)該被修整的樣本數(shù)
|
Conservative_extra_samples
|
int
|
增加到
num_coded_samples
,為了安全
|
Num_coded_samples
|
int
|
已經(jīng)被編碼的樣本數(shù)量
|
Quant_slope_rates
|
Int[4096]
|
元素的索引由塊過(guò)程斜率的
1/16
決定,值是到當(dāng)前過(guò)程的所有過(guò)程編碼長(zhǎng)度和。斜率的值是
2
個(gè)字節(jié),最大是
65535
,而為了歸整到
4096
個(gè)元素中,必須除以
16
。
|
Min_quant_slope
|
int
|
在所有塊編碼過(guò)程中出現(xiàn)的最小量化斜率
|
Max_quant_slope
|
int
|
在所有編碼過(guò)程中出現(xiàn)的最大的量化斜率
|
?
1.1.3.
???
成員函數(shù)
1.1.1.1.
?????????
get_conservative_slope_threshold
參數(shù):
assume_all_coded, bool
類型
PCRD-opt
算法產(chǎn)生的斜率門限不可能比這里返回的值小,記住,小的門限意味著在碼流中包含更多的壓縮數(shù)據(jù)。如果參數(shù)使
true
,斜率門限基于這樣的假定:對(duì)于任何更多的樣本不產(chǎn)生字節(jié)。否則,假定為:將來(lái)的樣本將有與已經(jīng)編碼的有相同的平均壓縮性。注意,由于壓縮器傾向于先輸出高頻子帶樣本的高比率部分,因此后來(lái)樣本的實(shí)際壓縮性低于平均值,使我們的估計(jì)更保守。
1.?
設(shè)置臨時(shí)編碼
max_bytes
2.?
如果
all_coded
為
true
,設(shè)置
max_bytes
為目保碼率×總樣本數(shù)量。否則設(shè)置其為目標(biāo)碼率×已經(jīng)編碼的樣本和保守的額外樣本數(shù)(
conservative_extra_samples
)。
3.?
設(shè)置
curmulative_byte
臨時(shí)變量為
0
4.?
設(shè)置初始
n
為
max_quant_slope
,并逐次減
1
循環(huán),結(jié)束的條件是
n
小于
min_quant_slope
。
5.?
累加
curmulative_bytes
的值為
quant_slope_rates
,如果某個(gè)循環(huán)中,其大于
max_bytes
,停止循環(huán)。
6.?
判斷
n
是否大于
0
,如果大于
0
,取
n
×
16
-
1
的值返回,否則返回
1
。
?
1.1.1.2.
?????????
kd_compressed_stats
參數(shù):
total_samples(
總樣本數(shù)量
)
,
target_bytes
(目標(biāo)字節(jié)數(shù)量)。
1.?
保存總樣本數(shù)量
2.?
設(shè)置
next_trim
為總樣本數(shù)量的字節(jié)數(shù)量
3.?
設(shè)置
conservative_extra_samples
為
4096
加總樣本數(shù)量除以
16
。
4.?
計(jì)算目標(biāo)碼率,如果總樣本數(shù)量是
0
,為
1
,否則目標(biāo)字節(jié)除以總樣本樹(shù),單位為字節(jié)
/
樣本
5.?
設(shè)置已經(jīng)編碼的樣本數(shù)量為
0
6.?
Min_quant_slope
為
4095
,
max_quat_slope
為
0
7.?
設(shè)置
quant_slope_rates
的每個(gè)元素為
0
1.1.1.3.
?????????
update
參數(shù):
block
對(duì)象
如果該函數(shù)返回
TRUE
,推薦壓縮的數(shù)據(jù)流截?cái)嗟脚c該點(diǎn)目標(biāo)壓縮長(zhǎng)度一直的大小。
1.?
增加已經(jīng)編碼的樣本數(shù)量;加上碼塊的高度乘寬度
2.?
設(shè)置臨時(shí)變量
quant_slope
和
length
參數(shù)為
0
,
3.?
按照塊的編碼過(guò)程來(lái)循環(huán)
4.?
累計(jì)每個(gè)塊編碼過(guò)程的長(zhǎng)度
5.?
如果某個(gè)塊的過(guò)程斜率為
0
,循環(huán)下一操作
6.?
否則設(shè)置臨時(shí)變量
quant_slope
為塊編碼過(guò)程斜率除以
16
的值,現(xiàn)在其再
0
到
4096
范圍內(nèi)。作為
quant_slope_rates
數(shù)組的索引。
7.?
如果
quant_slope
比
min_quant_slope
小,那么
min_quant_slope
取該值;如果其比
max_quant_slope
當(dāng),那么
max_quant_slope
取該值。
8.?
修改
quant_slope_rates
的
quant_slope
個(gè)元素的值,增加
length
;實(shí)際上,后面的元素比前面的元素要大。
9.?
如果已經(jīng)編碼的樣本比
next_trim
要大,那么將增加總樣本數(shù)量的
1/16
個(gè)字節(jié)到
next_trim
中。并且返回
true
。否則返回
false
。
?
1.1.4.
???
討論
壓縮狀態(tài)類進(jìn)行碼率分配方面的工作。
1.?
首先對(duì)斜率門限進(jìn)行了量化,也就是
16
個(gè)門限值量化為一個(gè)值,這樣有
4096
個(gè)門限量化值(這里說(shuō)明,斜率門限最大值是
65536
)。
Quat_slope_rates
的每個(gè)入口保存著當(dāng)前門限下編碼的長(zhǎng)度,其應(yīng)該是一個(gè)增加值的序列。
2.?
剛開(kāi)始的時(shí)候設(shè)置檢查截?cái)帱c(diǎn)的地方是八分之一樣本處。并且為每次樣本增加保守的空間來(lái)計(jì)算。
3.?
碼率是按照目標(biāo)字節(jié)數(shù)量和樣本總數(shù)確定的。
4.?
每次對(duì)
block
編碼的時(shí)候,首先查尋的到一個(gè)當(dāng)前的門限值;當(dāng)然第一個(gè)
block
是
1
。這里基于一個(gè)假設(shè),所有
block
的可壓縮性是均勻的。
5.?
在每次查詢斜率量化值的時(shí)候,首先計(jì)算已經(jīng)編碼的最大字節(jié)數(shù)量,然后在已經(jīng)編碼的許列中找到一個(gè)滿足到當(dāng)前點(diǎn)所有長(zhǎng)度的累加值比理想最大長(zhǎng)度小的點(diǎn),這個(gè)點(diǎn)對(duì)應(yīng)的數(shù)值就是當(dāng)前塊采用的估計(jì)斜率值。所以從這里可以看到,對(duì)當(dāng)前編碼塊的壓縮性是假設(shè)與前面編碼過(guò)的
block
相等的。
6.?
在塊編碼完成以后需要根據(jù)塊編碼過(guò)程中產(chǎn)生的斜率和當(dāng)前過(guò)程長(zhǎng)度來(lái)重新更新前面的值。
7.?
這個(gè)時(shí)候需要先計(jì)算已經(jīng)編碼的樣本的數(shù)量。
8.?
Block
的編碼過(guò)程中可能存在不在
convex hull
上的點(diǎn),這些點(diǎn)的斜率不是我們要求的,被踢出,而將在凸殼上的自然過(guò)程截?cái)帱c(diǎn)的斜率進(jìn)行比較。這里對(duì)該過(guò)程的斜率進(jìn)行了
1/16
的量化,并且檢查設(shè)置下個(gè)斜率區(qū)間的范圍。
9.?
對(duì)在凸殼上的自然截?cái)帱c(diǎn)需要查找對(duì)應(yīng)的量化斜率
rate
入口,并將該過(guò)程產(chǎn)生的編碼長(zhǎng)度增加到該入口中。對(duì)于
8
中描述的,不在凸殼上的點(diǎn)所在那個(gè)過(guò)程產(chǎn)生的編碼長(zhǎng)度被累加到下一個(gè)在凸殼上的點(diǎn)量化斜率
rate
入口中。
10.?????????????
最后需要檢查是否已經(jīng)到了需要截?cái)啻a流的位置,初始的時(shí)候設(shè)置的是在總樣本
1/8
處檢查一次,以后每次增加
1/16
,那么檢查點(diǎn)的序列為:
2/16-3/16-4/16-5/16-….
在進(jìn)行
trim
的時(shí)候,已經(jīng)對(duì)當(dāng)前編碼
block
對(duì)碼流的貢獻(xiàn)做了更新,因此斜率值是當(dāng)前
block
對(duì)失真長(zhǎng)度曲線產(chǎn)生的真正斜率。那么如果碼流已經(jīng)超出了當(dāng)前
block
在當(dāng)前碼率情況下的最大長(zhǎng)度,需要拋棄那些比這個(gè)斜率值小的所有編碼過(guò)程。其實(shí)可以理解為,增加編碼長(zhǎng)度對(duì)失真的改進(jìn)已經(jīng)在降低,而且比我們期望的最小值還要低,所以即使加上了這些長(zhǎng)度,失真的改進(jìn)比期望的小了,那么這個(gè)點(diǎn)的斜率應(yīng)該是最優(yōu)化的,超出的過(guò)程需要截?cái)唷?/span>