1 /*
2 * Motion Pixels Video Decoder
3 * Copyright (c) 2008 Gregory Montoir (cyx@users.sourceforge.net)
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
26
27 #define MAX_HUFF_CODES 16
28
30
36
52
54 {
56
62
63 return 0;
64 }
65
67 {
69 int w4 = (avctx->
width + 3) & ~3;
70 int h4 = (avctx->
height + 3) & ~3;
71
75 }
76
89 }
91
96 }
97
98 return 0;
99 }
100
102 {
103 uint16_t *pixels;
105
106 while (count--) {
110 if (read_color)
115 continue;
119 while (h--) {
121 if (read_color)
122 for (i = 0; i < w; ++i)
123 pixels[i] = color;
126 }
127 }
128 }
129
131 {
137 }
138 code <<= 1;
141 }
145 }
146
149 return 0;
150 }
151
153 {
156 } else {
157 int i;
159
169 }
170 }
171 return 0;
172 }
173
175 {
177
181 }
182
184 {
186
189 }
190
192 {
194
197 }
198
200 {
201 int i;
202
205 }
206
208 {
211 int w, i, x = 0;
212
216 ++x;
217 }
218 while (x < mp->avctx->width) {
220 if (w != 0) {
221 if ((y & 3) == 0) {
225 for (i = (x + 3) & ~3; i < x + w; i += 4) {
227 }
228 }
229 }
230 x += w;
233 } else {
235 p.
y = av_clip_uintp2(p.
y, 5);
236 if ((x & 3) == 0) {
237 if ((y & 3) == 0) {
239 p.
v = av_clip_intp2(p.
v, 5);
241 p.
u = av_clip_intp2(p.
u, 5);
243 } else {
246 }
247 }
249 ++x;
250 }
251 }
252 }
253
255 {
258
260
265 } else {
267 p.
y = av_clip_uintp2(p.
y, 5);
268 if ((y & 3) == 0) {
270 p.
v = av_clip_intp2(p.
v, 5);
272 p.
u = av_clip_intp2(p.
u, 5);
273 }
276 }
277 }
278 for (y0 = 0; y0 < 2; ++y0)
281 }
282
284 void *
data,
int *got_frame,
286 {
288 int buf_size = avpkt->
size;
291 int i, count1, count2, sz,
ret;
292
295
296 /* le32 bitstream msb first */
301 buf_size / 4);
302 if (buf_size & 3)
303 memcpy(mp->
bswapbuf + (buf_size & ~3), buf + (buf_size & ~3), buf_size & 3);
305
307 for (i = !(avctx->
extradata[1] & 2); i < 2; ++i) {
312 }
313
317
321 }
324
328 if (sz == 0)
330
337
341 *got_frame = 1;
342 return buf_size;
343 }
344
346 .
name =
"motionpixels",
355 };