1 /*
2 * Duck TrueMotion 1.0 Decoder
3 * Copyright (C) 2003 Alex Beregszaszi & Mike Melanson
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 /**
23 * @file
24 * Duck TrueMotion v1 Video Decoder by
25 * Alex Beregszaszi and
26 * Mike Melanson (melanson@pcisys.net)
27 *
28 * The TrueMotion v1 decoder presently only decodes 16-bit TM1 data and
29 * outputs RGB555 (or RGB565) data. 24-bit TM1 data is not supported yet.
30 */
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
42
44
48
51
56
59
64
69
74
76
79
81
82 #define FLAG_SPRITE 32
83 #define FLAG_KEYFRAME 16
84 #define FLAG_INTERFRAME 8
85 #define FLAG_INTERPOLATED 4
86
103 };
104
106 #define ALGO_RGB16V 1
107 #define ALGO_RGB16H 2
108 #define ALGO_RGB24H 3
109
110 /* these are the various block sizes that can occupy a 4x4 block */
115
122
123 /* { valid for metatype }, algorithm, num of deltas, vert res, horiz res */
126
131
136
141
146 };
147
149 {
150 int i;
151
152 if (delta_table_index > 3)
153 return;
154
155 memcpy(s->
ydt,
ydts[delta_table_index], 8 *
sizeof(int16_t));
156 memcpy(s->
cdt,
cdts[delta_table_index], 8 *
sizeof(int16_t));
159
160 /* Y skinny deltas need to be halved for some reason; maybe the
161 * skinny Y deltas should be modified */
162 for (i = 0; i < 8; i++)
163 {
164 /* drop the lsb before dividing by 2-- net effect: round down
165 * when dividing a negative number (e.g., -3/2 = -2, not -1) */
168 }
169 }
170
171 #if HAVE_BIGENDIAN
173 #else
175 #endif
176 {
177 int lo, hi;
178
179 lo = ydt[p1];
180 lo += (lo << 5) + (lo << 10);
181 hi = ydt[p2];
182 hi += (hi << 5) + (hi << 10);
183 return (lo + (hi << 16)) << 1;
184 }
185
187 {
189
190 b = cdt[p2];
191 r = cdt[p1] << 10;
193 return (lo + (lo << 16)) << 1;
194 }
195
196 #if HAVE_BIGENDIAN
198 #else
200 #endif
201 {
202 int lo, hi;
203
204 lo = ydt[p1];
205 lo += (lo << 6) + (lo << 11);
206 hi = ydt[p2];
207 hi += (hi << 6) + (hi << 11);
208 return (lo + (hi << 16)) << 1;
209 }
210
212 {
214
215 b = cdt[p2];
216 r = cdt[p1] << 11;
218 return (lo + (lo << 16)) << 1;
219 }
220
222 {
223 int lo, hi;
224
225 lo = ydt[p1];
226 hi = ydt[p2];
227 return (lo + (hi << 8) + (hi << 16)) << 1;
228 }
229
231 {
233
234 b = cdt[p2];
235 r = cdt[p1]<<16;
236 return (b+r) << 1;
237 }
238
240 {
242 unsigned char delta_pair;
243
244 for (i = 0; i < 1024; i += 4)
245 {
246 len = *sel_vector_table++ / 2;
247 for (j = 0; j <
len; j++)
248 {
249 delta_pair = *sel_vector_table++;
254 }
257 }
258 }
259
261 {
263 unsigned char delta_pair;
264
265 for (i = 0; i < 1024; i += 4)
266 {
267 len = *sel_vector_table++ / 2;
268 for (j = 0; j <
len; j++)
269 {
270 delta_pair = *sel_vector_table++;
275 }
278 }
279 }
280
282 {
284 unsigned char delta_pair;
285
286 for (i = 0; i < 1024; i += 4)
287 {
288 len = *sel_vector_table++ / 2;
289 for (j = 0; j <
len; j++)
290 {
291 delta_pair = *sel_vector_table++;
300 }
305 }
306 }
307
308 /* Returns the number of bytes consumed from the bytestream. Returns -1 if
309 * there was an error while decoding the header */
311 {
313 int width_shift = 0;
314 int new_pix_fmt;
316 uint8_t header_buffer[128] = { 0 };
/* logical maximum size of the header */
317 const uint8_t *sel_vector_table;
318
321 {
324 }
325
326 /* unscramble the header bytes with a XOR operation */
328 header_buffer[i - 1] = s->
buf[i] ^ s->
buf[i + 1];
329
336 header.
version = header_buffer[9];
338 header.
flags = header_buffer[11];
339 header.
control = header_buffer[12];
340
341 /* Version 2 */
343 {
345 {
352 } else
354 } else /* Version 1 */
356
359 /* FIXME header.width, height, xoffset and yoffset aren't initialized */
361 } else {
365 if ((s->
w < 213) && (s->
h >= 176))
366 {
369 }
370 }
371 }
372
376 }
377
381
384 else {
387 else {
390 }
391 }
392
395 width_shift = 1;
396 } else
398
399 s->
w >>= width_shift;
402
410 }
411
412 /* There is 1 change bit per 4 pixels, so each change byte represents
413 * 32 pixels; divide width by 4 to obtain the number of change bits and
414 * then round up to the nearest byte. */
416
418 {
421 else
424 else
426 }
427
428 /* set up pointers to the other key data chunks */
431 /* no change bits specified for a keyframe; only index bytes */
433 } else {
434 /* one change bit per 4x4 block */
437 }
439
446
455
457 }
458
460 {
462
464
465 // FIXME: it may change ?
466 // if (avctx->bits_per_sample == 24)
467 // avctx->pix_fmt = AV_PIX_FMT_RGB24;
468 // else
469 // avctx->pix_fmt = AV_PIX_FMT_RGB555;
470
472
473 /* there is a vertical predictor for each pixel in a line; each vertical
474 * predictor is 0 to start with */
476
477 return 0;
478 }
479
480 /*
481 Block decoding order:
482
483 dxi: Y-Y
484 dxic: Y-C-Y
485 dxic2: Y-C-Y-C
486
487 hres,vres,i,i%vres (0 < i < 4)
488 2x2 0: 0 dxic2
489 2x2 1: 1 dxi
490 2x2 2: 0 dxic2
491 2x2 3: 1 dxi
492 2x4 0: 0 dxic2
493 2x4 1: 1 dxi
494 2x4 2: 2 dxi
495 2x4 3: 3 dxi
496 4x2 0: 0 dxic
497 4x2 1: 1 dxi
498 4x2 2: 0 dxic
499 4x2 3: 1 dxi
500 4x4 0: 0 dxic
501 4x4 1: 1 dxi
502 4x4 2: 2 dxi
503 4x4 3: 3 dxi
504 */
505
506 #define GET_NEXT_INDEX() \
507 {\
508 if (index_stream_index >= s->index_stream_size) { \
509 av_log(s->avctx, AV_LOG_INFO, " help! truemotion1 decoder went out of bounds\n"); \
510 return; \
511 } \
512 index = s->index_stream[index_stream_index++] * 4; \
513 }
514
515 #define APPLY_C_PREDICTOR() \
516 if(index > 1023){\
517 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
518 return; \
519 }\
520 predictor_pair = s->c_predictor_table[index]; \
521 horiz_pred += (predictor_pair >> 1); \
522 if (predictor_pair & 1) { \
523 GET_NEXT_INDEX() \
524 if (!index) { \
525 GET_NEXT_INDEX() \
526 predictor_pair = s->c_predictor_table[index]; \
527 horiz_pred += ((predictor_pair >> 1) * 5); \
528 if (predictor_pair & 1) \
529 GET_NEXT_INDEX() \
530 else \
531 index++; \
532 } \
533 } else \
534 index++;
535
536 #define APPLY_C_PREDICTOR_24() \
537 if(index > 1023){\
538 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
539 return; \
540 }\
541 predictor_pair = s->c_predictor_table[index]; \
542 horiz_pred += (predictor_pair >> 1); \
543 if (predictor_pair & 1) { \
544 GET_NEXT_INDEX() \
545 if (!index) { \
546 GET_NEXT_INDEX() \
547 predictor_pair = s->fat_c_predictor_table[index]; \
548 horiz_pred += (predictor_pair >> 1); \
549 if (predictor_pair & 1) \
550 GET_NEXT_INDEX() \
551 else \
552 index++; \
553 } \
554 } else \
555 index++;
556
557
558 #define APPLY_Y_PREDICTOR() \
559 if(index > 1023){\
560 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
561 return; \
562 }\
563 predictor_pair = s->y_predictor_table[index]; \
564 horiz_pred += (predictor_pair >> 1); \
565 if (predictor_pair & 1) { \
566 GET_NEXT_INDEX() \
567 if (!index) { \
568 GET_NEXT_INDEX() \
569 predictor_pair = s->y_predictor_table[index]; \
570 horiz_pred += ((predictor_pair >> 1) * 5); \
571 if (predictor_pair & 1) \
572 GET_NEXT_INDEX() \
573 else \
574 index++; \
575 } \
576 } else \
577 index++;
578
579 #define APPLY_Y_PREDICTOR_24() \
580 if(index > 1023){\
581 av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
582 return; \
583 }\
584 predictor_pair = s->y_predictor_table[index]; \
585 horiz_pred += (predictor_pair >> 1); \
586 if (predictor_pair & 1) { \
587 GET_NEXT_INDEX() \
588 if (!index) { \
589 GET_NEXT_INDEX() \
590 predictor_pair = s->fat_y_predictor_table[index]; \
591 horiz_pred += (predictor_pair >> 1); \
592 if (predictor_pair & 1) \
593 GET_NEXT_INDEX() \
594 else \
595 index++; \
596 } \
597 } else \
598 index++;
599
600 #define OUTPUT_PIXEL_PAIR() \
601 *current_pixel_pair = *vert_pred + horiz_pred; \
602 *vert_pred++ = *current_pixel_pair++;
603
605 {
607 int pixels_left; /* remaining pixels on this line */
608 unsigned int predictor_pair;
609 unsigned int horiz_pred;
610 unsigned int *vert_pred;
611 unsigned int *current_pixel_pair;
612 unsigned char *current_line = s->
frame.
data[0];
614
615 /* these variables are for managing the stream of macroblock change bits */
617 unsigned char mb_change_byte;
618 unsigned char mb_change_byte_mask;
619 int mb_change_index;
620
621 /* these variables are for managing the main index stream */
622 int index_stream_index = 0; /* yes, the index into the index stream */
624
625 /* clean out the line buffer */
627
629
631
632 /* re-init variables for the next line iteration */
633 horiz_pred = 0;
634 current_pixel_pair = (unsigned int *)current_line;
636 mb_change_index = 0;
637 mb_change_byte = mb_change_bits[mb_change_index++];
638 mb_change_byte_mask = 0x01;
640
641 while (pixels_left > 0) {
642
643 if (keyframe || ((mb_change_byte & mb_change_byte_mask) == 0)) {
644
645 switch (y & 3) {
646 case 0:
647 /* if macroblock width is 2, apply C-Y-C-Y; else
648 * apply C-Y-Y */
656 } else {
662 }
663 break;
664
665 case 1:
666 case 3:
667 /* always apply 2 Y predictors on these iterations */
672 break;
673
674 case 2:
675 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
676 * depending on the macroblock type */
690 } else {
695 }
696 break;
697 }
698
699 } else {
700
701 /* skip (copy) four pixels, but reassign the horizontal
702 * predictor */
703 *vert_pred++ = *current_pixel_pair++;
704 horiz_pred = *current_pixel_pair - *vert_pred;
705 *vert_pred++ = *current_pixel_pair++;
706
707 }
708
709 if (!keyframe) {
710 mb_change_byte_mask <<= 1;
711
712 /* next byte */
713 if (!mb_change_byte_mask) {
714 mb_change_byte = mb_change_bits[mb_change_index++];
715 mb_change_byte_mask = 0x01;
716 }
717 }
718
719 pixels_left -= 4;
720 }
721
722 /* next change row */
723 if (((y + 1) & 3) == 0)
725
727 }
728 }
729
731 {
733 int pixels_left; /* remaining pixels on this line */
734 unsigned int predictor_pair;
735 unsigned int horiz_pred;
736 unsigned int *vert_pred;
737 unsigned int *current_pixel_pair;
738 unsigned char *current_line = s->
frame.
data[0];
740
741 /* these variables are for managing the stream of macroblock change bits */
743 unsigned char mb_change_byte;
744 unsigned char mb_change_byte_mask;
745 int mb_change_index;
746
747 /* these variables are for managing the main index stream */
748 int index_stream_index = 0; /* yes, the index into the index stream */
750
751 /* clean out the line buffer */
753
755
757
758 /* re-init variables for the next line iteration */
759 horiz_pred = 0;
760 current_pixel_pair = (unsigned int *)current_line;
762 mb_change_index = 0;
763 mb_change_byte = mb_change_bits[mb_change_index++];
764 mb_change_byte_mask = 0x01;
766
767 while (pixels_left > 0) {
768
769 if (keyframe || ((mb_change_byte & mb_change_byte_mask) == 0)) {
770
771 switch (y & 3) {
772 case 0:
773 /* if macroblock width is 2, apply C-Y-C-Y; else
774 * apply C-Y-Y */
782 } else {
788 }
789 break;
790
791 case 1:
792 case 3:
793 /* always apply 2 Y predictors on these iterations */
798 break;
799
800 case 2:
801 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
802 * depending on the macroblock type */
816 } else {
821 }
822 break;
823 }
824
825 } else {
826
827 /* skip (copy) four pixels, but reassign the horizontal
828 * predictor */
829 *vert_pred++ = *current_pixel_pair++;
830 horiz_pred = *current_pixel_pair - *vert_pred;
831 *vert_pred++ = *current_pixel_pair++;
832
833 }
834
835 if (!keyframe) {
836 mb_change_byte_mask <<= 1;
837
838 /* next byte */
839 if (!mb_change_byte_mask) {
840 mb_change_byte = mb_change_bits[mb_change_index++];
841 mb_change_byte_mask = 0x01;
842 }
843 }
844
845 pixels_left -= 2;
846 }
847
848 /* next change row */
849 if (((y + 1) & 3) == 0)
851
853 }
854 }
855
856
858 void *
data,
int *got_frame,
860 {
862 int ret, buf_size = avpkt->
size;
864
867
870
873
878 }
879
882
883 *got_frame = 1;
884
885 /* report that the buffer was completely consumed */
886 return buf_size;
887 }
888
890 {
892
895
896 return 0;
897 }
898
900 .
name =
"truemotion1",
909 };