diff mbox series

[FFmpeg-devel,3/3] avcodec/sheervideo: Avoid code duplication when creating VLC tables

Message ID 20201010185956.980042-3-andreas.rheinhardt@gmail.com
State Accepted
Commit 8227f60fee0b2ae0924ee6f9b1ed505d3a443526
Headers show
Series [FFmpeg-devel,1/3] avcodec/sheervideo: Don't leave context in inconsistent state upon error | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make warning Make failed

Commit Message

Andreas Rheinhardt Oct. 10, 2020, 6:59 p.m. UTC
The SheerVideo decoder uses two VLC tables and these are in turn created
from structures (called SheerTable) that are naturally paired. This
commit unifies these pairs of SheerTables to arrays and unifies creating
the VLC tables.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavcodec/sheervideo.c     | 129 ++++-------------
 libavcodec/sheervideodata.h | 269 +++++++++++++++++++-----------------
 2 files changed, 169 insertions(+), 229 deletions(-)

Comments

Paul B Mahol Oct. 10, 2020, 7:51 p.m. UTC | #1
On Sat, Oct 10, 2020 at 08:59:56PM +0200, Andreas Rheinhardt wrote:
> The SheerVideo decoder uses two VLC tables and these are in turn created
> from structures (called SheerTable) that are naturally paired. This
> commit unifies these pairs of SheerTables to arrays and unifies creating
> the VLC tables.

patch-set should be fine if all variant of files are still decoded fine
after this set applied.
Andreas Rheinhardt Oct. 10, 2020, 7:58 p.m. UTC | #2
Paul B Mahol:
> On Sat, Oct 10, 2020 at 08:59:56PM +0200, Andreas Rheinhardt wrote:
>> The SheerVideo decoder uses two VLC tables and these are in turn created
>> from structures (called SheerTable) that are naturally paired. This
>> commit unifies these pairs of SheerTables to arrays and unifies creating
>> the VLC tables.
> 
> patch-set should be fine if all variant of files are still decoded fine
> after this set applied.
> 
I tested all files from
https://samples.ffmpeg.org/ffmpeg-bugs/trac/ticket492/ which
unfortunately don't cover all variants and they decode the same. Given
that the new tables have been created automatically* I am confident that
I made no errors.

- Andreas

*: using this small program:


#include <stdio.h>
#include <stdint.h>
#include "sheervideodata.h"

void test(const char *name, const uint8_t *table, int size)
{
    int last = 0;
    int descending = 0;
    int counts[2][16] = { { 0 } }, count = 0;

    for (int i = 0; i < size; i++) {
        int cur = table[i];

        if (descending) {
            if (last < cur) {
                printf("Table %s not according to expectations at index
%d.\n",
                       name, i);
                return;
            }
        } else if (last > cur)
            descending = 1;
        if (cur > 16 || cur <= 0) {
            printf("Element %d of table %s out of range.\n", i, name);
            return;
        }
        counts[descending][cur - 1]++;
        last = cur;
    }
    if (!descending) {
        printf("Still ascending.\n");
        return;
    }
    if (counts[1][15]) {
        printf("Strange");
        return;
    }
    for (int i = 0; i < 16; i++)
        count += counts[0][i] + counts[1][i];

    if (count != size) {
        printf("Strange2");
        return;
    }
    if (counts[0][15] > UINT16_MAX) {
        printf("Strange3");
        return;
    }
    printf("static const SheerTable %s = {\n    {", name);
    for (int i = 0; i < 15; i++)
        printf("%3d,", counts[0][i]);
    printf("\n     ");
    for (int i = 0; i < 14; i++)
        printf("%3d,", counts[1][14 - i]);
    printf("%3d }, %d\n };\n\n", counts[1][0], counts[0][15]);
}

#define test(table, size) test(#table, table, size)

