#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"
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",
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);
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);
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");
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)
}
-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,