avcodec/mpeg4video: Make tables used to initialize VLCs smaller

Switching from ff_init_vlc_sparse() to ff_init_vlc_from_lengths()
allows to replace codes which are so long that they need to be stored
in an uint16_t by symbols which fit into an uint8_t; and even these can
be avoided in case of the sprite trajectory VLC.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-11-01 05:36:35 +01:00
parent 0d71ac319f
commit 3aa81a634a
3 changed files with 80 additions and 109 deletions

View File

@ -323,10 +323,8 @@ RLTable ff_rvlc_rl_intra = {
intra_rvlc_level,
};
const uint16_t ff_sprite_trajectory_tab[15][2] = {
{0x00, 2}, {0x02, 3}, {0x03, 3}, {0x04, 3}, {0x05, 3}, {0x06, 3},
{0x0E, 4}, {0x1E, 5}, {0x3E, 6}, {0x7E, 7}, {0xFE, 8},
{0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12},
const uint8_t ff_sprite_trajectory_lens[15] = {
2, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
};
const uint8_t ff_mb_type_b_tab[4][2] = {
@ -374,119 +372,91 @@ const uint8_t ff_mpeg4_dc_threshold[8]={
};
/* Note these are different in studio mode */
const uint16_t ff_mpeg4_studio_dc_luma[19][2]={
{0x0e, 6}, {0x06, 5}, {0x00, 4}, {0x02, 4},
{0x07, 3}, {0x05, 3}, {0x03, 3}, {0x02, 3},
{0x04, 3}, {0x06, 3}, {0x01, 4}, {0x1e, 7},
{0x3e, 8}, {0x7e, 9}, {0xfe, 10}, {0x1fe, 11},
{0x3fe, 12}, {0x7fe, 13}, {0x7ff, 13}
const uint8_t ff_mpeg4_studio_dc_luma[19][2] = {
{ 2, 4 }, { 10, 4 }, { 3, 4 }, { 1, 5 }, { 0, 6 }, { 11, 7 },
{ 12, 8 }, { 13, 9 }, { 14, 10 }, { 15, 11 }, { 16, 12 }, { 17, 13 },
{ 18, 13 }, { 7, 3 }, { 6, 3 }, { 8, 3 }, { 5, 3 }, { 9, 3 },
{ 4, 3 },
};
const uint16_t ff_mpeg4_studio_dc_chroma[19][2]={
{0x00, 4}, {0x02, 4}, {0x07, 3}, {0x05, 3},
{0x03, 3}, {0x02, 3}, {0x04, 3}, {0x06, 3},
{0x01, 4}, {0x06, 5}, {0x0e, 6}, {0x1e, 7},
{0x3e, 8}, {0x7e, 9}, {0xfe, 10}, {0x1fe, 11},
{0x3fe, 12}, {0x7fe, 13}, {0x7ff, 13}
const uint8_t ff_mpeg4_studio_dc_chroma[19][2] = {
{ 0, 4 }, { 8, 4 }, { 1, 4 }, { 9, 5 }, { 10, 6 }, { 11, 7 },
{ 12, 8 }, { 13, 9 }, { 14, 10 }, { 15, 11 }, { 16, 12 }, { 17, 13 },
{ 18, 13 }, { 5, 3 }, { 4, 3 }, { 6, 3 }, { 3, 3 }, { 7, 3 },
{ 2, 3 },
};
const uint16_t ff_mpeg4_studio_intra[12][22][2]={
const uint8_t ff_mpeg4_studio_intra[12][24][2] = {
{
{0x05, 4}, {0x04, 4}, {0x05, 7}, {0x09, 9},
{0x21, 11}, {0x41, 12}, {0x81, 13}, {0x03, 4},
{0x03, 5}, {0x05, 6}, {0x04, 7}, {0x03, 7},
{0x05, 8}, {0x03, 2}, {0x05, 3}, {0x04, 3},
{0x03, 3}, {0x02, 4}, {0x04, 6}, {0x03, 6},
{0x11, 10}, {0x80, 13}
{ 0, -6 }, { 21, 13 }, { 6, 13 }, { 5, 12 }, { 4, 11 }, { 20, 10 },
{ 3, 9 }, { 12, 8 }, { 11, 7 }, { 10, 7 }, { 2, 7 }, { 19, 6 },
{ 18, 6 }, { 9, 6 }, { 8, 5 }, { 17, 4 }, { 7, 4 }, { 1, 4 },
{ 0, 4 }, { 16, 3 }, { 15, 3 }, { 14, 3 }, { 13, 2 },
},
{
{0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
{0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
{0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
{0x00, 0}, {0x00, 0}, {0x01, 1}, {0x01, 2},
{0x01, 3}, {0x01, 4}, {0x01, 5}, {0x03, 7},
{0x05, 8}, {0x04, 8}
{ 0, -6 }, { 21, 8 }, { 20, 8 }, { 19, 7 }, { 18, 5 }, { 17, 4 },
{ 16, 3 }, { 15, 2 }, { 14, 1 },
},
{
{0x05, 3}, {0x03, 5}, {0x02, 5}, {0x03, 7},
{0x09, 9}, {0x103, 14}, {0x102, 14}, {0x04, 3},
{0x03, 3}, {0x03, 4}, {0x02, 4}, {0x03, 6},
{0x11, 10}, {0x03, 2}, {0x02, 3}, {0x02, 6},
{0x05, 8}, {0x21, 11}, {0x83, 13}, {0x101, 14},
{0x201, 15}, {0x82, 13}
{ 0, -6 }, { 0,-15 }, { 20, 15 }, { 19, 14 }, { 6, 14 }, { 5, 14 },
{ 21, 13 }, { 18, 13 }, { 17, 11 }, { 12, 10 }, { 4, 9 }, { 16, 8 },
{ 3, 7 }, { 15, 6 }, { 11, 6 }, { 2, 5 }, { 1, 5 }, { 10, 4 },
{ 9, 4 }, { 14, 3 }, { 8, 3 }, { 7, 3 }, { 0, 3 }, { 13, 2 },
},
{
{0x05, 5}, {0x05, 4}, {0x04, 5}, {0x03, 6},
{0x09, 9}, {0x83, 13}, {0x82, 13}, {0x03, 3},
{0x04, 4}, {0x03, 4}, {0x03, 5}, {0x05, 8},
{0x81, 13}, {0x03, 2}, {0x02, 2}, {0x02, 5},
{0x02, 6}, {0x03, 7}, {0x11, 10}, {0x43, 12},
{0x80, 13}, {0x42, 12}
{ 0, -6 }, { 20, 13 }, { 12, 13 }, { 6, 13 }, { 5, 13 }, { 21, 12 },
{ 19, 12 }, { 18, 10 }, { 4, 9 }, { 11, 8 }, { 17, 7 }, { 16, 6 },
{ 3, 6 }, { 15, 5 }, { 10, 5 }, { 2, 5 }, { 0, 5 }, { 9, 4 },
{ 8, 4 }, { 1, 4 }, { 7, 3 }, { 14, 2 }, { 13, 2 },
},
{
{0x05, 7}, {0x03, 4}, {0x03, 5}, {0x04, 7},
{0x09, 9}, {0x83, 13}, {0x101, 14}, {0x03, 3},
{0x02, 4}, {0x05, 6}, {0x03, 7}, {0x11, 10},
{0x201, 15}, {0x03, 2}, {0x02, 2}, {0x02, 3},
{0x04, 6}, {0x03, 6}, {0x05, 8}, {0x21, 11},
{0x82, 13}, {0x81, 13}
{ 0, -6 }, { 0,-15 }, { 12, 15 }, { 6, 14 }, { 21, 13 }, { 20, 13 },
{ 5, 13 }, { 19, 11 }, { 11, 10 }, { 4, 9 }, { 18, 8 }, { 10, 7 },
{ 3, 7 }, { 0, 7 }, { 17, 6 }, { 16, 6 }, { 9, 6 }, { 2, 5 },
{ 8, 4 }, { 1, 4 }, { 15, 3 }, { 7, 3 }, { 14, 2 }, { 13, 2 },
},
{
{0x13, 10}, {0x03, 5}, {0x05, 7}, {0x12, 10},
{0x43, 12}, {0x83, 13}, {0x82, 13}, {0x02, 5},
{0x04, 7}, {0x05, 8}, {0x23, 11}, {0x81, 13},
{0x101, 14}, {0x03, 2}, {0x02, 2}, {0x01, 2},
{0x01, 3}, {0x03, 6}, {0x03, 7}, {0x22, 11},
{0x201, 15}, {0x42, 12}
{ 0, -6 }, { 0,-15 }, { 20, 15 }, { 12, 14 }, { 11, 13 }, { 6, 13 },
{ 5, 13 }, { 21, 12 }, { 4, 12 }, { 19, 11 }, { 10, 11 }, { 3, 10 },
{ 0, 10 }, { 9, 8 }, { 18, 7 }, { 8, 7 }, { 2, 7 }, { 17, 6 },
{ 7, 5 }, { 1, 5 }, { 16, 3 }, { 15, 2 }, { 14, 2 }, { 13, 2 },
},
{
{0x23, 11}, {0x01, 4}, {0x07, 8}, {0x13, 10},
{0x22, 11}, {0x103, 14}, {0x102, 14}, {0x03, 6},
{0x06, 8}, {0x12, 10}, {0x43, 12}, {0x101, 14},
{0x201, 15}, {0x03, 3}, {0x02, 3}, {0x03, 2},
{0x02, 2}, {0x01, 3}, {0x02, 6}, {0x05, 8},
{0x42, 12}, {0x41, 12}
{ 0, -6 }, { 0,-15 }, { 12, 15 }, { 11, 14 }, { 6, 14 }, { 5, 14 },
{ 21, 12 }, { 20, 12 }, { 10, 12 }, { 4, 11 }, { 0, 11 }, { 9, 10 },
{ 3, 10 }, { 19, 8 }, { 8, 8 }, { 2, 8 }, { 18, 6 }, { 7, 6 },
{ 1, 4 }, { 17, 3 }, { 14, 3 }, { 13, 3 }, { 16, 2 }, { 15, 2 },
},
{
{0x0b, 9}, {0x03, 5}, {0x07, 8}, {0x07, 7},
{0x06, 7}, {0x23, 11}, {0x41, 12}, {0x05, 7},
{0x06, 8}, {0x0a, 9}, {0x13, 10}, {0x22, 11},
{0x40, 12}, {0x03, 4}, {0x02, 4}, {0x03, 2},
{0x02, 2}, {0x01, 2}, {0x02, 5}, {0x04, 7},
{0x12, 10}, {0x21, 11}
{ 0, -6 }, { 12, 12 }, { 6, 12 }, { 21, 11 }, { 11, 11 }, { 5, 11 },
{ 20, 10 }, { 10, 10 }, { 9, 9 }, { 0, 9 }, { 8, 8 }, { 2, 8 },
{ 19, 7 }, { 7, 7 }, { 4, 7 }, { 3, 7 }, { 18, 5 }, { 1, 5 },
{ 14, 4 }, { 13, 4 }, { 17, 2 }, { 16, 2 }, { 15, 2 },
},
{
{0x15, 10}, {0x03, 6}, {0x14, 10}, {0x23, 11},
{0x07, 8}, {0x43, 12}, {0x81, 13}, {0x06, 8},
{0x0b, 9}, {0x13, 10}, {0x12, 10}, {0x42, 12},
{0x80, 13}, {0x01, 4}, {0x03, 3}, {0x02, 3},
{0x03, 2}, {0x02, 2}, {0x01, 3}, {0x02, 6},
{0x22, 11}, {0x41, 12}
{ 0, -6 }, { 12, 13 }, { 6, 13 }, { 21, 12 }, { 11, 12 }, { 5, 12 },
{ 20, 11 }, { 3, 11 }, { 10, 10 }, { 9, 10 }, { 2, 10 }, { 0, 10 },
{ 8, 9 }, { 7, 8 }, { 4, 8 }, { 19, 6 }, { 1, 6 }, { 13, 4 },
{ 18, 3 }, { 15, 3 }, { 14, 3 }, { 17, 2 }, { 16, 2 },
},
{
{0x43, 12}, {0x05, 6}, {0x07, 8}, {0x04, 6},
{0x03, 6}, {0x13, 10}, {0x42, 12}, {0x05, 7},
{0x04, 7}, {0x06, 8}, {0x12, 10}, {0x41, 12},
{0x40, 12}, {0x03, 5}, {0x03, 4}, {0x03, 3},
{0x02, 3}, {0x03, 2}, {0x02, 2}, {0x02, 4},
{0x05, 8}, {0x11, 10}
{ 0, -6 }, { 12, 12 }, { 11, 12 }, { 6, 12 }, { 0, 12 }, { 21, 10 },
{ 10, 10 }, { 5, 10 }, { 20, 8 }, { 9, 8 }, { 2, 8 }, { 8, 7 },
{ 7, 7 }, { 4, 6 }, { 3, 6 }, { 1, 6 }, { 13, 5 }, { 19, 4 },
{ 14, 4 }, { 16, 3 }, { 15, 3 }, { 18, 2 }, { 17, 2 },
},
{
{0x83, 13}, {0x05, 7}, {0x07, 8}, {0x03, 4},
{0x21, 11}, {0x82, 13}, {0x81, 13}, {0x04, 7},
{0x06, 8}, {0x0b, 9}, {0x0a, 9}, {0x11, 10},
{0x80, 13}, {0x03, 5}, {0x02, 5}, {0x02, 4},
{0x03, 3}, {0x02, 3}, {0x03, 2}, {0x02, 2},
{0x03, 6}, {0x09, 9}
{ 0, -6 }, { 12, 13 }, { 6, 13 }, { 5, 13 }, { 0, 13 }, { 4, 11 },
{ 11, 10 }, { 21, 9 }, { 10, 9 }, { 9, 9 }, { 8, 8 }, { 2, 8 },
{ 7, 7 }, { 1, 7 }, { 20, 6 }, { 14, 5 }, { 13, 5 }, { 15, 4 },
{ 3, 4 }, { 17, 3 }, { 16, 3 }, { 19, 2 }, { 18, 2 },
},
{
{0x13, 10}, {0x03, 5}, {0x03, 6}, {0x0d, 9},
{0x0c, 9}, {0x21, 11}, {0x20, 11}, {0x02, 5},
{0x02, 6}, {0x07, 8}, {0x0b, 9}, {0x12, 10},
{0x11, 10}, {0x05, 3}, {0x04, 3}, {0x05, 4},
{0x04, 4}, {0x03, 4}, {0x02, 4}, {0x03, 3},
{0x03, 2}, {0x0a, 9}
}
{ 0, -6 }, { 6, 11 }, { 5, 11 }, { 12, 10 }, { 11, 10 }, { 0, 10 },
{ 21, 9 }, { 10, 9 }, { 4, 9 }, { 3, 9 }, { 9, 8 }, { 8, 6 },
{ 2, 6 }, { 7, 5 }, { 1, 5 }, { 18, 4 }, { 17, 4 }, { 16, 4 },
{ 15, 4 }, { 19, 3 }, { 14, 3 }, { 13, 3 }, { 20, 2 },
},
};
#endif /* AVCODEC_MPEG4DATA_H */

View File

@ -138,7 +138,7 @@ extern RLTable ff_mpeg4_rl_intra;
extern RLTable ff_rvlc_rl_inter;
extern RLTable ff_rvlc_rl_intra;
extern const uint16_t ff_sprite_trajectory_tab[15][2];
extern const uint8_t ff_sprite_trajectory_lens[15];
extern const uint8_t ff_mb_type_b_tab[4][2];
/* these matrixes will be permuted for the idct */
@ -151,9 +151,9 @@ extern const uint16_t ff_mpeg4_resync_prefix[8];
extern const uint8_t ff_mpeg4_dc_threshold[8];
extern const uint16_t ff_mpeg4_studio_dc_luma[19][2];
extern const uint16_t ff_mpeg4_studio_dc_chroma[19][2];
extern const uint16_t ff_mpeg4_studio_intra[12][22][2];
extern const uint8_t ff_mpeg4_studio_dc_luma[19][2];
extern const uint8_t ff_mpeg4_studio_dc_chroma[19][2];
extern const uint8_t ff_mpeg4_studio_intra[12][24][2];
void ff_mpeg4_encode_mb(MpegEncContext *s,
int16_t block[6][64],

View File

@ -3394,9 +3394,9 @@ av_cold void ff_mpeg4videodec_static_init(void) {
INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
&ff_mpeg4_DCtab_chrom[0][1], 2, 1,
&ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512);
INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
&ff_sprite_trajectory_tab[0][1], 4, 2,
&ff_sprite_trajectory_tab[0][0], 4, 2, 128);
INIT_VLC_STATIC_FROM_LENGTHS(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
ff_sprite_trajectory_lens, 1,
NULL, 0, 0, 0, 0, 128);
INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
&ff_mb_type_b_tab[0][1], 2, 1,
&ff_mb_type_b_tab[0][0], 2, 1, 16);
@ -3506,26 +3506,27 @@ static av_cold int init_studio_vlcs(Mpeg4DecContext *ctx)
int i, ret;
for (i = 0; i < 12; i++) {
ret = init_vlc(&ctx->studio_intra_tab[i], STUDIO_INTRA_BITS, 22,
&ff_mpeg4_studio_intra[i][0][1], 4, 2,
&ff_mpeg4_studio_intra[i][0][0], 4, 2,
0);
ret = ff_init_vlc_from_lengths(&ctx->studio_intra_tab[i],
STUDIO_INTRA_BITS, 24,
&ff_mpeg4_studio_intra[i][0][1], 2,
&ff_mpeg4_studio_intra[i][0][0], 2, 1,
0, 0, NULL);
if (ret < 0)
return ret;
}
ret = init_vlc(&ctx->studio_luma_dc, STUDIO_INTRA_BITS, 19,
&ff_mpeg4_studio_dc_luma[0][1], 4, 2,
&ff_mpeg4_studio_dc_luma[0][0], 4, 2,
0);
ret = ff_init_vlc_from_lengths(&ctx->studio_luma_dc, STUDIO_INTRA_BITS, 19,
&ff_mpeg4_studio_dc_luma[0][1], 2,
&ff_mpeg4_studio_dc_luma[0][0], 2, 1,
0, 0, NULL);
if (ret < 0)
return ret;
ret = init_vlc(&ctx->studio_chroma_dc, STUDIO_INTRA_BITS, 19,
&ff_mpeg4_studio_dc_chroma[0][1], 4, 2,
&ff_mpeg4_studio_dc_chroma[0][0], 4, 2,
0);
ret = ff_init_vlc_from_lengths(&ctx->studio_chroma_dc, STUDIO_INTRA_BITS, 19,
&ff_mpeg4_studio_dc_chroma[0][1], 2,
&ff_mpeg4_studio_dc_chroma[0][0], 2, 1,
0, 0, NULL);
if (ret < 0)
return ret;