int main()
{
    test(l_r_rgb,     256);
    test(l_g_rgb,     256);
    test(l_r_rgbi,    256);
    test(l_g_rgbi,    256);
    test(l_y_ybr,     256);
    test(l_u_ybr,     256);
    test(l_y_ybyr,    256);
    test(l_u_ybyr,    256);
    test(l_y_byry,    256);
    test(l_u_byry,    256);
    test(l_y_ybr10i, 1024);
    test(l_y_ybr10,  1024);
    test(l_u_ybr10i, 1024);
    test(l_u_ybr10,  1024);
    test(l_r_rgbx,   1024);
    test(l_g_rgbx,   1024);
    test(l_y_yry10,  1024);
    test(l_u_yry10,  1024);
    test(l_y_yry10i, 1024);
    test(l_u_yry10i, 1024);
    test(l_y_ybri,    256);
    test(l_u_ybri,    256);
    test(l_y_byryi,   256);
    test(l_u_byryi,   256);
    test(l_r_rgbxi,  1024);
    test(l_g_rgbxi,  1024);
    return 0;
}
Andreas Rheinhardt Oct. 10, 2020, 9:34 p.m. UTC | #3
Paul B Mahol:
> On Sat, Oct 10, 2020 at 08:59:56PM +0200, Andreas Rheinhardt wrote:
>> The SheerVideo decoder uses two VLC tables and these are in turn created
>> from structures (called SheerTable) that are naturally paired. This
>> commit unifies these pairs of SheerTables to arrays and unifies creating
>> the VLC tables.
> 
> patch-set should be fine if all variant of files are still decoded fine
> after this set applied.
> 
On a second look, ticket #492 had some more files that were directly
hosted on trac and were not available on samples.ffmpeg.org and with
these files all tables and decode_frame functions are tested. I'll
therefore apply this patchset.

- Andreas
diff mbox series

Patch

diff --git a/libavcodec/sheervideo.c b/libavcodec/sheervideo.c
index 3471fdcff9..976c21c445 100644
--- a/libavcodec/sheervideo.c
+++ b/libavcodec/sheervideo.c
@@ -1816,6 +1816,7 @@  static int decode_frame(AVCodecContext *avctx,
 {
     SheerVideoContext *s = avctx->priv_data;
     ThreadFrame frame = { .f = data };
+    const SheerTable *table;
     AVFrame *p = data;
     GetBitContext gb;
     unsigned format;
@@ -1835,210 +1836,135 @@  static int decode_frame(AVCodecContext *avctx,
     case MKTAG(' ', 'R', 'G', 'B'):
         avctx->pix_fmt = AV_PIX_FMT_RGB0;
         s->decode_frame = decode_rgb;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgb);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgb);
-        }
+        table           = rgb;
         break;
     case MKTAG(' ', 'r', 'G', 'B'):
         avctx->pix_fmt = AV_PIX_FMT_RGB0;
         s->decode_frame = decode_rgbi;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbi);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbi);
-        }
+        table           = rgbi;
         break;
     case MKTAG('A', 'R', 'G', 'X'):
         avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
         s->decode_frame = decode_argx;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbx);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbx);
-        }
+        table           = rgbx;
         break;
     case MKTAG('A', 'r', 'G', 'X'):
         avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
         s->decode_frame = decode_argxi;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbxi);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbxi);
-        }
+        table           = rgbxi;
         break;
     case MKTAG('R', 'G', 'B', 'X'):
         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
         s->decode_frame = decode_rgbx;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbx);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbx);
-        }
+        table           = rgbx;
         break;
     case MKTAG('r', 'G', 'B', 'X'):
         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
         s->decode_frame = decode_rgbxi;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbxi);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbxi);
-        }
+        table           = rgbxi;
         break;
     case MKTAG('A', 'R', 'G', 'B'):
         avctx->pix_fmt = AV_PIX_FMT_ARGB;
         s->decode_frame = decode_argb;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgb);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgb);
-        }
+        table           = rgb;
         break;
     case MKTAG('A', 'r', 'G', 'B'):
         avctx->pix_fmt = AV_PIX_FMT_ARGB;
         s->decode_frame = decode_argbi;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_r_rgbi);
-            ret |= build_vlc(&s->vlc[1], &l_g_rgbi);
-        }
+        table           = rgbi;
         break;
     case MKTAG('A', 'Y', 'B', 'R'):
         s->alt = 1;
     case MKTAG('A', 'Y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
         s->decode_frame = decode_aybr;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr);
