| @@ -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; | |||