|
|
@@ -156,41 +156,43 @@ int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab, |
|
|
|
if (!desc_coded) { |
|
|
|
/* select default table */ |
|
|
|
huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7] |
|
|
|
: &ivi_mb_vlc_tabs [7]; |
|
|
|
} else { |
|
|
|
huff_tab->tab_sel = get_bits(gb, 3); |
|
|
|
if (huff_tab->tab_sel == 7) { |
|
|
|
/* custom huffman table (explicitly encoded) */ |
|
|
|
new_huff.num_rows = get_bits(gb, 4); |
|
|
|
if (!new_huff.num_rows) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
: &ivi_mb_vlc_tabs [7]; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < new_huff.num_rows; i++) |
|
|
|
new_huff.xbits[i] = get_bits(gb, 4); |
|
|
|
huff_tab->tab_sel = get_bits(gb, 3); |
|
|
|
if (huff_tab->tab_sel == 7) { |
|
|
|
/* custom huffman table (explicitly encoded) */ |
|
|
|
new_huff.num_rows = get_bits(gb, 4); |
|
|
|
if (!new_huff.num_rows) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
/* Have we got the same custom table? Rebuild if not. */ |
|
|
|
if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) { |
|
|
|
ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff); |
|
|
|
for (i = 0; i < new_huff.num_rows; i++) |
|
|
|
new_huff.xbits[i] = get_bits(gb, 4); |
|
|
|
|
|
|
|
if (huff_tab->cust_tab.table) |
|
|
|
ff_free_vlc(&huff_tab->cust_tab); |
|
|
|
result = ivi_create_huff_from_desc(&huff_tab->cust_desc, |
|
|
|
&huff_tab->cust_tab, 0); |
|
|
|
if (result) { |
|
|
|
huff_tab->cust_desc.num_rows = 0; // reset faulty description |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"Error while initializing custom vlc table!\n"); |
|
|
|
return result; |
|
|
|
} |
|
|
|
/* Have we got the same custom table? Rebuild if not. */ |
|
|
|
if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc)) { |
|
|
|
ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff); |
|
|
|
|
|
|
|
if (huff_tab->cust_tab.table) |
|
|
|
ff_free_vlc(&huff_tab->cust_tab); |
|
|
|
result = ivi_create_huff_from_desc(&huff_tab->cust_desc, |
|
|
|
&huff_tab->cust_tab, 0); |
|
|
|
if (result) { |
|
|
|
// reset faulty description |
|
|
|
huff_tab->cust_desc.num_rows = 0; |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"Error while initializing custom vlc table!\n"); |
|
|
|
return result; |
|
|
|
} |
|
|
|
huff_tab->tab = &huff_tab->cust_tab; |
|
|
|
} else { |
|
|
|
/* select one of predefined tables */ |
|
|
|
huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel] |
|
|
|
: &ivi_mb_vlc_tabs [huff_tab->tab_sel]; |
|
|
|
} |
|
|
|
huff_tab->tab = &huff_tab->cust_tab; |
|
|
|
} else { |
|
|
|
/* select one of predefined tables */ |
|
|
|
huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel] |
|
|
|
: &ivi_mb_vlc_tabs [huff_tab->tab_sel]; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|