X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Frl.c;h=93153ff7234ff4839a74e5ea3ef907307cb6e17d;hb=e8fdb0db16c5ca8ad382b20874b4a454be6b79ae;hp=6eac306b88ae8550fc15386ab6b65711f9f9931f;hpb=73d193d1d0ff62a029a905d1404c0fd357f4c880;p=ffmpeg diff --git a/libavcodec/rl.c b/libavcodec/rl.c index 6eac306b88a..93153ff7234 100644 --- a/libavcodec/rl.c +++ b/libavcodec/rl.c @@ -25,27 +25,16 @@ #include "rl.h" -void ff_rl_free(RLTable *rl) -{ - int i; - - for (i = 0; i < 2; i++) { - av_freep(&rl->max_run[i]); - av_freep(&rl->max_level[i]); - av_freep(&rl->index_run[i]); - } -} - -av_cold int ff_rl_init(RLTable *rl, - uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3]) +av_cold void ff_rl_init(RLTable *rl, + uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3]) { int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1]; uint8_t index_run[MAX_RUN + 1]; int last, run, level, start, end, i; - /* If table is static, we can quit if rl->max_level[0] is not NULL */ - if (static_store && rl->max_level[0]) - return 0; + /* If rl->max_level[0] is set, this RLTable has already been initialized */ + if (rl->max_level[0]) + return; /* compute max_level[], max_run[] and index_run[] */ for (last = 0; last < 2; last++) { @@ -70,36 +59,13 @@ av_cold int ff_rl_init(RLTable *rl, if (run > max_run[level]) max_run[level] = run; } - if (static_store) - rl->max_level[last] = static_store[last]; - else { - rl->max_level[last] = av_malloc(MAX_RUN + 1); - if (!rl->max_level[last]) - goto fail; - } + rl->max_level[last] = static_store[last]; memcpy(rl->max_level[last], max_level, MAX_RUN + 1); - if (static_store) - rl->max_run[last] = static_store[last] + MAX_RUN + 1; - else { - rl->max_run[last] = av_malloc(MAX_LEVEL + 1); - if (!rl->max_run[last]) - goto fail; - } + rl->max_run[last] = static_store[last] + MAX_RUN + 1; memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1); - if (static_store) - rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2; - else { - rl->index_run[last] = av_malloc(MAX_RUN + 1); - if (!rl->index_run[last]) - goto fail; - } + rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2; memcpy(rl->index_run[last], index_run, MAX_RUN + 1); } - return 0; - -fail: - ff_rl_free(rl); - return AVERROR(ENOMEM); } av_cold void ff_rl_init_vlc(RLTable *rl, unsigned static_size) @@ -114,6 +80,9 @@ av_cold void ff_rl_init_vlc(RLTable *rl, unsigned static_size) int qmul = q * 2; int qadd = (q - 1) | 1; + if (!rl->rl_vlc[q]) + return; + if (q == 0) { qmul = 1; qadd = 0;