-        }
+        table           = ybr;
         break;
     case MKTAG('A', 'y', 'B', 'R'):
         s->alt = 1;
     case MKTAG('A', 'y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
         s->decode_frame = decode_aybri;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybri);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybri);
-        }
+        table           = ybri;
         break;
     case MKTAG(' ', 'Y', 'B', 'R'):
         s->alt = 1;
     case MKTAG(' ', 'Y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
         s->decode_frame = decode_ybr;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr);
-        }
+        table           = ybr;
         break;
     case MKTAG(' ', 'y', 'B', 'R'):
         s->alt = 1;
     case MKTAG(' ', 'y', 'b', 'R'):
         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
         s->decode_frame = decode_ybri;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybri);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybri);
-        }
+        table           = ybri;
         break;
     case MKTAG('Y', 'B', 'R', 0x0a):
         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
         s->decode_frame = decode_ybr10;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr10);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr10);
-        }
+        table           = ybr10;
         break;
     case MKTAG('y', 'B', 'R', 0x0a):
         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
         s->decode_frame = decode_ybr10i;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr10i);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr10i);
-        }
+        table           = ybr10i;
         break;
     case MKTAG('C', 'A', '4', 'p'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
         s->decode_frame = decode_ca4p;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr10);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr10);
-        }
+        table           = ybr10;
         break;
     case MKTAG('C', 'A', '4', 'i'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
         s->decode_frame = decode_ca4i;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybr10i);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybr10i);
-        }
+        table           = ybr10i;
         break;
     case MKTAG('B', 'Y', 'R', 'Y'):
         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
         s->decode_frame = decode_byry;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_byry);
-            ret |= build_vlc(&s->vlc[1], &l_u_byry);
-        }
+        table           = byry;
         break;
     case MKTAG('B', 'Y', 'R', 'y'):
         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
         s->decode_frame = decode_byryi;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_byryi);
-            ret |= build_vlc(&s->vlc[1], &l_u_byryi);
-        }
+        table           = byryi;
         break;
     case MKTAG('Y', 'b', 'Y', 'r'):
         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
         s->decode_frame = decode_ybyr;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_ybyr);
-            ret |= build_vlc(&s->vlc[1], &l_u_ybyr);
-        }
+        table           = ybyr;
         break;
     case MKTAG('C', '8', '2', 'p'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
         s->decode_frame = decode_c82p;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_byry);
-            ret |= build_vlc(&s->vlc[1], &l_u_byry);
-        }
+        table           = byry;
         break;
     case MKTAG('C', '8', '2', 'i'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
         s->decode_frame = decode_c82i;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_byryi);
-            ret |= build_vlc(&s->vlc[1], &l_u_byryi);
-        }
+        table           = byryi;
         break;
     case MKTAG(0xa2, 'Y', 'R', 'Y'):
         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
         s->decode_frame = decode_yry10;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_yry10);
-            ret |= build_vlc(&s->vlc[1], &l_u_yry10);
-        }
+        table           = yry10;
         break;
     case MKTAG(0xa2, 'Y', 'R', 'y'):
         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
         s->decode_frame = decode_yry10i;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_yry10i);
-            ret |= build_vlc(&s->vlc[1], &l_u_yry10i);
-        }
+        table           = yry10i;
         break;
     case MKTAG('C', 'A', '2', 'p'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
         s->decode_frame = decode_ca2p;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_yry10);
-            ret |= build_vlc(&s->vlc[1], &l_u_yry10);
-        }
+        table           = yry10;
         break;
     case MKTAG('C', 'A', '2', 'i'):
         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
         s->decode_frame = decode_ca2i;
-        if (s->format != format) {
-            ret  = build_vlc(&s->vlc[0], &l_y_yry10i);
-            ret |= build_vlc(&s->vlc[1], &l_u_yry10i);
-        }
+        table           = yry10i;
         break;
     default:
         avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
