2011-12-25 55 views
2

第一次使用本網站提出一個問題,但我得到了很多很多答案!哈夫曼表熵解碼簡化(在C)

背景:

我解碼時使用RLE和霍夫曼編碼進行編碼的可變長度的視頻流。數據流長度爲10到20千字節,因此我試圖「擠出」每一步的時間,以便能夠實時有效地進行解碼。

現在我正在處理的這一步涉及將比特流轉換爲基於霍夫曼表的數字。我通過計算前導零的數量來確定要包含的尾隨位數。該表看起來像:

 001xs range -3 to 3 
     0001xxs range -7 to 7 
    00001xxxs range -15 to 15 

並一直到127. s是一個符號位,0意味着積極,1意味着消極。因此,例如,如果clz = 2,那麼我會讀取接下來的3位,2爲值,1爲符號。

問:

現在我創造了這樣做的討厭的表情是:

int outblock[64]; 
unsigned int value; 
//example value 7 -> 111 (xxs) which translates to -3 

    value=7; 

outblock[index]=(((value&1)?-1:1)*(value>>1)); //expression 

有沒有更簡單,更快的方式做到這一點?

感謝您的幫助!

編輯:編輯表達,因爲它不產生適當的正值。現在正確生成正面和負面。

+0

我不明白你爲什麼要計算前導零的數量,這些零代表什麼?接下來,是您發佈的用於執行流的Huffman解碼的代碼片段,還是僅在您實際解碼期間構建您以後使用的表格? – 2011-12-25 16:28:33

+0

零確定要讀取的值的尾隨位數。 – 2011-12-25 20:08:22

+0

零表示爲某個值讀取的尾隨位數。該代碼片段顯示了我用於將從流中讀取的位轉換爲輸出值的當前表達式。在這個例子中,如果你有2個前導零,那麼你需要讀取下3個位。接下來的3位是111 - > 7.這是您輸入表達式的值,它產生-3(負號11→3和1)。我從來沒有實際生成一個表。我只是好奇是否有辦法「優化」我創建的這個表達式,因爲我必須每10ms使用這個表達式大約2000次。 – 2011-12-25 20:17:14

回答