This moves indirections to init.
Showing the changes to libavcodec (2 of 2 files). Show all
Unified · Split
| @@ -60,7 +60,7 @@ typedef struct HQContext { · 59 unmodified lines | ||
| 60 | 60 | |
| 61 | 61 | static const int32_t *hq_quants[NUM_HQ_QUANTS][2][4]; |
| 62 | 62 | |
| 63 | −static VLCElem hq_ac_vlc[1184]; | |
| 63 | +static RL_VLC_ELEM hq_ac_rvlc[1184]; | |
| 64 | 64 | |
| 65 | 65 | static inline void put_blocks(HQContext *c, AVFrame *pic, |
| 66 | 66 | int plane, int x, int y, int ilace, |
| @@ -78,7 +78,6 @@ static int hq_decode_block(HQContext *c, GetBitContext *gb, int16_t block[64], · 11 unmodified lines | ||
| 78 | 78 | int qsel, int is_chroma, int is_hqa) |
| 79 | 79 | { |
| 80 | 80 | const int32_t *q; |
| 81 | − int val, pos = 1; | |
| 82 | 81 | |
| 83 | 82 | if (!is_hqa) { |
| 84 | 83 | block[0] = get_sbits(gb, 9) * 64; |
| @@ -88,17 +87,23 @@ static int hq_decode_block(HQContext *c, GetBitContext *gb, int16_t block[64], · 3 unmodified lines | ||
| 88 | 87 | block[0] = get_sbits(gb, 9) * 64; |
| 89 | 88 | } |
| 90 | 89 | |
| 91 | − for (;;) { | |
| 92 | − val = get_vlc2(gb, hq_ac_vlc, 9, 2); | |
| 93 | − if (val < 0) | |
| 90 | + OPEN_READER(re, gb); | |
| 91 | + for (int pos = 1;;) { | |
| 92 | + int level, run; | |
| 93 | + UPDATE_CACHE(re, gb); | |
| 94 | + GET_RL_VLC(level, run, re, gb, hq_ac_rvlc, 9, 2, 0); | |
| 95 | + if (run == HQ_AC_INVALID_RUN) { | |
| 96 | + CLOSE_READER(re, gb); | |
| 94 | 97 | return AVERROR_INVALIDDATA; |
| 98 | + } | |
| 95 | 99 | |
| 96 | − pos += hq_ac_skips[val]; | |
| 100 | + pos += run; | |
| 97 | 101 | if (pos >= 64) |
| 98 | 102 | break; |
| 99 | − block[ff_zigzag_direct[pos]] = (int)(hq_ac_syms[val] * (unsigned)q[pos]) >> 12; | |
| 103 | + block[ff_zigzag_direct[pos]] = (int)(level * (unsigned)q[pos]) >> 12; | |
| 100 | 104 | pos++; |
| 101 | 105 | } |
| 106 | + CLOSE_READER(re, gb); | |
| 102 | 107 | |
| 103 | 108 | return 0; |
| 104 | 109 | } |
| @@ -372,9 +377,27 @@ static int hq_hqa_decode_frame(AVCodecContext *avctx, AVFrame *pic, · 267 unmodified lines | ||
| 372 | 377 | |
| 373 | 378 | static av_cold void hq_init_static(void) |
| 374 | 379 | { |
| 375 | − VLC_INIT_STATIC_TABLE(hq_ac_vlc, 9, NUM_HQ_AC_ENTRIES, | |
| 380 | + VLC_INIT_STATIC_TABLE(hq_ac_rvlc, 9, NUM_HQ_AC_ENTRIES, | |
| 376 | 381 | hq_ac_bits, 1, 1, hq_ac_codes, 2, 2, 0); |
| 377 | 382 | |
| 383 | + for (size_t i = 0; i < FF_ARRAY_ELEMS(hq_ac_rvlc); ++i) { | |
| 384 | + int len = hq_ac_rvlc[i].len; | |
| 385 | + int sym = hq_ac_rvlc[i].sym, level = sym; | |
| 386 | + int run; | |
| 387 | + | |
| 388 | + if (len > 0) { | |
| 389 | + level = hq_ac_syms[sym]; | |
| 390 | + run = hq_ac_skips[sym]; | |
| 391 | + } else if (len < 0) { // More bits needed | |
| 392 | + run = 0; | |
| 393 | + } else { // Invalid code | |
| 394 | + run = HQ_AC_INVALID_RUN; | |
| 395 | + } | |
| 396 | + hq_ac_rvlc[i].len8 = len; | |
| 397 | + hq_ac_rvlc[i].run = run; | |
| 398 | + hq_ac_rvlc[i].level = level; | |
| 399 | + } | |
| 400 | + | |
| 378 | 401 | for (size_t i = 0; i < FF_ARRAY_ELEMS(hq_quants); ++i) { |
| 379 | 402 | for (size_t j = 0; j < FF_ARRAY_ELEMS(hq_quants[0]); ++j) { |
| 380 | 403 | for (size_t k = 0; k < FF_ARRAY_ELEMS(hq_quants[0][0]); ++k) |
| @@ -1155,6 +1155,8 @@ static const uint8_t hq_quant_map[NUM_HQ_QUANTS][2][4] = · 1154 unmodified lines | ||
| 1155 | 1155 | { { QMAT3A, QMAT48, QMAT4C, QMAT4C }, { QMAT3B, QMAT49, QMAT4D, QMAT4D } }, |
| 1156 | 1156 | }; |
| 1157 | 1157 | |
| 1158 | +#define HQ_AC_INVALID_RUN 128 | |
| 1159 | + | |
| 1158 | 1160 | static const uint8_t hq_ac_bits[NUM_HQ_AC_ENTRIES] = { |
| 1159 | 1161 | 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, |
| 1160 | 1162 | 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, |