avcodec/sheervideo: fix predictions for c82p format
[ffmpeg.git] / libavcodec / sheervideo.c
1 /*
2  * BitJazz SheerVideo decoder
3  * Copyright (c) 2016 Paul B Mahol
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "libavutil/intreadwrite.h"
27 #include "avcodec.h"
28 #include "get_bits.h"
29 #include "internal.h"
30 #include "thread.h"
31
32 typedef struct SheerVideoContext {
33     unsigned format;
34     VLC vlc[2];
35     void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb);
36 } SheerVideoContext;
37
38 static const uint8_t l_r_rgb[256] = {
39      3,  3,  4,  4,  5,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,
40      8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10,
41     10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
42     12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
43     13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
44     14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
45     15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
46     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
47     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
48     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15,
49     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
50     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13,
51     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12,
52     12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10,
53     10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,
54      8,  8,  8,  7,  7,  7,  7,  7,  6,  6,  6,  5,  5,  4,  4,  4,
55 };
56
57 static const uint8_t l_r_rgbi[256] = {
58      3,  4,  4,  4,  5,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  7,
59      8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,
60     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11,
61     11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,
62     12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
63     13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
64     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15,
65     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
66     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
67     15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
68     14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,
69     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12,
70     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11,
71     11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10,
72     10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,  8,  8,  8,  8,
73      8,  7,  7,  7,  7,  7,  7,  6,  6,  6,  6,  5,  5,  4,  4,  4,
74 };
75
76 static const uint8_t l_g_rgbi[256] = {
77      1,  3,  4,  5,  6,  7,  7,  8,  9,  9, 10, 10, 10, 10, 11, 11,
78     11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
79     14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,
80     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
81     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
82     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
83     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
84     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
85     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
86     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
87     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
88     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
89     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
90     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14,
91     14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12,
92     11, 11, 11, 10, 10, 10,  9,  9,  9,  8,  8,  7,  6,  5,  5,  3,
93 };
94
95 static const uint8_t l_g_rgb[256] = {
96      2,  2,  4,  4,  6,  7,  9,  9, 10, 11, 11, 11, 12, 12, 12, 13,
97     13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15,
98     15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
99     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
100     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
101     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
102     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
103     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
104     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
105     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
106     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
107     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
108     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
109     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
110     15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
111     13, 13, 12, 12, 12, 11, 11, 11, 10,  9,  9,  8,  6,  4,  3,  3,
112 };
113
114 static const uint8_t l_y_ybr[256] = {
115      3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,
116      8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
117     10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
118     12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14,
119     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
120     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16,
121     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
122     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
123     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
124     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
125     16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
126     15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
127     14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12,
128     12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11,
129     11, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  8,  8,
130      8,  8,  8,  8,  7,  7,  7,  7,  6,  6,  6,  6,  5,  4,  4,  3,
131 };
132
133 static const uint8_t l_u_ybr[256] = {
134      1,  2,  4,  6,  9, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14,
135     14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
136     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
137     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
138     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
139     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
140     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
141     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
142     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
143     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
144     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
145     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
146     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
147     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
148     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15,
149     14, 14, 14, 14, 14, 13, 13, 13, 12, 12, 11, 11, 10,  8,  5,  3,
150 };
151
152 static const uint8_t l_y_ybyr[256] = {
153      3,  3,  4,  4,  5,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,
154      8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10,
155     10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
156     12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13,
157     13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
158     14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
159     15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
160     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
161     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
162     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
163     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14,
164     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
165     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12,
166     12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10,
167     10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,
168      8,  8,  8,  7,  7,  7,  7,  7,  6,  6,  6,  5,  5,  4,  4,  4,
169 };
170
171 static const uint8_t l_u_ybyr[256] = {
172      1,  2,  4,  6,  8,  9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14,
173     14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16,
174     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
175     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
176     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
177     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
178     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
179     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
180     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
181     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
182     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
183     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
184     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
185     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
186     16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14,
187     14, 14, 13, 13, 13, 12, 12, 11, 11, 10, 10,  9,  8,  7,  6,  3,
188 };
189
190 static const uint8_t l_y_byry[256] = {
191      3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,
192      8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
193     10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
194     12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,
195     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
196     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16,
197     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
198     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
199     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
200     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
201     16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
202     15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
203     14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12,
204     12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11,
205     11, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  8,  8,
206      8,  8,  8,  8,  7,  7,  7,  7,  6,  6,  6,  6,  5,  4,  4,  3,
207 };
208
209 static const uint8_t l_u_byry[256] = {
210      1,  2,  4,  6,  8,  9,  9, 10, 11, 11, 12, 12, 13, 13, 13, 14,
211     14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16,
212     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
213     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
214     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
215     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
216     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
217     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
218     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
219     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
220     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
221     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
222     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
223     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
224     16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14,
225     14, 14, 14, 13, 13, 12, 12, 12, 11, 11, 10,  9,  8,  7,  6,  3,
226 };
227
228 static const uint8_t l_y_ybr10[1024] = {
229      4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  7,  7,  7,
230      7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
231      8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
232      9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
233     10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
234     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
235     11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
236     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
237     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
238     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
239     13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
240     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
241     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
242     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
243     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
244     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
245     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
246     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
247     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
248     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
249     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
250     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
251     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
252     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
253     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
254     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
255     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
256     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
257     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
258     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
259     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
260     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
261     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
262     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
263     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
264     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
265     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
266     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
267     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
268     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
269     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
270     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
271     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
272     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
273     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
274     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
275     16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15,
276     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
277     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
278     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
279     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
280     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
281     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
282     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
283     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
284     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
285     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
286     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
287     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
288     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10,
289     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
290      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
291      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,
292      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,
293 };
294
295 static const uint8_t l_u_ybr10[1024] = {
296      2,  3,  3,  4,  5,  5,  6,  7,  8,  9,  9, 10, 10, 10, 11, 11,
297     12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
298     14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
299     15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16,
300     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
301     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
302     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
303     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
304     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
305     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
306     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
307     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
308     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
309     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
310     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
311     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
312     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
313     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
314     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
315     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
316     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
317     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
318     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
319     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
320     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
321     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
322     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
323     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
324     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
325     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
326     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
327     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
328     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
329     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
330     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
331     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
332     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
333     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
334     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
335     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
336     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
337     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
338     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
339     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
340     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
341     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
342     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
343     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
344     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
345     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
346     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
347     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
348     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
349     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
350     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
351     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
352     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
353     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
354     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
355     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
356     16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15,
357     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
358     14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12,
359     12, 11, 11, 11, 10, 10,  9,  9,  8,  8,  7,  6,  5,  4,  4,  3,
360 };
361
362 static const uint8_t l_r_rgbx[1024] = {
363      4,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,
364      7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
365      8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
366      9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10,
367     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
368     10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
369     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12,
370     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
371     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
372     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
373     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
374     13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
375     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
376     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
377     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15,
378     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
379     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
380     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
381     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
382     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
383     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
384     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
385     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
386     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
387     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
388     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
389     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
390     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
391     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
392     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
393     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
394     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
395     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
396     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
397     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
398     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
399     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
400     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
401     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
402     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
403     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
404     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
405     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
406     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
407     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15,
408     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
409     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
410     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
411     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
412     15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14,
413     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
414     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
415     14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13,
416     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
417     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
418     13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
419     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
420     12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
421     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
422     11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
423     10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,
424      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,
425      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,  7,  7,
426      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,
427 };
428
429 static const uint8_t l_g_rgbx[1024] = {
430      3,  4,  4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,
431      8,  8,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12,
432     12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
433     13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
434     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
435     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
436     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
437     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
438     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
439     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
440     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
441     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
442     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
443     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
444     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
445     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
446     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
447     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
448     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
449     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
450     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
451     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
452     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
453     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
454     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
455     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
456     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
457     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
458     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
459     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
460     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
461     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
462     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
463     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
464     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
465     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
466     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
467     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
468     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
469     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
470     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
471     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
472     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
473     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
474     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
475     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
476     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
477     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
478     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
479     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
480     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
481     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
482     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
483     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
484     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
485     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
486     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
487     16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
488     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
489     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
490     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
491     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12,
492     12, 12, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10,  9,  9,  9,  9,
493      8,  7,  7,  7,  6,  6,  6,  6,  6,  5,  5,  5,  5,  4,  4,  4,
494 };
495
496 static const uint8_t l_y_yry10[1024] = {
497      4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  7,  7,  7,
498      7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
499      8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
500      9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
501     10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
502     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
503     11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
504     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
505     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
506     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
507     13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
508     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
509     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
510     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
511     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
512     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
513     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
514     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
515     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
516     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
517     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
518     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
519     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
520     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
521     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
522     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
523     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
524     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
525     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
526     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
527     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
528     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
529     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
530     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
531     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
532     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
533     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
534     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
535     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
536     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
537     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
538     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
539     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
540     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
541     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
542     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
543     16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15,
544     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
545     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
546     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
547     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
548     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
549     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
550     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
551     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
552     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
553     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
554     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
555     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
556     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10,
557     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
558      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
559      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,
560      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,
561 };
562
563 static const uint8_t l_u_yry10[1024] = {
564      2,  3,  3,  4,  5,  6,  7,  7,  8,  8,  8,  9,  9, 10, 10, 10,
565     10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
566     13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
567     14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
568     15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
569     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
570     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
571     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
572     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
573     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
574     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
575     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
576     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
577     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
578     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
579     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
580     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
581     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
582     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
583     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
584     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
585     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
586     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
587     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
588     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
589     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
590     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
591     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
592     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
593     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
594     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
595     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
596     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
597     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
598     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
599     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
600     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
601     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
602     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
603     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
604     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
605     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
606     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
607     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
608     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
609     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
610     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
611     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
612     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
613     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
614     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
615     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
616     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
617     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
618     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
619     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
620     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
621     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
622     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
623     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
624     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
625     15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
626     13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11,
627     10, 10, 10, 10,  9,  9,  9,  8,  8,  7,  7,  6,  5,  4,  4,  3,
628 };
629
630 static const uint8_t l_y_ybri[256] = {
631      3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,
632      8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
633     10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
634     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
635     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
636     14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
637     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
638     15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
639     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
640     16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
641     15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
642     14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
643     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
644     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10,
645     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
646      8,  8,  8,  7,  7,  7,  7,  7,  6,  6,  6,  5,  5,  5,  4,  3,
647 };
648
649 static const uint8_t l_u_ybri[256] = {
650      1,  3,  5,  6,  8,  8,  9, 10, 10, 11, 11, 12, 12, 13, 13, 13,
651     14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
652     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
653     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
654     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
655     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
656     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
657     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
658     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
659     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
660     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
661     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
662     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
663     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
664     16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14,
665     14, 13, 13, 13, 12, 12, 11, 11, 10, 10,  9,  8,  8,  6,  5,  2,
666 };
667
668 static const uint8_t l_y_byryi[256] = {
669      3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  7,  7,  7,  7,  8,  8,
670      8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10,
671     10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
672     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
673     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
674     14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,
675     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
676     15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
677     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
678     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
679     15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
680     14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
681     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
682     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10,
683     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
684      8,  8,  8,  7,  7,  7,  7,  7,  7,  6,  6,  6,  5,  4,  4,  3,
685 };
686
687 static const uint8_t l_u_byryi[256] = {
688      1,  3,  4,  6,  6,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11,
689     12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15,
690     15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
691     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
692     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
693     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
694     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
695     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
696     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
697     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
698     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
699     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
700     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
701     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
702     15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12,
703     12, 11, 11, 11, 10, 10, 10,  9,  9,  8,  8,  7,  7,  5,  4,  3,
704 };
705
706 static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
707 {
708     SheerVideoContext *s = avctx->priv_data;
709     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
710     int x, y;
711
712     dst_a = (uint16_t *)p->data[3];
713     dst_y = (uint16_t *)p->data[0];
714     dst_u = (uint16_t *)p->data[1];
715     dst_v = (uint16_t *)p->data[2];
716
717     if (get_bits1(gb)) {
718         for (x = 0; x < avctx->width; x++) {
719             dst_a[x] = get_bits(gb, 10);
720             dst_y[x] = get_bits(gb, 10);
721             dst_u[x] = get_bits(gb, 10);
722             dst_v[x] = get_bits(gb, 10);
723         }
724     } else {
725         int pred[4] = { 502, 512, 512, 502 };
726
727         for (x = 0; x < avctx->width; x++) {
728             int y, u, v, a;
729
730             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
731             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
732             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
733             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
734
735             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
736             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
737             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
738             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
739         }
740     }
741
742     dst_y += p->linesize[0] / 2;
743     dst_u += p->linesize[1] / 2;
744     dst_v += p->linesize[2] / 2;
745     dst_a += p->linesize[3] / 2;
746
747     for (y = 1; y < avctx->height; y++) {
748         if (get_bits1(gb)) {
749             for (x = 0; x < avctx->width; x++) {
750                 dst_a[x] = get_bits(gb, 10);
751                 dst_y[x] = get_bits(gb, 10);
752                 dst_u[x] = get_bits(gb, 10);
753                 dst_v[x] = get_bits(gb, 10);
754             }
755         } else {
756             int pred_TL[4], pred_L[4], pred_T[4];
757             int y, u, v, a;
758
759             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
760             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
761             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
762             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
763
764             for (x = 0; x < avctx->width; x++) {
765                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
766                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
767                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
768                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
769
770                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
771                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
772                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
773                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
774
775                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
776                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
777                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
778                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
779
780                 pred_TL[0] = pred_T[0];
781                 pred_TL[1] = pred_T[1];
782                 pred_TL[2] = pred_T[2];
783                 pred_TL[3] = pred_T[3];
784             }
785         }
786
787         dst_y += p->linesize[0] / 2;
788         dst_u += p->linesize[1] / 2;
789         dst_v += p->linesize[2] / 2;
790         dst_a += p->linesize[3] / 2;
791     }
792 }
793
794 static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
795 {
796     SheerVideoContext *s = avctx->priv_data;
797     uint16_t *dst_y, *dst_u, *dst_v;
798     int x, y;
799
800     dst_y = (uint16_t *)p->data[0];
801     dst_u = (uint16_t *)p->data[1];
802     dst_v = (uint16_t *)p->data[2];
803
804     if (get_bits1(gb)) {
805         for (x = 0; x < avctx->width; x++) {
806             dst_y[x] = get_bits(gb, 10);
807             dst_u[x] = get_bits(gb, 10);
808             dst_v[x] = get_bits(gb, 10);
809         }
810     } else {
811         int pred[4] = { 502, 512, 512, 512 };
812
813         for (x = 0; x < avctx->width; x++) {
814             int y, u, v;
815
816             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
817             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
818             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
819
820             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
821             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
822             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
823         }
824     }
825
826     dst_y += p->linesize[0] / 2;
827     dst_u += p->linesize[1] / 2;
828     dst_v += p->linesize[2] / 2;
829
830     for (y = 1; y < avctx->height; y++) {
831         if (get_bits1(gb)) {
832             for (x = 0; x < avctx->width; x++) {
833                 dst_y[x] = get_bits(gb, 10);
834                 dst_u[x] = get_bits(gb, 10);
835                 dst_v[x] = get_bits(gb, 10);
836             }
837         } else {
838             int pred_TL[4], pred_L[4], pred_T[4];
839             int y, u, v;
840
841             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
842             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
843             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
844
845             for (x = 0; x < avctx->width; x++) {
846                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
847                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
848                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
849
850                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
851                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
852                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
853
854                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
855                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
856                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
857
858                 pred_TL[0] = pred_T[0];
859                 pred_TL[1] = pred_T[1];
860                 pred_TL[2] = pred_T[2];
861             }
862         }
863
864         dst_y += p->linesize[0] / 2;
865         dst_u += p->linesize[1] / 2;
866         dst_v += p->linesize[2] / 2;
867     }
868 }
869
870 static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
871 {
872     SheerVideoContext *s = avctx->priv_data;
873     uint16_t *dst_y, *dst_u, *dst_v;
874     int x, y;
875
876     dst_y = (uint16_t *)p->data[0];
877     dst_u = (uint16_t *)p->data[1];
878     dst_v = (uint16_t *)p->data[2];
879
880     if (get_bits1(gb)) {
881         for (x = 0; x < avctx->width; x += 2) {
882             dst_y[x    ] = get_bits(gb, 10);
883             dst_u[x / 2] = get_bits(gb, 10);
884             dst_y[x + 1] = get_bits(gb, 10);
885             dst_v[x / 2] = get_bits(gb, 10);
886         }
887     } else {
888         int pred[4] = { 502, 512, 512, 0 };
889
890         for (x = 0; x < avctx->width; x += 2) {
891             int y1, y2, u, v;
892
893             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
894             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
895             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
896             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
897
898             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
899             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
900             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
901             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
902         }
903     }
904
905     dst_y += p->linesize[0] / 2;
906     dst_u += p->linesize[1] / 2;
907     dst_v += p->linesize[2] / 2;
908
909     for (y = 1; y < avctx->height; y++) {
910         if (get_bits1(gb)) {
911             for (x = 0; x < avctx->width; x += 2) {
912                 dst_y[x    ] = get_bits(gb, 10);
913                 dst_u[x / 2] = get_bits(gb, 10);
914                 dst_y[x + 1] = get_bits(gb, 10);
915                 dst_v[x / 2] = get_bits(gb, 10);
916             }
917         } else {
918             int pred_TL[6], pred_L[6], pred_T[6];
919             int y1, y2, u, v;
920
921             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
922             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
923             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
924
925             for (x = 0; x < avctx->width; x += 2) {
926                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
927                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
928                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
929                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
930
931                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
932                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
933                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
934                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
935
936                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
937                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
938                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
939                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
940
941                 pred_TL[0] = pred_T[3];
942                 pred_TL[1] = pred_T[1];
943                 pred_TL[2] = pred_T[2];
944             }
945         }
946
947         dst_y += p->linesize[0] / 2;
948         dst_u += p->linesize[1] / 2;
949         dst_v += p->linesize[2] / 2;
950     }
951 }
952
953 static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
954 {
955     SheerVideoContext *s = avctx->priv_data;
956     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
957     int x, y;
958
959     dst_y = (uint16_t *)p->data[0];
960     dst_u = (uint16_t *)p->data[1];
961     dst_v = (uint16_t *)p->data[2];
962     dst_a = (uint16_t *)p->data[3];
963
964     if (get_bits1(gb)) {
965         for (x = 0; x < avctx->width; x += 2) {
966             dst_a[x    ] = get_bits(gb, 10);
967             dst_y[x    ] = get_bits(gb, 10);
968             dst_u[x / 2] = get_bits(gb, 10);
969             dst_a[x + 1] = get_bits(gb, 10);
970             dst_y[x + 1] = get_bits(gb, 10);
971             dst_v[x / 2] = get_bits(gb, 10);
972         }
973     } else {
974         int pred[4] = { 502, 512, 512, 502 };
975
976         for (x = 0; x < avctx->width; x += 2) {
977             int y1, y2, u, v, a1, a2;
978
979             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
980             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
981             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
982             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
983             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
984             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
985
986             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
987             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
988             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
989             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
990             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
991             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
992         }
993     }
994
995     dst_y += p->linesize[0] / 2;
996     dst_u += p->linesize[1] / 2;
997     dst_v += p->linesize[2] / 2;
998     dst_a += p->linesize[3] / 2;
999
1000     for (y = 1; y < avctx->height; y++) {
1001         if (get_bits1(gb)) {
1002             for (x = 0; x < avctx->width; x += 2) {
1003                 dst_a[x    ] = get_bits(gb, 10);
1004                 dst_y[x    ] = get_bits(gb, 10);
1005                 dst_u[x / 2] = get_bits(gb, 10);
1006                 dst_a[x + 1] = get_bits(gb, 10);
1007                 dst_y[x + 1] = get_bits(gb, 10);
1008                 dst_v[x / 2] = get_bits(gb, 10);
1009             }
1010         } else {
1011             int pred_TL[6], pred_L[6], pred_T[6];
1012             int y1, y2, u, v, a1, a2;
1013
1014             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1015             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1016             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1017             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
1018
1019             for (x = 0; x < avctx->width; x += 2) {
1020                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1021                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
1022                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
1023                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
1024                 pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
1025                 pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
1026
1027                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1028                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1029                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1030                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1031                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1032                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1033
1034                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1035                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
1036                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
1037                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
1038                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
1039                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
1040
1041                 pred_TL[0] = pred_T[3];
1042                 pred_TL[1] = pred_T[1];
1043                 pred_TL[2] = pred_T[2];
1044                 pred_TL[4] = pred_T[5];
1045             }
1046         }
1047
1048         dst_y += p->linesize[0] / 2;
1049         dst_u += p->linesize[1] / 2;
1050         dst_v += p->linesize[2] / 2;
1051         dst_a += p->linesize[3] / 2;
1052     }
1053 }
1054
1055 static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1056 {
1057     SheerVideoContext *s = avctx->priv_data;
1058     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1059     int x, y;
1060
1061     dst_y = p->data[0];
1062     dst_u = p->data[1];
1063     dst_v = p->data[2];
1064     dst_a = p->data[3];
1065
1066     for (y = 0; y < avctx->height; y += 1) {
1067         if (get_bits1(gb)) {
1068             for (x = 0; x < avctx->width; x += 2) {
1069                 dst_a[x    ] = get_bits(gb, 8);
1070                 dst_y[x    ] = get_bits(gb, 8);
1071                 dst_u[x / 2] = get_bits(gb, 8);
1072                 dst_a[x + 1] = get_bits(gb, 8);
1073                 dst_y[x + 1] = get_bits(gb, 8);
1074                 dst_v[x / 2] = get_bits(gb, 8);
1075             }
1076         } else {
1077             int pred[4] = { 125, -128, -128, 125 };
1078
1079             for (x = 0; x < avctx->width; x += 2) {
1080                 int y1, y2, u, v, a1, a2;
1081
1082                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1083                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1084                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1085                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1086                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1087                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1088
1089                 dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1090                 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1091                 dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1092                 dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1093                 dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1094                 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1095             }
1096         }
1097
1098         dst_y += p->linesize[0];
1099         dst_u += p->linesize[1];
1100         dst_v += p->linesize[2];
1101         dst_a += p->linesize[3];
1102     }
1103 }
1104
1105 static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1106 {
1107     SheerVideoContext *s = avctx->priv_data;
1108     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1109     int x, y;
1110
1111     dst_y = p->data[0];
1112     dst_u = p->data[1];
1113     dst_v = p->data[2];
1114     dst_a = p->data[3];
1115
1116     if (get_bits1(gb)) {
1117         for (x = 0; x < avctx->width; x += 2) {
1118             dst_a[x    ] = get_bits(gb, 8);
1119             dst_y[x    ] = get_bits(gb, 8);
1120             dst_u[x / 2] = get_bits(gb, 8);
1121             dst_a[x + 1] = get_bits(gb, 8);
1122             dst_y[x + 1] = get_bits(gb, 8);
1123             dst_v[x / 2] = get_bits(gb, 8);
1124         }
1125     } else {
1126         int pred[4] = { 125, -128, -128, 125 };
1127
1128         for (x = 0; x < avctx->width; x += 2) {
1129             int y1, y2, u, v, a1, a2;
1130
1131             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1132             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1133             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1134             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1135             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1136             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1137
1138             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1139             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1140             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1141             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1142             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1143             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1144         }
1145     }
1146
1147     dst_y += p->linesize[0];
1148     dst_u += p->linesize[1];
1149     dst_v += p->linesize[2];
1150     dst_a += p->linesize[3];
1151
1152     for (y = 1; y < avctx->height; y++) {
1153         if (get_bits1(gb)) {
1154             for (x = 0; x < avctx->width; x += 2) {
1155                 dst_a[x    ] = get_bits(gb, 8);
1156                 dst_y[x    ] = get_bits(gb, 8);
1157                 dst_u[x / 2] = get_bits(gb, 8);
1158                 dst_a[x + 1] = get_bits(gb, 8);
1159                 dst_y[x + 1] = get_bits(gb, 8);
1160                 dst_v[x / 2] = get_bits(gb, 8);
1161             }
1162         } else {
1163             int pred_TL[6], pred_L[6], pred_T[6];
1164             int y1, y2, u, v, a1, a2;
1165
1166             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1167             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1168             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1169             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
1170
1171             for (x = 0; x < avctx->width; x += 2) {
1172                 pred_T[0] = dst_y[-p->linesize[0] + x];
1173                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1174                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1175                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1176                 pred_T[4] = dst_a[-p->linesize[3] + x];
1177                 pred_T[5] = dst_a[-p->linesize[3] + x + 1];
1178
1179                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1180                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1181                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1182                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1183                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1184                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1185
1186                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1187                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1188                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1189                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1190                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
1191                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
1192
1193                 pred_TL[0] = pred_T[3];
1194                 pred_TL[1] = pred_T[1];
1195                 pred_TL[2] = pred_T[2];
1196                 pred_TL[4] = pred_T[5];
1197             }
1198         }
1199
1200         dst_y += p->linesize[0];
1201         dst_u += p->linesize[1];
1202         dst_v += p->linesize[2];
1203         dst_a += p->linesize[3];
1204     }
1205 }
1206
1207 static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1208 {
1209     SheerVideoContext *s = avctx->priv_data;
1210     uint8_t *dst_y, *dst_u, *dst_v;
1211     int x, y;
1212
1213     dst_y = p->data[0];
1214     dst_u = p->data[1];
1215     dst_v = p->data[2];
1216
1217     if (get_bits1(gb)) {
1218         for (x = 0; x < avctx->width; x += 2) {
1219             dst_y[x    ] = get_bits(gb, 8);
1220             dst_u[x / 2] = get_bits(gb, 8);
1221             dst_y[x + 1] = get_bits(gb, 8);
1222             dst_v[x / 2] = get_bits(gb, 8);
1223         }
1224     } else {
1225         int pred[4] = { -125, 128, 128, 0 };
1226
1227         for (x = 0; x < avctx->width; x += 2) {
1228             int y1, y2, u, v;
1229
1230             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1231             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1232             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1233             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1234
1235             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1236             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1237             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1238             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1239         }
1240     }
1241
1242     dst_y += p->linesize[0];
1243     dst_u += p->linesize[1];
1244     dst_v += p->linesize[2];
1245
1246     for (y = 1; y < avctx->height; y++) {
1247         if (get_bits1(gb)) {
1248             for (x = 0; x < avctx->width; x += 2) {
1249                 dst_y[x    ] = get_bits(gb, 8);
1250                 dst_u[x / 2] = get_bits(gb, 8);
1251                 dst_y[x + 1] = get_bits(gb, 8);
1252                 dst_v[x / 2] = get_bits(gb, 8);
1253             }
1254         } else {
1255             int pred_TL[4], pred_L[4], pred_T[4];
1256             int y1, y2, u, v;
1257
1258             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1259             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1260             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1261
1262             for (x = 0; x < avctx->width; x += 2) {
1263                 pred_T[0] = dst_y[-p->linesize[0] + x];
1264                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1265                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1266                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1267
1268                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1269                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1270                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1271                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1272
1273                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1274                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1275                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1276                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1277
1278                 pred_TL[0] = pred_T[3];
1279                 pred_TL[1] = pred_T[1];
1280                 pred_TL[2] = pred_T[2];
1281             }
1282         }
1283
1284         dst_y += p->linesize[0];
1285         dst_u += p->linesize[1];
1286         dst_v += p->linesize[2];
1287     }
1288 }
1289
1290 static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1291 {
1292     SheerVideoContext *s = avctx->priv_data;
1293     uint8_t *dst_y, *dst_u, *dst_v;
1294     int x, y;
1295
1296     dst_y = p->data[0];
1297     dst_u = p->data[1];
1298     dst_v = p->data[2];
1299
1300     if (get_bits1(gb)) {
1301         for (x = 0; x < avctx->width; x += 2) {
1302             dst_y[x    ] = get_bits(gb, 8);
1303             dst_u[x / 2] = get_bits(gb, 8);
1304             dst_y[x + 1] = get_bits(gb, 8);
1305             dst_v[x / 2] = get_bits(gb, 8);
1306         }
1307     } else {
1308         int pred[4] = { 125, -128, -128, 0 };
1309
1310         for (x = 0; x < avctx->width; x += 2) {
1311             int y1, y2, u, v;
1312
1313             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1314             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1315             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1316             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1317
1318             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1319             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1320             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1321             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1322         }
1323     }
1324
1325     dst_y += p->linesize[0];
1326     dst_u += p->linesize[1];
1327     dst_v += p->linesize[2];
1328
1329     for (y = 1; y < avctx->height; y++) {
1330         if (get_bits1(gb)) {
1331             for (x = 0; x < avctx->width; x += 2) {
1332                 dst_y[x    ] = get_bits(gb, 8);
1333                 dst_u[x / 2] = get_bits(gb, 8);
1334                 dst_y[x + 1] = get_bits(gb, 8);
1335                 dst_v[x / 2] = get_bits(gb, 8);
1336             }
1337         } else {
1338             int pred_L[4];
1339             int y1, y2, u, v;
1340
1341             pred_L[0] = dst_y[-p->linesize[0]];
1342             pred_L[1] = dst_u[-p->linesize[1]];
1343             pred_L[2] = dst_v[-p->linesize[2]];
1344
1345             for (x = 0; x < avctx->width; x += 2) {
1346                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1347                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1348                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1349                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1350
1351                 dst_y[x    ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
1352                 dst_u[x / 2] = pred_L[1] = (u  + pred_L[1]) & 0xff;
1353                 dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
1354                 dst_v[x / 2] = pred_L[2] = (v +  pred_L[2]) & 0xff;
1355             }
1356         }
1357
1358         dst_y += p->linesize[0];
1359         dst_u += p->linesize[1];
1360         dst_v += p->linesize[2];
1361     }
1362 }
1363
1364 static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1365 {
1366     SheerVideoContext *s = avctx->priv_data;
1367     uint8_t *dst_y, *dst_u, *dst_v;
1368     int x, y;
1369
1370     dst_y = p->data[0];
1371     dst_u = p->data[1];
1372     dst_v = p->data[2];
1373
1374     if (get_bits1(gb)) {
1375         for (x = 0; x < avctx->width; x += 2) {
1376             dst_y[x    ] = get_bits(gb, 8);
1377             dst_u[x / 2] = get_bits(gb, 8);
1378             dst_y[x + 1] = get_bits(gb, 8);
1379             dst_v[x / 2] = get_bits(gb, 8);
1380         }
1381     } else {
1382         int pred[4] = { 125, -128, -128, 0 };
1383
1384         for (x = 0; x < avctx->width; x += 2) {
1385             int y1, y2, u, v;
1386
1387             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1388             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1389             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1390             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1391
1392             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1393             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1394             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1395             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1396         }
1397     }
1398
1399     dst_y += p->linesize[0];
1400     dst_u += p->linesize[1];
1401     dst_v += p->linesize[2];
1402
1403     for (y = 1; y < avctx->height; y++) {
1404         if (get_bits1(gb)) {
1405             for (x = 0; x < avctx->width; x += 2) {
1406                 dst_y[x    ] = get_bits(gb, 8);
1407                 dst_u[x / 2] = get_bits(gb, 8);
1408                 dst_y[x + 1] = get_bits(gb, 8);
1409                 dst_v[x / 2] = get_bits(gb, 8);
1410             }
1411         } else {
1412             int pred_TL[4], pred_L[4], pred_T[4];
1413             int y1, y2, u, v;
1414
1415             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1416             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1417             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1418
1419             for (x = 0; x < avctx->width; x += 2) {
1420                 pred_T[0] = dst_y[-p->linesize[0] + x];
1421                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1422                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1423                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1424
1425                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1426                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1427                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1428                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1429
1430                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1431                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1432                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1433                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1434
1435                 pred_TL[0] = pred_T[3];
1436                 pred_TL[1] = pred_T[1];
1437                 pred_TL[2] = pred_T[2];
1438             }
1439         }
1440
1441         dst_y += p->linesize[0];
1442         dst_u += p->linesize[1];
1443         dst_v += p->linesize[2];
1444     }
1445 }
1446
1447 static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1448 {
1449     SheerVideoContext *s = avctx->priv_data;
1450     uint8_t *dst_y, *dst_u, *dst_v;
1451     int x, y;
1452
1453     dst_y = p->data[0];
1454     dst_u = p->data[1];
1455     dst_v = p->data[2];
1456
1457     if (get_bits1(gb)) {
1458         for (x = 0; x < avctx->width; x++) {
1459             dst_y[x] = get_bits(gb, 8);
1460             dst_u[x] = get_bits(gb, 8);
1461             dst_v[x] = get_bits(gb, 8);
1462         }
1463     } else {
1464         int pred[4] = { 125, -128, -128, -128 };
1465
1466         for (x = 0; x < avctx->width; x++) {
1467             int y, u, v;
1468
1469             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1470             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1471             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1472
1473             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1474             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1475             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1476         }
1477     }
1478
1479     dst_y += p->linesize[0];
1480     dst_u += p->linesize[1];
1481     dst_v += p->linesize[2];
1482
1483     for (y = 1; y < avctx->height; y++) {
1484         if (get_bits1(gb)) {
1485             for (x = 0; x < avctx->width; x++) {
1486                 dst_y[x] = get_bits(gb, 8);
1487                 dst_u[x] = get_bits(gb, 8);
1488                 dst_v[x] = get_bits(gb, 8);
1489             }
1490         } else {
1491             int pred_L[4];
1492             int y, u, v;
1493
1494             pred_L[0] = dst_y[-p->linesize[0]];
1495             pred_L[1] = dst_u[-p->linesize[1]];
1496             pred_L[2] = dst_v[-p->linesize[2]];
1497
1498             for (x = 0; x < avctx->width; x++) {
1499                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1500                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1501                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1502
1503                 dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1504                 dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1505                 dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1506             }
1507         }
1508
1509         dst_y += p->linesize[0];
1510         dst_u += p->linesize[1];
1511         dst_v += p->linesize[2];
1512     }
1513 }
1514
1515 static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1516 {
1517     SheerVideoContext *s = avctx->priv_data;
1518     uint8_t *dst_y, *dst_u, *dst_v;
1519     int x, y;
1520
1521     dst_y = p->data[0];
1522     dst_u = p->data[1];
1523     dst_v = p->data[2];
1524
1525     if (get_bits1(gb)) {
1526         for (x = 0; x < avctx->width; x++) {
1527             dst_y[x] = get_bits(gb, 8);
1528             dst_u[x] = get_bits(gb, 8);
1529             dst_v[x] = get_bits(gb, 8);
1530         }
1531     } else {
1532         int pred[4] = { 125, -128, -128, -128 };
1533
1534         for (x = 0; x < avctx->width; x++) {
1535             int y, u, v;
1536
1537             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1538             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1539             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1540
1541             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1542             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1543             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1544         }
1545     }
1546
1547     dst_y += p->linesize[0];
1548     dst_u += p->linesize[1];
1549     dst_v += p->linesize[2];
1550
1551     for (y = 1; y < avctx->height; y++) {
1552         if (get_bits1(gb)) {
1553             for (x = 0; x < avctx->width; x++) {
1554                 dst_y[x] = get_bits(gb, 8);
1555                 dst_u[x] = get_bits(gb, 8);
1556                 dst_v[x] = get_bits(gb, 8);
1557             }
1558         } else {
1559             int pred_TL[4], pred_L[4], pred_T[4];
1560             int y, u, v;
1561
1562             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1563             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1564             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1565
1566             for (x = 0; x < avctx->width; x++) {
1567                 pred_T[0] = dst_y[-p->linesize[0] + x];
1568                 pred_T[1] = dst_u[-p->linesize[1] + x];
1569                 pred_T[2] = dst_v[-p->linesize[2] + x];
1570
1571                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1572                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1573                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1574
1575                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1576                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1577                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1578
1579                 pred_TL[0] = pred_T[0];
1580                 pred_TL[1] = pred_T[1];
1581                 pred_TL[2] = pred_T[2];
1582             }
1583         }
1584
1585         dst_y += p->linesize[0];
1586         dst_u += p->linesize[1];
1587         dst_v += p->linesize[2];
1588     }
1589 }
1590
1591 static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1592 {
1593     SheerVideoContext *s = avctx->priv_data;
1594     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1595     int x, y;
1596
1597     dst_a = p->data[3];
1598     dst_y = p->data[0];
1599     dst_u = p->data[1];
1600     dst_v = p->data[2];
1601
1602     if (get_bits1(gb)) {
1603         for (x = 0; x < avctx->width; x++) {
1604             dst_a[x] = get_bits(gb, 8);
1605             dst_y[x] = get_bits(gb, 8);
1606             dst_u[x] = get_bits(gb, 8);
1607             dst_v[x] = get_bits(gb, 8);
1608         }
1609     } else {
1610         int pred[4] = { 125, 125, -128, -128 };
1611
1612         for (x = 0; x < avctx->width; x++) {
1613             int a, y, u, v;
1614
1615             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1616             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1617             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1618             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1619
1620             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1621             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1622             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1623             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1624         }
1625     }
1626
1627     dst_a += p->linesize[3];
1628     dst_y += p->linesize[0];
1629     dst_u += p->linesize[1];
1630     dst_v += p->linesize[2];
1631
1632     for (y = 1; y < avctx->height; y++) {
1633         if (get_bits1(gb)) {
1634             for (x = 0; x < avctx->width; x++) {
1635                 dst_a[x] = get_bits(gb, 8);
1636                 dst_y[x] = get_bits(gb, 8);
1637                 dst_u[x] = get_bits(gb, 8);
1638                 dst_v[x] = get_bits(gb, 8);
1639             }
1640         } else {
1641             int pred_L[4];
1642             int a, y, u, v;
1643
1644             pred_L[0] = dst_a[-p->linesize[3]];
1645             pred_L[1] = dst_y[-p->linesize[0]];
1646             pred_L[2] = dst_u[-p->linesize[1]];
1647             pred_L[3] = dst_v[-p->linesize[2]];
1648
1649             for (x = 0; x < avctx->width; x++) {
1650                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1651                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1652                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1653                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1654
1655                 dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
1656                 dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
1657                 dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
1658                 dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
1659             }
1660         }
1661
1662         dst_a += p->linesize[3];
1663         dst_y += p->linesize[0];
1664         dst_u += p->linesize[1];
1665         dst_v += p->linesize[2];
1666     }
1667 }
1668
1669 static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1670 {
1671     SheerVideoContext *s = avctx->priv_data;
1672     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1673     int x, y;
1674
1675     dst_a = p->data[3];
1676     dst_y = p->data[0];
1677     dst_u = p->data[1];
1678     dst_v = p->data[2];
1679
1680     if (get_bits1(gb)) {
1681         for (x = 0; x < avctx->width; x++) {
1682             dst_a[x] = get_bits(gb, 8);
1683             dst_y[x] = get_bits(gb, 8);
1684             dst_u[x] = get_bits(gb, 8);
1685             dst_v[x] = get_bits(gb, 8);
1686         }
1687     } else {
1688         int pred[4] = { 125, 125, -128, -128 };
1689
1690         for (x = 0; x < avctx->width; x++) {
1691             int a, y, u, v;
1692
1693             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1694             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1695             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1696             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1697
1698             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1699             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1700             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1701             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1702         }
1703     }
1704
1705     dst_a += p->linesize[3];
1706     dst_y += p->linesize[0];
1707     dst_u += p->linesize[1];
1708     dst_v += p->linesize[2];
1709
1710     for (y = 1; y < avctx->height; y++) {
1711         if (get_bits1(gb)) {
1712             for (x = 0; x < avctx->width; x++) {
1713                 dst_a[x] = get_bits(gb, 8);
1714                 dst_y[x] = get_bits(gb, 8);
1715                 dst_u[x] = get_bits(gb, 8);
1716                 dst_v[x] = get_bits(gb, 8);
1717             }
1718         } else {
1719             int pred_TL[4], pred_L[4], pred_T[4];
1720             int a, y, u, v;
1721
1722             pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
1723             pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
1724             pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
1725             pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
1726
1727             for (x = 0; x < avctx->width; x++) {
1728                 pred_T[0] = dst_a[-p->linesize[3] + x];
1729                 pred_T[1] = dst_y[-p->linesize[0] + x];
1730                 pred_T[2] = dst_u[-p->linesize[1] + x];
1731                 pred_T[3] = dst_v[-p->linesize[2] + x];
1732
1733                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1734                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1735                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1736                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1737
1738                 dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1739                 dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1740                 dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1741                 dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1742
1743                 pred_TL[0] = pred_T[0];
1744                 pred_TL[1] = pred_T[1];
1745                 pred_TL[2] = pred_T[2];
1746                 pred_TL[3] = pred_T[3];
1747             }
1748         }
1749
1750         dst_a += p->linesize[3];
1751         dst_y += p->linesize[0];
1752         dst_u += p->linesize[1];
1753         dst_v += p->linesize[2];
1754     }
1755 }
1756
1757 static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1758 {
1759     SheerVideoContext *s = avctx->priv_data;
1760     uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1761     int x, y;
1762
1763     dst_r = (uint16_t *)p->data[2];
1764     dst_g = (uint16_t *)p->data[0];
1765     dst_b = (uint16_t *)p->data[1];
1766     dst_a = (uint16_t *)p->data[3];
1767
1768     if (get_bits1(gb)) {
1769         for (x = 0; x < avctx->width; x++) {
1770             dst_a[x] = get_bits(gb, 10);
1771             dst_r[x] = get_bits(gb, 10);
1772             dst_g[x] = get_bits(gb, 10);
1773             dst_b[x] = get_bits(gb, 10);
1774         }
1775     } else {
1776         int pred[4] = { 512, 512, 512, 0 };
1777
1778         for (x = 0; x < avctx->width; x++) {
1779             int r, g, b, a;
1780
1781             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1782             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1783             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1784             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1785
1786             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1787             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1788             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1789             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1790         }
1791     }
1792
1793     dst_r += p->linesize[2] / 2;
1794     dst_g += p->linesize[0] / 2;
1795     dst_b += p->linesize[1] / 2;
1796     dst_a += p->linesize[3] / 2;
1797
1798     for (y = 1; y < avctx->height; y++) {
1799         if (get_bits1(gb)) {
1800             for (x = 0; x < avctx->width; x++) {
1801                 dst_a[x] = get_bits(gb, 10);
1802                 dst_r[x] = get_bits(gb, 10);
1803                 dst_g[x] = get_bits(gb, 10);
1804                 dst_b[x] = get_bits(gb, 10);
1805             }
1806         } else {
1807             int pred_TL[4], pred_L[4], pred_T[4];
1808             int r, g, b, a;
1809
1810             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1811             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1812             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1813             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
1814
1815             for (x = 0; x < avctx->width; x++) {
1816                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1817                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1818                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1819                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
1820
1821                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1822                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1823                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1824                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1825
1826                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
1827                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1828                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1829                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1830
1831                 pred_TL[0] = pred_T[0];
1832                 pred_TL[1] = pred_T[1];
1833                 pred_TL[2] = pred_T[2];
1834                 pred_TL[3] = pred_T[3];
1835             }
1836         }
1837
1838         dst_r += p->linesize[2] / 2;
1839         dst_g += p->linesize[0] / 2;
1840         dst_b += p->linesize[1] / 2;
1841         dst_a += p->linesize[3] / 2;
1842     }
1843 }
1844
1845 static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1846 {
1847     SheerVideoContext *s = avctx->priv_data;
1848     uint16_t *dst_r, *dst_g, *dst_b;
1849     int x, y;
1850
1851     dst_r = (uint16_t *)p->data[2];
1852     dst_g = (uint16_t *)p->data[0];
1853     dst_b = (uint16_t *)p->data[1];
1854
1855     if (get_bits1(gb)) {
1856         for (x = 0; x < avctx->width; x++) {
1857             dst_r[x] = get_bits(gb, 10);
1858             dst_g[x] = get_bits(gb, 10);
1859             dst_b[x] = get_bits(gb, 10);
1860         }
1861     } else {
1862         int pred[4] = { 512, 512, 512, 0 };
1863
1864         for (x = 0; x < avctx->width; x++) {
1865             int r, g, b;
1866
1867             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1868             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1869             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1870
1871             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1872             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1873             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1874         }
1875     }
1876
1877     dst_r += p->linesize[2] / 2;
1878     dst_g += p->linesize[0] / 2;
1879     dst_b += p->linesize[1] / 2;
1880
1881     for (y = 1; y < avctx->height; y++) {
1882         if (get_bits1(gb)) {
1883             for (x = 0; x < avctx->width; x++) {
1884                 dst_r[x] = get_bits(gb, 10);
1885                 dst_g[x] = get_bits(gb, 10);
1886                 dst_b[x] = get_bits(gb, 10);
1887             }
1888         } else {
1889             int pred_TL[4], pred_L[4], pred_T[4];
1890             int r, g, b;
1891
1892             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1893             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1894             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1895
1896             for (x = 0; x < avctx->width; x++) {
1897                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1898                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1899                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1900
1901                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1902                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1903                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1904
1905                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1906                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1907                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1908
1909                 pred_TL[0] = pred_T[0];
1910                 pred_TL[1] = pred_T[1];
1911                 pred_TL[2] = pred_T[2];
1912             }
1913         }
1914
1915         dst_r += p->linesize[2] / 2;
1916         dst_g += p->linesize[0] / 2;
1917         dst_b += p->linesize[1] / 2;
1918     }
1919 }
1920
1921 static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1922 {
1923     SheerVideoContext *s = avctx->priv_data;
1924     uint8_t *dst;
1925     int x, y;
1926
1927     dst = p->data[0];
1928     if (get_bits1(gb)) {
1929         for (x = 0; x < avctx->width; x++) {
1930             dst[x * 4 + 0] = get_bits(gb, 8);
1931             dst[x * 4 + 1] = get_bits(gb, 8);
1932             dst[x * 4 + 2] = get_bits(gb, 8);
1933             dst[x * 4 + 3] = get_bits(gb, 8);
1934         }
1935     } else {
1936         int pred[4] = { -128, -128, -128, -128 };
1937
1938         for (x = 0; x < avctx->width; x++) {
1939             int a, r, g, b;
1940
1941             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1942             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1943             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1944             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1945
1946             dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1947             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1948             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1949             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1950         }
1951     }
1952
1953     dst += p->linesize[0];
1954     for (y = 1; y < avctx->height; y++) {
1955         if (get_bits1(gb)) {
1956             for (x = 0; x < avctx->width; x++) {
1957                 dst[x * 4 + 0] = get_bits(gb, 8);
1958                 dst[x * 4 + 1] = get_bits(gb, 8);
1959                 dst[x * 4 + 2] = get_bits(gb, 8);
1960                 dst[x * 4 + 3] = get_bits(gb, 8);
1961             }
1962         } else {
1963             int pred_L[4];
1964             int a, r, g, b;
1965
1966             pred_L[0] = dst[-p->linesize[0] + 0];
1967             pred_L[1] = dst[-p->linesize[0] + 1];
1968             pred_L[2] = dst[-p->linesize[0] + 2];
1969             pred_L[3] = dst[-p->linesize[0] + 3];
1970
1971             for (x = 0; x < avctx->width; x++) {
1972                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1973                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1974                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1975                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1976
1977                 dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
1978                 dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
1979                 dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
1980                 dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
1981             }
1982         }
1983         dst += p->linesize[0];
1984     }
1985 }
1986
1987 static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1988 {
1989     SheerVideoContext *s = avctx->priv_data;
1990     uint8_t *dst;
1991     int x, y;
1992
1993     dst = p->data[0];
1994     if (get_bits1(gb)) {
1995         for (x = 0; x < avctx->width; x++) {
1996             dst[x * 4 + 0] = get_bits(gb, 8);
1997             dst[x * 4 + 1] = get_bits(gb, 8);
1998             dst[x * 4 + 2] = get_bits(gb, 8);
1999             dst[x * 4 + 3] = get_bits(gb, 8);
2000         }
2001     } else {
2002         int pred[4] = { -128, -128, -128, -128 };
2003
2004         for (x = 0; x < avctx->width; x++) {
2005             int a, r, g, b;
2006
2007             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2008             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2009             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2010             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2011
2012             dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
2013             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
2014             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
2015             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
2016         }
2017     }
2018
2019     dst += p->linesize[0];
2020     for (y = 1; y < avctx->height; y++) {
2021         if (get_bits1(gb)) {
2022             for (x = 0; x < avctx->width; x++) {
2023                 dst[x * 4 + 0] = get_bits(gb, 8);
2024                 dst[x * 4 + 1] = get_bits(gb, 8);
2025                 dst[x * 4 + 2] = get_bits(gb, 8);
2026                 dst[x * 4 + 3] = get_bits(gb, 8);
2027             }
2028         } else {
2029             int pred_TL[4], pred_L[4], pred_T[4];
2030             int a, r, g, b;
2031
2032             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2033             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2034             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2035             pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
2036
2037             for (x = 0; x < avctx->width; x++) {
2038                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2039                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2040                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2041                 pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
2042
2043                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2044                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2045                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2046                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2047
2048                 dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2049                 dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2050                 dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2051                 dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
2052
2053                 pred_TL[0] = pred_T[0];
2054                 pred_TL[1] = pred_T[1];
2055                 pred_TL[2] = pred_T[2];
2056                 pred_TL[3] = pred_T[3];
2057             }
2058         }
2059         dst += p->linesize[0];
2060     }
2061 }
2062
2063 static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2064 {
2065     SheerVideoContext *s = avctx->priv_data;
2066     uint8_t *dst;
2067     int x, y;
2068
2069     dst = p->data[0];
2070     if (get_bits1(gb)) {
2071         for (x = 0; x < avctx->width; x++) {
2072             dst[x * 4 + 0] = get_bits(gb, 8);
2073             dst[x * 4 + 1] = get_bits(gb, 8);
2074             dst[x * 4 + 2] = get_bits(gb, 8);
2075         }
2076     } else {
2077         int pred[4] = { -128, -128, -128, -128 };
2078
2079         for (x = 0; x < avctx->width; x++) {
2080             int r, g, b;
2081
2082             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2083             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2084             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2085
2086             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2087             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2088             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2089         }
2090     }
2091
2092     dst += p->linesize[0];
2093     for (y = 1; y < avctx->height; y++) {
2094         if (get_bits1(gb)) {
2095             for (x = 0; x < avctx->width; x++) {
2096                 dst[x * 4 + 0] = get_bits(gb, 8);
2097                 dst[x * 4 + 1] = get_bits(gb, 8);
2098                 dst[x * 4 + 2] = get_bits(gb, 8);
2099             }
2100         } else {
2101             int pred_L[4];
2102             int r, g, b;
2103
2104             pred_L[0] = dst[-p->linesize[0] + 0];
2105             pred_L[1] = dst[-p->linesize[0] + 1];
2106             pred_L[2] = dst[-p->linesize[0] + 2];
2107
2108             for (x = 0; x < avctx->width; x++) {
2109                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2110                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2111                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2112
2113                 dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
2114                 dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
2115                 dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
2116             }
2117         }
2118         dst += p->linesize[0];
2119     }
2120 }
2121
2122 static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2123 {
2124     SheerVideoContext *s = avctx->priv_data;
2125     uint8_t *dst;
2126     int x, y;
2127
2128     dst = p->data[0];
2129     if (get_bits1(gb)) {
2130         for (x = 0; x < avctx->width; x++) {
2131             dst[x * 4 + 0] = get_bits(gb, 8);
2132             dst[x * 4 + 1] = get_bits(gb, 8);
2133             dst[x * 4 + 2] = get_bits(gb, 8);
2134         }
2135     } else {
2136         int pred[4] = { -128, -128, -128, -128 };
2137
2138         for (x = 0; x < avctx->width; x++) {
2139             int r, g, b;
2140
2141             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2142             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2143             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2144
2145             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2146             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2147             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2148         }
2149     }
2150
2151     dst += p->linesize[0];
2152     for (y = 1; y < avctx->height; y++) {
2153         if (get_bits1(gb)) {
2154             for (x = 0; x < avctx->width; x++) {
2155                 dst[x * 4 + 0] = get_bits(gb, 8);
2156                 dst[x * 4 + 1] = get_bits(gb, 8);
2157                 dst[x * 4 + 2] = get_bits(gb, 8);
2158             }
2159         } else {
2160             int pred_TL[4], pred_L[4], pred_T[4];
2161             int r, g, b;
2162
2163             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2164             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2165             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2166
2167             for (x = 0; x < avctx->width; x++) {
2168                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2169                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2170                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2171
2172                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2173                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2174                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2175
2176                 dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2177                 dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2178                 dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2179
2180                 pred_TL[0] = pred_T[0];
2181                 pred_TL[1] = pred_T[1];
2182                 pred_TL[2] = pred_T[2];
2183             }
2184         }
2185         dst += p->linesize[0];
2186     }
2187 }
2188
2189 static int build_vlc(VLC *vlc, const uint8_t *len, int count)
2190 {
2191     uint32_t codes[1024];
2192     uint8_t bits[1024];
2193     uint16_t syms[1024];
2194     uint64_t index;
2195     int i;
2196
2197     index = 0;
2198     for (i = 0; i < count; i++) {
2199         codes[i]  = index >> (32 - len[i]);
2200         bits[i] = len[i];
2201         syms[i]  = i;
2202         index += 1ULL << (32 - len[i]);
2203     }
2204
2205     ff_free_vlc(vlc);
2206     return ff_init_vlc_sparse(vlc, 16, count,
2207                               bits,  sizeof(*bits),  sizeof(*bits),
2208                               codes, sizeof(*codes), sizeof(*codes),
2209                               syms,  sizeof(*syms),  sizeof(*syms), 0);
2210 }
2211
2212 static int decode_frame(AVCodecContext *avctx,
2213                         void *data, int *got_frame,
2214                         AVPacket *avpkt)
2215 {
2216     SheerVideoContext *s = avctx->priv_data;
2217     ThreadFrame frame = { .f = data };
2218     AVFrame *p = data;
2219     GetBitContext gb;
2220     unsigned format;
2221     int ret;
2222
2223     if (avpkt->size <= 20)
2224         return AVERROR_INVALIDDATA;
2225
2226     if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
2227         AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
2228         return AVERROR_INVALIDDATA;
2229
2230     format = AV_RL32(avpkt->data + 16);
2231     switch (format) {
2232     case MKTAG(' ', 'R', 'G', 'B'):
2233         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2234         s->decode_frame = decode_rgb;
2235         if (s->format != format) {
2236             build_vlc(&s->vlc[0], l_r_rgb, 256);
2237             build_vlc(&s->vlc[1], l_g_rgb, 256);
2238         }
2239         break;
2240     case MKTAG(' ', 'r', 'G', 'B'):
2241         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2242         s->decode_frame = decode_rgbi;
2243         if (s->format != format) {
2244             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2245             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2246         }
2247         break;
2248     case MKTAG('A', 'R', 'G', 'X'):
2249         avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
2250         s->decode_frame = decode_argx;
2251         if (s->format != format) {
2252             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2253             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2254         }
2255         break;
2256     case MKTAG('R', 'G', 'B', 'X'):
2257         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
2258         s->decode_frame = decode_rgbx;
2259         if (s->format != format) {
2260             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2261             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2262         }
2263         break;
2264     case MKTAG('A', 'R', 'G', 'B'):
2265         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2266         s->decode_frame = decode_argb;
2267         if (s->format != format) {
2268             build_vlc(&s->vlc[0], l_r_rgb, 256);
2269             build_vlc(&s->vlc[1], l_g_rgb, 256);
2270         }
2271         break;
2272     case MKTAG('A', 'r', 'G', 'B'):
2273         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2274         s->decode_frame = decode_argbi;
2275         if (s->format != format) {
2276             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2277             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2278         }
2279         break;
2280     case MKTAG('A', 'Y', 'B', 'R'):
2281     case MKTAG('A', 'Y', 'b', 'R'):
2282         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2283         s->decode_frame = decode_aybr;
2284         if (s->format != format) {
2285             build_vlc(&s->vlc[0], l_y_ybr, 256);
2286             build_vlc(&s->vlc[1], l_u_ybr, 256);
2287         }
2288         break;
2289     case MKTAG('A', 'y', 'B', 'R'):
2290     case MKTAG('A', 'y', 'b', 'R'):
2291         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2292         s->decode_frame = decode_aybri;
2293         if (s->format != format) {
2294             build_vlc(&s->vlc[0], l_y_ybri, 256);
2295             build_vlc(&s->vlc[1], l_u_ybri, 256);
2296         }
2297         break;
2298     case MKTAG(' ', 'Y', 'B', 'R'):
2299     case MKTAG(' ', 'Y', 'b', 'R'):
2300         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2301         s->decode_frame = decode_ybr;
2302         if (s->format != format) {
2303             build_vlc(&s->vlc[0], l_y_ybr, 256);
2304             build_vlc(&s->vlc[1], l_u_ybr, 256);
2305         }
2306         break;
2307     case MKTAG(' ', 'y', 'B', 'R'):
2308     case MKTAG(' ', 'y', 'b', 'R'):
2309         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2310         s->decode_frame = decode_ybri;
2311         if (s->format != format) {
2312             build_vlc(&s->vlc[0], l_y_ybri, 256);
2313             build_vlc(&s->vlc[1], l_u_ybri, 256);
2314         }
2315         break;
2316     case MKTAG('Y', 'B', 'R', 0x0a):
2317         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
2318         s->decode_frame = decode_ybr10;
2319         if (s->format != format) {
2320             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2321             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2322         }
2323         break;
2324     case MKTAG('C', 'A', '4', 'p'):
2325         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
2326         s->decode_frame = decode_ca4p;
2327         if (s->format != format) {
2328             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2329             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2330         }
2331         break;
2332     case MKTAG('B', 'Y', 'R', 'Y'):
2333         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2334         s->decode_frame = decode_byry;
2335         if (s->format != format) {
2336             build_vlc(&s->vlc[0], l_y_byry, 256);
2337             build_vlc(&s->vlc[1], l_u_byry, 256);
2338         }
2339         break;
2340     case MKTAG('B', 'Y', 'R', 'y'):
2341         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2342         s->decode_frame = decode_byryi;
2343         if (s->format != format) {
2344             build_vlc(&s->vlc[0], l_y_byryi, 256);
2345             build_vlc(&s->vlc[1], l_u_byryi, 256);
2346         }
2347         break;
2348     case MKTAG('Y', 'b', 'Y', 'r'):
2349         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2350         s->decode_frame = decode_ybyr;
2351         if (s->format != format) {
2352             build_vlc(&s->vlc[0], l_y_ybyr, 256);
2353             build_vlc(&s->vlc[1], l_u_ybyr, 256);
2354         }
2355         break;
2356     case MKTAG('C', '8', '2', 'p'):
2357         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2358         s->decode_frame = decode_c82p;
2359         if (s->format != format) {
2360             build_vlc(&s->vlc[0], l_y_byry, 256);
2361             build_vlc(&s->vlc[1], l_u_byry, 256);
2362         }
2363         break;
2364     case MKTAG('C', '8', '2', 'i'):
2365         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2366         s->decode_frame = decode_c82i;
2367         if (s->format != format) {
2368             build_vlc(&s->vlc[0], l_y_byryi, 256);
2369             build_vlc(&s->vlc[1], l_u_byryi, 256);
2370         }
2371         break;
2372     case MKTAG(0xa2, 'Y', 'R', 'Y'):
2373         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2374         s->decode_frame = decode_yry10;
2375         if (s->format != format) {
2376             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2377             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2378         }
2379         break;
2380     case MKTAG('C', 'A', '2', 'p'):
2381         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2382         s->decode_frame = decode_ca2p;
2383         if (s->format != format) {
2384             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2385             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2386         }
2387         break;
2388     default:
2389         avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
2390         return AVERROR_PATCHWELCOME;
2391     }
2392     s->format = format;
2393
2394     p->pict_type = AV_PICTURE_TYPE_I;
2395     p->key_frame = 1;
2396
2397     if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2398         return ret;
2399
2400     if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
2401         return ret;
2402
2403     s->decode_frame(avctx, p, &gb);
2404
2405     *got_frame = 1;
2406
2407     return avpkt->size;
2408 }
2409
2410 #if HAVE_THREADS
2411 static int decode_init_thread_copy(AVCodecContext *avctx)
2412 {
2413     SheerVideoContext *s = avctx->priv_data;
2414
2415     s->format = 0;
2416     memset(&s->vlc[0], 0, sizeof(s->vlc[0]));
2417     memset(&s->vlc[1], 0, sizeof(s->vlc[1]));
2418
2419     return 0;
2420 }
2421 #endif
2422
2423 static av_cold int decode_end(AVCodecContext *avctx)
2424 {
2425     SheerVideoContext *s = avctx->priv_data;
2426
2427     ff_free_vlc(&s->vlc[0]);
2428     ff_free_vlc(&s->vlc[1]);
2429
2430     return 0;
2431 }
2432
2433 AVCodec ff_sheervideo_decoder = {
2434     .name             = "sheervideo",
2435     .long_name        = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
2436     .type             = AVMEDIA_TYPE_VIDEO,
2437     .id               = AV_CODEC_ID_SHEERVIDEO,
2438     .priv_data_size   = sizeof(SheerVideoContext),
2439     .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
2440     .close            = decode_end,
2441     .decode           = decode_frame,
2442     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2443 };