Expressions like array[get_vlc2()] can be optimized by using a symbols table if the array is always the same for a given VLC. This requirement is fulfilled for the VLC for the Block-level Transform Type and therefore this commit implements this; switching from ff_init_vlc_sparse() to ff_init_vlc_from_lengths() means that we can also remove the codes table in the process which had the same size as the new symbols table; the array used to translate the get_vlc2() values to the desired form has also been removed, saving space.
Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com> --- libavcodec/vc1.c | 7 ++++--- libavcodec/vc1_block.c | 2 +- libavcodec/vc1data.c | 30 +++++++++++++----------------- libavcodec/vc1data.h | 9 +++------ 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index d973fd6c57..8c8387b7fb 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -1611,9 +1611,10 @@ av_cold int ff_vc1_init_common(VC1Context *v) ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]]; ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1]; - init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, - ff_vc1_ttblk_bits[i], 1, 1, - ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); + ff_init_vlc_from_lengths(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, + &ff_vc1_ttblk_tabs[i][0][1], 2, + &ff_vc1_ttblk_tabs[i][0][0], 2, 1, + 0, INIT_VLC_USE_NEW_STATIC, NULL); ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]]; ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2]; ff_init_vlc_from_lengths(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15, diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index b8987b0015..da58a0738f 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -1140,7 +1140,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n, s->bdsp.clear_block(block); if (ttmb == -1) { - ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)]; + ttblk = get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1); } if (ttblk == TT_4X4) { subblkpat = ~get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1); diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c index e92d9b7310..ed5e680527 100644 --- a/libavcodec/vc1data.c +++ b/libavcodec/vc1data.c @@ -30,13 +30,6 @@ #include "vc1.h" #include "vc1data.h" -/** Table for conversion between TTBLK and TTMB */ -const int ff_vc1_ttblk_to_tt[3][8] = { - { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT }, - { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP }, - { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP } -}; - const int ff_vc1_ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 }; /** MV P mode - the 5th element is only used for mode 1 */ @@ -908,17 +901,20 @@ const uint8_t ff_vc1_ttmb_bits[3][16] = { 11 } }; - /* TTBLK (Transform Type per Block) tables */ -const uint8_t ff_vc1_ttblk_codes[3][8] = { - { 0, 1, 3, 5, 16, 17, 18, 19 }, - { 3, 0, 1, 2, 3, 5, 8, 9 }, - { 1, 0, 1, 4, 6, 7, 10, 11 } -}; -const uint8_t ff_vc1_ttblk_bits[3][8] = { - { 2, 2, 2, 3, 5, 5, 5, 5 }, - { 2, 3, 3, 3, 3, 3, 4, 4 }, - { 2, 3, 3, 3, 3, 3, 4, 4 } +const uint8_t ff_vc1_ttblk_tabs[3][8][2] = { + { + { TT_8X4, 2 }, { TT_4X8, 2 }, { TT_8X4_TOP, 5 }, { TT_8X4_BOTTOM, 5 }, + { TT_4X8_RIGHT, 5 }, { TT_4X8_LEFT, 5 }, { TT_4X4, 3 }, { TT_8X8, 2 }, + }, + { + { TT_4X8_RIGHT, 3 }, { TT_4X8_LEFT, 3 }, { TT_4X4, 3 }, { TT_8X4, 3 }, + { TT_8X4_BOTTOM, 4 }, { TT_8X4_TOP, 4 }, { TT_4X8, 3 }, { TT_8X8, 2 }, + }, + { + { TT_4X8, 3 }, { TT_4X4, 3 }, { TT_8X8, 2 }, { TT_8X4_BOTTOM, 3 }, + { TT_8X4, 4 }, { TT_8X4_TOP, 4 }, { TT_4X8_RIGHT, 3 }, { TT_4X8_LEFT, 3 }, + }, }; /* SUBBLKPAT tables, p93-94, reordered and offset by 1 */ diff --git a/libavcodec/vc1data.h b/libavcodec/vc1data.h index 02603ca9bc..9c6ac7370b 100644 --- a/libavcodec/vc1data.h +++ b/libavcodec/vc1data.h @@ -34,9 +34,6 @@ #include "vlc.h" -/** Table for conversion between TTBLK and TTMB */ -extern const int ff_vc1_ttblk_to_tt[3][8]; - extern const int ff_vc1_ttfrm_to_tt[4]; /** MV P mode - the 5th element is only used for mode 1 */ @@ -148,9 +145,9 @@ extern const uint16_t ff_vc1_ttmb_codes[3][16]; extern const uint8_t ff_vc1_ttmb_bits[3][16]; -/* TTBLK (Transform Type per Block) tables */ -extern const uint8_t ff_vc1_ttblk_codes[3][8]; -extern const uint8_t ff_vc1_ttblk_bits[3][8]; +/* TTBLK (Transform Type per Block) tables (tables #62-#64). + * The symbols contain enum TransformTypes (TT_*) values. */ +extern const uint8_t ff_vc1_ttblk_tabs[3][8][2]; /* SUBBLKPAT tables (tables #65-#67). * The symbols contain the Subblock Pattern. */ -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".