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