diff options
author | Diego Biurrun <diego@biurrun.de> | 2016-06-16 12:14:12 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2016-07-25 13:57:01 +0200 |
commit | 79d199a3e7f4afdc0b41859bc9451e1a88775a28 (patch) | |
tree | ebc01304a50d11af4e45be7870e9ab4943d79c83 | |
parent | 2553d1896e8c8b9779f0b73c10bea14a3be615e4 (diff) |
cfhd: Refactor initializing signed VLC tables
-rw-r--r-- | libavcodec/cfhddata.c | 121 |
1 files changed, 48 insertions, 73 deletions
diff --git a/libavcodec/cfhddata.c b/libavcodec/cfhddata.c index 476c788c6e..c144935f55 100644 --- a/libavcodec/cfhddata.c +++ b/libavcodec/cfhddata.c @@ -21,7 +21,6 @@ #include <stdint.h> #include "libavutil/attributes.h" -#include "libavutil/avassert.h" #include "cfhd.h" @@ -274,99 +273,75 @@ static const uint8_t table_18_vlc_level[NB_VLC_TABLE_18] = { 220, 195, 161, 231, 173, 226, 116, 255, }; -av_cold int ff_cfhd_init_vlcs(CFHDContext *s) +static int init_vlc_signed(VLC *vlc, CFHD_RL_VLC_ELEM table_rl_vlc[], + unsigned bound, + const uint32_t table_vlc_bits[], + const uint8_t table_vlc_len[], + const uint16_t table_vlc_run[], + const uint8_t table_vlc_level[]) { - int i, j, ret = 0; - uint32_t new_cfhd_vlc_bits[NB_VLC_TABLE_18 * 2]; - uint8_t new_cfhd_vlc_len[NB_VLC_TABLE_18 * 2]; - uint16_t new_cfhd_vlc_run[NB_VLC_TABLE_18 * 2]; - int16_t new_cfhd_vlc_level[NB_VLC_TABLE_18 * 2]; - - /** Similar to dv.c, generate signed VLC tables **/ + uint32_t vlc_bits[NB_VLC_TABLE_18 * 2]; + uint8_t vlc_len[NB_VLC_TABLE_18 * 2]; + uint16_t vlc_run[NB_VLC_TABLE_18 * 2]; + int16_t vlc_level[NB_VLC_TABLE_18 * 2]; + unsigned i, j; + int ret; - /* Table 9 */ - for (i = 0, j = 0; i < NB_VLC_TABLE_9; i++, j++) { - new_cfhd_vlc_bits[j] = table_9_vlc_bits[i]; - new_cfhd_vlc_len[j] = table_9_vlc_len[i]; - new_cfhd_vlc_run[j] = table_9_vlc_run[i]; - new_cfhd_vlc_level[j] = table_9_vlc_level[i]; + for (i = 0, j = 0; i < bound; i++, j++) { + vlc_bits[j] = table_vlc_bits[i]; + vlc_len[j] = table_vlc_len[i]; + vlc_run[j] = table_vlc_run[i]; + vlc_level[j] = table_vlc_level[i]; /* Don't include the zero level nor escape bits */ - if (table_9_vlc_level[i] && - new_cfhd_vlc_bits[j] != table_9_vlc_bits[NB_VLC_TABLE_9 - 1]) { - new_cfhd_vlc_bits[j] <<= 1; - new_cfhd_vlc_len[j]++; + if (table_vlc_level[i] && + vlc_bits[j] != table_vlc_bits[bound - 1]) { + vlc_bits[j] <<= 1; + vlc_len[j]++; j++; - new_cfhd_vlc_bits[j] = (table_9_vlc_bits[i] << 1) | 1; - new_cfhd_vlc_len[j] = table_9_vlc_len[i] + 1; - new_cfhd_vlc_run[j] = table_9_vlc_run[i]; - new_cfhd_vlc_level[j] = -table_9_vlc_level[i]; + vlc_bits[j] = (table_vlc_bits[i] << 1) | 1; + vlc_len[j] = table_vlc_len[i] + 1; + vlc_run[j] = table_vlc_run[i]; + vlc_level[j] = -table_vlc_level[i]; } } - ret = init_vlc(&s->vlc_9, VLC_BITS, j, new_cfhd_vlc_len, - 1, 1, new_cfhd_vlc_bits, 4, 4, 0); - if (ret < 0) + if ((ret = init_vlc(vlc, VLC_BITS, j, vlc_len, 1, 1, vlc_bits, 4, 4, 0)) < 0) return ret; - for (i = 0; i < s->vlc_9.table_size; i++) { - int code = s->vlc_9.table[i][0]; - int len = s->vlc_9.table[i][1]; + + for (i = 0; i < (*vlc).table_size; i++) { + int code = (*vlc).table[i][0]; + int len = (*vlc).table[i][1]; int level, run; if (len < 0) { // more bits needed run = 0; level = code; } else { - run = new_cfhd_vlc_run[code]; - level = new_cfhd_vlc_level[code]; + run = vlc_run[code]; + level = vlc_level[code]; } - s->table_9_rl_vlc[i].len = len; - s->table_9_rl_vlc[i].level = level; - s->table_9_rl_vlc[i].run = run; + table_rl_vlc[i].len = len; + table_rl_vlc[i].level = level; + table_rl_vlc[i].run = run; } - /* Table 18 */ - for (i = 0, j = 0; i < NB_VLC_TABLE_18; i++, j++) { - new_cfhd_vlc_bits[j] = table_18_vlc_bits[i]; - new_cfhd_vlc_len[j] = table_18_vlc_len[i]; - new_cfhd_vlc_run[j] = table_18_vlc_run[i]; - new_cfhd_vlc_level[j] = table_18_vlc_level[i]; + return 0; +} - /* Don't include the zero level nor escape bits */ - if (table_18_vlc_level[i] && - new_cfhd_vlc_bits[j] != table_18_vlc_bits[NB_VLC_TABLE_18 - 1]) { - new_cfhd_vlc_bits[j] <<= 1; - new_cfhd_vlc_len[j]++; - j++; - new_cfhd_vlc_bits[j] = (table_18_vlc_bits[i] << 1) | 1; - new_cfhd_vlc_len[j] = table_18_vlc_len[i] + 1; - new_cfhd_vlc_run[j] = table_18_vlc_run[i]; - new_cfhd_vlc_level[j] = -table_18_vlc_level[i]; - } - } +av_cold int ff_cfhd_init_vlcs(CFHDContext *s) +{ + /** Similar to dv.c, generate signed VLC tables **/ - ret = init_vlc(&s->vlc_18, VLC_BITS, j, new_cfhd_vlc_len, - 1, 1, new_cfhd_vlc_bits, 4, 4, 0); + /* Table 9 */ + int ret = init_vlc_signed(&s->vlc_9, s->table_9_rl_vlc, NB_VLC_TABLE_9, + table_9_vlc_bits, table_9_vlc_len, + table_9_vlc_run, table_9_vlc_level); if (ret < 0) return ret; - av_assert0(s->vlc_18.table_size == 4572); - for (i = 0; i < s->vlc_18.table_size; i++) { - int code = s->vlc_18.table[i][0]; - int len = s->vlc_18.table[i][1]; - int level, run; - - if (len < 0) { // more bits needed - run = 0; - level = code; - } else { - run = new_cfhd_vlc_run[code]; - level = new_cfhd_vlc_level[code]; - } - s->table_18_rl_vlc[i].len = len; - s->table_18_rl_vlc[i].level = level; - s->table_18_rl_vlc[i].run = run; - } - - return ret; + /* Table 18 */ + return init_vlc_signed(&s->vlc_18, s->table_18_rl_vlc, NB_VLC_TABLE_18, + table_18_vlc_bits, table_18_vlc_len, + table_18_vlc_run, table_18_vlc_level); } |