8843f1d7cfb51ed4f0a0b25fda13b559c9aea218
[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_ybr10i[1024] = {
229      3,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  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,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
233     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11,
234     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
235     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
236     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
237     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
238     12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
239     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
240     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
241     13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
242     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
243     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
244     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
245     14, 14, 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, 15, 15, 15, 15, 15, 15,
247     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
248     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
249     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
250     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 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, 15, 15, 15, 15, 15, 15, 15, 15, 15,
272     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
273     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
274     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
275     15, 15, 15, 15, 15, 15, 15, 15, 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     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
278     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
279     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
280     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
281     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
282     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
283     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
284     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
285     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
286     12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11,
287     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
288     11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
289     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  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,  7,  7,  7,  7,
292      7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,
293 };
294
295 static const uint8_t l_y_ybr10[1024] = {
296      4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  7,  7,  7,
297      7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
298      8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
299      9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
300     10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
301     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
302     11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
303     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
304     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
305     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
306     13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
307     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
308     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
309     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
310     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
311     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
312     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
313     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 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, 15, 15, 15, 15, 15, 15, 15, 15,
343     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
344     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
345     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
346     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
347     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
348     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
349     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
350     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
351     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
352     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
353     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
354     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
355     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10,
356     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
357      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
358      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,
359      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,
360 };
361
362 static const uint8_t l_u_ybr10i[1024] = {
363      2,  3,  4,  4,  5,  5,  6,  7,  7,  8,  8,  9,  9,  9,  9, 10,
364     10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
365     13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
366     14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
367     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
368     15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
369     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
370     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
371     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
372     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
373     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
374     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
375     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
376     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
377     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
378     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
379     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
380     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
381     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
382     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 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, 16, 16, 16, 16, 16, 16,
408     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
409     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
410     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
411     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
412     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
413     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
414     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
415     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
416     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
417     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
418     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
419     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
420     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
421     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15,
422     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
423     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14,
424     14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
425     13, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 10, 10,
426     10, 10, 10,  9,  9,  9,  8,  8,  8,  7,  6,  5,  5,  4,  4,  3,
427 };
428
429 static const uint8_t l_u_ybr10[1024] = {
430      2,  3,  3,  4,  5,  5,  6,  7,  8,  9,  9, 10, 10, 10, 11, 11,
431     12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
432     14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
433     15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16,
434     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
435     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
436     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 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, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
488     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
489     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
490     16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15,
491     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
492     14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 12,
493     12, 11, 11, 11, 10, 10,  9,  9,  8,  8,  7,  6,  5,  4,  4,  3,
494 };
495
496 static const uint8_t l_r_rgbx[1024] = {
497      4,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,
498      7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,
499      8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
500      9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10,
501     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
502     10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
503     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12,
504     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
505     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
506     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
507     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
508     13, 13, 13, 13, 13, 13, 13, 13, 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, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
511     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 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, 15, 15, 15, 15, 15, 15,
515     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
516     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 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, 15, 15, 15, 15, 15, 15,
542     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
543     15, 15, 15, 15, 15, 15, 15, 15, 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, 14, 14, 14, 14, 14, 14, 14, 14, 14,
547     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
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, 13, 13, 13, 13, 13, 13, 13,
550     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
551     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
552     13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
553     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
554     12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
555     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
556     11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
557     10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,
558      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  8,  8,  8,
559      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,  7,  7,
560      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,
561 };
562
563 static const uint8_t l_g_rgbx[1024] = {
564      3,  4,  4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,
565      8,  8,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12,
566     12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13,
567     13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
568     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
569     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
570     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 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, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
622     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
623     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14,
624     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13,
625     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12,
626     12, 12, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10,  9,  9,  9,  9,
627      8,  7,  7,  7,  6,  6,  6,  6,  6,  5,  5,  5,  5,  4,  4,  4,
628 };
629
630 static const uint8_t l_y_yry10[1024] = {
631      4,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  7,  7,  7,
632      7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
633      8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
634      9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
635     10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
636     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
637     11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
638     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
639     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
640     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
641     13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
642     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
643     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
644     14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
645     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
646     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
647     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
648     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16,
649     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
650     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
651     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 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, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
665     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
666     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
667     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
668     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
669     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
670     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
671     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
672     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
673     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
674     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
675     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
676     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
677     16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15,
678     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
679     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
680     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
681     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
682     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
683     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
684     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
685     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
686     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
687     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
688     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
689     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
690     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10,
691     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,
692      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
693      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,
694      7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,
695 };
696
697 static const uint8_t l_y_yry10i[1024] = {
698      3,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,
699      7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
700      8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
701      9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
702     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11,
703     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
704     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12,
705     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
706     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
707     12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
708     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
709     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
710     13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
711     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
712     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
713     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
714     14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
715     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
716     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
717     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
718     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
719     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16,
720     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
721     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
722     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
723     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
724     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
725     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
726     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
727     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
728     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
729     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
730     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
731     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
732     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
733     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
734     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
735     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
736     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
737     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
738     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
739     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
740     16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15,
741     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
742     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
743     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
744     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
745     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
746     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
747     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
748     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
749     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
750     14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
751     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
752     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
753     13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
754     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
755     12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11,
756     11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
757     11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
758     10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,
759      9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
760      8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  7,  7,  7,  7,
761      7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,
762 };
763
764 static const uint8_t l_u_yry10[1024] = {
765      2,  3,  3,  4,  5,  6,  7,  7,  8,  8,  8,  9,  9, 10, 10, 10,
766     10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
767     13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
768     14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
769     15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
770     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
771     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
772     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
773     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
774     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
775     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
776     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
777     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
778     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
779     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
780     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
781     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
782     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
783     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
784     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
785     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
786     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
787     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
788     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
789     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
790     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
791     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
792     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
793     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
794     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
795     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
796     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
797     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
798     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
799     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
800     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
801     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
802     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
803     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
804     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
805     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
806     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
807     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
808     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
809     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
810     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
811     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
812     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
813     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
814     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
815     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
816     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
817     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
818     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
819     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
820     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
821     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
822     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
823     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
824     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
825     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
826     15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
827     13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11,
828     10, 10, 10, 10,  9,  9,  9,  8,  8,  7,  7,  6,  5,  4,  4,  3,
829 };
830
831 static const uint8_t l_u_yry10i[1024] = {
832      2,  4,  4,  4,  5,  6,  6,  6,  7,  7,  7,  8,  8,  8,  9,  9,
833      9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11,
834     11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13,
835     13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,
836     14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15,
837     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
838     15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
839     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
840     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
841     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
842     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
843     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
844     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
845     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
846     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
847     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
848     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
849     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
850     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
851     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
852     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
853     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
854     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
855     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
856     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
857     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
858     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
859     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
860     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
861     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
862     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
863     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
864     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
865     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
866     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
867     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
868     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
869     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
870     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
871     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
872     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
873     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
874     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
875     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
876     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
877     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
878     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
879     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
880     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
881     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
882     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
883     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
884     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
885     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
886     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
887     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
888     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
889     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
890     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
891     15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
892     14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13,
893     13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11,
894     11, 11, 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10,  9,  9,  9,
895      9,  9,  8,  8,  8,  8,  7,  7,  7,  6,  6,  5,  5,  4,  4,  3,
896 };
897
898 static const uint8_t l_y_ybri[256] = {
899      3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,
900      8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
901     10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
902     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
903     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
904     14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
905     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
906     15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
907     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
908     16, 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
909     15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
910     14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
911     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
912     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10,
913     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
914      8,  8,  8,  7,  7,  7,  7,  7,  6,  6,  6,  5,  5,  5,  4,  3,
915 };
916
917 static const uint8_t l_u_ybri[256] = {
918      1,  3,  5,  6,  8,  8,  9, 10, 10, 11, 11, 12, 12, 13, 13, 13,
919     14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
920     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
921     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
922     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
923     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
924     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
925     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
926     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
927     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
928     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
929     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
930     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
931     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
932     16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14,
933     14, 13, 13, 13, 12, 12, 11, 11, 10, 10,  9,  8,  8,  6,  5,  2,
934 };
935
936 static const uint8_t l_y_byryi[256] = {
937      3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  7,  7,  7,  7,  8,  8,
938      8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10,
939     10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
940     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
941     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
942     14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,
943     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
944     15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
945     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
946     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
947     15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
948     14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
949     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
950     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10,
951     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
952      8,  8,  8,  7,  7,  7,  7,  7,  7,  6,  6,  6,  5,  4,  4,  3,
953 };
954
955 static const uint8_t l_u_byryi[256] = {
956      1,  3,  4,  6,  6,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11,
957     12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15,
958     15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
959     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
960     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
961     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
962     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
963     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
964     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
965     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
966     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
967     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
968     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
969     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
970     15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12,
971     12, 11, 11, 11, 10, 10, 10,  9,  9,  8,  8,  7,  7,  5,  4,  3,
972 };
973
974 static void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
975 {
976     SheerVideoContext *s = avctx->priv_data;
977     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
978     int x, y;
979
980     dst_a = (uint16_t *)p->data[3];
981     dst_y = (uint16_t *)p->data[0];
982     dst_u = (uint16_t *)p->data[1];
983     dst_v = (uint16_t *)p->data[2];
984
985     for (y = 0; y < avctx->height; y++) {
986         if (get_bits1(gb)) {
987             for (x = 0; x < avctx->width; x++) {
988                 dst_a[x] = get_bits(gb, 10);
989                 dst_y[x] = get_bits(gb, 10);
990                 dst_u[x] = get_bits(gb, 10);
991                 dst_v[x] = get_bits(gb, 10);
992             }
993         } else {
994             int pred[4] = { 502, 512, 512, 502 };
995
996             for (x = 0; x < avctx->width; x++) {
997                 int y, u, v, a;
998
999                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1000                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1001                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1002                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1003
1004                 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1005                 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1006                 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1007                 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1008             }
1009         }
1010
1011         dst_y += p->linesize[0] / 2;
1012         dst_u += p->linesize[1] / 2;
1013         dst_v += p->linesize[2] / 2;
1014         dst_a += p->linesize[3] / 2;
1015     }
1016 }
1017
1018 static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1019 {
1020     SheerVideoContext *s = avctx->priv_data;
1021     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
1022     int x, y;
1023
1024     dst_a = (uint16_t *)p->data[3];
1025     dst_y = (uint16_t *)p->data[0];
1026     dst_u = (uint16_t *)p->data[1];
1027     dst_v = (uint16_t *)p->data[2];
1028
1029     if (get_bits1(gb)) {
1030         for (x = 0; x < avctx->width; x++) {
1031             dst_a[x] = get_bits(gb, 10);
1032             dst_y[x] = get_bits(gb, 10);
1033             dst_u[x] = get_bits(gb, 10);
1034             dst_v[x] = get_bits(gb, 10);
1035         }
1036     } else {
1037         int pred[4] = { 502, 512, 512, 502 };
1038
1039         for (x = 0; x < avctx->width; x++) {
1040             int y, u, v, a;
1041
1042             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1043             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1044             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1045             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1046
1047             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1048             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1049             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1050             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1051         }
1052     }
1053
1054     dst_y += p->linesize[0] / 2;
1055     dst_u += p->linesize[1] / 2;
1056     dst_v += p->linesize[2] / 2;
1057     dst_a += p->linesize[3] / 2;
1058
1059     for (y = 1; y < avctx->height; y++) {
1060         if (get_bits1(gb)) {
1061             for (x = 0; x < avctx->width; x++) {
1062                 dst_a[x] = get_bits(gb, 10);
1063                 dst_y[x] = get_bits(gb, 10);
1064                 dst_u[x] = get_bits(gb, 10);
1065                 dst_v[x] = get_bits(gb, 10);
1066             }
1067         } else {
1068             int pred_TL[4], pred_L[4], pred_T[4];
1069             int y, u, v, a;
1070
1071             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1072             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1073             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1074             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
1075
1076             for (x = 0; x < avctx->width; x++) {
1077                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1078                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
1079                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
1080                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
1081
1082                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1083                 y = 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                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1086
1087                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
1088                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1089                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1090                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1091
1092                 pred_TL[0] = pred_T[0];
1093                 pred_TL[1] = pred_T[1];
1094                 pred_TL[2] = pred_T[2];
1095                 pred_TL[3] = pred_T[3];
1096             }
1097         }
1098
1099         dst_y += p->linesize[0] / 2;
1100         dst_u += p->linesize[1] / 2;
1101         dst_v += p->linesize[2] / 2;
1102         dst_a += p->linesize[3] / 2;
1103     }
1104 }
1105
1106 static void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1107 {
1108     SheerVideoContext *s = avctx->priv_data;
1109     uint16_t *dst_y, *dst_u, *dst_v;
1110     int x, y;
1111
1112     dst_y = (uint16_t *)p->data[0];
1113     dst_u = (uint16_t *)p->data[1];
1114     dst_v = (uint16_t *)p->data[2];
1115
1116     for (y = 0; y < avctx->height; y++) {
1117         if (get_bits1(gb)) {
1118             for (x = 0; x < avctx->width; x++) {
1119                 dst_y[x] = get_bits(gb, 10);
1120                 dst_u[x] = get_bits(gb, 10);
1121                 dst_v[x] = get_bits(gb, 10);
1122             }
1123         } else {
1124             int pred[4] = { 502, 512, 512, 512 };
1125
1126             for (x = 0; x < avctx->width; x++) {
1127                 int y, u, v;
1128
1129                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1130                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1131                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1132
1133                 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1134                 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1135                 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1136             }
1137         }
1138
1139         dst_y += p->linesize[0] / 2;
1140         dst_u += p->linesize[1] / 2;
1141         dst_v += p->linesize[2] / 2;
1142     }
1143 }
1144
1145 static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1146 {
1147     SheerVideoContext *s = avctx->priv_data;
1148     uint16_t *dst_y, *dst_u, *dst_v;
1149     int x, y;
1150
1151     dst_y = (uint16_t *)p->data[0];
1152     dst_u = (uint16_t *)p->data[1];
1153     dst_v = (uint16_t *)p->data[2];
1154
1155     if (get_bits1(gb)) {
1156         for (x = 0; x < avctx->width; x++) {
1157             dst_y[x] = get_bits(gb, 10);
1158             dst_u[x] = get_bits(gb, 10);
1159             dst_v[x] = get_bits(gb, 10);
1160         }
1161     } else {
1162         int pred[4] = { 502, 512, 512, 512 };
1163
1164         for (x = 0; x < avctx->width; x++) {
1165             int y, u, v;
1166
1167             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1168             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1169             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1170
1171             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1172             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1173             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1174         }
1175     }
1176
1177     dst_y += p->linesize[0] / 2;
1178     dst_u += p->linesize[1] / 2;
1179     dst_v += p->linesize[2] / 2;
1180
1181     for (y = 1; y < avctx->height; y++) {
1182         if (get_bits1(gb)) {
1183             for (x = 0; x < avctx->width; x++) {
1184                 dst_y[x] = get_bits(gb, 10);
1185                 dst_u[x] = get_bits(gb, 10);
1186                 dst_v[x] = get_bits(gb, 10);
1187             }
1188         } else {
1189             int pred_TL[4], pred_L[4], pred_T[4];
1190             int y, u, v;
1191
1192             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1193             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1194             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1195
1196             for (x = 0; x < avctx->width; x++) {
1197                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1198                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
1199                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
1200
1201                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1202                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1203                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1204
1205                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1206                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1207                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1208
1209                 pred_TL[0] = pred_T[0];
1210                 pred_TL[1] = pred_T[1];
1211                 pred_TL[2] = pred_T[2];
1212             }
1213         }
1214
1215         dst_y += p->linesize[0] / 2;
1216         dst_u += p->linesize[1] / 2;
1217         dst_v += p->linesize[2] / 2;
1218     }
1219 }
1220
1221 static void decode_yry10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1222 {
1223     SheerVideoContext *s = avctx->priv_data;
1224     uint16_t *dst_y, *dst_u, *dst_v;
1225     int x, y;
1226
1227     dst_y = (uint16_t *)p->data[0];
1228     dst_u = (uint16_t *)p->data[1];
1229     dst_v = (uint16_t *)p->data[2];
1230
1231     for (y = 0; y < avctx->height; y++) {
1232         if (get_bits1(gb)) {
1233             for (x = 0; x < avctx->width; x += 2) {
1234                 dst_y[x    ] = get_bits(gb, 10);
1235                 dst_u[x / 2] = get_bits(gb, 10);
1236                 dst_y[x + 1] = get_bits(gb, 10);
1237                 dst_v[x / 2] = get_bits(gb, 10);
1238             }
1239         } else {
1240             int pred[4] = { 502, 512, 512, 0 };
1241
1242             for (x = 0; x < avctx->width; x += 2) {
1243                 int y1, y2, u, v;
1244
1245                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1246                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1247                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1248                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1249
1250                 dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1251                 dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1252                 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1253                 dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1254             }
1255         }
1256
1257         dst_y += p->linesize[0] / 2;
1258         dst_u += p->linesize[1] / 2;
1259         dst_v += p->linesize[2] / 2;
1260     }
1261 }
1262
1263 static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1264 {
1265     SheerVideoContext *s = avctx->priv_data;
1266     uint16_t *dst_y, *dst_u, *dst_v;
1267     int x, y;
1268
1269     dst_y = (uint16_t *)p->data[0];
1270     dst_u = (uint16_t *)p->data[1];
1271     dst_v = (uint16_t *)p->data[2];
1272
1273     if (get_bits1(gb)) {
1274         for (x = 0; x < avctx->width; x += 2) {
1275             dst_y[x    ] = get_bits(gb, 10);
1276             dst_u[x / 2] = get_bits(gb, 10);
1277             dst_y[x + 1] = get_bits(gb, 10);
1278             dst_v[x / 2] = get_bits(gb, 10);
1279         }
1280     } else {
1281         int pred[4] = { 502, 512, 512, 0 };
1282
1283         for (x = 0; x < avctx->width; x += 2) {
1284             int y1, y2, u, v;
1285
1286             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1287             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1288             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1289             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1290
1291             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1292             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1293             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1294             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1295         }
1296     }
1297
1298     dst_y += p->linesize[0] / 2;
1299     dst_u += p->linesize[1] / 2;
1300     dst_v += p->linesize[2] / 2;
1301
1302     for (y = 1; y < avctx->height; y++) {
1303         if (get_bits1(gb)) {
1304             for (x = 0; x < avctx->width; x += 2) {
1305                 dst_y[x    ] = get_bits(gb, 10);
1306                 dst_u[x / 2] = get_bits(gb, 10);
1307                 dst_y[x + 1] = get_bits(gb, 10);
1308                 dst_v[x / 2] = get_bits(gb, 10);
1309             }
1310         } else {
1311             int pred_TL[6], pred_L[6], pred_T[6];
1312             int y1, y2, u, v;
1313
1314             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1315             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1316             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1317
1318             for (x = 0; x < avctx->width; x += 2) {
1319                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1320                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
1321                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
1322                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
1323
1324                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1325                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1326                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1327                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1328
1329                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1330                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
1331                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
1332                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
1333
1334                 pred_TL[0] = pred_T[3];
1335                 pred_TL[1] = pred_T[1];
1336                 pred_TL[2] = pred_T[2];
1337             }
1338         }
1339
1340         dst_y += p->linesize[0] / 2;
1341         dst_u += p->linesize[1] / 2;
1342         dst_v += p->linesize[2] / 2;
1343     }
1344 }
1345
1346 static void decode_ca2i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1347 {
1348     SheerVideoContext *s = avctx->priv_data;
1349     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
1350     int x, y;
1351
1352     dst_y = (uint16_t *)p->data[0];
1353     dst_u = (uint16_t *)p->data[1];
1354     dst_v = (uint16_t *)p->data[2];
1355     dst_a = (uint16_t *)p->data[3];
1356
1357     for (y = 0; y < avctx->height; y++) {
1358         if (get_bits1(gb)) {
1359             for (x = 0; x < avctx->width; x += 2) {
1360                 dst_a[x    ] = get_bits(gb, 10);
1361                 dst_y[x    ] = get_bits(gb, 10);
1362                 dst_u[x / 2] = get_bits(gb, 10);
1363                 dst_a[x + 1] = get_bits(gb, 10);
1364                 dst_y[x + 1] = get_bits(gb, 10);
1365                 dst_v[x / 2] = get_bits(gb, 10);
1366             }
1367         } else {
1368             int pred[4] = { 502, 512, 512, 502 };
1369
1370             for (x = 0; x < avctx->width; x += 2) {
1371                 int y1, y2, u, v, a1, a2;
1372
1373                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1374                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1375                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1376                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1377                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1378                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1379
1380                 dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1381                 dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1382                 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1383                 dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
1384                 dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1385                 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
1386             }
1387         }
1388
1389         dst_y += p->linesize[0] / 2;
1390         dst_u += p->linesize[1] / 2;
1391         dst_v += p->linesize[2] / 2;
1392         dst_a += p->linesize[3] / 2;
1393     }
1394 }
1395
1396 static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1397 {
1398     SheerVideoContext *s = avctx->priv_data;
1399     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
1400     int x, y;
1401
1402     dst_y = (uint16_t *)p->data[0];
1403     dst_u = (uint16_t *)p->data[1];
1404     dst_v = (uint16_t *)p->data[2];
1405     dst_a = (uint16_t *)p->data[3];
1406
1407     if (get_bits1(gb)) {
1408         for (x = 0; x < avctx->width; x += 2) {
1409             dst_a[x    ] = get_bits(gb, 10);
1410             dst_y[x    ] = get_bits(gb, 10);
1411             dst_u[x / 2] = get_bits(gb, 10);
1412             dst_a[x + 1] = get_bits(gb, 10);
1413             dst_y[x + 1] = get_bits(gb, 10);
1414             dst_v[x / 2] = get_bits(gb, 10);
1415         }
1416     } else {
1417         int pred[4] = { 502, 512, 512, 502 };
1418
1419         for (x = 0; x < avctx->width; x += 2) {
1420             int y1, y2, u, v, a1, a2;
1421
1422             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1423             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1424             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1425             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1426             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1427             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1428
1429             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1430             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1431             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1432             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
1433             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1434             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
1435         }
1436     }
1437
1438     dst_y += p->linesize[0] / 2;
1439     dst_u += p->linesize[1] / 2;
1440     dst_v += p->linesize[2] / 2;
1441     dst_a += p->linesize[3] / 2;
1442
1443     for (y = 1; y < avctx->height; y++) {
1444         if (get_bits1(gb)) {
1445             for (x = 0; x < avctx->width; x += 2) {
1446                 dst_a[x    ] = get_bits(gb, 10);
1447                 dst_y[x    ] = get_bits(gb, 10);
1448                 dst_u[x / 2] = get_bits(gb, 10);
1449                 dst_a[x + 1] = get_bits(gb, 10);
1450                 dst_y[x + 1] = get_bits(gb, 10);
1451                 dst_v[x / 2] = get_bits(gb, 10);
1452             }
1453         } else {
1454             int pred_TL[6], pred_L[6], pred_T[6];
1455             int y1, y2, u, v, a1, a2;
1456
1457             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1458             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1459             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1460             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
1461
1462             for (x = 0; x < avctx->width; x += 2) {
1463                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1464                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
1465                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
1466                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
1467                 pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
1468                 pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
1469
1470                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1471                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1472                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1473                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1474                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1475                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1476
1477                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1478                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
1479                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
1480                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
1481                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
1482                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
1483
1484                 pred_TL[0] = pred_T[3];
1485                 pred_TL[1] = pred_T[1];
1486                 pred_TL[2] = pred_T[2];
1487                 pred_TL[4] = pred_T[5];
1488             }
1489         }
1490
1491         dst_y += p->linesize[0] / 2;
1492         dst_u += p->linesize[1] / 2;
1493         dst_v += p->linesize[2] / 2;
1494         dst_a += p->linesize[3] / 2;
1495     }
1496 }
1497
1498 static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1499 {
1500     SheerVideoContext *s = avctx->priv_data;
1501     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1502     int x, y;
1503
1504     dst_y = p->data[0];
1505     dst_u = p->data[1];
1506     dst_v = p->data[2];
1507     dst_a = p->data[3];
1508
1509     for (y = 0; y < avctx->height; y += 1) {
1510         if (get_bits1(gb)) {
1511             for (x = 0; x < avctx->width; x += 2) {
1512                 dst_a[x    ] = get_bits(gb, 8);
1513                 dst_y[x    ] = get_bits(gb, 8);
1514                 dst_u[x / 2] = get_bits(gb, 8);
1515                 dst_a[x + 1] = get_bits(gb, 8);
1516                 dst_y[x + 1] = get_bits(gb, 8);
1517                 dst_v[x / 2] = get_bits(gb, 8);
1518             }
1519         } else {
1520             int pred[4] = { 125, -128, -128, 125 };
1521
1522             for (x = 0; x < avctx->width; x += 2) {
1523                 int y1, y2, u, v, a1, a2;
1524
1525                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1526                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1527                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1528                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1529                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1530                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1531
1532                 dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1533                 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1534                 dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1535                 dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1536                 dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1537                 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1538             }
1539         }
1540
1541         dst_y += p->linesize[0];
1542         dst_u += p->linesize[1];
1543         dst_v += p->linesize[2];
1544         dst_a += p->linesize[3];
1545     }
1546 }
1547
1548 static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1549 {
1550     SheerVideoContext *s = avctx->priv_data;
1551     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1552     int x, y;
1553
1554     dst_y = p->data[0];
1555     dst_u = p->data[1];
1556     dst_v = p->data[2];
1557     dst_a = p->data[3];
1558
1559     if (get_bits1(gb)) {
1560         for (x = 0; x < avctx->width; x += 2) {
1561             dst_a[x    ] = get_bits(gb, 8);
1562             dst_y[x    ] = get_bits(gb, 8);
1563             dst_u[x / 2] = get_bits(gb, 8);
1564             dst_a[x + 1] = get_bits(gb, 8);
1565             dst_y[x + 1] = get_bits(gb, 8);
1566             dst_v[x / 2] = get_bits(gb, 8);
1567         }
1568     } else {
1569         int pred[4] = { 125, -128, -128, 125 };
1570
1571         for (x = 0; x < avctx->width; x += 2) {
1572             int y1, y2, u, v, a1, a2;
1573
1574             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1575             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1576             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1577             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1578             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1579             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1580
1581             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1582             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1583             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1584             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1585             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1586             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1587         }
1588     }
1589
1590     dst_y += p->linesize[0];
1591     dst_u += p->linesize[1];
1592     dst_v += p->linesize[2];
1593     dst_a += p->linesize[3];
1594
1595     for (y = 1; y < avctx->height; y++) {
1596         if (get_bits1(gb)) {
1597             for (x = 0; x < avctx->width; x += 2) {
1598                 dst_a[x    ] = get_bits(gb, 8);
1599                 dst_y[x    ] = get_bits(gb, 8);
1600                 dst_u[x / 2] = get_bits(gb, 8);
1601                 dst_a[x + 1] = get_bits(gb, 8);
1602                 dst_y[x + 1] = get_bits(gb, 8);
1603                 dst_v[x / 2] = get_bits(gb, 8);
1604             }
1605         } else {
1606             int pred_TL[6], pred_L[6], pred_T[6];
1607             int y1, y2, u, v, a1, a2;
1608
1609             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1610             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1611             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1612             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
1613
1614             for (x = 0; x < avctx->width; x += 2) {
1615                 pred_T[0] = dst_y[-p->linesize[0] + x];
1616                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1617                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1618                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1619                 pred_T[4] = dst_a[-p->linesize[3] + x];
1620                 pred_T[5] = dst_a[-p->linesize[3] + x + 1];
1621
1622                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1623                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1624                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1625                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1626                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1627                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1628
1629                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1630                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1631                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1632                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1633                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
1634                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
1635
1636                 pred_TL[0] = pred_T[3];
1637                 pred_TL[1] = pred_T[1];
1638                 pred_TL[2] = pred_T[2];
1639                 pred_TL[4] = pred_T[5];
1640             }
1641         }
1642
1643         dst_y += p->linesize[0];
1644         dst_u += p->linesize[1];
1645         dst_v += p->linesize[2];
1646         dst_a += p->linesize[3];
1647     }
1648 }
1649
1650 static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1651 {
1652     SheerVideoContext *s = avctx->priv_data;
1653     uint8_t *dst_y, *dst_u, *dst_v;
1654     int x, y;
1655
1656     dst_y = p->data[0];
1657     dst_u = p->data[1];
1658     dst_v = p->data[2];
1659
1660     if (get_bits1(gb)) {
1661         for (x = 0; x < avctx->width; x += 2) {
1662             dst_y[x    ] = get_bits(gb, 8);
1663             dst_u[x / 2] = get_bits(gb, 8);
1664             dst_y[x + 1] = get_bits(gb, 8);
1665             dst_v[x / 2] = get_bits(gb, 8);
1666         }
1667     } else {
1668         int pred[4] = { -128, 128, 128, 0 };
1669
1670         for (x = 0; x < avctx->width; x += 2) {
1671             int y1, y2, u, v;
1672
1673             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1674             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1675             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1676             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1677
1678             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1679             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1680             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1681             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1682         }
1683     }
1684
1685     dst_y += p->linesize[0];
1686     dst_u += p->linesize[1];
1687     dst_v += p->linesize[2];
1688
1689     for (y = 1; y < avctx->height; y++) {
1690         if (get_bits1(gb)) {
1691             for (x = 0; x < avctx->width; x += 2) {
1692                 dst_y[x    ] = get_bits(gb, 8);
1693                 dst_u[x / 2] = get_bits(gb, 8);
1694                 dst_y[x + 1] = get_bits(gb, 8);
1695                 dst_v[x / 2] = get_bits(gb, 8);
1696             }
1697         } else {
1698             int pred_TL[4], pred_L[4], pred_T[4];
1699             int y1, y2, u, v;
1700
1701             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1702             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1703             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1704
1705             for (x = 0; x < avctx->width; x += 2) {
1706                 pred_T[0] = dst_y[-p->linesize[0] + x];
1707                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1708                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1709                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1710
1711                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1712                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1713                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1714                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1715
1716                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1717                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1718                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1719                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1720
1721                 pred_TL[0] = pred_T[3];
1722                 pred_TL[1] = pred_T[1];
1723                 pred_TL[2] = pred_T[2];
1724             }
1725         }
1726
1727         dst_y += p->linesize[0];
1728         dst_u += p->linesize[1];
1729         dst_v += p->linesize[2];
1730     }
1731 }
1732
1733 static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1734 {
1735     SheerVideoContext *s = avctx->priv_data;
1736     uint8_t *dst_y, *dst_u, *dst_v;
1737     int x, y;
1738
1739     dst_y = p->data[0];
1740     dst_u = p->data[1];
1741     dst_v = p->data[2];
1742
1743     if (get_bits1(gb)) {
1744         for (x = 0; x < avctx->width; x += 2) {
1745             dst_y[x    ] = get_bits(gb, 8);
1746             dst_u[x / 2] = get_bits(gb, 8);
1747             dst_y[x + 1] = get_bits(gb, 8);
1748             dst_v[x / 2] = get_bits(gb, 8);
1749         }
1750     } else {
1751         int pred[4] = { 125, -128, -128, 0 };
1752
1753         for (x = 0; x < avctx->width; x += 2) {
1754             int y1, y2, u, v;
1755
1756             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1757             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1758             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1759             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1760
1761             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1762             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1763             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1764             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1765         }
1766     }
1767
1768     dst_y += p->linesize[0];
1769     dst_u += p->linesize[1];
1770     dst_v += p->linesize[2];
1771
1772     for (y = 1; y < avctx->height; y++) {
1773         if (get_bits1(gb)) {
1774             for (x = 0; x < avctx->width; x += 2) {
1775                 dst_y[x    ] = get_bits(gb, 8);
1776                 dst_u[x / 2] = get_bits(gb, 8);
1777                 dst_y[x + 1] = get_bits(gb, 8);
1778                 dst_v[x / 2] = get_bits(gb, 8);
1779             }
1780         } else {
1781             int pred_L[4];
1782             int y1, y2, u, v;
1783
1784             pred_L[0] = dst_y[-p->linesize[0]];
1785             pred_L[1] = dst_u[-p->linesize[1]];
1786             pred_L[2] = dst_v[-p->linesize[2]];
1787
1788             for (x = 0; x < avctx->width; x += 2) {
1789                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1790                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1791                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1792                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1793
1794                 dst_y[x    ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
1795                 dst_u[x / 2] = pred_L[1] = (u  + pred_L[1]) & 0xff;
1796                 dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
1797                 dst_v[x / 2] = pred_L[2] = (v +  pred_L[2]) & 0xff;
1798             }
1799         }
1800
1801         dst_y += p->linesize[0];
1802         dst_u += p->linesize[1];
1803         dst_v += p->linesize[2];
1804     }
1805 }
1806
1807 static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1808 {
1809     SheerVideoContext *s = avctx->priv_data;
1810     uint8_t *dst_y, *dst_u, *dst_v;
1811     int x, y;
1812
1813     dst_y = p->data[0];
1814     dst_u = p->data[1];
1815     dst_v = p->data[2];
1816
1817     if (get_bits1(gb)) {
1818         for (x = 0; x < avctx->width; x += 2) {
1819             dst_y[x    ] = get_bits(gb, 8);
1820             dst_u[x / 2] = get_bits(gb, 8);
1821             dst_y[x + 1] = get_bits(gb, 8);
1822             dst_v[x / 2] = get_bits(gb, 8);
1823         }
1824     } else {
1825         int pred[4] = { 125, -128, -128, 0 };
1826
1827         for (x = 0; x < avctx->width; x += 2) {
1828             int y1, y2, u, v;
1829
1830             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1831             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1832             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1833             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1834
1835             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1836             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1837             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1838             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1839         }
1840     }
1841
1842     dst_y += p->linesize[0];
1843     dst_u += p->linesize[1];
1844     dst_v += p->linesize[2];
1845
1846     for (y = 1; y < avctx->height; y++) {
1847         if (get_bits1(gb)) {
1848             for (x = 0; x < avctx->width; x += 2) {
1849                 dst_y[x    ] = get_bits(gb, 8);
1850                 dst_u[x / 2] = get_bits(gb, 8);
1851                 dst_y[x + 1] = get_bits(gb, 8);
1852                 dst_v[x / 2] = get_bits(gb, 8);
1853             }
1854         } else {
1855             int pred_TL[4], pred_L[4], pred_T[4];
1856             int y1, y2, u, v;
1857
1858             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1859             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1860             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1861
1862             for (x = 0; x < avctx->width; x += 2) {
1863                 pred_T[0] = dst_y[-p->linesize[0] + x];
1864                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1865                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1866                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1867
1868                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1869                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1870                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1871                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1872
1873                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1874                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1875                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1876                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1877
1878                 pred_TL[0] = pred_T[3];
1879                 pred_TL[1] = pred_T[1];
1880                 pred_TL[2] = pred_T[2];
1881             }
1882         }
1883
1884         dst_y += p->linesize[0];
1885         dst_u += p->linesize[1];
1886         dst_v += p->linesize[2];
1887     }
1888 }
1889
1890 static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1891 {
1892     SheerVideoContext *s = avctx->priv_data;
1893     uint8_t *dst_y, *dst_u, *dst_v;
1894     int x, y;
1895
1896     dst_y = p->data[0];
1897     dst_u = p->data[1];
1898     dst_v = p->data[2];
1899
1900     if (get_bits1(gb)) {
1901         for (x = 0; x < avctx->width; x++) {
1902             dst_y[x] = get_bits(gb, 8);
1903             dst_u[x] = get_bits(gb, 8);
1904             dst_v[x] = get_bits(gb, 8);
1905         }
1906     } else {
1907         int pred[4] = { 125, -128, -128, -128 };
1908
1909         for (x = 0; x < avctx->width; x++) {
1910             int y, u, v;
1911
1912             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1913             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1914             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1915
1916             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1917             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1918             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1919         }
1920     }
1921
1922     dst_y += p->linesize[0];
1923     dst_u += p->linesize[1];
1924     dst_v += p->linesize[2];
1925
1926     for (y = 1; y < avctx->height; y++) {
1927         if (get_bits1(gb)) {
1928             for (x = 0; x < avctx->width; x++) {
1929                 dst_y[x] = get_bits(gb, 8);
1930                 dst_u[x] = get_bits(gb, 8);
1931                 dst_v[x] = get_bits(gb, 8);
1932             }
1933         } else {
1934             int pred_L[4];
1935             int y, u, v;
1936
1937             pred_L[0] = dst_y[-p->linesize[0]];
1938             pred_L[1] = dst_u[-p->linesize[1]];
1939             pred_L[2] = dst_v[-p->linesize[2]];
1940
1941             for (x = 0; x < avctx->width; x++) {
1942                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1943                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1944                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1945
1946                 dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1947                 dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1948                 dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1949             }
1950         }
1951
1952         dst_y += p->linesize[0];
1953         dst_u += p->linesize[1];
1954         dst_v += p->linesize[2];
1955     }
1956 }
1957
1958 static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1959 {
1960     SheerVideoContext *s = avctx->priv_data;
1961     uint8_t *dst_y, *dst_u, *dst_v;
1962     int x, y;
1963
1964     dst_y = p->data[0];
1965     dst_u = p->data[1];
1966     dst_v = p->data[2];
1967
1968     if (get_bits1(gb)) {
1969         for (x = 0; x < avctx->width; x++) {
1970             dst_y[x] = get_bits(gb, 8);
1971             dst_u[x] = get_bits(gb, 8);
1972             dst_v[x] = get_bits(gb, 8);
1973         }
1974     } else {
1975         int pred[4] = { 125, -128, -128, -128 };
1976
1977         for (x = 0; x < avctx->width; x++) {
1978             int y, u, v;
1979
1980             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1981             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1982             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1983
1984             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1985             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1986             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1987         }
1988     }
1989
1990     dst_y += p->linesize[0];
1991     dst_u += p->linesize[1];
1992     dst_v += p->linesize[2];
1993
1994     for (y = 1; y < avctx->height; y++) {
1995         if (get_bits1(gb)) {
1996             for (x = 0; x < avctx->width; x++) {
1997                 dst_y[x] = get_bits(gb, 8);
1998                 dst_u[x] = get_bits(gb, 8);
1999                 dst_v[x] = get_bits(gb, 8);
2000             }
2001         } else {
2002             int pred_TL[4], pred_L[4], pred_T[4];
2003             int y, u, v;
2004
2005             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
2006             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
2007             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
2008
2009             for (x = 0; x < avctx->width; x++) {
2010                 pred_T[0] = dst_y[-p->linesize[0] + x];
2011                 pred_T[1] = dst_u[-p->linesize[1] + x];
2012                 pred_T[2] = dst_v[-p->linesize[2] + x];
2013
2014                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2015                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2016                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2017
2018                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2019                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2020                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2021
2022                 pred_TL[0] = pred_T[0];
2023                 pred_TL[1] = pred_T[1];
2024                 pred_TL[2] = pred_T[2];
2025             }
2026         }
2027
2028         dst_y += p->linesize[0];
2029         dst_u += p->linesize[1];
2030         dst_v += p->linesize[2];
2031     }
2032 }
2033
2034 static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2035 {
2036     SheerVideoContext *s = avctx->priv_data;
2037     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
2038     int x, y;
2039
2040     dst_a = p->data[3];
2041     dst_y = p->data[0];
2042     dst_u = p->data[1];
2043     dst_v = p->data[2];
2044
2045     if (get_bits1(gb)) {
2046         for (x = 0; x < avctx->width; x++) {
2047             dst_a[x] = get_bits(gb, 8);
2048             dst_y[x] = get_bits(gb, 8);
2049             dst_u[x] = get_bits(gb, 8);
2050             dst_v[x] = get_bits(gb, 8);
2051         }
2052     } else {
2053         int pred[4] = { 125, 125, -128, -128 };
2054
2055         for (x = 0; x < avctx->width; x++) {
2056             int a, y, u, v;
2057
2058             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2059             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2060             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2061             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2062
2063             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
2064             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
2065             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
2066             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
2067         }
2068     }
2069
2070     dst_a += p->linesize[3];
2071     dst_y += p->linesize[0];
2072     dst_u += p->linesize[1];
2073     dst_v += p->linesize[2];
2074
2075     for (y = 1; y < avctx->height; y++) {
2076         if (get_bits1(gb)) {
2077             for (x = 0; x < avctx->width; x++) {
2078                 dst_a[x] = get_bits(gb, 8);
2079                 dst_y[x] = get_bits(gb, 8);
2080                 dst_u[x] = get_bits(gb, 8);
2081                 dst_v[x] = get_bits(gb, 8);
2082             }
2083         } else {
2084             int pred_L[4];
2085             int a, y, u, v;
2086
2087             pred_L[0] = dst_a[-p->linesize[3]];
2088             pred_L[1] = dst_y[-p->linesize[0]];
2089             pred_L[2] = dst_u[-p->linesize[1]];
2090             pred_L[3] = dst_v[-p->linesize[2]];
2091
2092             for (x = 0; x < avctx->width; x++) {
2093                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2094                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2095                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2096                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2097
2098                 dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
2099                 dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
2100                 dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
2101                 dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
2102             }
2103         }
2104
2105         dst_a += p->linesize[3];
2106         dst_y += p->linesize[0];
2107         dst_u += p->linesize[1];
2108         dst_v += p->linesize[2];
2109     }
2110 }
2111
2112 static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2113 {
2114     SheerVideoContext *s = avctx->priv_data;
2115     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
2116     int x, y;
2117
2118     dst_a = p->data[3];
2119     dst_y = p->data[0];
2120     dst_u = p->data[1];
2121     dst_v = p->data[2];
2122
2123     if (get_bits1(gb)) {
2124         for (x = 0; x < avctx->width; x++) {
2125             dst_a[x] = get_bits(gb, 8);
2126             dst_y[x] = get_bits(gb, 8);
2127             dst_u[x] = get_bits(gb, 8);
2128             dst_v[x] = get_bits(gb, 8);
2129         }
2130     } else {
2131         int pred[4] = { 125, 125, -128, -128 };
2132
2133         for (x = 0; x < avctx->width; x++) {
2134             int a, y, u, v;
2135
2136             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2137             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2138             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2139             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2140
2141             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
2142             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
2143             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
2144             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
2145         }
2146     }
2147
2148     dst_a += p->linesize[3];
2149     dst_y += p->linesize[0];
2150     dst_u += p->linesize[1];
2151     dst_v += p->linesize[2];
2152
2153     for (y = 1; y < avctx->height; y++) {
2154         if (get_bits1(gb)) {
2155             for (x = 0; x < avctx->width; x++) {
2156                 dst_a[x] = get_bits(gb, 8);
2157                 dst_y[x] = get_bits(gb, 8);
2158                 dst_u[x] = get_bits(gb, 8);
2159                 dst_v[x] = get_bits(gb, 8);
2160             }
2161         } else {
2162             int pred_TL[4], pred_L[4], pred_T[4];
2163             int a, y, u, v;
2164
2165             pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
2166             pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
2167             pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
2168             pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
2169
2170             for (x = 0; x < avctx->width; x++) {
2171                 pred_T[0] = dst_a[-p->linesize[3] + x];
2172                 pred_T[1] = dst_y[-p->linesize[0] + x];
2173                 pred_T[2] = dst_u[-p->linesize[1] + x];
2174                 pred_T[3] = dst_v[-p->linesize[2] + x];
2175
2176                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2177                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2178                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2179                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2180
2181                 dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2182                 dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2183                 dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2184                 dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
2185
2186                 pred_TL[0] = pred_T[0];
2187                 pred_TL[1] = pred_T[1];
2188                 pred_TL[2] = pred_T[2];
2189                 pred_TL[3] = pred_T[3];
2190             }
2191         }
2192
2193         dst_a += p->linesize[3];
2194         dst_y += p->linesize[0];
2195         dst_u += p->linesize[1];
2196         dst_v += p->linesize[2];
2197     }
2198 }
2199
2200 static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2201 {
2202     SheerVideoContext *s = avctx->priv_data;
2203     uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
2204     int x, y;
2205
2206     dst_r = (uint16_t *)p->data[2];
2207     dst_g = (uint16_t *)p->data[0];
2208     dst_b = (uint16_t *)p->data[1];
2209     dst_a = (uint16_t *)p->data[3];
2210
2211     if (get_bits1(gb)) {
2212         for (x = 0; x < avctx->width; x++) {
2213             dst_a[x] = get_bits(gb, 10);
2214             dst_r[x] = get_bits(gb, 10);
2215             dst_g[x] = get_bits(gb, 10);
2216             dst_b[x] = get_bits(gb, 10);
2217         }
2218     } else {
2219         int pred[4] = { 512, 512, 512, 512 };
2220
2221         for (x = 0; x < avctx->width; x++) {
2222             int r, g, b, a;
2223
2224             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2225             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2226             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2227             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2228
2229             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
2230             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
2231             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
2232             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
2233         }
2234     }
2235
2236     dst_r += p->linesize[2] / 2;
2237     dst_g += p->linesize[0] / 2;
2238     dst_b += p->linesize[1] / 2;
2239     dst_a += p->linesize[3] / 2;
2240
2241     for (y = 1; y < avctx->height; y++) {
2242         if (get_bits1(gb)) {
2243             for (x = 0; x < avctx->width; x++) {
2244                 dst_a[x] = get_bits(gb, 10);
2245                 dst_r[x] = get_bits(gb, 10);
2246                 dst_g[x] = get_bits(gb, 10);
2247                 dst_b[x] = get_bits(gb, 10);
2248             }
2249         } else {
2250             int pred_TL[4], pred_L[4], pred_T[4];
2251             int r, g, b, a;
2252
2253             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
2254             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
2255             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
2256             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
2257
2258             for (x = 0; x < avctx->width; x++) {
2259                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
2260                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
2261                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
2262                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
2263
2264                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2265                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2266                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2267                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2268
2269                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
2270                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
2271                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
2272                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
2273
2274                 pred_TL[0] = pred_T[0];
2275                 pred_TL[1] = pred_T[1];
2276                 pred_TL[2] = pred_T[2];
2277                 pred_TL[3] = pred_T[3];
2278             }
2279         }
2280
2281         dst_r += p->linesize[2] / 2;
2282         dst_g += p->linesize[0] / 2;
2283         dst_b += p->linesize[1] / 2;
2284         dst_a += p->linesize[3] / 2;
2285     }
2286 }
2287
2288 static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2289 {
2290     SheerVideoContext *s = avctx->priv_data;
2291     uint16_t *dst_r, *dst_g, *dst_b;
2292     int x, y;
2293
2294     dst_r = (uint16_t *)p->data[2];
2295     dst_g = (uint16_t *)p->data[0];
2296     dst_b = (uint16_t *)p->data[1];
2297
2298     if (get_bits1(gb)) {
2299         for (x = 0; x < avctx->width; x++) {
2300             dst_r[x] = get_bits(gb, 10);
2301             dst_g[x] = get_bits(gb, 10);
2302             dst_b[x] = get_bits(gb, 10);
2303         }
2304     } else {
2305         int pred[4] = { 512, 512, 512, 0 };
2306
2307         for (x = 0; x < avctx->width; x++) {
2308             int r, g, b;
2309
2310             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2311             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2312             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2313
2314             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
2315             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
2316             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
2317         }
2318     }
2319
2320     dst_r += p->linesize[2] / 2;
2321     dst_g += p->linesize[0] / 2;
2322     dst_b += p->linesize[1] / 2;
2323
2324     for (y = 1; y < avctx->height; y++) {
2325         if (get_bits1(gb)) {
2326             for (x = 0; x < avctx->width; x++) {
2327                 dst_r[x] = get_bits(gb, 10);
2328                 dst_g[x] = get_bits(gb, 10);
2329                 dst_b[x] = get_bits(gb, 10);
2330             }
2331         } else {
2332             int pred_TL[4], pred_L[4], pred_T[4];
2333             int r, g, b;
2334
2335             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
2336             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
2337             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
2338
2339             for (x = 0; x < avctx->width; x++) {
2340                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
2341                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
2342                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
2343
2344                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2345                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2346                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2347
2348                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
2349                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
2350                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
2351
2352                 pred_TL[0] = pred_T[0];
2353                 pred_TL[1] = pred_T[1];
2354                 pred_TL[2] = pred_T[2];
2355             }
2356         }
2357
2358         dst_r += p->linesize[2] / 2;
2359         dst_g += p->linesize[0] / 2;
2360         dst_b += p->linesize[1] / 2;
2361     }
2362 }
2363
2364 static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2365 {
2366     SheerVideoContext *s = avctx->priv_data;
2367     uint8_t *dst;
2368     int x, y;
2369
2370     dst = p->data[0];
2371     if (get_bits1(gb)) {
2372         for (x = 0; x < avctx->width; x++) {
2373             dst[x * 4 + 0] = get_bits(gb, 8);
2374             dst[x * 4 + 1] = get_bits(gb, 8);
2375             dst[x * 4 + 2] = get_bits(gb, 8);
2376             dst[x * 4 + 3] = get_bits(gb, 8);
2377         }
2378     } else {
2379         int pred[4] = { -128, -128, -128, -128 };
2380
2381         for (x = 0; x < avctx->width; x++) {
2382             int a, r, g, b;
2383
2384             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2385             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2386             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2387             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2388
2389             dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
2390             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
2391             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
2392             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
2393         }
2394     }
2395
2396     dst += p->linesize[0];
2397     for (y = 1; y < avctx->height; y++) {
2398         if (get_bits1(gb)) {
2399             for (x = 0; x < avctx->width; x++) {
2400                 dst[x * 4 + 0] = get_bits(gb, 8);
2401                 dst[x * 4 + 1] = get_bits(gb, 8);
2402                 dst[x * 4 + 2] = get_bits(gb, 8);
2403                 dst[x * 4 + 3] = get_bits(gb, 8);
2404             }
2405         } else {
2406             int pred_L[4];
2407             int a, r, g, b;
2408
2409             pred_L[0] = dst[-p->linesize[0] + 0];
2410             pred_L[1] = dst[-p->linesize[0] + 1];
2411             pred_L[2] = dst[-p->linesize[0] + 2];
2412             pred_L[3] = dst[-p->linesize[0] + 3];
2413
2414             for (x = 0; x < avctx->width; x++) {
2415                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2416                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2417                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2418                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2419
2420                 dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
2421                 dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
2422                 dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
2423                 dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
2424             }
2425         }
2426         dst += p->linesize[0];
2427     }
2428 }
2429
2430 static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2431 {
2432     SheerVideoContext *s = avctx->priv_data;
2433     uint8_t *dst;
2434     int x, y;
2435
2436     dst = p->data[0];
2437     if (get_bits1(gb)) {
2438         for (x = 0; x < avctx->width; x++) {
2439             dst[x * 4 + 0] = get_bits(gb, 8);
2440             dst[x * 4 + 1] = get_bits(gb, 8);
2441             dst[x * 4 + 2] = get_bits(gb, 8);
2442             dst[x * 4 + 3] = get_bits(gb, 8);
2443         }
2444     } else {
2445         int pred[4] = { -128, -128, -128, -128 };
2446
2447         for (x = 0; x < avctx->width; x++) {
2448             int a, r, g, b;
2449
2450             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2451             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2452             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2453             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2454
2455             dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
2456             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
2457             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
2458             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
2459         }
2460     }
2461
2462     dst += p->linesize[0];
2463     for (y = 1; y < avctx->height; y++) {
2464         if (get_bits1(gb)) {
2465             for (x = 0; x < avctx->width; x++) {
2466                 dst[x * 4 + 0] = get_bits(gb, 8);
2467                 dst[x * 4 + 1] = get_bits(gb, 8);
2468                 dst[x * 4 + 2] = get_bits(gb, 8);
2469                 dst[x * 4 + 3] = get_bits(gb, 8);
2470             }
2471         } else {
2472             int pred_TL[4], pred_L[4], pred_T[4];
2473             int a, r, g, b;
2474
2475             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2476             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2477             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2478             pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
2479
2480             for (x = 0; x < avctx->width; x++) {
2481                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2482                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2483                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2484                 pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
2485
2486                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2487                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2488                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2489                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2490
2491                 dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2492                 dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2493                 dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2494                 dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
2495
2496                 pred_TL[0] = pred_T[0];
2497                 pred_TL[1] = pred_T[1];
2498                 pred_TL[2] = pred_T[2];
2499                 pred_TL[3] = pred_T[3];
2500             }
2501         }
2502         dst += p->linesize[0];
2503     }
2504 }
2505
2506 static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2507 {
2508     SheerVideoContext *s = avctx->priv_data;
2509     uint8_t *dst;
2510     int x, y;
2511
2512     dst = p->data[0];
2513     if (get_bits1(gb)) {
2514         for (x = 0; x < avctx->width; x++) {
2515             dst[x * 4 + 0] = get_bits(gb, 8);
2516             dst[x * 4 + 1] = get_bits(gb, 8);
2517             dst[x * 4 + 2] = get_bits(gb, 8);
2518         }
2519     } else {
2520         int pred[4] = { -128, -128, -128, -128 };
2521
2522         for (x = 0; x < avctx->width; x++) {
2523             int r, g, b;
2524
2525             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2526             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2527             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2528
2529             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2530             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2531             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2532         }
2533     }
2534
2535     dst += p->linesize[0];
2536     for (y = 1; y < avctx->height; y++) {
2537         if (get_bits1(gb)) {
2538             for (x = 0; x < avctx->width; x++) {
2539                 dst[x * 4 + 0] = get_bits(gb, 8);
2540                 dst[x * 4 + 1] = get_bits(gb, 8);
2541                 dst[x * 4 + 2] = get_bits(gb, 8);
2542             }
2543         } else {
2544             int pred_L[4];
2545             int r, g, b;
2546
2547             pred_L[0] = dst[-p->linesize[0] + 0];
2548             pred_L[1] = dst[-p->linesize[0] + 1];
2549             pred_L[2] = dst[-p->linesize[0] + 2];
2550
2551             for (x = 0; x < avctx->width; x++) {
2552                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2553                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2554                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2555
2556                 dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
2557                 dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
2558                 dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
2559             }
2560         }
2561         dst += p->linesize[0];
2562     }
2563 }
2564
2565 static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2566 {
2567     SheerVideoContext *s = avctx->priv_data;
2568     uint8_t *dst;
2569     int x, y;
2570
2571     dst = p->data[0];
2572     if (get_bits1(gb)) {
2573         for (x = 0; x < avctx->width; x++) {
2574             dst[x * 4 + 0] = get_bits(gb, 8);
2575             dst[x * 4 + 1] = get_bits(gb, 8);
2576             dst[x * 4 + 2] = get_bits(gb, 8);
2577         }
2578     } else {
2579         int pred[4] = { -128, -128, -128, -128 };
2580
2581         for (x = 0; x < avctx->width; x++) {
2582             int r, g, b;
2583
2584             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2585             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2586             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2587
2588             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2589             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2590             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2591         }
2592     }
2593
2594     dst += p->linesize[0];
2595     for (y = 1; y < avctx->height; y++) {
2596         if (get_bits1(gb)) {
2597             for (x = 0; x < avctx->width; x++) {
2598                 dst[x * 4 + 0] = get_bits(gb, 8);
2599                 dst[x * 4 + 1] = get_bits(gb, 8);
2600                 dst[x * 4 + 2] = get_bits(gb, 8);
2601             }
2602         } else {
2603             int pred_TL[4], pred_L[4], pred_T[4];
2604             int r, g, b;
2605
2606             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2607             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2608             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2609
2610             for (x = 0; x < avctx->width; x++) {
2611                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2612                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2613                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2614
2615                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2616                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2617                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2618
2619                 dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2620                 dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2621                 dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2622
2623                 pred_TL[0] = pred_T[0];
2624                 pred_TL[1] = pred_T[1];
2625                 pred_TL[2] = pred_T[2];
2626             }
2627         }
2628         dst += p->linesize[0];
2629     }
2630 }
2631
2632 static int build_vlc(VLC *vlc, const uint8_t *len, int count)
2633 {
2634     uint32_t codes[1024];
2635     uint8_t bits[1024];
2636     uint16_t syms[1024];
2637     uint64_t index;
2638     int i;
2639
2640     index = 0;
2641     for (i = 0; i < count; i++) {
2642         codes[i]  = index >> (32 - len[i]);
2643         bits[i] = len[i];
2644         syms[i]  = i;
2645         index += 1ULL << (32 - len[i]);
2646     }
2647
2648     ff_free_vlc(vlc);
2649     return ff_init_vlc_sparse(vlc, 16, count,
2650                               bits,  sizeof(*bits),  sizeof(*bits),
2651                               codes, sizeof(*codes), sizeof(*codes),
2652                               syms,  sizeof(*syms),  sizeof(*syms), 0);
2653 }
2654
2655 static int decode_frame(AVCodecContext *avctx,
2656                         void *data, int *got_frame,
2657                         AVPacket *avpkt)
2658 {
2659     SheerVideoContext *s = avctx->priv_data;
2660     ThreadFrame frame = { .f = data };
2661     AVFrame *p = data;
2662     GetBitContext gb;
2663     unsigned format;
2664     int ret;
2665
2666     if (avpkt->size <= 20)
2667         return AVERROR_INVALIDDATA;
2668
2669     if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
2670         AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
2671         return AVERROR_INVALIDDATA;
2672
2673     format = AV_RL32(avpkt->data + 16);
2674     switch (format) {
2675     case MKTAG(' ', 'R', 'G', 'B'):
2676         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2677         s->decode_frame = decode_rgb;
2678         if (s->format != format) {
2679             build_vlc(&s->vlc[0], l_r_rgb, 256);
2680             build_vlc(&s->vlc[1], l_g_rgb, 256);
2681         }
2682         break;
2683     case MKTAG(' ', 'r', 'G', 'B'):
2684         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2685         s->decode_frame = decode_rgbi;
2686         if (s->format != format) {
2687             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2688             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2689         }
2690         break;
2691     case MKTAG('A', 'R', 'G', 'X'):
2692         avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
2693         s->decode_frame = decode_argx;
2694         if (s->format != format) {
2695             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2696             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2697         }
2698         break;
2699     case MKTAG('R', 'G', 'B', 'X'):
2700         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
2701         s->decode_frame = decode_rgbx;
2702         if (s->format != format) {
2703             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2704             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2705         }
2706         break;
2707     case MKTAG('A', 'R', 'G', 'B'):
2708         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2709         s->decode_frame = decode_argb;
2710         if (s->format != format) {
2711             build_vlc(&s->vlc[0], l_r_rgb, 256);
2712             build_vlc(&s->vlc[1], l_g_rgb, 256);
2713         }
2714         break;
2715     case MKTAG('A', 'r', 'G', 'B'):
2716         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2717         s->decode_frame = decode_argbi;
2718         if (s->format != format) {
2719             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2720             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2721         }
2722         break;
2723     case MKTAG('A', 'Y', 'B', 'R'):
2724     case MKTAG('A', 'Y', 'b', 'R'):
2725         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2726         s->decode_frame = decode_aybr;
2727         if (s->format != format) {
2728             build_vlc(&s->vlc[0], l_y_ybr, 256);
2729             build_vlc(&s->vlc[1], l_u_ybr, 256);
2730         }
2731         break;
2732     case MKTAG('A', 'y', 'B', 'R'):
2733     case MKTAG('A', 'y', 'b', 'R'):
2734         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2735         s->decode_frame = decode_aybri;
2736         if (s->format != format) {
2737             build_vlc(&s->vlc[0], l_y_ybri, 256);
2738             build_vlc(&s->vlc[1], l_u_ybri, 256);
2739         }
2740         break;
2741     case MKTAG(' ', 'Y', 'B', 'R'):
2742     case MKTAG(' ', 'Y', 'b', 'R'):
2743         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2744         s->decode_frame = decode_ybr;
2745         if (s->format != format) {
2746             build_vlc(&s->vlc[0], l_y_ybr, 256);
2747             build_vlc(&s->vlc[1], l_u_ybr, 256);
2748         }
2749         break;
2750     case MKTAG(' ', 'y', 'B', 'R'):
2751     case MKTAG(' ', 'y', 'b', 'R'):
2752         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2753         s->decode_frame = decode_ybri;
2754         if (s->format != format) {
2755             build_vlc(&s->vlc[0], l_y_ybri, 256);
2756             build_vlc(&s->vlc[1], l_u_ybri, 256);
2757         }
2758         break;
2759     case MKTAG('Y', 'B', 'R', 0x0a):
2760         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
2761         s->decode_frame = decode_ybr10;
2762         if (s->format != format) {
2763             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2764             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2765         }
2766         break;
2767     case MKTAG('y', 'B', 'R', 0x0a):
2768         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
2769         s->decode_frame = decode_ybr10i;
2770         if (s->format != format) {
2771             build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
2772             build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
2773         }
2774         break;
2775     case MKTAG('C', 'A', '4', 'p'):
2776         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
2777         s->decode_frame = decode_ca4p;
2778         if (s->format != format) {
2779             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2780             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2781         }
2782         break;
2783     case MKTAG('C', 'A', '4', 'i'):
2784         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
2785         s->decode_frame = decode_ca4i;
2786         if (s->format != format) {
2787             build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
2788             build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
2789         }
2790         break;
2791     case MKTAG('B', 'Y', 'R', 'Y'):
2792         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2793         s->decode_frame = decode_byry;
2794         if (s->format != format) {
2795             build_vlc(&s->vlc[0], l_y_byry, 256);
2796             build_vlc(&s->vlc[1], l_u_byry, 256);
2797         }
2798         break;
2799     case MKTAG('B', 'Y', 'R', 'y'):
2800         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2801         s->decode_frame = decode_byryi;
2802         if (s->format != format) {
2803             build_vlc(&s->vlc[0], l_y_byryi, 256);
2804             build_vlc(&s->vlc[1], l_u_byryi, 256);
2805         }
2806         break;
2807     case MKTAG('Y', 'b', 'Y', 'r'):
2808         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2809         s->decode_frame = decode_ybyr;
2810         if (s->format != format) {
2811             build_vlc(&s->vlc[0], l_y_ybyr, 256);
2812             build_vlc(&s->vlc[1], l_u_ybyr, 256);
2813         }
2814         break;
2815     case MKTAG('C', '8', '2', 'p'):
2816         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2817         s->decode_frame = decode_c82p;
2818         if (s->format != format) {
2819             build_vlc(&s->vlc[0], l_y_byry, 256);
2820             build_vlc(&s->vlc[1], l_u_byry, 256);
2821         }
2822         break;
2823     case MKTAG('C', '8', '2', 'i'):
2824         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2825         s->decode_frame = decode_c82i;
2826         if (s->format != format) {
2827             build_vlc(&s->vlc[0], l_y_byryi, 256);
2828             build_vlc(&s->vlc[1], l_u_byryi, 256);
2829         }
2830         break;
2831     case MKTAG(0xa2, 'Y', 'R', 'Y'):
2832         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2833         s->decode_frame = decode_yry10;
2834         if (s->format != format) {
2835             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2836             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2837         }
2838         break;
2839     case MKTAG(0xa2, 'Y', 'R', 'y'):
2840         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2841         s->decode_frame = decode_yry10i;
2842         if (s->format != format) {
2843             build_vlc(&s->vlc[0], l_y_yry10i, 1024);
2844             build_vlc(&s->vlc[1], l_u_yry10i, 1024);
2845         }
2846         break;
2847     case MKTAG('C', 'A', '2', 'p'):
2848         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2849         s->decode_frame = decode_ca2p;
2850         if (s->format != format) {
2851             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2852             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2853         }
2854         break;
2855     case MKTAG('C', 'A', '2', 'i'):
2856         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2857         s->decode_frame = decode_ca2i;
2858         if (s->format != format) {
2859             build_vlc(&s->vlc[0], l_y_yry10i, 1024);
2860             build_vlc(&s->vlc[1], l_u_yry10i, 1024);
2861         }
2862         break;
2863     default:
2864         avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
2865         return AVERROR_PATCHWELCOME;
2866     }
2867     s->format = format;
2868
2869     p->pict_type = AV_PICTURE_TYPE_I;
2870     p->key_frame = 1;
2871
2872     if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2873         return ret;
2874
2875     if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
2876         return ret;
2877
2878     s->decode_frame(avctx, p, &gb);
2879
2880     *got_frame = 1;
2881
2882     return avpkt->size;
2883 }
2884
2885 #if HAVE_THREADS
2886 static int decode_init_thread_copy(AVCodecContext *avctx)
2887 {
2888     SheerVideoContext *s = avctx->priv_data;
2889
2890     s->format = 0;
2891     memset(&s->vlc[0], 0, sizeof(s->vlc[0]));
2892     memset(&s->vlc[1], 0, sizeof(s->vlc[1]));
2893
2894     return 0;
2895 }
2896 #endif
2897
2898 static av_cold int decode_end(AVCodecContext *avctx)
2899 {
2900     SheerVideoContext *s = avctx->priv_data;
2901
2902     ff_free_vlc(&s->vlc[0]);
2903     ff_free_vlc(&s->vlc[1]);
2904
2905     return 0;
2906 }
2907
2908 AVCodec ff_sheervideo_decoder = {
2909     .name             = "sheervideo",
2910     .long_name        = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
2911     .type             = AVMEDIA_TYPE_VIDEO,
2912     .id               = AV_CODEC_ID_SHEERVIDEO,
2913     .priv_data_size   = sizeof(SheerVideoContext),
2914     .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
2915     .close            = decode_end,
2916     .decode           = decode_frame,
2917     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2918 };