mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-13 02:34:54 +00:00
avcodec/bitstream: Allow static VLC tables to be bigger than needed
Right now the allocated size of the VLC table of a static VLC has to exactly match the size actually used for the VLC: If it is not enough, abort is called; if it is more than enough, an error message is emitted. This is no problem when one wants to initialize an individual VLC via one of the INIT_VLC macros as one just hardcodes the needed size. Yet it is an obstacle when one wants to initialize several VLCs in a loop as one then needs to add an array for the sizes/offsets of the VLC tables (unless max_depth of all arrays is one in which case the sizes are derivable from the number of bits used). Yet said size array is not necessary if one disables the warning for too big buffers. The reason is that the amount of entries needed for the table is of course generated as a byproduct of initializing the VLC. To this end a flag that disables the warning has been added. So one can proceed as follows: static VLC vlcs[NUM]; static VLC_TYPE vlc_table[BUF_SIZE][2]; for (int i = 0, offset = 0; i < NUM; i++) { vlcs[i].table = &vlc_table[offset]; vlcs[i].table_allocated = BUF_SIZE - offset; init_vlc(); /* With INIT_VLC_STATIC_OVERLONG flag */ offset += vlcs[i].table_size; } Of course, BUF_SIZE should be equal to the number of entries actually needed. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
e127af3c2b
commit
b629deab3d
@ -281,9 +281,9 @@ static int vlc_common_end(VLC *vlc, int nb_bits, int nb_codes, VLCcode *codes,
|
|||||||
int ret = build_table(vlc, nb_bits, nb_codes, codes, flags);
|
int ret = build_table(vlc, nb_bits, nb_codes, codes, flags);
|
||||||
|
|
||||||
if (flags & INIT_VLC_USE_NEW_STATIC) {
|
if (flags & INIT_VLC_USE_NEW_STATIC) {
|
||||||
if(vlc->table_size != vlc->table_allocated)
|
if (vlc->table_size != vlc->table_allocated &&
|
||||||
|
!(flags & (INIT_VLC_STATIC_OVERLONG & ~INIT_VLC_USE_NEW_STATIC)))
|
||||||
av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
|
av_log(NULL, AV_LOG_ERROR, "needed %d had %d\n", vlc->table_size, vlc->table_allocated);
|
||||||
|
|
||||||
av_assert0(ret >= 0);
|
av_assert0(ret >= 0);
|
||||||
*vlc_arg = *vlc;
|
*vlc_arg = *vlc;
|
||||||
} else {
|
} else {
|
||||||
|
@ -93,6 +93,7 @@ void ff_free_vlc(VLC *vlc);
|
|||||||
#define INIT_VLC_OUTPUT_LE 8
|
#define INIT_VLC_OUTPUT_LE 8
|
||||||
#define INIT_VLC_LE (INIT_VLC_INPUT_LE | INIT_VLC_OUTPUT_LE)
|
#define INIT_VLC_LE (INIT_VLC_INPUT_LE | INIT_VLC_OUTPUT_LE)
|
||||||
#define INIT_VLC_USE_NEW_STATIC 4
|
#define INIT_VLC_USE_NEW_STATIC 4
|
||||||
|
#define INIT_VLC_STATIC_OVERLONG (1 | INIT_VLC_USE_NEW_STATIC)
|
||||||
|
|
||||||
#define INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
|
#define INIT_CUSTOM_VLC_SPARSE_STATIC(vlc, bits, a, b, c, d, e, f, g, \
|
||||||
h, i, j, flags, static_size) \
|
h, i, j, flags, static_size) \
|
||||||
|
Loading…
Reference in New Issue
Block a user