1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-09-07 16:40:10 +02:00
ffmpeg/libavcodec/on2avcdata.h
Andreas Rheinhardt 71753c5235 avcodec/on2avc: Use smaller tables for VLCs
The On2 audio decoder uses huge tables to initialize VLC tables. These
tables (mostly) use symbols tables in addition to the codes tables and
the lengths tables. This commit makes the codes tables redundant and
removes them: If all tables are permuted so that the codes are ordered
from left to right in the Huffman tree, the codes become redundant and
can be easily calculated at runtime from the lengths
(via ff_init_vlc_from_lengths()); this also avoids sorting the codes in
ff_init_vlc_sparse()*.

The symbols tables are always 16bit, the codes tables are 32bit, 16bit
or (rarely) 8bit, the lengths tables are always 8bit. Even though some
symbols tables have been used twice (which is no longer possible now
because different permutations need to be performed on the code tables
sharing the same symbol table in order to order them from left to right),
this nevertheless saves about 28KB.

*: If the initializations of the VLCs are repeated 2048 times
(interleaved with calls to free the VLCs which have not been timed), the
number of decicycles spent on each round of initializations improves
from 27669656 to 7356159.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
2020-12-08 17:51:44 +01:00

78 lines
2.8 KiB
C

/*
* On2 Audio for Video Codec decoder
*
* Copyright (c) 2013 Konstantin Shishkov
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_ON2AVCDATA_H
#define AVCODEC_ON2AVCDATA_H
#include <stdint.h>
#define ON2AVC_MAX_BANDS 112
#define ON2AVC_ESC_CB 15
typedef struct On2AVCMode {
int num_windows;
int num_bands;
const int *band_start;
} On2AVCMode;
extern const On2AVCMode ff_on2avc_modes_40[8];
extern const On2AVCMode ff_on2avc_modes_44[8];
#define ON2AVC_SCALE_DIFFS 121
extern const uint8_t ff_on2avc_scale_diff_syms[];
extern const uint8_t ff_on2avc_scale_diff_bits[];
extern const uint8_t * const ff_on2avc_cb_bits[];
extern const uint16_t * const ff_on2avc_cb_syms[];
extern const int ff_on2avc_cb_elems[];
extern const float ff_on2avc_window_long_32000[1024];
extern const float ff_on2avc_window_long_24000[1024];
extern const float ff_on2avc_window_short[128];
extern const double ff_on2avc_tab_10_1[];
extern const double ff_on2avc_tab_10_2[];
extern const double ff_on2avc_tab_20_1[];
extern const double ff_on2avc_tab_20_2[];
extern const double ff_on2avc_tab_40_1[];
extern const double ff_on2avc_tab_40_2[];
extern const double ff_on2avc_tab_84_1[];
extern const double ff_on2avc_tab_84_2[];
extern const double ff_on2avc_tab_84_3[];
extern const double ff_on2avc_tab_84_4[];
extern const double * const ff_on2avc_tabs_4_10_1[4];
extern const double * const ff_on2avc_tabs_4_10_2[4];
extern const double * const ff_on2avc_tabs_9_20_1[9];
extern const double * const ff_on2avc_tabs_9_20_2[9];
extern const double * const ff_on2avc_tabs_19_40_1[19];
extern const double * const ff_on2avc_tabs_19_40_2[19];
extern const double * const ff_on2avc_tabs_20_84_1[20];
extern const double * const ff_on2avc_tabs_20_84_2[20];
extern const double * const ff_on2avc_tabs_20_84_3[20];
extern const double * const ff_on2avc_tabs_20_84_4[20];
extern const float ff_on2avc_ctab_1[2048];
extern const float ff_on2avc_ctab_2[2048];
extern const float ff_on2avc_ctab_3[2048];
extern const float ff_on2avc_ctab_4[2048];
#endif /* AVCODEC_ON2AVCDATA_H */