avcodec/sheervideo: add support for 10-bit interlaced YCbCr(A) 4:4:4(:4)
[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_u_yry10[1024] = {
698      2,  3,  3,  4,  5,  6,  7,  7,  8,  8,  8,  9,  9, 10, 10, 10,
699     10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
700     13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
701     14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
702     15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
703     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
704     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
705     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
706     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
707     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
708     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
709     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
710     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
711     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
712     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
713     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
714     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
715     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
716     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
717     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
718     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
719     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 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, 16, 16, 16, 16, 16, 16, 16, 16, 16,
741     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
742     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
743     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
744     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
745     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
746     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
747     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
748     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
749     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
750     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
751     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
752     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
753     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
754     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
755     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
756     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
757     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
758     16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
759     15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13,
760     13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11,
761     10, 10, 10, 10,  9,  9,  9,  8,  8,  7,  7,  6,  5,  4,  4,  3,
762 };
763
764 static const uint8_t l_y_ybri[256] = {
765      3,  3,  4,  4,  5,  5,  6,  6,  6,  7,  7,  7,  7,  7,  8,  8,
766      8,  8,  8,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
767     10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
768     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
769     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
770     14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
771     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
772     15, 15, 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, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
775     15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
776     14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
777     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
778     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10,
779     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
780      8,  8,  8,  7,  7,  7,  7,  7,  6,  6,  6,  5,  5,  5,  4,  3,
781 };
782
783 static const uint8_t l_u_ybri[256] = {
784      1,  3,  5,  6,  8,  8,  9, 10, 10, 11, 11, 12, 12, 13, 13, 13,
785     14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 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, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14,
799     14, 13, 13, 13, 12, 12, 11, 11, 10, 10,  9,  8,  8,  6,  5,  2,
800 };
801
802 static const uint8_t l_y_byryi[256] = {
803      3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  7,  7,  7,  7,  8,  8,
804      8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10,
805     10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
806     12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13,
807     13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
808     14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,
809     15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
810     15, 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, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
813     15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
814     14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
815     13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12,
816     12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10,
817     10, 10, 10, 10, 10, 10, 10,  9,  9,  9,  9,  9,  9,  9,  8,  8,
818      8,  8,  8,  7,  7,  7,  7,  7,  7,  6,  6,  6,  5,  4,  4,  3,
819 };
820
821 static const uint8_t l_u_byryi[256] = {
822      1,  3,  4,  6,  6,  7,  8,  8,  9,  9, 10, 10, 10, 11, 11, 11,
823     12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15,
824     15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
825     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
826     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
827     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
828     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
829     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
830     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
831     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
832     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
833     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
834     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
835     16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15,
836     15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12,
837     12, 11, 11, 11, 10, 10, 10,  9,  9,  8,  8,  7,  7,  5,  4,  3,
838 };
839
840 static void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
841 {
842     SheerVideoContext *s = avctx->priv_data;
843     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
844     int x, y;
845
846     dst_a = (uint16_t *)p->data[3];
847     dst_y = (uint16_t *)p->data[0];
848     dst_u = (uint16_t *)p->data[1];
849     dst_v = (uint16_t *)p->data[2];
850
851     for (y = 0; y < avctx->height; y++) {
852         if (get_bits1(gb)) {
853             for (x = 0; x < avctx->width; x++) {
854                 dst_a[x] = get_bits(gb, 10);
855                 dst_y[x] = get_bits(gb, 10);
856                 dst_u[x] = get_bits(gb, 10);
857                 dst_v[x] = get_bits(gb, 10);
858             }
859         } else {
860             int pred[4] = { 502, 512, 512, 502 };
861
862             for (x = 0; x < avctx->width; x++) {
863                 int y, u, v, a;
864
865                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
866                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
867                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
868                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
869
870                 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
871                 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
872                 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
873                 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
874             }
875         }
876
877         dst_y += p->linesize[0] / 2;
878         dst_u += p->linesize[1] / 2;
879         dst_v += p->linesize[2] / 2;
880         dst_a += p->linesize[3] / 2;
881     }
882 }
883
884 static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
885 {
886     SheerVideoContext *s = avctx->priv_data;
887     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
888     int x, y;
889
890     dst_a = (uint16_t *)p->data[3];
891     dst_y = (uint16_t *)p->data[0];
892     dst_u = (uint16_t *)p->data[1];
893     dst_v = (uint16_t *)p->data[2];
894
895     if (get_bits1(gb)) {
896         for (x = 0; x < avctx->width; x++) {
897             dst_a[x] = get_bits(gb, 10);
898             dst_y[x] = get_bits(gb, 10);
899             dst_u[x] = get_bits(gb, 10);
900             dst_v[x] = get_bits(gb, 10);
901         }
902     } else {
903         int pred[4] = { 502, 512, 512, 502 };
904
905         for (x = 0; x < avctx->width; x++) {
906             int y, u, v, a;
907
908             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
909             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
910             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
911             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
912
913             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
914             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
915             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
916             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
917         }
918     }
919
920     dst_y += p->linesize[0] / 2;
921     dst_u += p->linesize[1] / 2;
922     dst_v += p->linesize[2] / 2;
923     dst_a += p->linesize[3] / 2;
924
925     for (y = 1; y < avctx->height; y++) {
926         if (get_bits1(gb)) {
927             for (x = 0; x < avctx->width; x++) {
928                 dst_a[x] = get_bits(gb, 10);
929                 dst_y[x] = get_bits(gb, 10);
930                 dst_u[x] = get_bits(gb, 10);
931                 dst_v[x] = get_bits(gb, 10);
932             }
933         } else {
934             int pred_TL[4], pred_L[4], pred_T[4];
935             int y, u, v, a;
936
937             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
938             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
939             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
940             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
941
942             for (x = 0; x < avctx->width; x++) {
943                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
944                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
945                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
946                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
947
948                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
949                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
950                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
951                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
952
953                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
954                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
955                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
956                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
957
958                 pred_TL[0] = pred_T[0];
959                 pred_TL[1] = pred_T[1];
960                 pred_TL[2] = pred_T[2];
961                 pred_TL[3] = pred_T[3];
962             }
963         }
964
965         dst_y += p->linesize[0] / 2;
966         dst_u += p->linesize[1] / 2;
967         dst_v += p->linesize[2] / 2;
968         dst_a += p->linesize[3] / 2;
969     }
970 }
971
972 static void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
973 {
974     SheerVideoContext *s = avctx->priv_data;
975     uint16_t *dst_y, *dst_u, *dst_v;
976     int x, y;
977
978     dst_y = (uint16_t *)p->data[0];
979     dst_u = (uint16_t *)p->data[1];
980     dst_v = (uint16_t *)p->data[2];
981
982     for (y = 0; y < avctx->height; y++) {
983         if (get_bits1(gb)) {
984             for (x = 0; x < avctx->width; x++) {
985                 dst_y[x] = get_bits(gb, 10);
986                 dst_u[x] = get_bits(gb, 10);
987                 dst_v[x] = get_bits(gb, 10);
988             }
989         } else {
990             int pred[4] = { 502, 512, 512, 512 };
991
992             for (x = 0; x < avctx->width; x++) {
993                 int y, u, v;
994
995                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
996                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
997                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
998
999                 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1000                 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1001                 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1002             }
1003         }
1004
1005         dst_y += p->linesize[0] / 2;
1006         dst_u += p->linesize[1] / 2;
1007         dst_v += p->linesize[2] / 2;
1008     }
1009 }
1010
1011 static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1012 {
1013     SheerVideoContext *s = avctx->priv_data;
1014     uint16_t *dst_y, *dst_u, *dst_v;
1015     int x, y;
1016
1017     dst_y = (uint16_t *)p->data[0];
1018     dst_u = (uint16_t *)p->data[1];
1019     dst_v = (uint16_t *)p->data[2];
1020
1021     if (get_bits1(gb)) {
1022         for (x = 0; x < avctx->width; x++) {
1023             dst_y[x] = get_bits(gb, 10);
1024             dst_u[x] = get_bits(gb, 10);
1025             dst_v[x] = get_bits(gb, 10);
1026         }
1027     } else {
1028         int pred[4] = { 502, 512, 512, 512 };
1029
1030         for (x = 0; x < avctx->width; x++) {
1031             int y, u, v;
1032
1033             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1034             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1035             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1036
1037             dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
1038             dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
1039             dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
1040         }
1041     }
1042
1043     dst_y += p->linesize[0] / 2;
1044     dst_u += p->linesize[1] / 2;
1045     dst_v += p->linesize[2] / 2;
1046
1047     for (y = 1; y < avctx->height; y++) {
1048         if (get_bits1(gb)) {
1049             for (x = 0; x < avctx->width; x++) {
1050                 dst_y[x] = get_bits(gb, 10);
1051                 dst_u[x] = get_bits(gb, 10);
1052                 dst_v[x] = get_bits(gb, 10);
1053             }
1054         } else {
1055             int pred_TL[4], pred_L[4], pred_T[4];
1056             int y, u, v;
1057
1058             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1059             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1060             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1061
1062             for (x = 0; x < avctx->width; x++) {
1063                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1064                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
1065                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
1066
1067                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1068                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1069                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1070
1071                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1072                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1073                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1074
1075                 pred_TL[0] = pred_T[0];
1076                 pred_TL[1] = pred_T[1];
1077                 pred_TL[2] = pred_T[2];
1078             }
1079         }
1080
1081         dst_y += p->linesize[0] / 2;
1082         dst_u += p->linesize[1] / 2;
1083         dst_v += p->linesize[2] / 2;
1084     }
1085 }
1086
1087 static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1088 {
1089     SheerVideoContext *s = avctx->priv_data;
1090     uint16_t *dst_y, *dst_u, *dst_v;
1091     int x, y;
1092
1093     dst_y = (uint16_t *)p->data[0];
1094     dst_u = (uint16_t *)p->data[1];
1095     dst_v = (uint16_t *)p->data[2];
1096
1097     if (get_bits1(gb)) {
1098         for (x = 0; x < avctx->width; x += 2) {
1099             dst_y[x    ] = get_bits(gb, 10);
1100             dst_u[x / 2] = get_bits(gb, 10);
1101             dst_y[x + 1] = get_bits(gb, 10);
1102             dst_v[x / 2] = get_bits(gb, 10);
1103         }
1104     } else {
1105         int pred[4] = { 502, 512, 512, 0 };
1106
1107         for (x = 0; x < avctx->width; x += 2) {
1108             int y1, y2, u, v;
1109
1110             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1111             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1112             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1113             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1114
1115             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1116             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1117             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1118             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1119         }
1120     }
1121
1122     dst_y += p->linesize[0] / 2;
1123     dst_u += p->linesize[1] / 2;
1124     dst_v += p->linesize[2] / 2;
1125
1126     for (y = 1; y < avctx->height; y++) {
1127         if (get_bits1(gb)) {
1128             for (x = 0; x < avctx->width; x += 2) {
1129                 dst_y[x    ] = get_bits(gb, 10);
1130                 dst_u[x / 2] = get_bits(gb, 10);
1131                 dst_y[x + 1] = get_bits(gb, 10);
1132                 dst_v[x / 2] = get_bits(gb, 10);
1133             }
1134         } else {
1135             int pred_TL[6], pred_L[6], pred_T[6];
1136             int y1, y2, u, v;
1137
1138             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1139             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1140             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1141
1142             for (x = 0; x < avctx->width; x += 2) {
1143                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1144                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
1145                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
1146                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
1147
1148                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1149                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1150                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1151                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1152
1153                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1154                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
1155                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
1156                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
1157
1158                 pred_TL[0] = pred_T[3];
1159                 pred_TL[1] = pred_T[1];
1160                 pred_TL[2] = pred_T[2];
1161             }
1162         }
1163
1164         dst_y += p->linesize[0] / 2;
1165         dst_u += p->linesize[1] / 2;
1166         dst_v += p->linesize[2] / 2;
1167     }
1168 }
1169
1170 static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1171 {
1172     SheerVideoContext *s = avctx->priv_data;
1173     uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
1174     int x, y;
1175
1176     dst_y = (uint16_t *)p->data[0];
1177     dst_u = (uint16_t *)p->data[1];
1178     dst_v = (uint16_t *)p->data[2];
1179     dst_a = (uint16_t *)p->data[3];
1180
1181     if (get_bits1(gb)) {
1182         for (x = 0; x < avctx->width; x += 2) {
1183             dst_a[x    ] = get_bits(gb, 10);
1184             dst_y[x    ] = get_bits(gb, 10);
1185             dst_u[x / 2] = get_bits(gb, 10);
1186             dst_a[x + 1] = get_bits(gb, 10);
1187             dst_y[x + 1] = get_bits(gb, 10);
1188             dst_v[x / 2] = get_bits(gb, 10);
1189         }
1190     } else {
1191         int pred[4] = { 502, 512, 512, 502 };
1192
1193         for (x = 0; x < avctx->width; x += 2) {
1194             int y1, y2, u, v, a1, a2;
1195
1196             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1197             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1198             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1199             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1200             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1201             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1202
1203             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
1204             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
1205             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
1206             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
1207             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
1208             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
1209         }
1210     }
1211
1212     dst_y += p->linesize[0] / 2;
1213     dst_u += p->linesize[1] / 2;
1214     dst_v += p->linesize[2] / 2;
1215     dst_a += p->linesize[3] / 2;
1216
1217     for (y = 1; y < avctx->height; y++) {
1218         if (get_bits1(gb)) {
1219             for (x = 0; x < avctx->width; x += 2) {
1220                 dst_a[x    ] = get_bits(gb, 10);
1221                 dst_y[x    ] = get_bits(gb, 10);
1222                 dst_u[x / 2] = get_bits(gb, 10);
1223                 dst_a[x + 1] = get_bits(gb, 10);
1224                 dst_y[x + 1] = get_bits(gb, 10);
1225                 dst_v[x / 2] = get_bits(gb, 10);
1226             }
1227         } else {
1228             int pred_TL[6], pred_L[6], pred_T[6];
1229             int y1, y2, u, v, a1, a2;
1230
1231             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
1232             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
1233             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
1234             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
1235
1236             for (x = 0; x < avctx->width; x += 2) {
1237                 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
1238                 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
1239                 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
1240                 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
1241                 pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
1242                 pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
1243
1244                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
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                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1248                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1249                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1250
1251                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1252                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
1253                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
1254                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
1255                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
1256                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
1257
1258                 pred_TL[0] = pred_T[3];
1259                 pred_TL[1] = pred_T[1];
1260                 pred_TL[2] = pred_T[2];
1261                 pred_TL[4] = pred_T[5];
1262             }
1263         }
1264
1265         dst_y += p->linesize[0] / 2;
1266         dst_u += p->linesize[1] / 2;
1267         dst_v += p->linesize[2] / 2;
1268         dst_a += p->linesize[3] / 2;
1269     }
1270 }
1271
1272 static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1273 {
1274     SheerVideoContext *s = avctx->priv_data;
1275     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1276     int x, y;
1277
1278     dst_y = p->data[0];
1279     dst_u = p->data[1];
1280     dst_v = p->data[2];
1281     dst_a = p->data[3];
1282
1283     for (y = 0; y < avctx->height; y += 1) {
1284         if (get_bits1(gb)) {
1285             for (x = 0; x < avctx->width; x += 2) {
1286                 dst_a[x    ] = get_bits(gb, 8);
1287                 dst_y[x    ] = get_bits(gb, 8);
1288                 dst_u[x / 2] = get_bits(gb, 8);
1289                 dst_a[x + 1] = get_bits(gb, 8);
1290                 dst_y[x + 1] = get_bits(gb, 8);
1291                 dst_v[x / 2] = get_bits(gb, 8);
1292             }
1293         } else {
1294             int pred[4] = { 125, -128, -128, 125 };
1295
1296             for (x = 0; x < avctx->width; x += 2) {
1297                 int y1, y2, u, v, a1, a2;
1298
1299                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1300                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1301                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1302                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1303                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1304                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1305
1306                 dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1307                 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1308                 dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1309                 dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1310                 dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1311                 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1312             }
1313         }
1314
1315         dst_y += p->linesize[0];
1316         dst_u += p->linesize[1];
1317         dst_v += p->linesize[2];
1318         dst_a += p->linesize[3];
1319     }
1320 }
1321
1322 static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1323 {
1324     SheerVideoContext *s = avctx->priv_data;
1325     uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
1326     int x, y;
1327
1328     dst_y = p->data[0];
1329     dst_u = p->data[1];
1330     dst_v = p->data[2];
1331     dst_a = p->data[3];
1332
1333     if (get_bits1(gb)) {
1334         for (x = 0; x < avctx->width; x += 2) {
1335             dst_a[x    ] = get_bits(gb, 8);
1336             dst_y[x    ] = get_bits(gb, 8);
1337             dst_u[x / 2] = get_bits(gb, 8);
1338             dst_a[x + 1] = get_bits(gb, 8);
1339             dst_y[x + 1] = get_bits(gb, 8);
1340             dst_v[x / 2] = get_bits(gb, 8);
1341         }
1342     } else {
1343         int pred[4] = { 125, -128, -128, 125 };
1344
1345         for (x = 0; x < avctx->width; x += 2) {
1346             int y1, y2, u, v, a1, a2;
1347
1348             a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1349             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1350             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1351             a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1352             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1353             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1354
1355             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1356             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1357             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1358             dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
1359             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1360             dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
1361         }
1362     }
1363
1364     dst_y += p->linesize[0];
1365     dst_u += p->linesize[1];
1366     dst_v += p->linesize[2];
1367     dst_a += p->linesize[3];
1368
1369     for (y = 1; y < avctx->height; y++) {
1370         if (get_bits1(gb)) {
1371             for (x = 0; x < avctx->width; x += 2) {
1372                 dst_a[x    ] = get_bits(gb, 8);
1373                 dst_y[x    ] = get_bits(gb, 8);
1374                 dst_u[x / 2] = get_bits(gb, 8);
1375                 dst_a[x + 1] = get_bits(gb, 8);
1376                 dst_y[x + 1] = get_bits(gb, 8);
1377                 dst_v[x / 2] = get_bits(gb, 8);
1378             }
1379         } else {
1380             int pred_TL[6], pred_L[6], pred_T[6];
1381             int y1, y2, u, v, a1, a2;
1382
1383             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1384             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1385             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1386             pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
1387
1388             for (x = 0; x < avctx->width; x += 2) {
1389                 pred_T[0] = dst_y[-p->linesize[0] + x];
1390                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1391                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1392                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1393                 pred_T[4] = dst_a[-p->linesize[3] + x];
1394                 pred_T[5] = dst_a[-p->linesize[3] + x + 1];
1395
1396                 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1397                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1398                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1399                 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1400                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1401                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1402
1403                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1404                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1405                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1406                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1407                 dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
1408                 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
1409
1410                 pred_TL[0] = pred_T[3];
1411                 pred_TL[1] = pred_T[1];
1412                 pred_TL[2] = pred_T[2];
1413                 pred_TL[4] = pred_T[5];
1414             }
1415         }
1416
1417         dst_y += p->linesize[0];
1418         dst_u += p->linesize[1];
1419         dst_v += p->linesize[2];
1420         dst_a += p->linesize[3];
1421     }
1422 }
1423
1424 static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1425 {
1426     SheerVideoContext *s = avctx->priv_data;
1427     uint8_t *dst_y, *dst_u, *dst_v;
1428     int x, y;
1429
1430     dst_y = p->data[0];
1431     dst_u = p->data[1];
1432     dst_v = p->data[2];
1433
1434     if (get_bits1(gb)) {
1435         for (x = 0; x < avctx->width; x += 2) {
1436             dst_y[x    ] = get_bits(gb, 8);
1437             dst_u[x / 2] = get_bits(gb, 8);
1438             dst_y[x + 1] = get_bits(gb, 8);
1439             dst_v[x / 2] = get_bits(gb, 8);
1440         }
1441     } else {
1442         int pred[4] = { -128, 128, 128, 0 };
1443
1444         for (x = 0; x < avctx->width; x += 2) {
1445             int y1, y2, u, v;
1446
1447             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1448             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1449             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1450             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1451
1452             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1453             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1454             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1455             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1456         }
1457     }
1458
1459     dst_y += p->linesize[0];
1460     dst_u += p->linesize[1];
1461     dst_v += p->linesize[2];
1462
1463     for (y = 1; y < avctx->height; y++) {
1464         if (get_bits1(gb)) {
1465             for (x = 0; x < avctx->width; x += 2) {
1466                 dst_y[x    ] = get_bits(gb, 8);
1467                 dst_u[x / 2] = get_bits(gb, 8);
1468                 dst_y[x + 1] = get_bits(gb, 8);
1469                 dst_v[x / 2] = get_bits(gb, 8);
1470             }
1471         } else {
1472             int pred_TL[4], pred_L[4], pred_T[4];
1473             int y1, y2, u, v;
1474
1475             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1476             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1477             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1478
1479             for (x = 0; x < avctx->width; x += 2) {
1480                 pred_T[0] = dst_y[-p->linesize[0] + x];
1481                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1482                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1483                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1484
1485                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1486                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1487                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1488                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1489
1490                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1491                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1492                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1493                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1494
1495                 pred_TL[0] = pred_T[3];
1496                 pred_TL[1] = pred_T[1];
1497                 pred_TL[2] = pred_T[2];
1498             }
1499         }
1500
1501         dst_y += p->linesize[0];
1502         dst_u += p->linesize[1];
1503         dst_v += p->linesize[2];
1504     }
1505 }
1506
1507 static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1508 {
1509     SheerVideoContext *s = avctx->priv_data;
1510     uint8_t *dst_y, *dst_u, *dst_v;
1511     int x, y;
1512
1513     dst_y = p->data[0];
1514     dst_u = p->data[1];
1515     dst_v = p->data[2];
1516
1517     if (get_bits1(gb)) {
1518         for (x = 0; x < avctx->width; x += 2) {
1519             dst_y[x    ] = get_bits(gb, 8);
1520             dst_u[x / 2] = get_bits(gb, 8);
1521             dst_y[x + 1] = get_bits(gb, 8);
1522             dst_v[x / 2] = get_bits(gb, 8);
1523         }
1524     } else {
1525         int pred[4] = { 125, -128, -128, 0 };
1526
1527         for (x = 0; x < avctx->width; x += 2) {
1528             int y1, y2, u, v;
1529
1530             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1531             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1532             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1533             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1534
1535             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1536             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1537             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1538             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1539         }
1540     }
1541
1542     dst_y += p->linesize[0];
1543     dst_u += p->linesize[1];
1544     dst_v += p->linesize[2];
1545
1546     for (y = 1; y < avctx->height; y++) {
1547         if (get_bits1(gb)) {
1548             for (x = 0; x < avctx->width; x += 2) {
1549                 dst_y[x    ] = get_bits(gb, 8);
1550                 dst_u[x / 2] = get_bits(gb, 8);
1551                 dst_y[x + 1] = get_bits(gb, 8);
1552                 dst_v[x / 2] = get_bits(gb, 8);
1553             }
1554         } else {
1555             int pred_L[4];
1556             int y1, y2, u, v;
1557
1558             pred_L[0] = dst_y[-p->linesize[0]];
1559             pred_L[1] = dst_u[-p->linesize[1]];
1560             pred_L[2] = dst_v[-p->linesize[2]];
1561
1562             for (x = 0; x < avctx->width; x += 2) {
1563                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1564                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1565                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1566                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1567
1568                 dst_y[x    ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
1569                 dst_u[x / 2] = pred_L[1] = (u  + pred_L[1]) & 0xff;
1570                 dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
1571                 dst_v[x / 2] = pred_L[2] = (v +  pred_L[2]) & 0xff;
1572             }
1573         }
1574
1575         dst_y += p->linesize[0];
1576         dst_u += p->linesize[1];
1577         dst_v += p->linesize[2];
1578     }
1579 }
1580
1581 static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1582 {
1583     SheerVideoContext *s = avctx->priv_data;
1584     uint8_t *dst_y, *dst_u, *dst_v;
1585     int x, y;
1586
1587     dst_y = p->data[0];
1588     dst_u = p->data[1];
1589     dst_v = p->data[2];
1590
1591     if (get_bits1(gb)) {
1592         for (x = 0; x < avctx->width; x += 2) {
1593             dst_y[x    ] = get_bits(gb, 8);
1594             dst_u[x / 2] = get_bits(gb, 8);
1595             dst_y[x + 1] = get_bits(gb, 8);
1596             dst_v[x / 2] = get_bits(gb, 8);
1597         }
1598     } else {
1599         int pred[4] = { 125, -128, -128, 0 };
1600
1601         for (x = 0; x < avctx->width; x += 2) {
1602             int y1, y2, u, v;
1603
1604             y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1605             u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1606             y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1607             v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1608
1609             dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
1610             dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
1611             dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
1612             dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
1613         }
1614     }
1615
1616     dst_y += p->linesize[0];
1617     dst_u += p->linesize[1];
1618     dst_v += p->linesize[2];
1619
1620     for (y = 1; y < avctx->height; y++) {
1621         if (get_bits1(gb)) {
1622             for (x = 0; x < avctx->width; x += 2) {
1623                 dst_y[x    ] = get_bits(gb, 8);
1624                 dst_u[x / 2] = get_bits(gb, 8);
1625                 dst_y[x + 1] = get_bits(gb, 8);
1626                 dst_v[x / 2] = get_bits(gb, 8);
1627             }
1628         } else {
1629             int pred_TL[4], pred_L[4], pred_T[4];
1630             int y1, y2, u, v;
1631
1632             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1633             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1634             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1635
1636             for (x = 0; x < avctx->width; x += 2) {
1637                 pred_T[0] = dst_y[-p->linesize[0] + x];
1638                 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
1639                 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
1640                 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
1641
1642                 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1643                 u  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1644                 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1645                 v  = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1646
1647                 dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1648                 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
1649                 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
1650                 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
1651
1652                 pred_TL[0] = pred_T[3];
1653                 pred_TL[1] = pred_T[1];
1654                 pred_TL[2] = pred_T[2];
1655             }
1656         }
1657
1658         dst_y += p->linesize[0];
1659         dst_u += p->linesize[1];
1660         dst_v += p->linesize[2];
1661     }
1662 }
1663
1664 static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1665 {
1666     SheerVideoContext *s = avctx->priv_data;
1667     uint8_t *dst_y, *dst_u, *dst_v;
1668     int x, y;
1669
1670     dst_y = p->data[0];
1671     dst_u = p->data[1];
1672     dst_v = p->data[2];
1673
1674     if (get_bits1(gb)) {
1675         for (x = 0; x < avctx->width; x++) {
1676             dst_y[x] = get_bits(gb, 8);
1677             dst_u[x] = get_bits(gb, 8);
1678             dst_v[x] = get_bits(gb, 8);
1679         }
1680     } else {
1681         int pred[4] = { 125, -128, -128, -128 };
1682
1683         for (x = 0; x < avctx->width; x++) {
1684             int y, u, v;
1685
1686             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1687             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1688             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1689
1690             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1691             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1692             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1693         }
1694     }
1695
1696     dst_y += p->linesize[0];
1697     dst_u += p->linesize[1];
1698     dst_v += p->linesize[2];
1699
1700     for (y = 1; y < avctx->height; y++) {
1701         if (get_bits1(gb)) {
1702             for (x = 0; x < avctx->width; x++) {
1703                 dst_y[x] = get_bits(gb, 8);
1704                 dst_u[x] = get_bits(gb, 8);
1705                 dst_v[x] = get_bits(gb, 8);
1706             }
1707         } else {
1708             int pred_L[4];
1709             int y, u, v;
1710
1711             pred_L[0] = dst_y[-p->linesize[0]];
1712             pred_L[1] = dst_u[-p->linesize[1]];
1713             pred_L[2] = dst_v[-p->linesize[2]];
1714
1715             for (x = 0; x < avctx->width; x++) {
1716                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1717                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1718                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1719
1720                 dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1721                 dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1722                 dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1723             }
1724         }
1725
1726         dst_y += p->linesize[0];
1727         dst_u += p->linesize[1];
1728         dst_v += p->linesize[2];
1729     }
1730 }
1731
1732 static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1733 {
1734     SheerVideoContext *s = avctx->priv_data;
1735     uint8_t *dst_y, *dst_u, *dst_v;
1736     int x, y;
1737
1738     dst_y = p->data[0];
1739     dst_u = p->data[1];
1740     dst_v = p->data[2];
1741
1742     if (get_bits1(gb)) {
1743         for (x = 0; x < avctx->width; x++) {
1744             dst_y[x] = get_bits(gb, 8);
1745             dst_u[x] = get_bits(gb, 8);
1746             dst_v[x] = get_bits(gb, 8);
1747         }
1748     } else {
1749         int pred[4] = { 125, -128, -128, -128 };
1750
1751         for (x = 0; x < avctx->width; x++) {
1752             int y, u, v;
1753
1754             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1755             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1756             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1757
1758             dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1759             dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1760             dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1761         }
1762     }
1763
1764     dst_y += p->linesize[0];
1765     dst_u += p->linesize[1];
1766     dst_v += p->linesize[2];
1767
1768     for (y = 1; y < avctx->height; y++) {
1769         if (get_bits1(gb)) {
1770             for (x = 0; x < avctx->width; x++) {
1771                 dst_y[x] = get_bits(gb, 8);
1772                 dst_u[x] = get_bits(gb, 8);
1773                 dst_v[x] = get_bits(gb, 8);
1774             }
1775         } else {
1776             int pred_TL[4], pred_L[4], pred_T[4];
1777             int y, u, v;
1778
1779             pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1780             pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1781             pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1782
1783             for (x = 0; x < avctx->width; x++) {
1784                 pred_T[0] = dst_y[-p->linesize[0] + x];
1785                 pred_T[1] = dst_u[-p->linesize[1] + x];
1786                 pred_T[2] = dst_v[-p->linesize[2] + x];
1787
1788                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1789                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1790                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1791
1792                 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1793                 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1794                 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1795
1796                 pred_TL[0] = pred_T[0];
1797                 pred_TL[1] = pred_T[1];
1798                 pred_TL[2] = pred_T[2];
1799             }
1800         }
1801
1802         dst_y += p->linesize[0];
1803         dst_u += p->linesize[1];
1804         dst_v += p->linesize[2];
1805     }
1806 }
1807
1808 static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1809 {
1810     SheerVideoContext *s = avctx->priv_data;
1811     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1812     int x, y;
1813
1814     dst_a = p->data[3];
1815     dst_y = p->data[0];
1816     dst_u = p->data[1];
1817     dst_v = p->data[2];
1818
1819     if (get_bits1(gb)) {
1820         for (x = 0; x < avctx->width; x++) {
1821             dst_a[x] = get_bits(gb, 8);
1822             dst_y[x] = get_bits(gb, 8);
1823             dst_u[x] = get_bits(gb, 8);
1824             dst_v[x] = get_bits(gb, 8);
1825         }
1826     } else {
1827         int pred[4] = { 125, 125, -128, -128 };
1828
1829         for (x = 0; x < avctx->width; x++) {
1830             int a, y, u, v;
1831
1832             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1833             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1834             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1835             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1836
1837             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1838             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1839             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1840             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1841         }
1842     }
1843
1844     dst_a += p->linesize[3];
1845     dst_y += p->linesize[0];
1846     dst_u += p->linesize[1];
1847     dst_v += p->linesize[2];
1848
1849     for (y = 1; y < avctx->height; y++) {
1850         if (get_bits1(gb)) {
1851             for (x = 0; x < avctx->width; x++) {
1852                 dst_a[x] = get_bits(gb, 8);
1853                 dst_y[x] = get_bits(gb, 8);
1854                 dst_u[x] = get_bits(gb, 8);
1855                 dst_v[x] = get_bits(gb, 8);
1856             }
1857         } else {
1858             int pred_L[4];
1859             int a, y, u, v;
1860
1861             pred_L[0] = dst_a[-p->linesize[3]];
1862             pred_L[1] = dst_y[-p->linesize[0]];
1863             pred_L[2] = dst_u[-p->linesize[1]];
1864             pred_L[3] = dst_v[-p->linesize[2]];
1865
1866             for (x = 0; x < avctx->width; x++) {
1867                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1868                 y = 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                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1871
1872                 dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
1873                 dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
1874                 dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
1875                 dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
1876             }
1877         }
1878
1879         dst_a += p->linesize[3];
1880         dst_y += p->linesize[0];
1881         dst_u += p->linesize[1];
1882         dst_v += p->linesize[2];
1883     }
1884 }
1885
1886 static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1887 {
1888     SheerVideoContext *s = avctx->priv_data;
1889     uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1890     int x, y;
1891
1892     dst_a = p->data[3];
1893     dst_y = p->data[0];
1894     dst_u = p->data[1];
1895     dst_v = p->data[2];
1896
1897     if (get_bits1(gb)) {
1898         for (x = 0; x < avctx->width; x++) {
1899             dst_a[x] = get_bits(gb, 8);
1900             dst_y[x] = get_bits(gb, 8);
1901             dst_u[x] = get_bits(gb, 8);
1902             dst_v[x] = get_bits(gb, 8);
1903         }
1904     } else {
1905         int pred[4] = { 125, 125, -128, -128 };
1906
1907         for (x = 0; x < avctx->width; x++) {
1908             int a, y, u, v;
1909
1910             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1911             y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1912             u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1913             v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1914
1915             dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1916             dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1917             dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1918             dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1919         }
1920     }
1921
1922     dst_a += p->linesize[3];
1923     dst_y += p->linesize[0];
1924     dst_u += p->linesize[1];
1925     dst_v += p->linesize[2];
1926
1927     for (y = 1; y < avctx->height; y++) {
1928         if (get_bits1(gb)) {
1929             for (x = 0; x < avctx->width; x++) {
1930                 dst_a[x] = get_bits(gb, 8);
1931                 dst_y[x] = get_bits(gb, 8);
1932                 dst_u[x] = get_bits(gb, 8);
1933                 dst_v[x] = get_bits(gb, 8);
1934             }
1935         } else {
1936             int pred_TL[4], pred_L[4], pred_T[4];
1937             int a, y, u, v;
1938
1939             pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
1940             pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
1941             pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
1942             pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
1943
1944             for (x = 0; x < avctx->width; x++) {
1945                 pred_T[0] = dst_a[-p->linesize[3] + x];
1946                 pred_T[1] = dst_y[-p->linesize[0] + x];
1947                 pred_T[2] = dst_u[-p->linesize[1] + x];
1948                 pred_T[3] = dst_v[-p->linesize[2] + x];
1949
1950                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1951                 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1952                 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1953                 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1954
1955                 dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1956                 dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1957                 dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1958                 dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1959
1960                 pred_TL[0] = pred_T[0];
1961                 pred_TL[1] = pred_T[1];
1962                 pred_TL[2] = pred_T[2];
1963                 pred_TL[3] = pred_T[3];
1964             }
1965         }
1966
1967         dst_a += p->linesize[3];
1968         dst_y += p->linesize[0];
1969         dst_u += p->linesize[1];
1970         dst_v += p->linesize[2];
1971     }
1972 }
1973
1974 static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1975 {
1976     SheerVideoContext *s = avctx->priv_data;
1977     uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1978     int x, y;
1979
1980     dst_r = (uint16_t *)p->data[2];
1981     dst_g = (uint16_t *)p->data[0];
1982     dst_b = (uint16_t *)p->data[1];
1983     dst_a = (uint16_t *)p->data[3];
1984
1985     if (get_bits1(gb)) {
1986         for (x = 0; x < avctx->width; x++) {
1987             dst_a[x] = get_bits(gb, 10);
1988             dst_r[x] = get_bits(gb, 10);
1989             dst_g[x] = get_bits(gb, 10);
1990             dst_b[x] = get_bits(gb, 10);
1991         }
1992     } else {
1993         int pred[4] = { 512, 512, 512, 0 };
1994
1995         for (x = 0; x < avctx->width; x++) {
1996             int r, g, b, a;
1997
1998             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1999             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2000             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2001             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2002
2003             dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
2004             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
2005             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
2006             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
2007         }
2008     }
2009
2010     dst_r += p->linesize[2] / 2;
2011     dst_g += p->linesize[0] / 2;
2012     dst_b += p->linesize[1] / 2;
2013     dst_a += p->linesize[3] / 2;
2014
2015     for (y = 1; y < avctx->height; y++) {
2016         if (get_bits1(gb)) {
2017             for (x = 0; x < avctx->width; x++) {
2018                 dst_a[x] = get_bits(gb, 10);
2019                 dst_r[x] = get_bits(gb, 10);
2020                 dst_g[x] = get_bits(gb, 10);
2021                 dst_b[x] = get_bits(gb, 10);
2022             }
2023         } else {
2024             int pred_TL[4], pred_L[4], pred_T[4];
2025             int r, g, b, a;
2026
2027             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
2028             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
2029             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
2030             pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
2031
2032             for (x = 0; x < avctx->width; x++) {
2033                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
2034                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
2035                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
2036                 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
2037
2038                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2039                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2040                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2041                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2042
2043                 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
2044                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
2045                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
2046                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
2047
2048                 pred_TL[0] = pred_T[0];
2049                 pred_TL[1] = pred_T[1];
2050                 pred_TL[2] = pred_T[2];
2051                 pred_TL[3] = pred_T[3];
2052             }
2053         }
2054
2055         dst_r += p->linesize[2] / 2;
2056         dst_g += p->linesize[0] / 2;
2057         dst_b += p->linesize[1] / 2;
2058         dst_a += p->linesize[3] / 2;
2059     }
2060 }
2061
2062 static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2063 {
2064     SheerVideoContext *s = avctx->priv_data;
2065     uint16_t *dst_r, *dst_g, *dst_b;
2066     int x, y;
2067
2068     dst_r = (uint16_t *)p->data[2];
2069     dst_g = (uint16_t *)p->data[0];
2070     dst_b = (uint16_t *)p->data[1];
2071
2072     if (get_bits1(gb)) {
2073         for (x = 0; x < avctx->width; x++) {
2074             dst_r[x] = get_bits(gb, 10);
2075             dst_g[x] = get_bits(gb, 10);
2076             dst_b[x] = get_bits(gb, 10);
2077         }
2078     } else {
2079         int pred[4] = { 512, 512, 512, 0 };
2080
2081         for (x = 0; x < avctx->width; x++) {
2082             int r, g, b;
2083
2084             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2085             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2086             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2087
2088             dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
2089             dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
2090             dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
2091         }
2092     }
2093
2094     dst_r += p->linesize[2] / 2;
2095     dst_g += p->linesize[0] / 2;
2096     dst_b += p->linesize[1] / 2;
2097
2098     for (y = 1; y < avctx->height; y++) {
2099         if (get_bits1(gb)) {
2100             for (x = 0; x < avctx->width; x++) {
2101                 dst_r[x] = get_bits(gb, 10);
2102                 dst_g[x] = get_bits(gb, 10);
2103                 dst_b[x] = get_bits(gb, 10);
2104             }
2105         } else {
2106             int pred_TL[4], pred_L[4], pred_T[4];
2107             int r, g, b;
2108
2109             pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
2110             pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
2111             pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
2112
2113             for (x = 0; x < avctx->width; x++) {
2114                 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
2115                 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
2116                 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
2117
2118                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2119                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2120                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2121
2122                 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
2123                 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
2124                 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
2125
2126                 pred_TL[0] = pred_T[0];
2127                 pred_TL[1] = pred_T[1];
2128                 pred_TL[2] = pred_T[2];
2129             }
2130         }
2131
2132         dst_r += p->linesize[2] / 2;
2133         dst_g += p->linesize[0] / 2;
2134         dst_b += p->linesize[1] / 2;
2135     }
2136 }
2137
2138 static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2139 {
2140     SheerVideoContext *s = avctx->priv_data;
2141     uint8_t *dst;
2142     int x, y;
2143
2144     dst = p->data[0];
2145     if (get_bits1(gb)) {
2146         for (x = 0; x < avctx->width; x++) {
2147             dst[x * 4 + 0] = get_bits(gb, 8);
2148             dst[x * 4 + 1] = get_bits(gb, 8);
2149             dst[x * 4 + 2] = get_bits(gb, 8);
2150             dst[x * 4 + 3] = get_bits(gb, 8);
2151         }
2152     } else {
2153         int pred[4] = { -128, -128, -128, -128 };
2154
2155         for (x = 0; x < avctx->width; x++) {
2156             int a, r, g, b;
2157
2158             a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2159             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2160             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2161             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2162
2163             dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
2164             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
2165             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
2166             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
2167         }
2168     }
2169
2170     dst += p->linesize[0];
2171     for (y = 1; y < avctx->height; y++) {
2172         if (get_bits1(gb)) {
2173             for (x = 0; x < avctx->width; x++) {
2174                 dst[x * 4 + 0] = get_bits(gb, 8);
2175                 dst[x * 4 + 1] = get_bits(gb, 8);
2176                 dst[x * 4 + 2] = get_bits(gb, 8);
2177                 dst[x * 4 + 3] = get_bits(gb, 8);
2178             }
2179         } else {
2180             int pred_L[4];
2181             int a, r, g, b;
2182
2183             pred_L[0] = dst[-p->linesize[0] + 0];
2184             pred_L[1] = dst[-p->linesize[0] + 1];
2185             pred_L[2] = dst[-p->linesize[0] + 2];
2186             pred_L[3] = dst[-p->linesize[0] + 3];
2187
2188             for (x = 0; x < avctx->width; x++) {
2189                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2190                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2191                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2192                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2193
2194                 dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
2195                 dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
2196                 dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
2197                 dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
2198             }
2199         }
2200         dst += p->linesize[0];
2201     }
2202 }
2203
2204 static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2205 {
2206     SheerVideoContext *s = avctx->priv_data;
2207     uint8_t *dst;
2208     int x, y;
2209
2210     dst = p->data[0];
2211     if (get_bits1(gb)) {
2212         for (x = 0; x < avctx->width; x++) {
2213             dst[x * 4 + 0] = get_bits(gb, 8);
2214             dst[x * 4 + 1] = get_bits(gb, 8);
2215             dst[x * 4 + 2] = get_bits(gb, 8);
2216             dst[x * 4 + 3] = get_bits(gb, 8);
2217         }
2218     } else {
2219         int pred[4] = { -128, -128, -128, -128 };
2220
2221         for (x = 0; x < avctx->width; x++) {
2222             int a, r, g, b;
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[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
2230             dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
2231             dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
2232             dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
2233         }
2234     }
2235
2236     dst += p->linesize[0];
2237     for (y = 1; y < avctx->height; y++) {
2238         if (get_bits1(gb)) {
2239             for (x = 0; x < avctx->width; x++) {
2240                 dst[x * 4 + 0] = get_bits(gb, 8);
2241                 dst[x * 4 + 1] = get_bits(gb, 8);
2242                 dst[x * 4 + 2] = get_bits(gb, 8);
2243                 dst[x * 4 + 3] = get_bits(gb, 8);
2244             }
2245         } else {
2246             int pred_TL[4], pred_L[4], pred_T[4];
2247             int a, r, g, b;
2248
2249             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2250             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2251             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2252             pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
2253
2254             for (x = 0; x < avctx->width; x++) {
2255                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2256                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2257                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2258                 pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
2259
2260                 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2261                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2262                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2263                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2264
2265                 dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2266                 dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2267                 dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2268                 dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
2269
2270                 pred_TL[0] = pred_T[0];
2271                 pred_TL[1] = pred_T[1];
2272                 pred_TL[2] = pred_T[2];
2273                 pred_TL[3] = pred_T[3];
2274             }
2275         }
2276         dst += p->linesize[0];
2277     }
2278 }
2279
2280 static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2281 {
2282     SheerVideoContext *s = avctx->priv_data;
2283     uint8_t *dst;
2284     int x, y;
2285
2286     dst = p->data[0];
2287     if (get_bits1(gb)) {
2288         for (x = 0; x < avctx->width; x++) {
2289             dst[x * 4 + 0] = get_bits(gb, 8);
2290             dst[x * 4 + 1] = get_bits(gb, 8);
2291             dst[x * 4 + 2] = get_bits(gb, 8);
2292         }
2293     } else {
2294         int pred[4] = { -128, -128, -128, -128 };
2295
2296         for (x = 0; x < avctx->width; x++) {
2297             int r, g, b;
2298
2299             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2300             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2301             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2302
2303             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2304             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2305             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2306         }
2307     }
2308
2309     dst += p->linesize[0];
2310     for (y = 1; y < avctx->height; y++) {
2311         if (get_bits1(gb)) {
2312             for (x = 0; x < avctx->width; x++) {
2313                 dst[x * 4 + 0] = get_bits(gb, 8);
2314                 dst[x * 4 + 1] = get_bits(gb, 8);
2315                 dst[x * 4 + 2] = get_bits(gb, 8);
2316             }
2317         } else {
2318             int pred_L[4];
2319             int r, g, b;
2320
2321             pred_L[0] = dst[-p->linesize[0] + 0];
2322             pred_L[1] = dst[-p->linesize[0] + 1];
2323             pred_L[2] = dst[-p->linesize[0] + 2];
2324
2325             for (x = 0; x < avctx->width; x++) {
2326                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2327                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2328                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2329
2330                 dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
2331                 dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
2332                 dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
2333             }
2334         }
2335         dst += p->linesize[0];
2336     }
2337 }
2338
2339 static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
2340 {
2341     SheerVideoContext *s = avctx->priv_data;
2342     uint8_t *dst;
2343     int x, y;
2344
2345     dst = p->data[0];
2346     if (get_bits1(gb)) {
2347         for (x = 0; x < avctx->width; x++) {
2348             dst[x * 4 + 0] = get_bits(gb, 8);
2349             dst[x * 4 + 1] = get_bits(gb, 8);
2350             dst[x * 4 + 2] = get_bits(gb, 8);
2351         }
2352     } else {
2353         int pred[4] = { -128, -128, -128, -128 };
2354
2355         for (x = 0; x < avctx->width; x++) {
2356             int r, g, b;
2357
2358             r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2359             g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2360             b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2361
2362             dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
2363             dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
2364             dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
2365         }
2366     }
2367
2368     dst += p->linesize[0];
2369     for (y = 1; y < avctx->height; y++) {
2370         if (get_bits1(gb)) {
2371             for (x = 0; x < avctx->width; x++) {
2372                 dst[x * 4 + 0] = get_bits(gb, 8);
2373                 dst[x * 4 + 1] = get_bits(gb, 8);
2374                 dst[x * 4 + 2] = get_bits(gb, 8);
2375             }
2376         } else {
2377             int pred_TL[4], pred_L[4], pred_T[4];
2378             int r, g, b;
2379
2380             pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
2381             pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
2382             pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
2383
2384             for (x = 0; x < avctx->width; x++) {
2385                 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
2386                 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
2387                 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
2388
2389                 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
2390                 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2391                 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
2392
2393                 dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
2394                 dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
2395                 dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
2396
2397                 pred_TL[0] = pred_T[0];
2398                 pred_TL[1] = pred_T[1];
2399                 pred_TL[2] = pred_T[2];
2400             }
2401         }
2402         dst += p->linesize[0];
2403     }
2404 }
2405
2406 static int build_vlc(VLC *vlc, const uint8_t *len, int count)
2407 {
2408     uint32_t codes[1024];
2409     uint8_t bits[1024];
2410     uint16_t syms[1024];
2411     uint64_t index;
2412     int i;
2413
2414     index = 0;
2415     for (i = 0; i < count; i++) {
2416         codes[i]  = index >> (32 - len[i]);
2417         bits[i] = len[i];
2418         syms[i]  = i;
2419         index += 1ULL << (32 - len[i]);
2420     }
2421
2422     ff_free_vlc(vlc);
2423     return ff_init_vlc_sparse(vlc, 16, count,
2424                               bits,  sizeof(*bits),  sizeof(*bits),
2425                               codes, sizeof(*codes), sizeof(*codes),
2426                               syms,  sizeof(*syms),  sizeof(*syms), 0);
2427 }
2428
2429 static int decode_frame(AVCodecContext *avctx,
2430                         void *data, int *got_frame,
2431                         AVPacket *avpkt)
2432 {
2433     SheerVideoContext *s = avctx->priv_data;
2434     ThreadFrame frame = { .f = data };
2435     AVFrame *p = data;
2436     GetBitContext gb;
2437     unsigned format;
2438     int ret;
2439
2440     if (avpkt->size <= 20)
2441         return AVERROR_INVALIDDATA;
2442
2443     if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
2444         AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
2445         return AVERROR_INVALIDDATA;
2446
2447     format = AV_RL32(avpkt->data + 16);
2448     switch (format) {
2449     case MKTAG(' ', 'R', 'G', 'B'):
2450         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2451         s->decode_frame = decode_rgb;
2452         if (s->format != format) {
2453             build_vlc(&s->vlc[0], l_r_rgb, 256);
2454             build_vlc(&s->vlc[1], l_g_rgb, 256);
2455         }
2456         break;
2457     case MKTAG(' ', 'r', 'G', 'B'):
2458         avctx->pix_fmt = AV_PIX_FMT_RGB0;
2459         s->decode_frame = decode_rgbi;
2460         if (s->format != format) {
2461             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2462             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2463         }
2464         break;
2465     case MKTAG('A', 'R', 'G', 'X'):
2466         avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
2467         s->decode_frame = decode_argx;
2468         if (s->format != format) {
2469             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2470             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2471         }
2472         break;
2473     case MKTAG('R', 'G', 'B', 'X'):
2474         avctx->pix_fmt = AV_PIX_FMT_GBRP10;
2475         s->decode_frame = decode_rgbx;
2476         if (s->format != format) {
2477             build_vlc(&s->vlc[0], l_r_rgbx, 1024);
2478             build_vlc(&s->vlc[1], l_g_rgbx, 1024);
2479         }
2480         break;
2481     case MKTAG('A', 'R', 'G', 'B'):
2482         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2483         s->decode_frame = decode_argb;
2484         if (s->format != format) {
2485             build_vlc(&s->vlc[0], l_r_rgb, 256);
2486             build_vlc(&s->vlc[1], l_g_rgb, 256);
2487         }
2488         break;
2489     case MKTAG('A', 'r', 'G', 'B'):
2490         avctx->pix_fmt = AV_PIX_FMT_ARGB;
2491         s->decode_frame = decode_argbi;
2492         if (s->format != format) {
2493             build_vlc(&s->vlc[0], l_r_rgbi, 256);
2494             build_vlc(&s->vlc[1], l_g_rgbi, 256);
2495         }
2496         break;
2497     case MKTAG('A', 'Y', 'B', 'R'):
2498     case MKTAG('A', 'Y', 'b', 'R'):
2499         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2500         s->decode_frame = decode_aybr;
2501         if (s->format != format) {
2502             build_vlc(&s->vlc[0], l_y_ybr, 256);
2503             build_vlc(&s->vlc[1], l_u_ybr, 256);
2504         }
2505         break;
2506     case MKTAG('A', 'y', 'B', 'R'):
2507     case MKTAG('A', 'y', 'b', 'R'):
2508         avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
2509         s->decode_frame = decode_aybri;
2510         if (s->format != format) {
2511             build_vlc(&s->vlc[0], l_y_ybri, 256);
2512             build_vlc(&s->vlc[1], l_u_ybri, 256);
2513         }
2514         break;
2515     case MKTAG(' ', 'Y', 'B', 'R'):
2516     case MKTAG(' ', 'Y', 'b', 'R'):
2517         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2518         s->decode_frame = decode_ybr;
2519         if (s->format != format) {
2520             build_vlc(&s->vlc[0], l_y_ybr, 256);
2521             build_vlc(&s->vlc[1], l_u_ybr, 256);
2522         }
2523         break;
2524     case MKTAG(' ', 'y', 'B', 'R'):
2525     case MKTAG(' ', 'y', 'b', 'R'):
2526         avctx->pix_fmt = AV_PIX_FMT_YUV444P;
2527         s->decode_frame = decode_ybri;
2528         if (s->format != format) {
2529             build_vlc(&s->vlc[0], l_y_ybri, 256);
2530             build_vlc(&s->vlc[1], l_u_ybri, 256);
2531         }
2532         break;
2533     case MKTAG('Y', 'B', 'R', 0x0a):
2534         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
2535         s->decode_frame = decode_ybr10;
2536         if (s->format != format) {
2537             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2538             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2539         }
2540         break;
2541     case MKTAG('y', 'B', 'R', 0x0a):
2542         avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
2543         s->decode_frame = decode_ybr10i;
2544         if (s->format != format) {
2545             build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
2546             build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
2547         }
2548         break;
2549     case MKTAG('C', 'A', '4', 'p'):
2550         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
2551         s->decode_frame = decode_ca4p;
2552         if (s->format != format) {
2553             build_vlc(&s->vlc[0], l_y_ybr10, 1024);
2554             build_vlc(&s->vlc[1], l_u_ybr10, 1024);
2555         }
2556         break;
2557     case MKTAG('C', 'A', '4', 'i'):
2558         avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
2559         s->decode_frame = decode_ca4i;
2560         if (s->format != format) {
2561             build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
2562             build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
2563         }
2564         break;
2565     case MKTAG('B', 'Y', 'R', 'Y'):
2566         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2567         s->decode_frame = decode_byry;
2568         if (s->format != format) {
2569             build_vlc(&s->vlc[0], l_y_byry, 256);
2570             build_vlc(&s->vlc[1], l_u_byry, 256);
2571         }
2572         break;
2573     case MKTAG('B', 'Y', 'R', 'y'):
2574         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2575         s->decode_frame = decode_byryi;
2576         if (s->format != format) {
2577             build_vlc(&s->vlc[0], l_y_byryi, 256);
2578             build_vlc(&s->vlc[1], l_u_byryi, 256);
2579         }
2580         break;
2581     case MKTAG('Y', 'b', 'Y', 'r'):
2582         avctx->pix_fmt = AV_PIX_FMT_YUV422P;
2583         s->decode_frame = decode_ybyr;
2584         if (s->format != format) {
2585             build_vlc(&s->vlc[0], l_y_ybyr, 256);
2586             build_vlc(&s->vlc[1], l_u_ybyr, 256);
2587         }
2588         break;
2589     case MKTAG('C', '8', '2', 'p'):
2590         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2591         s->decode_frame = decode_c82p;
2592         if (s->format != format) {
2593             build_vlc(&s->vlc[0], l_y_byry, 256);
2594             build_vlc(&s->vlc[1], l_u_byry, 256);
2595         }
2596         break;
2597     case MKTAG('C', '8', '2', 'i'):
2598         avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
2599         s->decode_frame = decode_c82i;
2600         if (s->format != format) {
2601             build_vlc(&s->vlc[0], l_y_byryi, 256);
2602             build_vlc(&s->vlc[1], l_u_byryi, 256);
2603         }
2604         break;
2605     case MKTAG(0xa2, 'Y', 'R', 'Y'):
2606         avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2607         s->decode_frame = decode_yry10;
2608         if (s->format != format) {
2609             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2610             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2611         }
2612         break;
2613     case MKTAG('C', 'A', '2', 'p'):
2614         avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2615         s->decode_frame = decode_ca2p;
2616         if (s->format != format) {
2617             build_vlc(&s->vlc[0], l_y_yry10, 1024);
2618             build_vlc(&s->vlc[1], l_u_yry10, 1024);
2619         }
2620         break;
2621     default:
2622         avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
2623         return AVERROR_PATCHWELCOME;
2624     }
2625     s->format = format;
2626
2627     p->pict_type = AV_PICTURE_TYPE_I;
2628     p->key_frame = 1;
2629
2630     if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2631         return ret;
2632
2633     if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
2634         return ret;
2635
2636     s->decode_frame(avctx, p, &gb);
2637
2638     *got_frame = 1;
2639
2640     return avpkt->size;
2641 }
2642
2643 #if HAVE_THREADS
2644 static int decode_init_thread_copy(AVCodecContext *avctx)
2645 {
2646     SheerVideoContext *s = avctx->priv_data;
2647
2648     s->format = 0;
2649     memset(&s->vlc[0], 0, sizeof(s->vlc[0]));
2650     memset(&s->vlc[1], 0, sizeof(s->vlc[1]));
2651
2652     return 0;
2653 }
2654 #endif
2655
2656 static av_cold int decode_end(AVCodecContext *avctx)
2657 {
2658     SheerVideoContext *s = avctx->priv_data;
2659
2660     ff_free_vlc(&s->vlc[0]);
2661     ff_free_vlc(&s->vlc[1]);
2662
2663     return 0;
2664 }
2665
2666 AVCodec ff_sheervideo_decoder = {
2667     .name             = "sheervideo",
2668     .long_name        = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
2669     .type             = AVMEDIA_TYPE_VIDEO,
2670     .id               = AV_CODEC_ID_SHEERVIDEO,
2671     .priv_data_size   = sizeof(SheerVideoContext),
2672     .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
2673     .close            = decode_end,
2674     .decode           = decode_frame,
2675     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2676 };