2 * Duck TrueMotion 1.0 Decoder
3 * Copyright (C) 2003 Alex Beregszaszi & Mike Melanson
5 * This file is part of FFmpeg.
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.
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.
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
24 * Duck TrueMotion v1 Video Decoder by
25 * Alex Beregszaszi and
26 * Mike Melanson (melanson@pcisys.net)
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.
38 #include "libavutil/imgutils.h"
39 #include "libavutil/internal.h"
40 #include "libavutil/intreadwrite.h"
41 #include "libavutil/mem.h"
43 #include "truemotion1data.h"
45 typedef struct TrueMotion1Context
{
46 AVCodecContext
*avctx
;
52 const uint8_t *mb_change_bits
;
53 int mb_change_bits_row_size
;
54 const uint8_t *index_stream
;
55 int index_stream_size
;
60 uint32_t y_predictor_table
[1024];
61 uint32_t c_predictor_table
[1024];
62 uint32_t fat_y_predictor_table
[1024];
63 uint32_t fat_c_predictor_table
[1024];
75 int last_deltaset
, last_vectable
;
77 unsigned int *vert_pred
;
82 #define FLAG_SPRITE 32
83 #define FLAG_KEYFRAME 16
84 #define FLAG_INTERFRAME 8
85 #define FLAG_INTERPOLATED 4
106 #define ALGO_RGB16V 1
107 #define ALGO_RGB16H 2
108 #define ALGO_RGB24H 3
110 /* these are the various block sizes that can occupy a 4x4 block */
116 typedef struct comp_types
{
118 int block_width
; // vres
119 int block_height
; // hres
123 /* { valid for metatype }, algorithm, num of deltas, vert res, horiz res */
124 static const comp_types compression_types
[17] = {
125 { ALGO_NOP
, 0, 0, 0 },
127 { ALGO_RGB16V
, 4, 4, BLOCK_4x4
},
128 { ALGO_RGB16H
, 4, 4, BLOCK_4x4
},
129 { ALGO_RGB16V
, 4, 2, BLOCK_4x2
},
130 { ALGO_RGB16H
, 4, 2, BLOCK_4x2
},
132 { ALGO_RGB16V
, 2, 4, BLOCK_2x4
},
133 { ALGO_RGB16H
, 2, 4, BLOCK_2x4
},
134 { ALGO_RGB16V
, 2, 2, BLOCK_2x2
},
135 { ALGO_RGB16H
, 2, 2, BLOCK_2x2
},
137 { ALGO_NOP
, 4, 4, BLOCK_4x4
},
138 { ALGO_RGB24H
, 4, 4, BLOCK_4x4
},
139 { ALGO_NOP
, 4, 2, BLOCK_4x2
},
140 { ALGO_RGB24H
, 4, 2, BLOCK_4x2
},
142 { ALGO_NOP
, 2, 4, BLOCK_2x4
},
143 { ALGO_RGB24H
, 2, 4, BLOCK_2x4
},
144 { ALGO_NOP
, 2, 2, BLOCK_2x2
},
145 { ALGO_RGB24H
, 2, 2, BLOCK_2x2
}
148 static void select_delta_tables(TrueMotion1Context
*s
, int delta_table_index
)
152 if (delta_table_index
> 3)
155 memcpy(s
->ydt
, ydts
[delta_table_index
], 8 * sizeof(int16_t));
156 memcpy(s
->cdt
, cdts
[delta_table_index
], 8 * sizeof(int16_t));
157 memcpy(s
->fat_ydt
, fat_ydts
[delta_table_index
], 8 * sizeof(int16_t));
158 memcpy(s
->fat_cdt
, fat_cdts
[delta_table_index
], 8 * sizeof(int16_t));
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
++)
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) */
172 static int make_ydt15_entry(int p2
, int p1
, int16_t *ydt
)
174 static int make_ydt15_entry(int p1
, int p2
, int16_t *ydt
)
180 lo
+= (lo
<< 5) + (lo
<< 10);
182 hi
+= (hi
<< 5) + (hi
<< 10);
183 return (lo
+ (hi
<< 16)) << 1;
186 static int make_cdt15_entry(int p1
, int p2
, int16_t *cdt
)
193 return (lo
+ (lo
<< 16)) << 1;
197 static int make_ydt16_entry(int p2
, int p1
, int16_t *ydt
)
199 static int make_ydt16_entry(int p1
, int p2
, int16_t *ydt
)
205 lo
+= (lo
<< 6) + (lo
<< 11);
207 hi
+= (hi
<< 6) + (hi
<< 11);
208 return (lo
+ (hi
<< 16)) << 1;
211 static int make_cdt16_entry(int p1
, int p2
, int16_t *cdt
)
218 return (lo
+ (lo
<< 16)) << 1;
221 static int make_ydt24_entry(int p1
, int p2
, int16_t *ydt
)
227 return (lo
+ (hi
<< 8) + (hi
<< 16)) << 1;
230 static int make_cdt24_entry(int p1
, int p2
, int16_t *cdt
)
239 static void gen_vector_table15(TrueMotion1Context
*s
, const uint8_t *sel_vector_table
)
242 unsigned char delta_pair
;
244 for (i
= 0; i
< 1024; i
+= 4)
246 len
= *sel_vector_table
++ / 2;
247 for (j
= 0; j
< len
; j
++)
249 delta_pair
= *sel_vector_table
++;
250 s
->y_predictor_table
[i
+j
] = 0xfffffffe &
251 make_ydt15_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->ydt
);
252 s
->c_predictor_table
[i
+j
] = 0xfffffffe &
253 make_cdt15_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->cdt
);
255 s
->y_predictor_table
[i
+(j
-1)] |= 1;
256 s
->c_predictor_table
[i
+(j
-1)] |= 1;
260 static void gen_vector_table16(TrueMotion1Context
*s
, const uint8_t *sel_vector_table
)
263 unsigned char delta_pair
;
265 for (i
= 0; i
< 1024; i
+= 4)
267 len
= *sel_vector_table
++ / 2;
268 for (j
= 0; j
< len
; j
++)
270 delta_pair
= *sel_vector_table
++;
271 s
->y_predictor_table
[i
+j
] = 0xfffffffe &
272 make_ydt16_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->ydt
);
273 s
->c_predictor_table
[i
+j
] = 0xfffffffe &
274 make_cdt16_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->cdt
);
276 s
->y_predictor_table
[i
+(j
-1)] |= 1;
277 s
->c_predictor_table
[i
+(j
-1)] |= 1;
281 static void gen_vector_table24(TrueMotion1Context
*s
, const uint8_t *sel_vector_table
)
284 unsigned char delta_pair
;
286 for (i
= 0; i
< 1024; i
+= 4)
288 len
= *sel_vector_table
++ / 2;
289 for (j
= 0; j
< len
; j
++)
291 delta_pair
= *sel_vector_table
++;
292 s
->y_predictor_table
[i
+j
] = 0xfffffffe &
293 make_ydt24_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->ydt
);
294 s
->c_predictor_table
[i
+j
] = 0xfffffffe &
295 make_cdt24_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->cdt
);
296 s
->fat_y_predictor_table
[i
+j
] = 0xfffffffe &
297 make_ydt24_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->fat_ydt
);
298 s
->fat_c_predictor_table
[i
+j
] = 0xfffffffe &
299 make_cdt24_entry(delta_pair
>> 4, delta_pair
& 0xf, s
->fat_cdt
);
301 s
->y_predictor_table
[i
+(j
-1)] |= 1;
302 s
->c_predictor_table
[i
+(j
-1)] |= 1;
303 s
->fat_y_predictor_table
[i
+(j
-1)] |= 1;
304 s
->fat_c_predictor_table
[i
+(j
-1)] |= 1;
308 /* Returns the number of bytes consumed from the bytestream. Returns -1 if
309 * there was an error while decoding the header */
310 static int truemotion1_decode_header(TrueMotion1Context
*s
)
315 struct frame_header header
;
316 uint8_t header_buffer
[128] = { 0 }; /* logical maximum size of the header */
317 const uint8_t *sel_vector_table
;
319 header
.header_size
= ((s
->buf
[0] >> 5) | (s
->buf
[0] << 3)) & 0x7f;
320 if (s
->buf
[0] < 0x10)
322 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid header size (%d)\n", s
->buf
[0]);
323 return AVERROR_INVALIDDATA
;
326 if (header
.header_size
+ 1 > s
->size
) {
327 av_log(s
->avctx
, AV_LOG_ERROR
, "Input packet too small.\n");
328 return AVERROR_INVALIDDATA
;
331 /* unscramble the header bytes with a XOR operation */
332 for (i
= 1; i
< header
.header_size
; i
++)
333 header_buffer
[i
- 1] = s
->buf
[i
] ^ s
->buf
[i
+ 1];
335 header
.compression
= header_buffer
[0];
336 header
.deltaset
= header_buffer
[1];
337 header
.vectable
= header_buffer
[2];
338 header
.ysize
= AV_RL16(&header_buffer
[3]);
339 header
.xsize
= AV_RL16(&header_buffer
[5]);
340 header
.checksum
= AV_RL16(&header_buffer
[7]);
341 header
.version
= header_buffer
[9];
342 header
.header_type
= header_buffer
[10];
343 header
.flags
= header_buffer
[11];
344 header
.control
= header_buffer
[12];
347 if (header
.version
>= 2)
349 if (header
.header_type
> 3)
351 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid header type (%d)\n", header
.header_type
);
352 return AVERROR_INVALIDDATA
;
353 } else if ((header
.header_type
== 2) || (header
.header_type
== 3)) {
354 s
->flags
= header
.flags
;
355 if (!(s
->flags
& FLAG_INTERFRAME
))
356 s
->flags
|= FLAG_KEYFRAME
;
358 s
->flags
= FLAG_KEYFRAME
;
359 } else /* Version 1 */
360 s
->flags
= FLAG_KEYFRAME
;
362 if (s
->flags
& FLAG_SPRITE
) {
363 avpriv_request_sample(s
->avctx
, "Frame with sprite");
364 /* FIXME header.width, height, xoffset and yoffset aren't initialized */
365 return AVERROR_PATCHWELCOME
;
369 if (header
.header_type
< 2) {
370 if ((s
->w
< 213) && (s
->h
>= 176))
372 s
->flags
|= FLAG_INTERPOLATED
;
373 avpriv_request_sample(s
->avctx
, "Interpolated frame");
378 if (header
.compression
>= 17) {
379 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid compression type (%d)\n", header
.compression
);
380 return AVERROR_INVALIDDATA
;
383 if ((header
.deltaset
!= s
->last_deltaset
) ||
384 (header
.vectable
!= s
->last_vectable
))
385 select_delta_tables(s
, header
.deltaset
);
387 if ((header
.compression
& 1) && header
.header_type
)
388 sel_vector_table
= pc_tbl2
;
390 if (header
.vectable
> 0 && header
.vectable
< 4)
391 sel_vector_table
= tables
[header
.vectable
- 1];
393 av_log(s
->avctx
, AV_LOG_ERROR
, "invalid vector table id (%d)\n", header
.vectable
);
394 return AVERROR_INVALIDDATA
;
398 if (compression_types
[header
.compression
].algorithm
== ALGO_RGB24H
) {
399 new_pix_fmt
= AV_PIX_FMT_RGB32
;
402 new_pix_fmt
= AV_PIX_FMT_RGB555
; // RGB565 is supported as well
404 s
->w
>>= width_shift
;
406 if (s
->w
!= s
->avctx
->width
|| s
->h
!= s
->avctx
->height
||
407 new_pix_fmt
!= s
->avctx
->pix_fmt
) {
408 av_frame_unref(s
->frame
);
409 s
->avctx
->sample_aspect_ratio
= (AVRational
){ 1 << width_shift
, 1 };
410 s
->avctx
->pix_fmt
= new_pix_fmt
;
412 if ((ret
= ff_set_dimensions(s
->avctx
, s
->w
, s
->h
)) < 0)
415 ff_set_sar(s
->avctx
, s
->avctx
->sample_aspect_ratio
);
417 av_fast_malloc(&s
->vert_pred
, &s
->vert_pred_size
, s
->avctx
->width
* sizeof(unsigned int));
419 return AVERROR(ENOMEM
);
422 /* There is 1 change bit per 4 pixels, so each change byte represents
423 * 32 pixels; divide width by 4 to obtain the number of change bits and
424 * then round up to the nearest byte. */
425 s
->mb_change_bits_row_size
= ((s
->avctx
->width
>> (2 - width_shift
)) + 7) >> 3;
427 if ((header
.deltaset
!= s
->last_deltaset
) || (header
.vectable
!= s
->last_vectable
))
429 if (compression_types
[header
.compression
].algorithm
== ALGO_RGB24H
)
430 gen_vector_table24(s
, sel_vector_table
);
432 if (s
->avctx
->pix_fmt
== AV_PIX_FMT_RGB555
)
433 gen_vector_table15(s
, sel_vector_table
);
435 gen_vector_table16(s
, sel_vector_table
);
438 /* set up pointers to the other key data chunks */
439 s
->mb_change_bits
= s
->buf
+ header
.header_size
;
440 if (s
->flags
& FLAG_KEYFRAME
) {
441 /* no change bits specified for a keyframe; only index bytes */
442 s
->index_stream
= s
->mb_change_bits
;
444 /* one change bit per 4x4 block */
445 s
->index_stream
= s
->mb_change_bits
+
446 (s
->mb_change_bits_row_size
* (s
->avctx
->height
>> 2));
448 s
->index_stream_size
= s
->size
- (s
->index_stream
- s
->buf
);
450 s
->last_deltaset
= header
.deltaset
;
451 s
->last_vectable
= header
.vectable
;
452 s
->compression
= header
.compression
;
453 s
->block_width
= compression_types
[header
.compression
].block_width
;
454 s
->block_height
= compression_types
[header
.compression
].block_height
;
455 s
->block_type
= compression_types
[header
.compression
].block_type
;
457 if (s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
458 av_log(s
->avctx
, AV_LOG_INFO
, "tables: %d / %d c:%d %dx%d t:%d %s%s%s%s\n",
459 s
->last_deltaset
, s
->last_vectable
, s
->compression
, s
->block_width
,
460 s
->block_height
, s
->block_type
,
461 s
->flags
& FLAG_KEYFRAME
? " KEY" : "",
462 s
->flags
& FLAG_INTERFRAME
? " INTER" : "",
463 s
->flags
& FLAG_SPRITE
? " SPRITE" : "",
464 s
->flags
& FLAG_INTERPOLATED
? " INTERPOL" : "");
466 return header
.header_size
;
469 static av_cold
int truemotion1_decode_init(AVCodecContext
*avctx
)
471 TrueMotion1Context
*s
= avctx
->priv_data
;
475 // FIXME: it may change ?
476 // if (avctx->bits_per_sample == 24)
477 // avctx->pix_fmt = AV_PIX_FMT_RGB24;
479 // avctx->pix_fmt = AV_PIX_FMT_RGB555;
481 s
->frame
= av_frame_alloc();
483 return AVERROR(ENOMEM
);
485 /* there is a vertical predictor for each pixel in a line; each vertical
486 * predictor is 0 to start with */
487 av_fast_malloc(&s
->vert_pred
, &s
->vert_pred_size
, s
->avctx
->width
* sizeof(unsigned int));
489 return AVERROR(ENOMEM
);
495 Block decoding order:
501 hres,vres,i,i%vres (0 < i < 4)
520 #define GET_NEXT_INDEX() \
522 if (index_stream_index >= s->index_stream_size) { \
523 av_log(s->avctx, AV_LOG_INFO, " help! truemotion1 decoder went out of bounds\n"); \
526 index = s->index_stream[index_stream_index++] * 4; \
531 if (index >= 1023) { \
532 av_log(s->avctx, AV_LOG_ERROR, "Invalid index value.\n"); \
538 #define APPLY_C_PREDICTOR() \
539 predictor_pair = s->c_predictor_table[index]; \
540 horiz_pred += (predictor_pair >> 1); \
541 if (predictor_pair & 1) { \
545 predictor_pair = s->c_predictor_table[index]; \
546 horiz_pred += ((predictor_pair >> 1) * 5); \
547 if (predictor_pair & 1) \
555 #define APPLY_C_PREDICTOR_24() \
556 predictor_pair = s->c_predictor_table[index]; \
557 horiz_pred += (predictor_pair >> 1); \
558 if (predictor_pair & 1) { \
562 predictor_pair = s->fat_c_predictor_table[index]; \
563 horiz_pred += (predictor_pair >> 1); \
564 if (predictor_pair & 1) \
573 #define APPLY_Y_PREDICTOR() \
574 predictor_pair = s->y_predictor_table[index]; \
575 horiz_pred += (predictor_pair >> 1); \
576 if (predictor_pair & 1) { \
580 predictor_pair = s->y_predictor_table[index]; \
581 horiz_pred += ((predictor_pair >> 1) * 5); \
582 if (predictor_pair & 1) \
590 #define APPLY_Y_PREDICTOR_24() \
591 predictor_pair = s->y_predictor_table[index]; \
592 horiz_pred += (predictor_pair >> 1); \
593 if (predictor_pair & 1) { \
597 predictor_pair = s->fat_y_predictor_table[index]; \
598 horiz_pred += (predictor_pair >> 1); \
599 if (predictor_pair & 1) \
607 #define OUTPUT_PIXEL_PAIR() \
608 *current_pixel_pair = *vert_pred + horiz_pred; \
609 *vert_pred++ = *current_pixel_pair++;
611 static void truemotion1_decode_16bit(TrueMotion1Context
*s
)
614 int pixels_left
; /* remaining pixels on this line */
615 unsigned int predictor_pair
;
616 unsigned int horiz_pred
;
617 unsigned int *vert_pred
;
618 unsigned int *current_pixel_pair
;
619 unsigned char *current_line
= s
->frame
->data
[0];
620 int keyframe
= s
->flags
& FLAG_KEYFRAME
;
622 /* these variables are for managing the stream of macroblock change bits */
623 const unsigned char *mb_change_bits
= s
->mb_change_bits
;
624 unsigned char mb_change_byte
;
625 unsigned char mb_change_byte_mask
;
628 /* these variables are for managing the main index stream */
629 int index_stream_index
= 0; /* yes, the index into the index stream */
632 /* clean out the line buffer */
633 memset(s
->vert_pred
, 0, s
->avctx
->width
* sizeof(unsigned int));
637 for (y
= 0; y
< s
->avctx
->height
; y
++) {
639 /* re-init variables for the next line iteration */
641 current_pixel_pair
= (unsigned int *)current_line
;
642 vert_pred
= s
->vert_pred
;
644 mb_change_byte
= mb_change_bits
[mb_change_index
++];
645 mb_change_byte_mask
= 0x01;
646 pixels_left
= s
->avctx
->width
;
648 while (pixels_left
> 0) {
650 if (keyframe
|| ((mb_change_byte
& mb_change_byte_mask
) == 0)) {
654 /* if macroblock width is 2, apply C-Y-C-Y; else
656 if (s
->block_width
== 2) {
674 /* always apply 2 Y predictors on these iterations */
682 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
683 * depending on the macroblock type */
684 if (s
->block_type
== BLOCK_2x2
) {
691 } else if (s
->block_type
== BLOCK_4x2
) {
708 /* skip (copy) four pixels, but reassign the horizontal
710 *vert_pred
++ = *current_pixel_pair
++;
711 horiz_pred
= *current_pixel_pair
- *vert_pred
;
712 *vert_pred
++ = *current_pixel_pair
++;
717 mb_change_byte_mask
<<= 1;
720 if (!mb_change_byte_mask
) {
721 mb_change_byte
= mb_change_bits
[mb_change_index
++];
722 mb_change_byte_mask
= 0x01;
729 /* next change row */
730 if (((y
+ 1) & 3) == 0)
731 mb_change_bits
+= s
->mb_change_bits_row_size
;
733 current_line
+= s
->frame
->linesize
[0];
737 static void truemotion1_decode_24bit(TrueMotion1Context
*s
)
740 int pixels_left
; /* remaining pixels on this line */
741 unsigned int predictor_pair
;
742 unsigned int horiz_pred
;
743 unsigned int *vert_pred
;
744 unsigned int *current_pixel_pair
;
745 unsigned char *current_line
= s
->frame
->data
[0];
746 int keyframe
= s
->flags
& FLAG_KEYFRAME
;
748 /* these variables are for managing the stream of macroblock change bits */
749 const unsigned char *mb_change_bits
= s
->mb_change_bits
;
750 unsigned char mb_change_byte
;
751 unsigned char mb_change_byte_mask
;
754 /* these variables are for managing the main index stream */
755 int index_stream_index
= 0; /* yes, the index into the index stream */
758 /* clean out the line buffer */
759 memset(s
->vert_pred
, 0, s
->avctx
->width
* sizeof(unsigned int));
763 for (y
= 0; y
< s
->avctx
->height
; y
++) {
765 /* re-init variables for the next line iteration */
767 current_pixel_pair
= (unsigned int *)current_line
;
768 vert_pred
= s
->vert_pred
;
770 mb_change_byte
= mb_change_bits
[mb_change_index
++];
771 mb_change_byte_mask
= 0x01;
772 pixels_left
= s
->avctx
->width
;
774 while (pixels_left
> 0) {
776 if (keyframe
|| ((mb_change_byte
& mb_change_byte_mask
) == 0)) {
780 /* if macroblock width is 2, apply C-Y-C-Y; else
782 if (s
->block_width
== 2) {
783 APPLY_C_PREDICTOR_24();
784 APPLY_Y_PREDICTOR_24();
786 APPLY_C_PREDICTOR_24();
787 APPLY_Y_PREDICTOR_24();
790 APPLY_C_PREDICTOR_24();
791 APPLY_Y_PREDICTOR_24();
793 APPLY_Y_PREDICTOR_24();
800 /* always apply 2 Y predictors on these iterations */
801 APPLY_Y_PREDICTOR_24();
803 APPLY_Y_PREDICTOR_24();
808 /* this iteration might be C-Y-C-Y, Y-Y, or C-Y-Y
809 * depending on the macroblock type */
810 if (s
->block_type
== BLOCK_2x2
) {
811 APPLY_C_PREDICTOR_24();
812 APPLY_Y_PREDICTOR_24();
814 APPLY_C_PREDICTOR_24();
815 APPLY_Y_PREDICTOR_24();
817 } else if (s
->block_type
== BLOCK_4x2
) {
818 APPLY_C_PREDICTOR_24();
819 APPLY_Y_PREDICTOR_24();
821 APPLY_Y_PREDICTOR_24();
824 APPLY_Y_PREDICTOR_24();
826 APPLY_Y_PREDICTOR_24();
834 /* skip (copy) four pixels, but reassign the horizontal
836 *vert_pred
++ = *current_pixel_pair
++;
837 horiz_pred
= *current_pixel_pair
- *vert_pred
;
838 *vert_pred
++ = *current_pixel_pair
++;
843 mb_change_byte_mask
<<= 1;
846 if (!mb_change_byte_mask
) {
847 mb_change_byte
= mb_change_bits
[mb_change_index
++];
848 mb_change_byte_mask
= 0x01;
855 /* next change row */
856 if (((y
+ 1) & 3) == 0)
857 mb_change_bits
+= s
->mb_change_bits_row_size
;
859 current_line
+= s
->frame
->linesize
[0];
864 static int truemotion1_decode_frame(AVCodecContext
*avctx
,
865 void *data
, int *got_frame
,
868 const uint8_t *buf
= avpkt
->data
;
869 int ret
, buf_size
= avpkt
->size
;
870 TrueMotion1Context
*s
= avctx
->priv_data
;
875 if ((ret
= truemotion1_decode_header(s
)) < 0)
878 if ((ret
= ff_reget_buffer(avctx
, s
->frame
)) < 0)
881 if (compression_types
[s
->compression
].algorithm
== ALGO_RGB24H
) {
882 truemotion1_decode_24bit(s
);
883 } else if (compression_types
[s
->compression
].algorithm
!= ALGO_NOP
) {
884 truemotion1_decode_16bit(s
);
887 if ((ret
= av_frame_ref(data
, s
->frame
)) < 0)
892 /* report that the buffer was completely consumed */
896 static av_cold
int truemotion1_decode_end(AVCodecContext
*avctx
)
898 TrueMotion1Context
*s
= avctx
->priv_data
;
900 av_frame_free(&s
->frame
);
901 av_freep(&s
->vert_pred
);
906 AVCodec ff_truemotion1_decoder
= {
907 .name
= "truemotion1",
908 .long_name
= NULL_IF_CONFIG_SMALL("Duck TrueMotion 1.0"),
909 .type
= AVMEDIA_TYPE_VIDEO
,
910 .id
= AV_CODEC_ID_TRUEMOTION1
,
911 .priv_data_size
= sizeof(TrueMotion1Context
),
912 .init
= truemotion1_decode_init
,
913 .close
= truemotion1_decode_end
,
914 .decode
= truemotion1_decode_frame
,
915 .capabilities
= CODEC_CAP_DR1
,