X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fon2avc.c;h=2ab67350caa44019ead5a29f22542f7476e2ddf4;hb=a247ac640df3da573cd661065bf53f37863e2b46;hp=4e4be7530affe47907088da92f76327b79add971;hpb=26148e923613e718787c6fc4bf3f64e8909f597c;p=ffmpeg diff --git a/libavcodec/on2avc.c b/libavcodec/on2avc.c index 4e4be7530af..2ab67350caa 100644 --- a/libavcodec/on2avc.c +++ b/libavcodec/on2avc.c @@ -23,6 +23,8 @@ #include "libavutil/channel_layout.h" #include "libavutil/ffmath.h" #include "libavutil/float_dsp.h" +#include "libavutil/mem_internal.h" + #include "avcodec.h" #include "bytestream.h" #include "fft.h" @@ -169,7 +171,7 @@ static int on2avc_decode_band_scales(On2AVCContext *c, GetBitContext *gb) scale = get_bits(gb, 7); first = 0; } else { - scale += get_vlc2(gb, c->scale_diff.table, 9, 3) - 60; + scale += get_vlc2(gb, c->scale_diff.table, 9, 3); } if (scale < 0 || scale > 127) { av_log(c->avctx, AV_LOG_ERROR, "Invalid scale value %d\n", @@ -195,7 +197,7 @@ static int on2avc_decode_quads(On2AVCContext *c, GetBitContext *gb, float *dst, int i, j, val, val1; for (i = 0; i < dst_size; i += 4) { - val = get_vlc2(gb, c->cb_vlc[type].table, 9, 3); + val = get_vlc2(gb, c->cb_vlc[type].table, 9, 2); for (j = 0; j < 4; j++) { val1 = sign_extend((val >> (12 - j * 4)) & 0xF, 4); @@ -228,7 +230,7 @@ static int on2avc_decode_pairs(On2AVCContext *c, GetBitContext *gb, float *dst, int i, val, val1, val2, sign; for (i = 0; i < dst_size; i += 2) { - val = get_vlc2(gb, c->cb_vlc[type].table, 9, 3); + val = get_vlc2(gb, c->cb_vlc[type].table, 9, 2); val1 = sign_extend(val >> 8, 8); val2 = sign_extend(val & 0xFF, 8); @@ -906,7 +908,9 @@ static av_cold void on2avc_free_vlcs(On2AVCContext *c) static av_cold int on2avc_decode_init(AVCodecContext *avctx) { On2AVCContext *c = avctx->priv_data; - int i; + const uint8_t *lens = ff_on2avc_cb_lens; + const uint16_t *syms = ff_on2avc_cb_syms; + int i, ret; if (avctx->channels > 2U) { avpriv_request_sample(avctx, "Decoding more than 2 channels"); @@ -956,36 +960,26 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx) if (!c->fdsp) return AVERROR(ENOMEM); - if (init_vlc(&c->scale_diff, 9, ON2AVC_SCALE_DIFFS, - ff_on2avc_scale_diff_bits, 1, 1, - ff_on2avc_scale_diff_codes, 4, 4, 0)) { + ret = ff_init_vlc_from_lengths(&c->scale_diff, 9, ON2AVC_SCALE_DIFFS, + ff_on2avc_scale_diff_bits, 1, + ff_on2avc_scale_diff_syms, 1, 1, -60, 0, avctx); + if (ret < 0) goto vlc_fail; - } - for (i = 1; i < 9; i++) { + for (i = 1; i < 16; i++) { int idx = i - 1; - if (ff_init_vlc_sparse(&c->cb_vlc[i], 9, ff_on2avc_quad_cb_elems[idx], - ff_on2avc_quad_cb_bits[idx], 1, 1, - ff_on2avc_quad_cb_codes[idx], 4, 4, - ff_on2avc_quad_cb_syms[idx], 2, 2, 0)) { - goto vlc_fail; - } - } - for (i = 9; i < 16; i++) { - int idx = i - 9; - if (ff_init_vlc_sparse(&c->cb_vlc[i], 9, ff_on2avc_pair_cb_elems[idx], - ff_on2avc_pair_cb_bits[idx], 1, 1, - ff_on2avc_pair_cb_codes[idx], 2, 2, - ff_on2avc_pair_cb_syms[idx], 2, 2, 0)) { + ret = ff_init_vlc_from_lengths(&c->cb_vlc[i], 9, ff_on2avc_cb_elems[idx], + lens, 1, + syms, 2, 2, 0, 0, avctx); + if (ret < 0) goto vlc_fail; - } + lens += ff_on2avc_cb_elems[idx]; + syms += ff_on2avc_cb_elems[idx]; } return 0; vlc_fail: av_log(avctx, AV_LOG_ERROR, "Cannot init VLC\n"); - on2avc_free_vlcs(c); - av_freep(&c->fdsp); - return AVERROR(ENOMEM); + return ret; } static av_cold int on2avc_decode_close(AVCodecContext *avctx) @@ -1008,7 +1002,7 @@ static av_cold int on2avc_decode_close(AVCodecContext *avctx) } -AVCodec ff_on2avc_decoder = { +const AVCodec ff_on2avc_decoder = { .name = "on2avc", .long_name = NULL_IF_CONFIG_SMALL("On2 Audio for Video Codec"), .type = AVMEDIA_TYPE_AUDIO, @@ -1018,6 +1012,7 @@ AVCodec ff_on2avc_decoder = { .decode = on2avc_decode_frame, .close = on2avc_decode_close, .capabilities = AV_CODEC_CAP_DR1, + .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, };