yading@10
|
1 /*
|
yading@10
|
2 * Duck TrueMotion 1.0 Decoder
|
yading@10
|
3 * Copyright (C) 2003 Alex Beregszaszi & Mike Melanson
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 /**
|
yading@10
|
23 * @file
|
yading@10
|
24 * Duck TrueMotion v1 Video Decoder by
|
yading@10
|
25 * Alex Beregszaszi and
|
yading@10
|
26 * Mike Melanson (melanson@pcisys.net)
|
yading@10
|
27 *
|
yading@10
|
28 * The TrueMotion v1 decoder presently only decodes 16-bit TM1 data and
|
yading@10
|
29 * outputs RGB555 (or RGB565) data. 24-bit TM1 data is not supported yet.
|
yading@10
|
30 */
|
yading@10
|
31
|
yading@10
|
32 #include <stdio.h>
|
yading@10
|
33 #include <stdlib.h>
|
yading@10
|
34 #include <string.h>
|
yading@10
|
35
|
yading@10
|
36 #include "avcodec.h"
|
yading@10
|
37 #include "internal.h"
|
yading@10
|
38 #include "libavutil/imgutils.h"
|
yading@10
|
39 #include "libavutil/internal.h"
|
yading@10
|
40 #include "libavutil/intreadwrite.h"
|
yading@10
|
41 #include "libavutil/mem.h"
|
yading@10
|
42
|
yading@10
|
43 #include "truemotion1data.h"
|
yading@10
|
44
|
yading@10
|
45 typedef struct TrueMotion1Context {
|
yading@10
|
46 AVCodecContext *avctx;
|
yading@10
|
47 AVFrame frame;
|
yading@10
|
48
|
yading@10
|
49 const uint8_t *buf;
|
yading@10
|
50 int size;
|
yading@10
|
51
|
yading@10
|
52 const uint8_t *mb_change_bits;
|
yading@10
|
53 int mb_change_bits_row_size;
|
yading@10
|
54 const uint8_t *index_stream;
|
yading@10
|
55 int index_stream_size;
|
yading@10
|
56
|
yading@10
|
57 int flags;
|
yading@10
|
58 int x, y, w, h;
|
yading@10
|
59
|
yading@10
|
60 uint32_t y_predictor_table[1024];
|
yading@10
|
61 uint32_t c_predictor_table[1024];
|
yading@10
|
62 uint32_t fat_y_predictor_table[1024];
|
yading@10
|
63 uint32_t fat_c_predictor_table[1024];
|
yading@10
|
64
|
yading@10
|
65 int compression;
|
yading@10
|
66 int block_type;
|
yading@10
|
67 int block_width;
|
yading@10
|
68 int block_height;
|
yading@10
|
69
|
yading@10
|
70 int16_t ydt[8];
|
yading@10
|
71 int16_t cdt[8];
|
yading@10
|
72 int16_t fat_ydt[8];
|
yading@10
|
73 int16_t fat_cdt[8];
|
yading@10
|
74
|
yading@10
|
75 int last_deltaset, last_vectable;
|
yading@10
|
76
|
yading@10
|
77 unsigned int *vert_pred;
|
yading@10
|
78 int vert_pred_size;
|
yading@10
|
79
|
yading@10
|
80 } TrueMotion1Context;
|
yading@10
|
81
|
yading@10
|
82 #define FLAG_SPRITE 32
|
yading@10
|
83 #define FLAG_KEYFRAME 16
|
yading@10
|
84 #define FLAG_INTERFRAME 8
|
yading@10
|
85 #define FLAG_INTERPOLATED 4
|
yading@10
|
86
|
yading@10
|
87 struct frame_header {
|
yading@10
|
88 uint8_t header_size;
|
yading@10
|
89 uint8_t compression;
|
yading@10
|
90 uint8_t deltaset;
|
yading@10
|
91 uint8_t vectable;
|
yading@10
|
92 uint16_t ysize;
|
yading@10
|
93 uint16_t xsize;
|
yading@10
|
94 uint16_t checksum;
|
yading@10
|
95 uint8_t version;
|
yading@10
|
96 uint8_t header_type;
|
yading@10
|
97 uint8_t flags;
|
yading@10
|
98 uint8_t control;
|
yading@10
|
99 uint16_t xoffset;
|
yading@10
|
100 uint16_t yoffset;
|
yading@10
|
101 uint16_t width;
|
yading@10
|
102 uint16_t height;
|
yading@10
|
103 };
|
yading@10
|
104
|
yading@10
|
105 #define ALGO_NOP 0
|
yading@10
|
106 #define ALGO_RGB16V 1
|
yading@10
|
107 #define ALGO_RGB16H 2
|
yading@10
|
108 #define ALGO_RGB24H 3
|
yading@10
|
109
|
yading@10
|
110 /* these are the various block sizes that can occupy a 4x4 block */
|
yading@10
|
111 #define BLOCK_2x2 0
|
yading@10
|
112 #define BLOCK_2x4 1
|
yading@10
|
113 #define BLOCK_4x2 2
|
yading@10
|
114 #define BLOCK_4x4 3
|
yading@10
|
115
|
yading@10
|
116 typedef struct comp_types {
|
yading@10
|
117 int algorithm;
|
yading@10
|
118 int block_width; // vres
|
yading@10
|
119 int block_height; // hres
|
yading@10
|
120 int block_type;
|
yading@10
|
121 } comp_types;
|
yading@10
|
122
|
yading@10
|
123 /* { valid for metatype }, algorithm, num of deltas, vert res, horiz res */
|
yading@10
|
124 static const comp_types compression_types[17] = {
|
yading@10
|
125 { ALGO_NOP, 0, 0, 0 },
|
yading@10
|
126
|
yading@10
|
127 { ALGO_RGB16V, 4, 4, BLOCK_4x4 },
|
yading@10
|
128 { ALGO_RGB16H, 4, 4, BLOCK_4x4 },
|
yading@10
|
129 { ALGO_RGB16V, 4, 2, BLOCK_4x2 },
|
yading@10
|
130 { ALGO_RGB16H, 4, 2, BLOCK_4x2 },
|
yading@10
|
131
|
yading@10
|
132 { ALGO_RGB16V, 2, 4, BLOCK_2x4 },
|
yading@10
|
133 { ALGO_RGB16H, 2, 4, BLOCK_2x4 },
|
yading@10
|
134 { ALGO_RGB16V, 2, 2, BLOCK_2x2 },
|
yading@10
|
135 { ALGO_RGB16H, 2, 2, BLOCK_2x2 },
|
yading@10
|
136
|
yading@10
|
137 { ALGO_NOP, 4, 4, BLOCK_4x4 },
|
yading@10
|
138 { ALGO_RGB24H, 4, 4, BLOCK_4x4 },
|
yading@10
|
139 { ALGO_NOP, 4, 2, BLOCK_4x2 },
|
yading@10
|
140 { ALGO_RGB24H, 4, 2, BLOCK_4x2 },
|
yading@10
|
141
|
yading@10
|
142 { ALGO_NOP, 2, 4, BLOCK_2x4 },
|
yading@10
|
143 { ALGO_RGB24H, 2, 4, BLOCK_2x4 },
|
yading@10
|
144 { ALGO_NOP, 2, 2, BLOCK_2x2 },
|
yading@10
|
145 { ALGO_RGB24H, 2, 2, BLOCK_2x2 }
|
yading@10
|
146 };
|
yading@10
|
147
|
yading@10
|
148 static void select_delta_tables(TrueMotion1Context *s, int delta_table_index)
|
yading@10
|
149 {
|
yading@10
|
150 int i;
|
yading@10
|
151
|
yading@10
|
152 if (delta_table_index > 3)
|
yading@10
|
153 return;
|
yading@10
|
154
|
yading@10
|
155 memcpy(s->ydt, ydts[delta_table_index], 8 * sizeof(int16_t));
|
yading@10
|
156 memcpy(s->cdt, cdts[delta_table_index], 8 * sizeof(int16_t));
|
yading@10
|
157 memcpy(s->fat_ydt, fat_ydts[delta_table_index], 8 * sizeof(int16_t));
|
yading@10
|
158 memcpy(s->fat_cdt, fat_cdts[delta_table_index], 8 * sizeof(int16_t));
|
yading@10
|
159
|
yading@10
|
160 /* Y skinny deltas need to be halved for some reason; maybe the
|
yading@10
|
161 * skinny Y deltas should be modified */
|
yading@10
|
162 for (i = 0; i < 8; i++)
|
yading@10
|
163 {
|
yading@10
|
164 /* drop the lsb before dividing by 2-- net effect: round down
|
yading@10
|
165 * when dividing a negative number (e.g., -3/2 = -2, not -1) */
|
yading@10
|
166 s->ydt[i] &= 0xFFFE;
|
yading@10
|
167 s->ydt[i] /= 2;
|
yading@10
|
168 }
|
yading@10
|
169 }
|
yading@10
|
170
|
yading@10
|
171 #if HAVE_BIGENDIAN
|
yading@10
|
172 static int make_ydt15_entry(int p2, int p1, int16_t *ydt)
|
yading@10
|
173 #else
|
yading@10
|
174 static int make_ydt15_entry(int p1, int p2, int16_t *ydt)
|
yading@10
|
175 #endif
|
yading@10
|
176 {
|
yading@10
|
177 int lo, hi;
|
yading@10
|
178
|
yading@10
|
179 lo = ydt[p1];
|
yading@10
|
180 lo += (lo << 5) + (lo << 10);
|
yading@10
|
181 hi = ydt[p2];
|
yading@10
|
182 hi += (hi << 5) + (hi << 10);
|
yading@10
|
183 return (lo + (hi << 16)) << 1;
|
yading@10
|
184 }
|
yading@10
|
185
|
yading@10
|
186 static int make_cdt15_entry(int p1, int p2, int16_t *cdt)
|
yading@10
|
187 {
|
yading@10
|
188 int r, b, lo;
|
yading@10
|
189
|
yading@10
|
190 b = cdt[p2];
|
yading@10
|
191 r = cdt[p1] << 10;
|
yading@10
|
192 lo = b + r;
|
yading@10
|
193 return (lo + (lo << 16)) << 1;
|
yading@10
|
194 }
|
yading@10
|
195
|
yading@10
|
196 #if HAVE_BIGENDIAN
|
yading@10
|
197 static int make_ydt16_entry(int p2, int p1, int16_t *ydt)
|
yading@10
|
198 #else
|
yading@10
|
199 static int make_ydt16_entry(int p1, int p2, int16_t *ydt)
|
yading@10
|
200 #endif
|
yading@10
|
201 {
|
yading@10
|
202 int lo, hi;
|
yading@10
|
203
|
yading@10
|
204 lo = ydt[p1];
|
yading@10
|
205 lo += (lo << 6) + (lo << 11);
|
yading@10
|
206 hi = ydt[p2];
|
yading@10
|
207 hi += (hi << 6) + (hi << 11);
|
yading@10
|
208 return (lo + (hi << 16)) << 1;
|
yading@10
|
209 }
|
yading@10
|
210
|
yading@10
|
211 static int make_cdt16_entry(int p1, int p2, int16_t *cdt)
|
yading@10
|
212 {
|
yading@10
|
213 int r, b, lo;
|
yading@10
|
214
|
yading@10
|
215 b = cdt[p2];
|
yading@10
|
216 r = cdt[p1] << 11;
|
yading@10
|
217 lo = b + r;
|
yading@10
|
218 return (lo + (lo << 16)) << 1;
|
yading@10
|
219 }
|
yading@10
|
220
|
yading@10
|
221 static int make_ydt24_entry(int p1, int p2, int16_t *ydt)
|
yading@10
|
222 {
|
yading@10
|
223 int lo, hi;
|
yading@10
|
224
|
yading@10
|
225 lo = ydt[p1];
|
yading@10
|
226 hi = ydt[p2];
|
yading@10
|
227 return (lo + (hi << 8) + (hi << 16)) << 1;
|
yading@10
|
228 }
|
yading@10
|
229
|
yading@10
|
230 static int make_cdt24_entry(int p1, int p2, int16_t *cdt)
|
yading@10
|
231 {
|
yading@10
|
232 int r, b;
|
yading@10
|
233
|
yading@10
|
234 b = cdt[p2];
|
yading@10
|
235 r = cdt[p1]<<16;
|
yading@10
|
236 return (b+r) << 1;
|
yading@10
|
237 }
|
yading@10
|
238
|
yading@10
|
239 static void gen_vector_table15(TrueMotion1Context *s, const uint8_t *sel_vector_table)
|
yading@10
|
240 {
|
yading@10
|
241 int len, i, j;
|
yading@10
|
242 unsigned char delta_pair;
|
yading@10
|
243
|
yading@10
|
244 for (i = 0; i < 1024; i += 4)
|
yading@10
|
245 {
|
yading@10
|
246 len = *sel_vector_table++ / 2;
|
yading@10
|
247 for (j = 0; j < len; j++)
|
yading@10
|
248 {
|
yading@10
|
249 delta_pair = *sel_vector_table++;
|
yading@10
|
250 s->y_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
251 make_ydt15_entry(delta_pair >> 4, delta_pair & 0xf, s->ydt);
|
yading@10
|
252 s->c_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
253 make_cdt15_entry(delta_pair >> 4, delta_pair & 0xf, s->cdt);
|
yading@10
|
254 }
|
yading@10
|
255 s->y_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
256 s->c_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
257 }
|
yading@10
|
258 }
|
yading@10
|
259
|
yading@10
|
260 static void gen_vector_table16(TrueMotion1Context *s, const uint8_t *sel_vector_table)
|
yading@10
|
261 {
|
yading@10
|
262 int len, i, j;
|
yading@10
|
263 unsigned char delta_pair;
|
yading@10
|
264
|
yading@10
|
265 for (i = 0; i < 1024; i += 4)
|
yading@10
|
266 {
|
yading@10
|
267 len = *sel_vector_table++ / 2;
|
yading@10
|
268 for (j = 0; j < len; j++)
|
yading@10
|
269 {
|
yading@10
|
270 delta_pair = *sel_vector_table++;
|
yading@10
|
271 s->y_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
272 make_ydt16_entry(delta_pair >> 4, delta_pair & 0xf, s->ydt);
|
yading@10
|
273 s->c_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
274 make_cdt16_entry(delta_pair >> 4, delta_pair & 0xf, s->cdt);
|
yading@10
|
275 }
|
yading@10
|
276 s->y_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
277 s->c_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
278 }
|
yading@10
|
279 }
|
yading@10
|
280
|
yading@10
|
281 static void gen_vector_table24(TrueMotion1Context *s, const uint8_t *sel_vector_table)
|
yading@10
|
282 {
|
yading@10
|
283 int len, i, j;
|
yading@10
|
284 unsigned char delta_pair;
|
yading@10
|
285
|
yading@10
|
286 for (i = 0; i < 1024; i += 4)
|
yading@10
|
287 {
|
yading@10
|
288 len = *sel_vector_table++ / 2;
|
yading@10
|
289 for (j = 0; j < len; j++)
|
yading@10
|
290 {
|
yading@10
|
291 delta_pair = *sel_vector_table++;
|
yading@10
|
292 s->y_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
293 make_ydt24_entry(delta_pair >> 4, delta_pair & 0xf, s->ydt);
|
yading@10
|
294 s->c_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
295 make_cdt24_entry(delta_pair >> 4, delta_pair & 0xf, s->cdt);
|
yading@10
|
296 s->fat_y_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
297 make_ydt24_entry(delta_pair >> 4, delta_pair & 0xf, s->fat_ydt);
|
yading@10
|
298 s->fat_c_predictor_table[i+j] = 0xfffffffe &
|
yading@10
|
299 make_cdt24_entry(delta_pair >> 4, delta_pair & 0xf, s->fat_cdt);
|
yading@10
|
300 }
|
yading@10
|
301 s->y_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
302 s->c_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
303 s->fat_y_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
304 s->fat_c_predictor_table[i+(j-1)] |= 1;
|
yading@10
|
305 }
|
yading@10
|
306 }
|
yading@10
|
307
|
yading@10
|
308 /* Returns the number of bytes consumed from the bytestream. Returns -1 if
|
yading@10
|
309 * there was an error while decoding the header */
|
yading@10
|
310 static int truemotion1_decode_header(TrueMotion1Context *s)
|
yading@10
|
311 {
|
yading@10
|
312 int i, ret;
|
yading@10
|
313 int width_shift = 0;
|
yading@10
|
314 int new_pix_fmt;
|
yading@10
|
315 struct frame_header header;
|
yading@10
|
316 uint8_t header_buffer[128] = { 0 }; /* logical maximum size of the header */
|
yading@10
|
317 const uint8_t *sel_vector_table;
|
yading@10
|
318
|
yading@10
|
319 header.header_size = ((s->buf[0] >> 5) | (s->buf[0] << 3)) & 0x7f;
|
yading@10
|
320 if (s->buf[0] < 0x10 || header.header_size >= s->size)
|
yading@10
|
321 {
|
yading@10
|
322 av_log(s->avctx, AV_LOG_ERROR, "invalid header size (%d)\n", s->buf[0]);
|
yading@10
|
323 return AVERROR_INVALIDDATA;
|
yading@10
|
324 }
|
yading@10
|
325
|
yading@10
|
326 /* unscramble the header bytes with a XOR operation */
|
yading@10
|
327 for (i = 1; i < header.header_size; i++)
|
yading@10
|
328 header_buffer[i - 1] = s->buf[i] ^ s->buf[i + 1];
|
yading@10
|
329
|
yading@10
|
330 header.compression = header_buffer[0];
|
yading@10
|
331 header.deltaset = header_buffer[1];
|
yading@10
|
332 header.vectable = header_buffer[2];
|
yading@10
|
333 header.ysize = AV_RL16(&header_buffer[3]);
|
yading@10
|
334 header.xsize = AV_RL16(&header_buffer[5]);
|
yading@10
|
335 header.checksum = AV_RL16(&header_buffer[7]);
|
yading@10
|
336 header.version = header_buffer[9];
|
yading@10
|
337 header.header_type = header_buffer[10];
|
yading@10
|
338 header.flags = header_buffer[11];
|
yading@10
|
339 header.control = header_buffer[12];
|
yading@10
|
340
|
yading@10
|
341 /* Version 2 */
|
yading@10
|
342 if (header.version >= 2)
|
yading@10
|
343 {
|
yading@10
|
344 if (header.header_type > 3)
|
yading@10
|
345 {
|
yading@10
|
346 av_log(s->avctx, AV_LOG_ERROR, "invalid header type (%d)\n", header.header_type);
|
yading@10
|
347 return AVERROR_INVALIDDATA;
|
yading@10
|
348 } else if ((header.header_type == 2) || (header.header_type == 3)) {
|
yading@10
|
349 s->flags = header.flags;
|
yading@10
|
350 if (!(s->flags & FLAG_INTERFRAME))
|
yading@10
|
351 s->flags |= FLAG_KEYFRAME;
|
yading@10
|
352 } else
|
yading@10
|
353 s->flags = FLAG_KEYFRAME;
|
yading@10
|
354 } else /* Version 1 */
|
yading@10
|
355 s->flags = FLAG_KEYFRAME;
|
yading@10
|
356
|
yading@10
|
357 if (s->flags & FLAG_SPRITE) {
|
yading@10
|
358 avpriv_request_sample(s->avctx, "Frame with sprite");
|
yading@10
|
359 /* FIXME header.width, height, xoffset and yoffset aren't initialized */
|
yading@10
|
360 return AVERROR_PATCHWELCOME;
|
yading@10
|
361 } else {
|
yading@10
|
362 s->w = header.xsize;
|
yading@10
|
363 s->h = header.ysize;
|
yading@10
|
364 if (header.header_type < 2) {
|
yading@10
|
365 if ((s->w < 213) && (s->h >= 176))
|
yading@10
|
366 {
|
yading@10
|
367 s->flags |= FLAG_INTERPOLATED;
|
yading@10
|
368 avpriv_request_sample(s->avctx, "Interpolated frame");
|
yading@10
|
369 }
|
yading@10
|
370 }
|
yading@10
|
371 }
|
yading@10
|
372
|
yading@10
|
373 if (header.compression >= 17) {
|
yading@10
|
374 av_log(s->avctx, AV_LOG_ERROR, "invalid compression type (%d)\n", header.compression);
|
yading@10
|
375 return AVERROR_INVALIDDATA;
|
yading@10
|
376 }
|
yading@10
|
377
|
yading@10
|
378 if ((header.deltaset != s->last_deltaset) ||
|
yading@10
|
379 (header.vectable != s->last_vectable))
|
yading@10
|
380 select_delta_tables(s, header.deltaset);
|
yading@10
|
381
|
yading@10
|
382 if ((header.compression & 1) && header.header_type)
|
yading@10
|
383 sel_vector_table = pc_tbl2;
|
yading@10
|
384 else {
|
yading@10
|
385 if (header.vectable > 0 && header.vectable < 4)
|
yading@10
|
386 sel_vector_table = tables[header.vectable - 1];
|
yading@10
|
387 else {
|
yading@10
|
388 av_log(s->avctx, AV_LOG_ERROR, "invalid vector table id (%d)\n", header.vectable);
|
yading@10
|
389 return AVERROR_INVALIDDATA;
|
yading@10
|
390 }
|
yading@10
|
391 }
|
yading@10
|
392
|
yading@10
|
393 if (compression_types[header.compression].algorithm == ALGO_RGB24H) {
|
yading@10
|
394 new_pix_fmt = AV_PIX_FMT_RGB32;
|
yading@10
|
395 width_shift = 1;
|
yading@10
|
396 } else
|
yading@10
|
397 new_pix_fmt = AV_PIX_FMT_RGB555; // RGB565 is supported as well
|
yading@10
|
398
|
yading@10
|
399 s->w >>= width_shift;
|
yading@10
|
400 if ((ret = av_image_check_size(s->w, s->h, 0, s->avctx)) < 0)
|
yading@10
|
401 return ret;
|
yading@10
|
402
|
yading@10
|
403 if (s->w != s->avctx->width || s->h != s->avctx->height ||
|
yading@10
|
404 new_pix_fmt != s->avctx->pix_fmt) {
|
yading@10
|
405 av_frame_unref(&s->frame);
|
yading@10
|
406 s->avctx->sample_aspect_ratio = (AVRational){ 1 << width_shift, 1 };
|
yading@10
|
407 s->avctx->pix_fmt = new_pix_fmt;
|
yading@10
|
408 avcodec_set_dimensions(s->avctx, s->w, s->h);
|
yading@10
|
409 av_fast_malloc(&s->vert_pred, &s->vert_pred_size, s->avctx->width * sizeof(unsigned int));
|
yading@10
|
410 }
|
yading@10
|
411
|
yading@10
|
412 /* There is 1 change bit per 4 pixels, so each change byte represents
|
yading@10
|
413 * 32 pixels; divide width by 4 to obtain the number of change bits and
|
yading@10
|
414 * then round up to the nearest byte. */
|
yading@10
|
415 s->mb_change_bits_row_size = ((s->avctx->width >> (2 - width_shift)) + 7) >> 3;
|
yading@10
|
416
|
yading@10
|
417 if ((header.deltaset != s->last_deltaset) || (header.vectable != s->last_vectable))
|
yading@10
|
418 {
|
yading@10
|
419 if (compression_types[header.compression].algorithm == ALGO_RGB24H)
|
yading@10
|
420 gen_vector_table24(s, sel_vector_table);
|
yading@10
|
421 else
|
yading@10
|
422 if (s->avctx->pix_fmt == AV_PIX_FMT_RGB555)
|
yading@10
|
423 gen_vector_table15(s, sel_vector_table);
|
yading@10
|
424 else
|
yading@10
|
425 gen_vector_table16(s, sel_vector_table);
|
yading@10
|
426 }
|
yading@10
|
427
|
yading@10
|
428 /* set up pointers to the other key data chunks */
|
yading@10
|
429 s->mb_change_bits = s->buf + header.header_size;
|
yading@10
|
430 if (s->flags & FLAG_KEYFRAME) {
|
yading@10
|
431 /* no change bits specified for a keyframe; only index bytes */
|
yading@10
|
432 s->index_stream = s->mb_change_bits;
|
yading@10
|
433 } else {
|
yading@10
|
434 /* one change bit per 4x4 block */
|
yading@10
|
435 s->index_stream = s->mb_change_bits +
|
yading@10
|
436 (s->mb_change_bits_row_size * (s->avctx->height >> 2));
|
yading@10
|
437 }
|
yading@10
|
438 s->index_stream_size = s->size - (s->index_stream - s->buf);
|
yading@10
|
439
|
yading@10
|
440 s->last_deltaset = header.deltaset;
|
yading@10
|
441 s->last_vectable = header.vectable;
|
yading@10
|
442 s->compression = header.compression;
|
yading@10
|
443 s->block_width = compression_types[header.compression].block_width;
|
yading@10
|
444 s->block_height = compression_types[header.compression].block_height;
|
yading@10
|
445 s->block_type = compression_types[header.compression].block_type;
|
yading@10
|
446
|
yading@10
|
447 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
|
yading@10
|
448 av_log(s->avctx, AV_LOG_INFO, "tables: %d / %d c:%d %dx%d t:%d %s%s%s%s\n",
|
yading@10
|
449 s->last_deltaset, s->last_vectable, s->compression, s->block_width,
|
yading@10
|
450 s->block_height, s->block_type,
|
yading@10
|
451 s->flags & FLAG_KEYFRAME ? " KEY" : "",
|
yading@10
|
452 s->flags & FLAG_INTERFRAME ? " INTER" : "",
|
yading@10
|
453 s->flags & FLAG_SPRITE ? " SPRITE" : "",
|
yading@10
|
454 s->flags & FLAG_INTERPOLATED ? " INTERPOL" : "");
|
yading@10
|
455
|
yading@10
|
456 return header.header_size;
|
yading@10
|
457 }
|
yading@10
|
458
|
yading@10
|
459 static av_cold int truemotion1_decode_init(AVCodecContext *avctx)
|
yading@10
|
460 {
|
yading@10
|
461 TrueMotion1Context *s = avctx->priv_data;
|
yading@10
|
462
|
yading@10
|
463 s->avctx = avctx;
|
yading@10
|
464
|
yading@10
|
465 // FIXME: it may change ?
|
yading@10
|
466 // if (avctx->bits_per_sample == 24)
|
yading@10
|
467 // avctx->pix_fmt = AV_PIX_FMT_RGB24;
|
yading@10
|
468 // else
|
yading@10
|
469 // avctx->pix_fmt = AV_PIX_FMT_RGB555;
|
yading@10
|
470
|
yading@10
|
471 avcodec_get_frame_defaults(&s->frame);
|
yading@10
|
472
|
yading@10
|
473 /* there is a vertical predictor for each pixel in a line; each vertical
|
yading@10
|
474 * predictor is 0 to start with */
|
yading@10
|
475 av_fast_malloc(&s->vert_pred, &s->vert_pred_size, s->avctx->width * sizeof(unsigned int));
|
yading@10
|
476
|
yading@10
|
477 return 0;
|
yading@10
|
478 }
|
yading@10
|
479
|
yading@10
|
480 /*
|
yading@10
|
481 Block decoding order:
|
yading@10
|
482
|
yading@10
|
483 dxi: Y-Y
|
yading@10
|
484 dxic: Y-C-Y
|
yading@10
|
485 dxic2: Y-C-Y-C
|
yading@10
|
486
|
yading@10
|
487 hres,vres,i,i%vres (0 < i < 4)
|
yading@10
|
488 2x2 0: 0 dxic2
|
yading@10
|
489 2x2 1: 1 dxi
|
yading@10
|
490 2x2 2: 0 dxic2
|
yading@10
|
491 2x2 3: 1 dxi
|
yading@10
|
492 2x4 0: 0 dxic2
|
yading@10
|
493 2x4 1: 1 dxi
|
yading@10
|
494 2x4 2: 2 dxi
|
yading@10
|
495 2x4 3: 3 dxi
|
yading@10
|
496 4x2 0: 0 dxic
|
yading@10
|
497 4x2 1: 1 dxi
|
yading@10
|
498 4x2 2: 0 dxic
|
yading@10
|
499 4x2 3: 1 dxi
|
yading@10
|
500 4x4 0: 0 dxic
|
yading@10
|
501 4x4 1: 1 dxi
|
yading@10
|
502 4x4 2: 2 dxi
|
yading@10
|
503 4x4 3: 3 dxi
|
yading@10
|
504 */
|
yading@10
|
505
|
yading@10
|
506 #define GET_NEXT_INDEX() \
|
yading@10
|
507 {\
|
yading@10
|
508 if (index_stream_index >= s->index_stream_size) { \
|
yading@10
|
509 av_log(s->avctx, AV_LOG_INFO, " help! truemotion1 decoder went out of bounds\n"); \
|
yading@10
|
510 return; \
|
yading@10
|
511 } \
|
yading@10
|
512 index = s->index_stream[index_stream_index++] * 4; \
|
yading@10
|
513 }
|
yading@10
|
514
|
yading@10
|
515 #define APPLY_C_PREDICTOR() \
|
yading@10
|
516 if(index > 1023){\
|
yading@10
|
517 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
|
yading@10
|
518 return; \
|
yading@10
|
519 }\
|
yading@10
|
520 predictor_pair = s->c_predictor_table[index]; \
|
yading@10
|
521 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
522 if (predictor_pair & 1) { \
|
yading@10
|
523 GET_NEXT_INDEX() \
|
yading@10
|
524 if (!index) { \
|
yading@10
|
525 GET_NEXT_INDEX() \
|
yading@10
|
526 predictor_pair = s->c_predictor_table[index]; \
|
yading@10
|
527 horiz_pred += ((predictor_pair >> 1) * 5); \
|
yading@10
|
528 if (predictor_pair & 1) \
|
yading@10
|
529 GET_NEXT_INDEX() \
|
yading@10
|
530 else \
|
yading@10
|
531 index++; \
|
yading@10
|
532 } \
|
yading@10
|
533 } else \
|
yading@10
|
534 index++;
|
yading@10
|
535
|
yading@10
|
536 #define APPLY_C_PREDICTOR_24() \
|
yading@10
|
537 if(index > 1023){\
|
yading@10
|
538 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
|
yading@10
|
539 return; \
|
yading@10
|
540 }\
|
yading@10
|
541 predictor_pair = s->c_predictor_table[index]; \
|
yading@10
|
542 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
543 if (predictor_pair & 1) { \
|
yading@10
|
544 GET_NEXT_INDEX() \
|
yading@10
|
545 if (!index) { \
|
yading@10
|
546 GET_NEXT_INDEX() \
|
yading@10
|
547 predictor_pair = s->fat_c_predictor_table[index]; \
|
yading@10
|
548 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
549 if (predictor_pair & 1) \
|
yading@10
|
550 GET_NEXT_INDEX() \
|
yading@10
|
551 else \
|
yading@10
|
552 index++; \
|
yading@10
|
553 } \
|
yading@10
|
554 } else \
|
yading@10
|
555 index++;
|
yading@10
|
556
|
yading@10
|
557
|
yading@10
|
558 #define APPLY_Y_PREDICTOR() \
|
yading@10
|
559 if(index > 1023){\
|
yading@10
|
560 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
|
yading@10
|
561 return; \
|
yading@10
|
562 }\
|
yading@10
|
563 predictor_pair = s->y_predictor_table[index]; \
|
yading@10
|
564 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
565 if (predictor_pair & 1) { \
|
yading@10
|
566 GET_NEXT_INDEX() \
|
yading@10
|
567 if (!index) { \
|
yading@10
|
568 GET_NEXT_INDEX() \
|
yading@10
|
569 predictor_pair = s->y_predictor_table[index]; \
|
yading@10
|
570 horiz_pred += ((predictor_pair >> 1) * 5); \
|
yading@10
|
571 if (predictor_pair & 1) \
|
yading@10
|
572 GET_NEXT_INDEX() \
|
yading@10
|
573 else \
|
yading@10
|
574 index++; \
|
yading@10
|
575 } \
|
yading@10
|
576 } else \
|
yading@10
|
577 index++;
|
yading@10
|
578
|
yading@10
|
579 #define APPLY_Y_PREDICTOR_24() \
|
yading@10
|
580 if(index > 1023){\
|
yading@10
|
581 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
|
yading@10
|
582 return; \
|
yading@10
|
583 }\
|
yading@10
|
584 predictor_pair = s->y_predictor_table[index]; \
|
yading@10
|
585 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
586 if (predictor_pair & 1) { \
|
yading@10
|
587 GET_NEXT_INDEX() \
|
yading@10
|
588 if (!index) { \
|
yading@10
|
589 GET_NEXT_INDEX() \
|
yading@10
|
590 predictor_pair = s->fat_y_predictor_table[index]; \
|
yading@10
|
591 horiz_pred += (predictor_pair >> 1); \
|
yading@10
|
592 if (predictor_pair & 1) \
|
yading@10
|
593 GET_NEXT_INDEX() \
|
yading@10
|
594 else \
|
yading@10
|
595 index++; \
|
yading@10
|
596 } \
|
yading@10
|
597 } else \
|
yading@10
|
598 index++;
|
yading@10
|
599
|
yading@10
|
600 #define OUTPUT_PIXEL_PAIR() \
|
yading@10
|
601 *current_pixel_pair = *vert_pred + horiz_pred; \
|
yading@10
|
602 *vert_pred++ = *current_pixel_pair++;
|
yading@10
|
603
|
yading@10
|
604 static void truemotion1_decode_16bit(TrueMotion1Context *s)
|
yading@10
|
605 {
|
yading@10
|
606 int y;
|
yading@10
|
607 int pixels_left; /* remaining pixels on this line */
|
yading@10
|
608 unsigned int predictor_pair;
|
yading@10
|
609 unsigned int horiz_pred;
|
yading@10
|
610 unsigned int *vert_pred;
|
yading@10
|
611 unsigned int *current_pixel_pair;
|
yading@10
|
612 unsigned char *current_line = s->frame.data[0];
|
yading@10
|
613 int keyframe = s->flags & FLAG_KEYFRAME;
|
yading@10
|
614
|
yading@10
|
615 /* these variables are for managing the stream of macroblock change bits */
|
yading@10
|
616 const unsigned char *mb_change_bits = s->mb_change_bits;
|
yading@10
|
617 unsigned char mb_change_byte;
|
yading@10
|
618 unsigned char mb_change_byte_mask;
|
yading@10
|
619 int mb_change_index;
|
yading@10
|
620
|
yading@10
|
621 /* these variables are for managing the main index stream */
|
yading@10
|
622 int index_stream_index = 0; /* yes, the index into the index stream */
|
yading@10
|
623 int index;
|
yading@10
|
624
|
yading@10
|
625 /* clean out the line buffer */
|
yading@10
|
626 memset(s->vert_pred, 0, s->avctx->width * sizeof(unsigned int));
|
yading@10
|
627
|
yading@10
|
628 GET_NEXT_INDEX();
|
yading@10
|
629
|
yading@10
|
630 for (y = 0; y < s->avctx->height; y++) {
|
yading@10
|
631
|
yading@10
|
632 /* re-init variables for the next line iteration */
|
yading@10
|
633 horiz_pred = 0;
|
yading@10
|
634 current_pixel_pair = (unsigned int *)current_line;
|
yading@10
|
635 vert_pred = s->vert_pred;
|
yading@10
|
636 mb_change_index = 0;
|
yading@10
|
637 mb_change_byte = mb_change_bits[mb_change_index++];
|
yading@10
|
638 mb_change_byte_mask = 0x01;
|
yading@10
|
639 pixels_left = s->avctx->width;
|
yading@10
|
640
|
yading@10
|
641 while (pixels_left > 0) {
|
yading@10
|
642
|
yading@10
|
643 if (keyframe || ((mb_change_byte & mb_change_byte_mask) == 0)) {
|
yading@10
|
644
|
yading@10
|
645 switch (y & 3) {
|
yading@10
|
646 case 0:
|
yading@10
|
647 /* if macroblock width is 2, apply C-Y-C-Y; else
|
yading@10
|
648 * apply C-Y-Y */
|
yading@10
|
649 if (s->block_width == 2) {
|
yading@10
|
650 APPLY_C_PREDICTOR();
|
yading@10
|
651 APPLY_Y_PREDICTOR();
|
yading@10
|
652 OUTPUT_PIXEL_PAIR();
|
yading@10
|
653 APPLY_C_PREDICTOR();
|
yading@10
|
654 APPLY_Y_PREDICTOR();
|
yading@10
|
655 OUTPUT_PIXEL_PAIR();
|
yading@10
|
656 } else {
|
yading@10
|
657 APPLY_C_PREDICTOR();
|
yading@10
|
658 APPLY_Y_PREDICTOR();
|
yading@10
|
659 OUTPUT_PIXEL_PAIR();
|
yading@10
|
660 APPLY_Y_PREDICTOR();
|
yading@10
|
661 OUTPUT_PIXEL_PAIR();
|
yading@10
|
662 }
|
yading@10
|
663 break;
|
yading@10
|
664
|
yading@10
|
665 case 1:
|
yading@10
|
666 case 3:
|
yading@10
|
667 /* always apply 2 Y predictors on these iterations */
|
yading@10
|
668 APPLY_Y_PREDICTOR();
|
yading@10
|
669 OUTPUT_PIXEL_PAIR();
|
yading@10
|
670 APPLY_Y_PREDICTOR();
|
yading@10
|
671 OUTPUT_PIXEL_PAIR();
|
yading@10
|
672 break;
|
yading@10
|
673
|
yading@10
|
674 case 2:
|
yading@10
|
675 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
|
yading@10
|
676 * depending on the macroblock type */
|
yading@10
|
677 if (s->block_type == BLOCK_2x2) {
|
yading@10
|
678 APPLY_C_PREDICTOR();
|
yading@10
|
679 APPLY_Y_PREDICTOR();
|
yading@10
|
680 OUTPUT_PIXEL_PAIR();
|
yading@10
|
681 APPLY_C_PREDICTOR();
|
yading@10
|
682 APPLY_Y_PREDICTOR();
|
yading@10
|
683 OUTPUT_PIXEL_PAIR();
|
yading@10
|
684 } else if (s->block_type == BLOCK_4x2) {
|
yading@10
|
685 APPLY_C_PREDICTOR();
|
yading@10
|
686 APPLY_Y_PREDICTOR();
|
yading@10
|
687 OUTPUT_PIXEL_PAIR();
|
yading@10
|
688 APPLY_Y_PREDICTOR();
|
yading@10
|
689 OUTPUT_PIXEL_PAIR();
|
yading@10
|
690 } else {
|
yading@10
|
691 APPLY_Y_PREDICTOR();
|
yading@10
|
692 OUTPUT_PIXEL_PAIR();
|
yading@10
|
693 APPLY_Y_PREDICTOR();
|
yading@10
|
694 OUTPUT_PIXEL_PAIR();
|
yading@10
|
695 }
|
yading@10
|
696 break;
|
yading@10
|
697 }
|
yading@10
|
698
|
yading@10
|
699 } else {
|
yading@10
|
700
|
yading@10
|
701 /* skip (copy) four pixels, but reassign the horizontal
|
yading@10
|
702 * predictor */
|
yading@10
|
703 *vert_pred++ = *current_pixel_pair++;
|
yading@10
|
704 horiz_pred = *current_pixel_pair - *vert_pred;
|
yading@10
|
705 *vert_pred++ = *current_pixel_pair++;
|
yading@10
|
706
|
yading@10
|
707 }
|
yading@10
|
708
|
yading@10
|
709 if (!keyframe) {
|
yading@10
|
710 mb_change_byte_mask <<= 1;
|
yading@10
|
711
|
yading@10
|
712 /* next byte */
|
yading@10
|
713 if (!mb_change_byte_mask) {
|
yading@10
|
714 mb_change_byte = mb_change_bits[mb_change_index++];
|
yading@10
|
715 mb_change_byte_mask = 0x01;
|
yading@10
|
716 }
|
yading@10
|
717 }
|
yading@10
|
718
|
yading@10
|
719 pixels_left -= 4;
|
yading@10
|
720 }
|
yading@10
|
721
|
yading@10
|
722 /* next change row */
|
yading@10
|
723 if (((y + 1) & 3) == 0)
|
yading@10
|
724 mb_change_bits += s->mb_change_bits_row_size;
|
yading@10
|
725
|
yading@10
|
726 current_line += s->frame.linesize[0];
|
yading@10
|
727 }
|
yading@10
|
728 }
|
yading@10
|
729
|
yading@10
|
730 static void truemotion1_decode_24bit(TrueMotion1Context *s)
|
yading@10
|
731 {
|
yading@10
|
732 int y;
|
yading@10
|
733 int pixels_left; /* remaining pixels on this line */
|
yading@10
|
734 unsigned int predictor_pair;
|
yading@10
|
735 unsigned int horiz_pred;
|
yading@10
|
736 unsigned int *vert_pred;
|
yading@10
|
737 unsigned int *current_pixel_pair;
|
yading@10
|
738 unsigned char *current_line = s->frame.data[0];
|
yading@10
|
739 int keyframe = s->flags & FLAG_KEYFRAME;
|
yading@10
|
740
|
yading@10
|
741 /* these variables are for managing the stream of macroblock change bits */
|
yading@10
|
742 const unsigned char *mb_change_bits = s->mb_change_bits;
|
yading@10
|
743 unsigned char mb_change_byte;
|
yading@10
|
744 unsigned char mb_change_byte_mask;
|
yading@10
|
745 int mb_change_index;
|
yading@10
|
746
|
yading@10
|
747 /* these variables are for managing the main index stream */
|
yading@10
|
748 int index_stream_index = 0; /* yes, the index into the index stream */
|
yading@10
|
749 int index;
|
yading@10
|
750
|
yading@10
|
751 /* clean out the line buffer */
|
yading@10
|
752 memset(s->vert_pred, 0, s->avctx->width * sizeof(unsigned int));
|
yading@10
|
753
|
yading@10
|
754 GET_NEXT_INDEX();
|
yading@10
|
755
|
yading@10
|
756 for (y = 0; y < s->avctx->height; y++) {
|
yading@10
|
757
|
yading@10
|
758 /* re-init variables for the next line iteration */
|
yading@10
|
759 horiz_pred = 0;
|
yading@10
|
760 current_pixel_pair = (unsigned int *)current_line;
|
yading@10
|
761 vert_pred = s->vert_pred;
|
yading@10
|
762 mb_change_index = 0;
|
yading@10
|
763 mb_change_byte = mb_change_bits[mb_change_index++];
|
yading@10
|
764 mb_change_byte_mask = 0x01;
|
yading@10
|
765 pixels_left = s->avctx->width;
|
yading@10
|
766
|
yading@10
|
767 while (pixels_left > 0) {
|
yading@10
|
768
|
yading@10
|
769 if (keyframe || ((mb_change_byte & mb_change_byte_mask) == 0)) {
|
yading@10
|
770
|
yading@10
|
771 switch (y & 3) {
|
yading@10
|
772 case 0:
|
yading@10
|
773 /* if macroblock width is 2, apply C-Y-C-Y; else
|
yading@10
|
774 * apply C-Y-Y */
|
yading@10
|
775 if (s->block_width == 2) {
|
yading@10
|
776 APPLY_C_PREDICTOR_24();
|
yading@10
|
777 APPLY_Y_PREDICTOR_24();
|
yading@10
|
778 OUTPUT_PIXEL_PAIR();
|
yading@10
|
779 APPLY_C_PREDICTOR_24();
|
yading@10
|
780 APPLY_Y_PREDICTOR_24();
|
yading@10
|
781 OUTPUT_PIXEL_PAIR();
|
yading@10
|
782 } else {
|
yading@10
|
783 APPLY_C_PREDICTOR_24();
|
yading@10
|
784 APPLY_Y_PREDICTOR_24();
|
yading@10
|
785 OUTPUT_PIXEL_PAIR();
|
yading@10
|
786 APPLY_Y_PREDICTOR_24();
|
yading@10
|
787 OUTPUT_PIXEL_PAIR();
|
yading@10
|
788 }
|
yading@10
|
789 break;
|
yading@10
|
790
|
yading@10
|
791 case 1:
|
yading@10
|
792 case 3:
|
yading@10
|
793 /* always apply 2 Y predictors on these iterations */
|
yading@10
|
794 APPLY_Y_PREDICTOR_24();
|
yading@10
|
795 OUTPUT_PIXEL_PAIR();
|
yading@10
|
796 APPLY_Y_PREDICTOR_24();
|
yading@10
|
797 OUTPUT_PIXEL_PAIR();
|
yading@10
|
798 break;
|
yading@10
|
799
|
yading@10
|
800 case 2:
|
yading@10
|
801 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
|
yading@10
|
802 * depending on the macroblock type */
|
yading@10
|
803 if (s->block_type == BLOCK_2x2) {
|
yading@10
|
804 APPLY_C_PREDICTOR_24();
|
yading@10
|
805 APPLY_Y_PREDICTOR_24();
|
yading@10
|
806 OUTPUT_PIXEL_PAIR();
|
yading@10
|
807 APPLY_C_PREDICTOR_24();
|
yading@10
|
808 APPLY_Y_PREDICTOR_24();
|
yading@10
|
809 OUTPUT_PIXEL_PAIR();
|
yading@10
|
810 } else if (s->block_type == BLOCK_4x2) {
|
yading@10
|
811 APPLY_C_PREDICTOR_24();
|
yading@10
|
812 APPLY_Y_PREDICTOR_24();
|
yading@10
|
813 OUTPUT_PIXEL_PAIR();
|
yading@10
|
814 APPLY_Y_PREDICTOR_24();
|
yading@10
|
815 OUTPUT_PIXEL_PAIR();
|
yading@10
|
816 } else {
|
yading@10
|
817 APPLY_Y_PREDICTOR_24();
|
yading@10
|
818 OUTPUT_PIXEL_PAIR();
|
yading@10
|
819 APPLY_Y_PREDICTOR_24();
|
yading@10
|
820 OUTPUT_PIXEL_PAIR();
|
yading@10
|
821 }
|
yading@10
|
822 break;
|
yading@10
|
823 }
|
yading@10
|
824
|
yading@10
|
825 } else {
|
yading@10
|
826
|
yading@10
|
827 /* skip (copy) four pixels, but reassign the horizontal
|
yading@10
|
828 * predictor */
|
yading@10
|
829 *vert_pred++ = *current_pixel_pair++;
|
yading@10
|
830 horiz_pred = *current_pixel_pair - *vert_pred;
|
yading@10
|
831 *vert_pred++ = *current_pixel_pair++;
|
yading@10
|
832
|
yading@10
|
833 }
|
yading@10
|
834
|
yading@10
|
835 if (!keyframe) {
|
yading@10
|
836 mb_change_byte_mask <<= 1;
|
yading@10
|
837
|
yading@10
|
838 /* next byte */
|
yading@10
|
839 if (!mb_change_byte_mask) {
|
yading@10
|
840 mb_change_byte = mb_change_bits[mb_change_index++];
|
yading@10
|
841 mb_change_byte_mask = 0x01;
|
yading@10
|
842 }
|
yading@10
|
843 }
|
yading@10
|
844
|
yading@10
|
845 pixels_left -= 2;
|
yading@10
|
846 }
|
yading@10
|
847
|
yading@10
|
848 /* next change row */
|
yading@10
|
849 if (((y + 1) & 3) == 0)
|
yading@10
|
850 mb_change_bits += s->mb_change_bits_row_size;
|
yading@10
|
851
|
yading@10
|
852 current_line += s->frame.linesize[0];
|
yading@10
|
853 }
|
yading@10
|
854 }
|
yading@10
|
855
|
yading@10
|
856
|
yading@10
|
857 static int truemotion1_decode_frame(AVCodecContext *avctx,
|
yading@10
|
858 void *data, int *got_frame,
|
yading@10
|
859 AVPacket *avpkt)
|
yading@10
|
860 {
|
yading@10
|
861 const uint8_t *buf = avpkt->data;
|
yading@10
|
862 int ret, buf_size = avpkt->size;
|
yading@10
|
863 TrueMotion1Context *s = avctx->priv_data;
|
yading@10
|
864
|
yading@10
|
865 s->buf = buf;
|
yading@10
|
866 s->size = buf_size;
|
yading@10
|
867
|
yading@10
|
868 if ((ret = truemotion1_decode_header(s)) < 0)
|
yading@10
|
869 return ret;
|
yading@10
|
870
|
yading@10
|
871 if ((ret = ff_reget_buffer(avctx, &s->frame)) < 0)
|
yading@10
|
872 return ret;
|
yading@10
|
873
|
yading@10
|
874 if (compression_types[s->compression].algorithm == ALGO_RGB24H) {
|
yading@10
|
875 truemotion1_decode_24bit(s);
|
yading@10
|
876 } else if (compression_types[s->compression].algorithm != ALGO_NOP) {
|
yading@10
|
877 truemotion1_decode_16bit(s);
|
yading@10
|
878 }
|
yading@10
|
879
|
yading@10
|
880 if ((ret = av_frame_ref(data, &s->frame)) < 0)
|
yading@10
|
881 return ret;
|
yading@10
|
882
|
yading@10
|
883 *got_frame = 1;
|
yading@10
|
884
|
yading@10
|
885 /* report that the buffer was completely consumed */
|
yading@10
|
886 return buf_size;
|
yading@10
|
887 }
|
yading@10
|
888
|
yading@10
|
889 static av_cold int truemotion1_decode_end(AVCodecContext *avctx)
|
yading@10
|
890 {
|
yading@10
|
891 TrueMotion1Context *s = avctx->priv_data;
|
yading@10
|
892
|
yading@10
|
893 av_frame_unref(&s->frame);
|
yading@10
|
894 av_free(s->vert_pred);
|
yading@10
|
895
|
yading@10
|
896 return 0;
|
yading@10
|
897 }
|
yading@10
|
898
|
yading@10
|
899 AVCodec ff_truemotion1_decoder = {
|
yading@10
|
900 .name = "truemotion1",
|
yading@10
|
901 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
902 .id = AV_CODEC_ID_TRUEMOTION1,
|
yading@10
|
903 .priv_data_size = sizeof(TrueMotion1Context),
|
yading@10
|
904 .init = truemotion1_decode_init,
|
yading@10
|
905 .close = truemotion1_decode_end,
|
yading@10
|
906 .decode = truemotion1_decode_frame,
|
yading@10
|
907 .capabilities = CODEC_CAP_DR1,
|
yading@10
|
908 .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 1.0"),
|
yading@10
|
909 };
|