@@ -2046,7 +1972,8 @@  static int decode_frame(AVCodecContext *avctx,
     }
 
     if (s->format != format) {
-        if (ret < 0) {
+        if ((ret = build_vlc(&s->vlc[0], &table[0])) < 0 ||
+            (ret = build_vlc(&s->vlc[1], &table[1])) < 0) {
             s->format = 0;
             return ret;
         }
diff --git a/libavcodec/sheervideodata.h b/libavcodec/sheervideodata.h
index 2cb8da377e..fbce3a4122 100644
--- a/libavcodec/sheervideodata.h
+++ b/libavcodec/sheervideodata.h
@@ -29,134 +29,147 @@  typedef struct SheerTable {
     uint16_t nb_16s;
 } SheerTable;
 
-static const SheerTable l_r_rgb = {
-    {  0,  0,  2,  2,  3,  3,  5,  5,  8,  8, 10,  9, 14, 15, 18,
-      17, 16, 13, 10, 10,  8,  7,  6,  5,  3,  2,  3,  0,  0,  0 }, 54
-};
-
-static const SheerTable l_g_rgb = {
-    {  0,  2,  0,  2,  0,  1,  1,  0,  2,  1,  3,  3,  4,  7, 13,
-      11,  8,  4,  3,  3,  1,  2,  1,  0,  1,  0,  1,  2,  0,  0 }, 180
-};
-
-static const SheerTable l_r_rgbi = {
-    {  0,  0,  1,  3,  3,  3,  6,  8,  8, 11, 12, 15, 18, 21, 38,
-       0, 22, 19, 15, 12, 11,  7,  8,  6,  4,  2,  3,  0,  0,  0 }, 0
-};
-
-static const SheerTable l_g_rgbi = {
-    {  1,  0,  1,  1,  1,  1,  2,  1,  2,  4,  3,  5,  5,  6, 12,
-      14,  6,  6,  5,  3,  3,  3,  2,  1,  1,  2,  0,  1,  0,  0 }, 164
-};
-
-static const SheerTable l_y_ybr = {
-    {  0,  0,  2,  2,  2,  3,  5,  5,  7,  7,  8,  9, 13, 13, 19,
-      16, 14, 12,  9,  9,  7,  6,  6,  4,  4,  1,  2,  1,  0,  0 }, 70
-};
-
-static const SheerTable l_u_ybr = {
-    {  1,  1,  0,  1,  0,  1,  0,  0,  1,  1,  2,  2,  3,  5,  5,
-       5,  5,  3,  2,  2,  1,  0,  1,  0,  0,  1,  0,  1,  0,  0 }, 212
-};
-
-static const SheerTable l_y_ybyr = {
-    {  0,  0,  2,  2,  3,  3,  5,  5,  8,  8, 10, 10, 13, 15, 19,
-      18, 15, 12, 10, 10,  8,  7,  6,  5,  3,  2,  3,  0,  0,  0 }, 54
-};
-
-static const SheerTable l_u_ybyr = {
-    {  1,  1,  0,  1,  0,  1,  0,  1,  1,  2,  2,  3,  2,  5,  5,
-       5,  4,  3,  2,  2,  2,  1,  1,  1,  1,  0,  0,  1,  0,  0 }, 208
-};
-
-static const SheerTable l_y_byry = {
-    {  0,  0,  2,  2,  2,  3,  5,  5,  7,  7,  8, 11, 10, 14, 19,
-      14, 16, 12, 10,  8,  7,  6,  6,  4,  4,  1,  2,  1,  0,  0 }, 70
-};
-
-static const SheerTable l_u_byry = {
-    {  1,  1,  0,  1,  0,  1,  0,  1,  2,  1,  2,  2,  3,  4,  6,
-       6,  4,  2,  3,  2,  1,  1,  1,  1,  1,  0,  0,  1,  0,  0 }, 208
-};
-
-static const SheerTable l_y_ybr10i = {
-    {  0,  0,  1,  0,  3,  8,  9, 12, 19, 27, 27, 39, 50, 63, 93,
-      89, 64, 50, 38, 26, 26, 20, 12,  9,  8,  3,  0,  0,  0,  0 }, 328
-};
-
-static const SheerTable l_u_ybr10i = {
-    {  0,  1,  1,  2,  2,  1,  2,  2,  4,  4,  6,  7,  9, 13, 28,
-      28, 12, 11,  6,  7,  5,  3,  3,  1,  1,  2,  2,  1,  0,  0 }, 860
-};
-
-static const SheerTable l_y_ybr10 = {
-    {  0,  0,  0,  1,  6,  6,  8, 12, 18, 21, 27, 29, 36, 47, 71,
-      72, 46, 36, 29, 27, 21, 17, 13,  7,  7,  5,  0,  0,  0,  0 }, 462
-};
-
-static const SheerTable l_u_ybr10 = {
-    {  0,  1,  2,  1,  2,  1,  1,  1,  2,  3,  2,  5,  6, 10, 20,
-      20, 10,  6,  4,  3,  2,  2,  2,  1,  1,  1,  2,  1,  0,  0 }, 912
-};
-
-static const SheerTable l_r_rgbx = {
-    {  0,  0,  0,  1,  3,  9, 10, 13, 19, 26, 28, 35, 40, 53, 77,
-      77, 50, 42, 34, 28, 25, 19, 13, 10,  8,  4,  0,  0,  0,  0 }, 400
-};
-
-static const SheerTable l_g_rgbx = {
-    {  0,  0,  1,  2,  6,  4,  3,  2,  3,  4,  6,  8, 10, 18, 39,
-      39, 18, 11,  8,  6,  4,  4,  1,  3,  5,  4,  3,  0,  0,  0 }, 812
-};
-
-static const SheerTable l_y_yry10 = {
-    {  0,  0,  0,  1,  6,  6,  8, 12, 18, 21, 27, 29, 36, 47, 71,
-      72, 46, 36, 29, 27, 21, 17, 13,  7,  7,  5,  0,  0,  0,  0 }, 462
-};
-
-static const SheerTable l_u_yry10 = {
-    {  0,  1,  2,  1,  1,  1,  2,  3,  2,  4,  5,  5,  8, 14, 16,
-      18, 11,  7,  7,  4,  4,  3,  2,  2,  1,  1,  2,  1,  0,  0 }, 896
-};
-
-static const SheerTable l_y_yry10i = {
-    {  0,  0,  1,  0,  3,  8,  9, 12, 19, 27, 27, 40, 48, 64, 93,
-      89, 65, 49, 38, 26, 26, 20, 12,  9,  8,  3,  0,  0,  0,  0 }, 328
-};
-
-static const SheerTable l_u_yry10i = {
-    {  0,  1,  0,  3,  1,  3,  3,  3,  6,  7,  7, 12, 11, 19, 23,
-      20, 18, 12, 12,  8,  6,  5,  4,  3,  2,  2,  2,  1,  0,  0 }, 830
-};
-
-static const SheerTable l_y_ybri = {
-    {  0,  0,  2,  2,  2,  3,  5,  5,  7, 10, 11, 13, 15, 13, 26,
-      20, 16, 17, 12, 11,  9,  7,  5,  5,  3,  3,  1,  1,  0,  0 }, 32
-};
-
-static const SheerTable l_u_ybri = {
-    {  1,  0,  1,  0,  1,  1,  0,  2,  1,  2,  2,  2,  3,  6,  6,
-       5,  6,  3,  2,  2,  2,  1,  2,  0,  1,  1,  0,  0,  1,  0 }, 202
-};
-
-static const SheerTable l_y_byryi = {
-    {  0,  0,  2,  2,  2,  2,  6,  5,  8,  8, 12, 12, 16, 14, 24,
-      20, 16, 18, 12, 12,  8,  7,  5,  6,  3,  1,  2,  1,  0,  0 }, 32
-};
-
-static const SheerTable l_u_byryi = {
-    {  1,  0,  1,  1,  0,  2,  1,  2,  2,  3,  3,  4,  5,  4,  6,
-       7,  5,  4,  4,  3,  3,  2,  2,  2,  0,  1,  1,  1,  0,  0 }, 186
-};
-
-static const SheerTable l_r_rgbxi = {
-    {  0,  0,  1,  3,  2,  3,  4,  6, 16, 23, 27, 29, 24, 29, 76,
-      78, 29, 21, 29, 27, 23, 15,  7,  4,  3,  2,  3,  0,  0,  0 }, 540
-};
-
-static const SheerTable l_g_rgbxi = {
-    {  0,  1,  1,  2,  0,  2,  6,  4,  3,  9,  7, 12, 13, 16, 29,
-      32, 17, 14, 12,  7,  8,  4,  4,  6,  2,  0,  2,  1,  0,  0 }, 810
+static const SheerTable rgb[2] = {
+    {
+        {  0,  0,  2,  2,  3,  3,  5,  5,  8,  8, 10,  9, 14, 15, 18,
+          17, 16, 13, 10, 10,  8,  7,  6,  5,  3,  2,  3,  0,  0,  0 }, 54
+    },
+    {
+        {  0,  2,  0,  2,  0,  1,  1,  0,  2,  1,  3,  3,  4,  7, 13,
+          11,  8,  4,  3,  3,  1,  2,  1,  0,  1,  0,  1,  2,  0,  0 }, 180
+    }
+};
+
+static const SheerTable rgbi[2] = {
+    {
+        {  0,  0,  1,  3,  3,  3,  6,  8,  8, 11, 12, 15, 18, 21, 38,
+           0, 22, 19, 15, 12, 11,  7,  8,  6,  4,  2,  3,  0,  0,  0 }, 0
+    },
+    {
+        {  1,  0,  1,  1,  1,  1,  2,  1,  2,  4,  3,  5,  5,  6, 12,
+          14,  6,  6,  5,  3,  3,  3,  2,  1,  1,  2,  0,  1,  0,  0 }, 164
+    }
+};
+
+static const SheerTable ybr[2] = {
+    {
+        {  0,  0,  2,  2,  2,  3,  5,  5,  7,  7,  8,  9, 13, 13, 19,
+          16, 14, 12,  9,  9,  7,  6,  6,  4,  4,  1,  2,  1,  0,  0 }, 70
+    },
+    {
+        {  1,  1,  0,  1,  0,  1,  0,  0,  1,  1,  2,  2,  3,  5,  5,
+           5,  5,  3,  2,  2,  1,  0,  1,  0,  0,  1,  0,  1,  0,  0 }, 212
+    }
+};
+
+static const SheerTable ybyr[2] = {
+    {
+        {  0,  0,  2,  2,  3,  3,  5,  5,  8,  8, 10, 10, 13, 15, 19,
+          18, 15, 12, 10, 10,  8,  7,  6,  5,  3,  2,  3,  0,  0,  0 }, 54
+    },
+    {
+        {  1,  1,  0,  1,  0,  1,  0,  1,  1,  2,  2,  3,  2,  5,  5,
+           5,  4,  3,  2,  2,  2,  1,  1,  1,  1,  0,  0,  1,  0,  0 }, 208
+    }
+};
+
+static const SheerTable byry[2] = {
+    {
+        {  0,  0,  2,  2,  2,  3,  5,  5,  7,  7,  8, 11, 10, 14, 19,
+          14, 16, 12, 10,  8,  7,  6,  6,  4,  4,  1,  2,  1,  0,  0 }, 70
+    },
+    {
+        {  1,  1,  0,  1,  0,  1,  0,  1,  2,  1,  2,  2,  3,  4,  6,
+           6,  4,  2,  3,  2,  1,  1,  1,  1,  1,  0,  0,  1,  0,  0 }, 208
+    }
+};
+
+static const SheerTable ybr10i[2] = {
+    {
+        {  0,  0,  1,  0,  3,  8,  9, 12, 19, 27, 27, 39, 50, 63, 93,
+          89, 64, 50, 38, 26, 26, 20, 12,  9,  8,  3,  0,  0,  0,  0 }, 328
+    },
+    {
+        {  0,  1,  1,  2,  2,  1,  2,  2,  4,  4,  6,  7,  9, 13, 28,
+          28, 12, 11,  6,  7,  5,  3,  3,  1,  1,  2,  2,  1,  0,  0 }, 860
+    }
+};
+
+static const SheerTable ybr10[2] = {
+    {
+        {  0,  0,  0,  1,  6,  6,  8, 12, 18, 21, 27, 29, 36, 47, 71,
+          72, 46, 36, 29, 27, 21, 17, 13,  7,  7,  5,  0,  0,  0,  0 }, 462
+    },
+    {
+        {  0,  1,  2,  1,  2,  1,  1,  1,  2,  3,  2,  5,  6, 10, 20,
+          20, 10,  6,  4,  3,  2,  2,  2,  1,  1,  1,  2,  1,  0,  0 }, 912
+    }
+};
+
+static const SheerTable rgbx[2] = {
+    {
+        {  0,  0,  0,  1,  3,  9, 10, 13, 19, 26, 28, 35, 40, 53, 77,
+          77, 50, 42, 34, 28, 25, 19, 13, 10,  8,  4,  0,  0,  0,  0 }, 400
+    },
+    {
+        {  0,  0,  1,  2,  6,  4,  3,  2,  3,  4,  6,  8, 10, 18, 39,
+          39, 18, 11,  8,  6,  4,  4,  1,  3,  5,  4,  3,  0,  0,  0 }, 812
+    }
+};
+
+static const SheerTable yry10[2] = {
+    {
+        {  0,  0,  0,  1,  6,  6,  8, 12, 18, 21, 27, 29, 36, 47, 71,
+          72, 46, 36, 29, 27, 21, 17, 13,  7,  7,  5,  0,  0,  0,  0 }, 462
+    },
+    {
+        {  0,  1,  2,  1,  1,  1,  2,  3,  2,  4,  5,  5,  8, 14, 16,
+          18, 11,  7,  7,  4,  4,  3,  2,  2,  1,  1,  2,  1,  0,  0 }, 896
+    }
+};
+
+static const SheerTable yry10i[2] = {
+    {
+        {  0,  0,  1,  0,  3,  8,  9, 12, 19, 27, 27, 40, 48, 64, 93,
+          89, 65, 49, 38, 26, 26, 20, 12,  9,  8,  3,  0,  0,  0,  0 }, 328
+    },
+    {
+        {  0,  1,  0,  3,  1,  3,  3,  3,  6,  7,  7, 12, 11, 19, 23,
+          20, 18, 12, 12,  8,  6,  5,  4,  3,  2,  2,  2,  1,  0,  0 }, 830
+    }
+};
+
+static const SheerTable ybri[2] = {
+    {
+        {  0,  0,  2,  2,  2,  3,  5,  5,  7, 10, 11, 13, 15, 13, 26,
+          20, 16, 17, 12, 11,  9,  7,  5,  5,  3,  3,  1,  1,  0,  0 }, 32
+    },
+    {
+        {  1,  0,  1,  0,  1,  1,  0,  2,  1,  2,  2,  2,  3,  6,  6,
+           5,  6,  3,  2,  2,  2,  1,  2,  0,  1,  1,  0,  0,  1,  0 }, 202
+    }
+};
+
+static const SheerTable byryi[2] = {
+    {
+        {  0,  0,  2,  2,  2,  2,  6,  5,  8,  8, 12, 12, 16, 14, 24,
+          20, 16, 18, 12, 12,  8,  7,  5,  6,  3,  1,  2,  1,  0,  0 }, 32
+    },
+    {
+        {  1,  0,  1,  1,  0,  2,  1,  2,  2,  3,  3,  4,  5,  4,  6,
+           7,  5,  4,  4,  3,  3,  2,  2,  2,  0,  1,  1,  1,  0,  0 }, 186
+    }
+};
+
+static const SheerTable rgbxi[2] = {
+    {
+        {  0,  0,  1,  3,  2,  3,  4,  6, 16, 23, 27, 29, 24, 29, 76,
+          78, 29, 21, 29, 27, 23, 15,  7,  4,  3,  2,  3,  0,  0,  0 }, 540
+    },
+    {
+        {  0,  1,  1,  2,  0,  2,  6,  4,  3,  9,  7, 12, 13, 16, 29,
+          32, 17, 14, 12,  7,  8,  4,  4,  6,  2,  0,  2,  1,  0,  0 }, 810
+    }
 };
 
 #endif /* AVCODEC_SHEERVIDEODATA_H */