[FFmpeg-devel] [PATCH v2 124/162] avcodec/vp3: Use symbols table for VP3 motion vectors

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Fri Nov 20 09:32:49 EET 2020


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 used for VP3 motion vectors. The reason it
hasn't been done before is probably that the array in this case
contained entries in the range -31..31; but this is no problem with
ff_init_vlc_from_lengths(): Just apply an offset of 31 to the symbols
before storing them in the table used to initialize VP3 motion vectors
and apply an offset of -31 when initializing the actual VLC.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
 libavcodec/vp3.c     | 21 +++++++++++++-------
 libavcodec/vp3data.h | 46 +++++++++++---------------------------------
 2 files changed, 25 insertions(+), 42 deletions(-)

diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 7d1d2411ab..2f43de757e 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -48,6 +48,7 @@
 #include "vp3dsp.h"
 #include "xiph.h"
 
+#define VP3_MV_VLC_BITS     6
 #define VP4_MV_VLC_BITS     6
 #define SUPERBLOCK_VLC_BITS 6
 
@@ -946,8 +947,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
                 case MODE_INTER_PLUS_MV:
                     /* all 6 fragments use the same motion vector */
                     if (coding_mode == 0) {
-                        motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
-                        motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
+                        motion_x[0] = get_vlc2(gb, s->motion_vector_vlc.table,
+                                               VP3_MV_VLC_BITS, 2);
+                        motion_y[0] = get_vlc2(gb, s->motion_vector_vlc.table,
+                                               VP3_MV_VLC_BITS, 2);
                     } else if (coding_mode == 1) {
                         motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)];
                         motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)];
@@ -976,8 +979,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
                         current_fragment = BLOCK_Y * s->fragment_width[0] + BLOCK_X;
                         if (s->all_fragments[current_fragment].coding_method != MODE_COPY) {
                             if (coding_mode == 0) {
-                                motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
-                                motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
+                                motion_x[k] = get_vlc2(gb, s->motion_vector_vlc.table,
+                                                       VP3_MV_VLC_BITS, 2);
+                                motion_y[k] = get_vlc2(gb, s->motion_vector_vlc.table,
+                                                       VP3_MV_VLC_BITS, 2);
                             } else if (coding_mode == 1) {
                                 motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)];
                                 motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)];
@@ -2479,9 +2484,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
     if (ret < 0)
         return ret;
 
-    if ((ret = init_vlc(&s->motion_vector_vlc, 6, 63,
-                        &motion_vector_vlc_table[0][1], 2, 1,
-                        &motion_vector_vlc_table[0][0], 2, 1, 0)) < 0)
+    ret = ff_init_vlc_from_lengths(&s->motion_vector_vlc, VP3_MV_VLC_BITS, 63,
+                                   &motion_vector_vlc_table[0][1], 2,
+                                   &motion_vector_vlc_table[0][0], 2, 1,
+                                   -31, 0, avctx);
+    if (ret < 0)
         return ret;
 
 #if CONFIG_VP4_DECODER
diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h
index ae2b44f533..1fbeac731b 100644
--- a/libavcodec/vp3data.h
+++ b/libavcodec/vp3data.h
@@ -112,41 +112,17 @@ static const uint8_t mode_code_vlc_len[8] = {
 };
 
 static const uint8_t motion_vector_vlc_table[63][2] = {
-    {    0, 3 },
-    {    1, 3 },
-    {    2, 3 },
-
-    {    6, 4 }, {    7, 4 },
-
-    {    8, 4 }, {    9, 4 },
-
-    {   40, 6 }, {   41, 6 }, {   42, 6 }, {   43, 6 },
-    {   44, 6 }, {   45, 6 }, {   46, 6 }, {   47, 6 },
-
-    {   96, 7 }, {   97, 7 }, {   98, 7 }, {   99, 7 },
-    {  100, 7 }, {  101, 7 }, {  102, 7 }, {  103, 7 },
-    {  104, 7 }, {  105, 7 }, {  106, 7 }, {  107, 7 },
-    {  108, 7 }, {  109, 7 }, {  110, 7 }, {  111, 7 },
-
-    { 0xE0, 8 }, { 0xE1, 8 }, { 0xE2, 8 }, { 0xE3, 8 },
-    { 0xE4, 8 }, { 0xE5, 8 }, { 0xE6, 8 }, { 0xE7, 8 },
-    { 0xE8, 8 }, { 0xE9, 8 }, { 0xEA, 8 }, { 0xEB, 8 },
-    { 0xEC, 8 }, { 0xED, 8 }, { 0xEE, 8 }, { 0xEF, 8 },
-
-    { 0xF0, 8 }, { 0xF1, 8 }, { 0xF2, 8 }, { 0xF3, 8 },
-    { 0xF4, 8 }, { 0xF5, 8 }, { 0xF6, 8 }, { 0xF7, 8 },
-    { 0xF8, 8 }, { 0xF9, 8 }, { 0xFA, 8 }, { 0xFB, 8 },
-    { 0xFC, 8 }, { 0xFD, 8 }, { 0xFE, 8 }, { 0xFF, 8 }
-};
-
-static const int8_t motion_vector_table[63] = {
-     0,   1, -1,
-     2,  -2,
-     3,  -3,
-     4,  -4,  5,  -5,  6,  -6,  7,  -7,
-     8,  -8,  9,  -9, 10, -10, 11, -11, 12, -12, 13, -13, 14, -14, 15, -15,
-    16, -16, 17, -17, 18, -18, 19, -19, 20, -20, 21, -21, 22, -22, 23, -23,
-    24, -24, 25, -25, 26, -26, 27, -27, 28, -28, 29, -29, 30, -30, 31, -31
+    { 31,  3 }, { 32,  3 }, { 30,  3 }, { 33,  4 }, { 29,  4 }, { 34,  4 },
+    { 28,  4 }, { 35,  6 }, { 27,  6 }, { 36,  6 }, { 26,  6 }, { 37,  6 },
+    { 25,  6 }, { 38,  6 }, { 24,  6 }, { 39,  7 }, { 23,  7 }, { 40,  7 },
+    { 22,  7 }, { 41,  7 }, { 21,  7 }, { 42,  7 }, { 20,  7 }, { 43,  7 },
+    { 19,  7 }, { 44,  7 }, { 18,  7 }, { 45,  7 }, { 17,  7 }, { 46,  7 },
+    { 16,  7 }, { 47,  8 }, { 15,  8 }, { 48,  8 }, { 14,  8 }, { 49,  8 },
+    { 13,  8 }, { 50,  8 }, { 12,  8 }, { 51,  8 }, { 11,  8 }, { 52,  8 },
+    { 10,  8 }, { 53,  8 }, {  9,  8 }, { 54,  8 }, {  8,  8 }, { 55,  8 },
+    {  7,  8 }, { 56,  8 }, {  6,  8 }, { 57,  8 }, {  5,  8 }, { 58,  8 },
+    {  4,  8 }, { 59,  8 }, {  3,  8 }, { 60,  8 }, {  2,  8 }, { 61,  8 },
+    {  1,  8 }, { 62,  8 }, {  0,  8 },
 };
 
 static const int8_t fixed_motion_vector_table[64] = {
-- 
2.25.1



More information about the ffmpeg-devel mailing list