[FFmpeg-devel] [PATCH 076/114] avcodec/vc1: Already offset subblock VLC tables during init

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Tue Nov 10 12:48:13 EET 2020


Offseting by +1 is possible without adding dummy elements to the
beginning of the codes and lengths tables by switching to
ff_init_vlc_from_lengths() as this allows one to set the symbols
arbitrarily without incurring any penalty.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
I wonder whether the tables used to initialize VC1 VLCs should not be
put into a header of their own that is only included by vc1.c (the only
user of them) instead of vc1data.c. Given that I already touch all of
them, I could do it. What do other think of this?

 libavcodec/vc1.c       |  7 ++++---
 libavcodec/vc1_block.c |  2 +-
 libavcodec/vc1data.c   | 27 +++++++++++++++++----------
 libavcodec/vc1data.h   |  5 ++---
 4 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 9df778bcab..68180dc797 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -1616,9 +1616,10 @@ av_cold int ff_vc1_init_common(VC1Context *v)
                      ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
             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];
-            init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
-                     ff_vc1_subblkpat_bits[i], 1, 1,
-                     ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
+            ff_init_vlc_from_lengths(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
+                                     &ff_vc1_subblkpat_tabs[i][0][1], 2,
+                                     &ff_vc1_subblkpat_tabs[i][0][0], 2, 1,
+                                     0, INIT_VLC_USE_NEW_STATIC);
         }
         for (i = 0; i < 4; i++) {
             ff_vc1_4mv_block_pattern_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 9]];
diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c
index 5c33170933..b8987b0015 100644
--- a/libavcodec/vc1_block.c
+++ b/libavcodec/vc1_block.c
@@ -1143,7 +1143,7 @@ static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n,
         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)];
     }
     if (ttblk == TT_4X4) {
-        subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
+        subblkpat = ~get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1);
     }
     if ((ttblk != TT_8X8 && ttblk != TT_4X4)
         && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
diff --git a/libavcodec/vc1data.c b/libavcodec/vc1data.c
index 19f1cad45f..e92d9b7310 100644
--- a/libavcodec/vc1data.c
+++ b/libavcodec/vc1data.c
@@ -921,16 +921,23 @@ const uint8_t ff_vc1_ttblk_bits[3][8] = {
     {  2,  3,  3,  3,  3,  3,  4,  4 }
 };
 
-/* SUBBLKPAT tables, p93-94, reordered */
-const uint8_t ff_vc1_subblkpat_codes[3][15] = {
-    { 14, 12,  7, 11,  9, 26,  2, 10, 27,  8,  0,  6,  1, 15,  1 },
-    { 14,  0,  8, 15, 10,  4, 23, 13,  5,  9, 25,  3, 24, 22,  1 },
-    {  5,  6,  2,  2,  8,  0, 28,  3,  1,  3, 29,  1, 19, 18, 15 }
-};
-const uint8_t ff_vc1_subblkpat_bits[3][15] = {
-    {  5,  5,  5,  5,  5,  6,  4,  5,  6,  5,  4,  5,  4,  5,  1},
-    {  4,  3,  4,  4,  4,  5,  5,  4,  5,  4,  5,  4,  5,  5,  2},
-    {  3,  3,  4,  3,  4,  5,  5,  3,  5,  4,  5,  4,  5,  5,  4}
+/* SUBBLKPAT tables, p93-94, reordered and offset by 1 */
+const uint8_t ff_vc1_subblkpat_tabs[3][15][2] = {
+    {
+        { 0x0B, 4 }, { 0x0D, 4 }, { 0x07, 4 }, { 0x0C, 5 }, { 0x03, 5 },
+        { 0x0A, 5 }, { 0x05, 5 }, { 0x08, 5 }, { 0x04, 5 }, { 0x02, 5 },
+        { 0x06, 6 }, { 0x09, 6 }, { 0x01, 5 }, { 0x0E, 5 }, { 0x0F, 1 },
+    },
+    {
+        { 0x02, 3 }, { 0x06, 5 }, { 0x09, 5 }, { 0x0C, 4 }, { 0x0F, 2 },
+        { 0x03, 4 }, { 0x0A, 4 }, { 0x05, 4 }, { 0x0E, 5 }, { 0x07, 5 },
+        { 0x0D, 5 }, { 0x0B, 5 }, { 0x08, 4 }, { 0x01, 4 }, { 0x04, 4 },
+    },
+    {
+        { 0x06, 5 }, { 0x09, 5 }, { 0x0C, 4 }, { 0x03, 4 }, { 0x0A, 4 },
+        { 0x04, 3 }, { 0x08, 3 }, { 0x05, 4 }, { 0x0E, 5 }, { 0x0D, 5 },
+        { 0x01, 3 }, { 0x02, 3 }, { 0x07, 5 }, { 0x0B, 5 }, { 0x0F, 4 },
+    }
 };
 
 /* MV differential tables, p265 */
diff --git a/libavcodec/vc1data.h b/libavcodec/vc1data.h
index 90dd8baf61..6b141b0f76 100644
--- a/libavcodec/vc1data.h
+++ b/libavcodec/vc1data.h
@@ -152,9 +152,8 @@ extern const uint8_t ff_vc1_ttmb_bits[3][16];
 extern const uint8_t ff_vc1_ttblk_codes[3][8];
 extern const uint8_t ff_vc1_ttblk_bits[3][8];
 
-/* SUBBLKPAT tables, p93-94, reordered */
-extern const uint8_t ff_vc1_subblkpat_codes[3][15];
-extern const uint8_t ff_vc1_subblkpat_bits[3][15];
+/* SUBBLKPAT tables, p93-94, reordered and offset by 1 */
+extern const uint8_t ff_vc1_subblkpat_tabs[3][15][2];
 
 /* MV differential tables, p265 */
 extern const uint16_t ff_vc1_mv_diff_codes[4][73];
-- 
2.25.1



More information about the ffmpeg-devel mailing list