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