summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Biurrun <diego@biurrun.de>2016-06-16 12:14:12 +0200
committerAnton Khirnov <anton@khirnov.net>2016-07-25 13:57:01 +0200
commit79d199a3e7f4afdc0b41859bc9451e1a88775a28 (patch)
treeebc01304a50d11af4e45be7870e9ab4943d79c83
parent2553d1896e8c8b9779f0b73c10bea14a3be615e4 (diff)
cfhd: Refactor initializing signed VLC tables
-rw-r--r--libavcodec/cfhddata.c121
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);
}