diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index 7037d03a98..f288a53fe1 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)];
@@ -2477,9 +2482,10 @@ 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);
+    if (ret < 0)
         return ret;
 
 #if CONFIG_VP4_DECODER
diff --git a/libavcodec/vp3data.h b/libavcodec/vp3data.h
index eb516a0add..901850bd75 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] = {
