2 * Duck/ON2 TrueMotion 2 Decoder
3 * Copyright (c) 2005 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Duck TrueMotion2 decoder.
30 #include "bitstream.h"
32 #include "bytestream.h"
36 #define TM2_ESCAPE 0x80000000
39 /* Huffman-coded streams of different types of blocks */
62 typedef struct TM2Context
{
63 AVCodecContext
*avctx
;
70 int *tokens
[TM2_NUM_STREAMS
];
71 int tok_lens
[TM2_NUM_STREAMS
];
72 int tok_ptrs
[TM2_NUM_STREAMS
];
73 int deltas
[TM2_NUM_STREAMS
][TM2_DELTAS
];
74 /* for blocks decoding */
80 /* data for current and previous frame */
81 int *Y1_base
, *U1_base
, *V1_base
, *Y2_base
, *U2_base
, *V2_base
;
82 int *Y1
, *U1
, *V1
, *Y2
, *U2
, *V2
;
83 int y_stride
, uv_stride
;
88 * Huffman codes for each of streams
90 typedef struct TM2Codes
{
91 VLC vlc
; ///< table for Libav bitstream reader
93 int *recode
; ///< table for converting from code indexes to values
98 * structure for gathering Huffman codes information
100 typedef struct TM2Huff
{
101 int val_bits
; ///< length of literal
102 int max_bits
; ///< maximum length of code
103 int min_bits
; ///< minimum length of code
104 int nodes
; ///< total number of nodes in tree
105 int num
; ///< current number filled
106 int max_num
; ///< total number of codes
107 int *nums
; ///< literals
108 uint32_t *bits
; ///< codes
109 int *lens
; ///< codelengths
112 static int tm2_read_tree(TM2Context
*ctx
, uint32_t prefix
, int length
, TM2Huff
*huff
)
115 if (length
> huff
->max_bits
) {
116 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Tree exceeded its given depth (%i)\n",
118 return AVERROR_INVALIDDATA
;
121 if (!bitstream_read_bit(&ctx
->bc
)) { /* literal */
125 if (huff
->num
>= huff
->max_num
) {
126 av_log(ctx
->avctx
, AV_LOG_DEBUG
, "Too many literals\n");
127 return AVERROR_INVALIDDATA
;
129 huff
->nums
[huff
->num
] = bitstream_read(&ctx
->bc
, huff
->val_bits
);
130 huff
->bits
[huff
->num
] = prefix
;
131 huff
->lens
[huff
->num
] = length
;
134 } else { /* non-terminal node */
135 if ((ret
= tm2_read_tree(ctx
, prefix
<< 1, length
+ 1, huff
)) < 0)
137 if ((ret
= tm2_read_tree(ctx
, (prefix
<< 1) | 1, length
+ 1, huff
)) < 0)
143 static int tm2_build_huff_table(TM2Context
*ctx
, TM2Codes
*code
)
148 huff
.val_bits
= bitstream_read(&ctx
->bc
, 5);
149 huff
.max_bits
= bitstream_read(&ctx
->bc
, 5);
150 huff
.min_bits
= bitstream_read(&ctx
->bc
, 5);
151 huff
.nodes
= bitstream_read(&ctx
->bc
, 17);
154 /* check for correct codes parameters */
155 if ((huff
.val_bits
< 1) || (huff
.val_bits
> 32) ||
156 (huff
.max_bits
< 0) || (huff
.max_bits
> 25)) {
157 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Incorrect tree parameters - literal "
158 "length: %i, max code length: %i\n", huff
.val_bits
, huff
.max_bits
);
159 return AVERROR_INVALIDDATA
;
161 if ((huff
.nodes
<= 0) || (huff
.nodes
> 0x10000)) {
162 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Incorrect number of Huffman tree "
163 "nodes: %i\n", huff
.nodes
);
164 return AVERROR_INVALIDDATA
;
167 if (huff
.max_bits
== 0)
170 /* allocate space for codes - it is exactly ceil(nodes / 2) entries */
171 huff
.max_num
= (huff
.nodes
+ 1) >> 1;
172 huff
.nums
= av_mallocz(huff
.max_num
* sizeof(int));
173 huff
.bits
= av_mallocz(huff
.max_num
* sizeof(uint32_t));
174 huff
.lens
= av_mallocz(huff
.max_num
* sizeof(int));
175 if (!huff
.nums
|| !huff
.bits
|| !huff
.lens
) {
176 res
= AVERROR(ENOMEM
);
180 res
= tm2_read_tree(ctx
, 0, 0, &huff
);
182 if (huff
.num
!= huff
.max_num
) {
183 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Got less codes than expected: %i of %i\n",
184 huff
.num
, huff
.max_num
);
185 res
= AVERROR_INVALIDDATA
;
188 /* convert codes to vlc_table */
192 res
= init_vlc(&code
->vlc
, huff
.max_bits
, huff
.max_num
,
193 huff
.lens
, sizeof(int), sizeof(int),
194 huff
.bits
, sizeof(uint32_t), sizeof(uint32_t), 0);
196 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Cannot build VLC table\n");
198 code
->bits
= huff
.max_bits
;
199 code
->length
= huff
.max_num
;
200 code
->recode
= av_malloc(code
->length
* sizeof(int));
202 res
= AVERROR(ENOMEM
);
205 for (i
= 0; i
< code
->length
; i
++)
206 code
->recode
[i
] = huff
.nums
[i
];
211 /* free allocated memory */
219 static void tm2_free_codes(TM2Codes
*code
)
221 av_free(code
->recode
);
223 ff_free_vlc(&code
->vlc
);
226 static inline int tm2_get_token(BitstreamContext
*bc
, TM2Codes
*code
)
229 val
= bitstream_read_vlc(bc
, code
->vlc
.table
, code
->bits
, 1);
230 return code
->recode
[val
];
233 #define TM2_OLD_HEADER_MAGIC 0x00000100
234 #define TM2_NEW_HEADER_MAGIC 0x00000101
236 static inline int tm2_read_header(TM2Context
*ctx
, const uint8_t *buf
)
238 uint32_t magic
= AV_RL32(buf
);
241 case TM2_OLD_HEADER_MAGIC
:
242 avpriv_request_sample(ctx
->avctx
, "Old TM2 header");
244 case TM2_NEW_HEADER_MAGIC
:
247 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Not a TM2 header: 0x%08"PRIX32
"\n",
249 return AVERROR_INVALIDDATA
;
253 static int tm2_read_deltas(TM2Context
*ctx
, int stream_id
)
258 d
= bitstream_read(&ctx
->bc
, 9);
259 mb
= bitstream_read(&ctx
->bc
, 5);
261 if ((d
< 1) || (d
> TM2_DELTAS
) || (mb
< 1) || (mb
> 32)) {
262 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Incorrect delta table: %i deltas x %i bits\n", d
, mb
);
263 return AVERROR_INVALIDDATA
;
266 for (i
= 0; i
< d
; i
++) {
267 v
= bitstream_read(&ctx
->bc
, mb
);
268 if (v
& (1 << (mb
- 1)))
269 ctx
->deltas
[stream_id
][i
] = v
- (1 << mb
);
271 ctx
->deltas
[stream_id
][i
] = v
;
273 for (; i
< TM2_DELTAS
; i
++)
274 ctx
->deltas
[stream_id
][i
] = 0;
279 static int tm2_read_stream(TM2Context
*ctx
, const uint8_t *buf
, int stream_id
, int buf_size
)
287 /* get stream length in dwords */
288 bytestream2_init(&gb
, buf
, buf_size
);
289 len
= bytestream2_get_be32(&gb
);
295 if (len
>= INT_MAX
/ 4 - 1 || len
< 0 || skip
> buf_size
) {
296 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Error, invalid stream size.\n");
297 return AVERROR_INVALIDDATA
;
300 toks
= bytestream2_get_be32(&gb
);
302 len
= bytestream2_get_be32(&gb
);
303 if (len
== TM2_ESCAPE
) {
304 len
= bytestream2_get_be32(&gb
);
307 pos
= bytestream2_tell(&gb
);
309 return AVERROR_INVALIDDATA
;
310 bitstream_init8(&ctx
->bc
, buf
+ pos
, skip
- pos
);
311 if ((ret
= tm2_read_deltas(ctx
, stream_id
)) < 0)
313 bytestream2_skip(&gb
, ((bitstream_tell(&ctx
->bc
) + 31) >> 5) << 2);
316 /* skip unused fields */
317 len
= bytestream2_get_be32(&gb
);
318 if (len
== TM2_ESCAPE
) { /* some unknown length - could be escaped too */
319 bytestream2_skip(&gb
, 8); /* unused by decoder */
321 bytestream2_skip(&gb
, 4); /* unused by decoder */
324 pos
= bytestream2_tell(&gb
);
326 return AVERROR_INVALIDDATA
;
327 bitstream_init8(&ctx
->bc
, buf
+ pos
, skip
- pos
);
328 if ((ret
= tm2_build_huff_table(ctx
, &codes
)) < 0)
330 bytestream2_skip(&gb
, ((bitstream_tell(&ctx
->bc
) + 31) >> 5) << 2);
333 /* check if we have sane number of tokens */
334 if ((toks
< 0) || (toks
> 0xFFFFFF)) {
335 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Incorrect number of tokens: %i\n", toks
);
336 tm2_free_codes(&codes
);
337 return AVERROR_INVALIDDATA
;
339 ctx
->tokens
[stream_id
] = av_realloc(ctx
->tokens
[stream_id
], toks
* sizeof(int));
340 ctx
->tok_lens
[stream_id
] = toks
;
341 len
= bytestream2_get_be32(&gb
);
343 pos
= bytestream2_tell(&gb
);
345 return AVERROR_INVALIDDATA
;
346 bitstream_init8(&ctx
->bc
, buf
+ pos
, skip
- pos
);
347 for (i
= 0; i
< toks
; i
++) {
348 if (bitstream_bits_left(&ctx
->bc
) <= 0) {
349 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Incorrect number of tokens: %i\n", toks
);
350 return AVERROR_INVALIDDATA
;
352 ctx
->tokens
[stream_id
][i
] = tm2_get_token(&ctx
->bc
, &codes
);
353 if (stream_id
<= TM2_MOT
&& ctx
->tokens
[stream_id
][i
] >= TM2_DELTAS
) {
354 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Invalid delta token index %d for type %d, n=%d\n",
355 ctx
->tokens
[stream_id
][i
], stream_id
, i
);
356 return AVERROR_INVALIDDATA
;
360 for (i
= 0; i
< toks
; i
++) {
361 ctx
->tokens
[stream_id
][i
] = codes
.recode
[0];
362 if (stream_id
<= TM2_MOT
&& ctx
->tokens
[stream_id
][i
] >= TM2_DELTAS
) {
363 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Invalid delta token index %d for type %d, n=%d\n",
364 ctx
->tokens
[stream_id
][i
], stream_id
, i
);
365 return AVERROR_INVALIDDATA
;
369 tm2_free_codes(&codes
);
374 static inline int GET_TOK(TM2Context
*ctx
,int type
)
376 if (ctx
->tok_ptrs
[type
] >= ctx
->tok_lens
[type
]) {
377 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Read token from stream %i out of bounds (%i>=%i)\n", type
, ctx
->tok_ptrs
[type
], ctx
->tok_lens
[type
]);
381 return ctx
->deltas
[type
][ctx
->tokens
[type
][ctx
->tok_ptrs
[type
]++]];
382 return ctx
->tokens
[type
][ctx
->tok_ptrs
[type
]++];
385 /* blocks decoding routines */
387 /* common Y, U, V pointers initialisation */
388 #define TM2_INIT_POINTERS() \
391 int Ystride, Ustride, Vstride;\
393 Ystride = ctx->y_stride;\
394 Vstride = ctx->uv_stride;\
395 Ustride = ctx->uv_stride;\
396 Y = (ctx->cur?ctx->Y2:ctx->Y1) + by * 4 * Ystride + bx * 4;\
397 V = (ctx->cur?ctx->V2:ctx->V1) + by * 2 * Vstride + bx * 2;\
398 U = (ctx->cur?ctx->U2:ctx->U1) + by * 2 * Ustride + bx * 2;\
399 last = ctx->last + bx * 4;\
400 clast = ctx->clast + bx * 4;
402 #define TM2_INIT_POINTERS_2() \
404 int oYstride, oUstride, oVstride;\
406 TM2_INIT_POINTERS();\
410 Yo = (ctx->cur?ctx->Y1:ctx->Y2) + by * 4 * oYstride + bx * 4;\
411 Vo = (ctx->cur?ctx->V1:ctx->V2) + by * 2 * oVstride + bx * 2;\
412 Uo = (ctx->cur?ctx->U1:ctx->U2) + by * 2 * oUstride + bx * 2;
414 /* recalculate last and delta values for next blocks */
415 #define TM2_RECALC_BLOCK(CHR, stride, last, CD) {\
416 CD[0] = CHR[1] - last[1];\
417 CD[1] = (int)CHR[stride + 1] - (int)CHR[1];\
418 last[0] = (int)CHR[stride + 0];\
419 last[1] = (int)CHR[stride + 1];}
421 /* common operations - add deltas to 4x4 block of luma or 2x2 blocks of chroma */
422 static inline void tm2_apply_deltas(TM2Context
*ctx
, int* Y
, int stride
, int *deltas
, int *last
)
427 for (j
= 0; j
< 4; j
++){
429 for (i
= 0; i
< 4; i
++){
430 d
= deltas
[i
+ j
* 4];
433 Y
[i
] = av_clip_uint8(last
[i
]);
440 static inline void tm2_high_chroma(int *data
, int stride
, int *last
, int *CD
, int *deltas
)
443 for (j
= 0; j
< 2; j
++) {
444 for (i
= 0; i
< 2; i
++) {
445 CD
[j
] += deltas
[i
+ j
* 2];
453 static inline void tm2_low_chroma(int *data
, int stride
, int *clast
, int *CD
, int *deltas
, int bx
)
463 t
= (CD
[0] + CD
[1]) >> 1;
464 l
= (prev
- CD
[0] - CD
[1] + clast
[1]) >> 1;
465 CD
[1] = CD
[0] + CD
[1] - t
;
469 tm2_high_chroma(data
, stride
, clast
, CD
, deltas
);
472 static inline void tm2_hi_res_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
479 for (i
= 0; i
< 4; i
++) {
480 deltas
[i
] = GET_TOK(ctx
, TM2_C_HI
);
481 deltas
[i
+ 4] = GET_TOK(ctx
, TM2_C_HI
);
483 tm2_high_chroma(U
, Ustride
, clast
, ctx
->CD
, deltas
);
484 tm2_high_chroma(V
, Vstride
, clast
+ 2, ctx
->CD
+ 2, deltas
+ 4);
487 for (i
= 0; i
< 16; i
++)
488 deltas
[i
] = GET_TOK(ctx
, TM2_L_HI
);
490 tm2_apply_deltas(ctx
, Y
, Ystride
, deltas
, last
);
493 static inline void tm2_med_res_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
500 deltas
[0] = GET_TOK(ctx
, TM2_C_LO
);
501 deltas
[1] = deltas
[2] = deltas
[3] = 0;
502 tm2_low_chroma(U
, Ustride
, clast
, ctx
->CD
, deltas
, bx
);
504 deltas
[0] = GET_TOK(ctx
, TM2_C_LO
);
505 deltas
[1] = deltas
[2] = deltas
[3] = 0;
506 tm2_low_chroma(V
, Vstride
, clast
+ 2, ctx
->CD
+ 2, deltas
, bx
);
509 for (i
= 0; i
< 16; i
++)
510 deltas
[i
] = GET_TOK(ctx
, TM2_L_HI
);
512 tm2_apply_deltas(ctx
, Y
, Ystride
, deltas
, last
);
515 static inline void tm2_low_res_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
523 deltas
[0] = GET_TOK(ctx
, TM2_C_LO
);
524 deltas
[1] = deltas
[2] = deltas
[3] = 0;
525 tm2_low_chroma(U
, Ustride
, clast
, ctx
->CD
, deltas
, bx
);
527 deltas
[0] = GET_TOK(ctx
, TM2_C_LO
);
528 deltas
[1] = deltas
[2] = deltas
[3] = 0;
529 tm2_low_chroma(V
, Vstride
, clast
+ 2, ctx
->CD
+ 2, deltas
, bx
);
532 for (i
= 0; i
< 16; i
++)
535 deltas
[ 0] = GET_TOK(ctx
, TM2_L_LO
);
536 deltas
[ 2] = GET_TOK(ctx
, TM2_L_LO
);
537 deltas
[ 8] = GET_TOK(ctx
, TM2_L_LO
);
538 deltas
[10] = GET_TOK(ctx
, TM2_L_LO
);
541 last
[0] = (last
[-1] - ctx
->D
[0] - ctx
->D
[1] - ctx
->D
[2] - ctx
->D
[3] + last
[1]) >> 1;
543 last
[0] = (last
[1] - ctx
->D
[0] - ctx
->D
[1] - ctx
->D
[2] - ctx
->D
[3])>> 1;
544 last
[2] = (last
[1] + last
[3]) >> 1;
546 t1
= ctx
->D
[0] + ctx
->D
[1];
548 ctx
->D
[1] = t1
- (t1
>> 1);
549 t2
= ctx
->D
[2] + ctx
->D
[3];
551 ctx
->D
[3] = t2
- (t2
>> 1);
553 tm2_apply_deltas(ctx
, Y
, Ystride
, deltas
, last
);
556 static inline void tm2_null_res_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
560 int left
, right
, diff
;
565 deltas
[0] = deltas
[1] = deltas
[2] = deltas
[3] = 0;
566 tm2_low_chroma(U
, Ustride
, clast
, ctx
->CD
, deltas
, bx
);
568 deltas
[0] = deltas
[1] = deltas
[2] = deltas
[3] = 0;
569 tm2_low_chroma(V
, Vstride
, clast
+ 2, ctx
->CD
+ 2, deltas
, bx
);
572 for (i
= 0; i
< 16; i
++)
575 ct
= ctx
->D
[0] + ctx
->D
[1] + ctx
->D
[2] + ctx
->D
[3];
578 left
= last
[-1] - ct
;
584 last
[0] = left
+ (diff
>> 2);
585 last
[1] = left
+ (diff
>> 1);
586 last
[2] = right
- (diff
>> 2);
591 ctx
->D
[0] = (tp
+ (ct
>> 2)) - left
;
593 ctx
->D
[1] = (tp
+ (ct
>> 1)) - left
;
595 ctx
->D
[2] = ((tp
+ ct
) - (ct
>> 2)) - left
;
597 ctx
->D
[3] = (tp
+ ct
) - left
;
599 tm2_apply_deltas(ctx
, Y
, Ystride
, deltas
, last
);
602 static inline void tm2_still_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
605 TM2_INIT_POINTERS_2();
608 for (j
= 0; j
< 2; j
++) {
609 for (i
= 0; i
< 2; i
++){
613 U
+= Ustride
; V
+= Vstride
;
614 Uo
+= oUstride
; Vo
+= oVstride
;
618 TM2_RECALC_BLOCK(U
, Ustride
, clast
, ctx
->CD
);
619 TM2_RECALC_BLOCK(V
, Vstride
, (clast
+ 2), (ctx
->CD
+ 2));
622 ctx
->D
[0] = Yo
[3] - last
[3];
623 ctx
->D
[1] = Yo
[3 + oYstride
] - Yo
[3];
624 ctx
->D
[2] = Yo
[3 + oYstride
* 2] - Yo
[3 + oYstride
];
625 ctx
->D
[3] = Yo
[3 + oYstride
* 3] - Yo
[3 + oYstride
* 2];
627 for (j
= 0; j
< 4; j
++) {
628 for (i
= 0; i
< 4; i
++) {
637 static inline void tm2_update_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
641 TM2_INIT_POINTERS_2();
644 for (j
= 0; j
< 2; j
++) {
645 for (i
= 0; i
< 2; i
++) {
646 U
[i
] = Uo
[i
] + GET_TOK(ctx
, TM2_UPD
);
647 V
[i
] = Vo
[i
] + GET_TOK(ctx
, TM2_UPD
);
656 TM2_RECALC_BLOCK(U
, Ustride
, clast
, ctx
->CD
);
657 TM2_RECALC_BLOCK(V
, Vstride
, (clast
+ 2), (ctx
->CD
+ 2));
660 ctx
->D
[0] = Yo
[3] - last
[3];
661 ctx
->D
[1] = Yo
[3 + oYstride
] - Yo
[3];
662 ctx
->D
[2] = Yo
[3 + oYstride
* 2] - Yo
[3 + oYstride
];
663 ctx
->D
[3] = Yo
[3 + oYstride
* 3] - Yo
[3 + oYstride
* 2];
665 for (j
= 0; j
< 4; j
++) {
667 for (i
= 0; i
< 4; i
++) {
668 Y
[i
] = Yo
[i
] + GET_TOK(ctx
, TM2_UPD
);
671 ctx
->D
[j
] = last
[3] - d
;
677 static inline void tm2_motion_block(TM2Context
*ctx
, AVFrame
*pic
, int bx
, int by
)
681 TM2_INIT_POINTERS_2();
683 mx
= GET_TOK(ctx
, TM2_MOT
);
684 my
= GET_TOK(ctx
, TM2_MOT
);
685 mx
= av_clip(mx
, -(bx
* 4 + 4), ctx
->avctx
->width
- bx
* 4);
686 my
= av_clip(my
, -(by
* 4 + 4), ctx
->avctx
->height
- by
* 4);
688 Yo
+= my
* oYstride
+ mx
;
689 Uo
+= (my
>> 1) * oUstride
+ (mx
>> 1);
690 Vo
+= (my
>> 1) * oVstride
+ (mx
>> 1);
693 for (j
= 0; j
< 2; j
++) {
694 for (i
= 0; i
< 2; i
++) {
705 TM2_RECALC_BLOCK(U
, Ustride
, clast
, ctx
->CD
);
706 TM2_RECALC_BLOCK(V
, Vstride
, (clast
+ 2), (ctx
->CD
+ 2));
709 for (j
= 0; j
< 4; j
++) {
710 for (i
= 0; i
< 4; i
++) {
716 /* calculate deltas */
718 ctx
->D
[0] = Y
[3] - last
[3];
719 ctx
->D
[1] = Y
[3 + Ystride
] - Y
[3];
720 ctx
->D
[2] = Y
[3 + Ystride
* 2] - Y
[3 + Ystride
];
721 ctx
->D
[3] = Y
[3 + Ystride
* 3] - Y
[3 + Ystride
* 2];
722 for (i
= 0; i
< 4; i
++)
723 last
[i
] = Y
[i
+ Ystride
* 3];
726 static int tm2_decode_blocks(TM2Context
*ctx
, AVFrame
*p
)
729 int w
= ctx
->avctx
->width
, h
= ctx
->avctx
->height
, bw
= w
>> 2, bh
= h
>> 2, cw
= w
>> 1;
735 for (i
= 0; i
< TM2_NUM_STREAMS
; i
++)
736 ctx
->tok_ptrs
[i
] = 0;
738 if (ctx
->tok_lens
[TM2_TYPE
]<bw
*bh
) {
739 av_log(ctx
->avctx
,AV_LOG_ERROR
,"Got %i tokens for %i blocks\n",ctx
->tok_lens
[TM2_TYPE
],bw
*bh
);
740 return AVERROR_INVALIDDATA
;
743 memset(ctx
->last
, 0, 4 * bw
* sizeof(int));
744 memset(ctx
->clast
, 0, 4 * bw
* sizeof(int));
746 for (j
= 0; j
< bh
; j
++) {
747 memset(ctx
->D
, 0, 4 * sizeof(int));
748 memset(ctx
->CD
, 0, 4 * sizeof(int));
749 for (i
= 0; i
< bw
; i
++) {
750 type
= GET_TOK(ctx
, TM2_TYPE
);
753 tm2_hi_res_block(ctx
, p
, i
, j
);
756 tm2_med_res_block(ctx
, p
, i
, j
);
759 tm2_low_res_block(ctx
, p
, i
, j
);
762 tm2_null_res_block(ctx
, p
, i
, j
);
765 tm2_update_block(ctx
, p
, i
, j
);
769 tm2_still_block(ctx
, p
, i
, j
);
773 tm2_motion_block(ctx
, p
, i
, j
);
777 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Skipping unknown block type %i\n", type
);
782 /* copy data from our buffer to AVFrame */
783 Y
= (ctx
->cur
?ctx
->Y2
:ctx
->Y1
);
784 U
= (ctx
->cur
?ctx
->U2
:ctx
->U1
);
785 V
= (ctx
->cur
?ctx
->V2
:ctx
->V1
);
787 for (j
= 0; j
< h
; j
++) {
788 for (i
= 0; i
< w
; i
++) {
789 int y
= Y
[i
], u
= U
[i
>> 1], v
= V
[i
>> 1];
790 dst
[3*i
+0] = av_clip_uint8(y
+ v
);
791 dst
[3*i
+1] = av_clip_uint8(y
);
792 dst
[3*i
+2] = av_clip_uint8(y
+ u
);
795 /* horizontal edge extension */
796 Y
[-4] = Y
[-3] = Y
[-2] = Y
[-1] = Y
[0];
797 Y
[w
+ 3] = Y
[w
+ 2] = Y
[w
+ 1] = Y
[w
] = Y
[w
- 1];
799 /* vertical edge extension */
801 memcpy(Y
- 4 - 1 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
802 memcpy(Y
- 4 - 2 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
803 memcpy(Y
- 4 - 3 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
804 memcpy(Y
- 4 - 4 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
805 } else if (j
== h
- 1) {
806 memcpy(Y
- 4 + 1 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
807 memcpy(Y
- 4 + 2 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
808 memcpy(Y
- 4 + 3 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
809 memcpy(Y
- 4 + 4 * ctx
->y_stride
, Y
- 4, ctx
->y_stride
);
814 /* horizontal edge extension */
815 U
[-2] = U
[-1] = U
[0];
816 V
[-2] = V
[-1] = V
[0];
817 U
[cw
+ 1] = U
[cw
] = U
[cw
- 1];
818 V
[cw
+ 1] = V
[cw
] = V
[cw
- 1];
820 /* vertical edge extension */
822 memcpy(U
- 2 - 1 * ctx
->uv_stride
, U
- 2, ctx
->uv_stride
);
823 memcpy(V
- 2 - 1 * ctx
->uv_stride
, V
- 2, ctx
->uv_stride
);
824 memcpy(U
- 2 - 2 * ctx
->uv_stride
, U
- 2, ctx
->uv_stride
);
825 memcpy(V
- 2 - 2 * ctx
->uv_stride
, V
- 2, ctx
->uv_stride
);
826 } else if (j
== h
- 1) {
827 memcpy(U
- 2 + 1 * ctx
->uv_stride
, U
- 2, ctx
->uv_stride
);
828 memcpy(V
- 2 + 1 * ctx
->uv_stride
, V
- 2, ctx
->uv_stride
);
829 memcpy(U
- 2 + 2 * ctx
->uv_stride
, U
- 2, ctx
->uv_stride
);
830 memcpy(V
- 2 + 2 * ctx
->uv_stride
, V
- 2, ctx
->uv_stride
);
836 dst
+= p
->linesize
[0];
842 static const int tm2_stream_order
[TM2_NUM_STREAMS
] = {
843 TM2_C_HI
, TM2_C_LO
, TM2_L_HI
, TM2_L_LO
, TM2_UPD
, TM2_MOT
, TM2_TYPE
846 #define TM2_HEADER_SIZE 40
848 static int decode_frame(AVCodecContext
*avctx
,
849 void *data
, int *got_frame
,
852 TM2Context
* const l
= avctx
->priv_data
;
853 const uint8_t *buf
= avpkt
->data
;
854 int buf_size
= avpkt
->size
& ~3;
855 AVFrame
* const p
= l
->pic
;
856 int offset
= TM2_HEADER_SIZE
;
860 swbuf
= av_malloc(buf_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
862 av_log(avctx
, AV_LOG_ERROR
, "Cannot allocate temporary buffer\n");
863 return AVERROR(ENOMEM
);
866 if ((ret
= ff_reget_buffer(avctx
, p
)) < 0) {
867 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
872 l
->bdsp
.bswap_buf((uint32_t *) swbuf
, (const uint32_t *) buf
,
875 if ((ret
= tm2_read_header(l
, swbuf
)) < 0) {
880 for (i
= 0; i
< TM2_NUM_STREAMS
; i
++) {
881 if (offset
>= buf_size
) {
883 return AVERROR_INVALIDDATA
;
885 t
= tm2_read_stream(l
, swbuf
+ offset
, tm2_stream_order
[i
],
893 p
->key_frame
= tm2_decode_blocks(l
, p
);
895 p
->pict_type
= AV_PICTURE_TYPE_I
;
897 p
->pict_type
= AV_PICTURE_TYPE_P
;
901 ret
= av_frame_ref(data
, l
->pic
);
904 return (ret
< 0) ? ret
: buf_size
;
907 static av_cold
int decode_init(AVCodecContext
*avctx
)
909 TM2Context
* const l
= avctx
->priv_data
;
910 int i
, w
= avctx
->width
, h
= avctx
->height
;
912 if ((avctx
->width
& 3) || (avctx
->height
& 3)) {
913 av_log(avctx
, AV_LOG_ERROR
, "Width and height must be multiple of 4\n");
914 return AVERROR(EINVAL
);
918 avctx
->pix_fmt
= AV_PIX_FMT_BGR24
;
920 l
->pic
= av_frame_alloc();
922 return AVERROR(ENOMEM
);
924 ff_bswapdsp_init(&l
->bdsp
);
926 l
->last
= av_malloc(4 * sizeof(*l
->last
) * (w
>> 2));
927 l
->clast
= av_malloc(4 * sizeof(*l
->clast
) * (w
>> 2));
929 for (i
= 0; i
< TM2_NUM_STREAMS
; i
++) {
936 l
->Y1_base
= av_malloc(sizeof(*l
->Y1_base
) * w
* h
);
937 l
->Y2_base
= av_malloc(sizeof(*l
->Y2_base
) * w
* h
);
941 l
->U1_base
= av_malloc(sizeof(*l
->U1_base
) * w
* h
);
942 l
->V1_base
= av_malloc(sizeof(*l
->V1_base
) * w
* h
);
943 l
->U2_base
= av_malloc(sizeof(*l
->U2_base
) * w
* h
);
944 l
->V2_base
= av_malloc(sizeof(*l
->V1_base
) * w
* h
);
947 if (!l
->Y1_base
|| !l
->Y2_base
|| !l
->U1_base
||
948 !l
->V1_base
|| !l
->U2_base
|| !l
->V2_base
||
949 !l
->last
|| !l
->clast
) {
950 av_freep(&l
->Y1_base
);
951 av_freep(&l
->Y2_base
);
952 av_freep(&l
->U1_base
);
953 av_freep(&l
->U2_base
);
954 av_freep(&l
->V1_base
);
955 av_freep(&l
->V2_base
);
958 return AVERROR(ENOMEM
);
960 l
->Y1
= l
->Y1_base
+ l
->y_stride
* 4 + 4;
961 l
->Y2
= l
->Y2_base
+ l
->y_stride
* 4 + 4;
962 l
->U1
= l
->U1_base
+ l
->uv_stride
* 2 + 2;
963 l
->U2
= l
->U2_base
+ l
->uv_stride
* 2 + 2;
964 l
->V1
= l
->V1_base
+ l
->uv_stride
* 2 + 2;
965 l
->V2
= l
->V2_base
+ l
->uv_stride
* 2 + 2;
970 static av_cold
int decode_end(AVCodecContext
*avctx
)
972 TM2Context
* const l
= avctx
->priv_data
;
977 for (i
= 0; i
< TM2_NUM_STREAMS
; i
++)
978 av_free(l
->tokens
[i
]);
988 av_frame_free(&l
->pic
);
993 AVCodec ff_truemotion2_decoder
= {
994 .name
= "truemotion2",
995 .long_name
= NULL_IF_CONFIG_SMALL("Duck TrueMotion 2.0"),
996 .type
= AVMEDIA_TYPE_VIDEO
,
997 .id
= AV_CODEC_ID_TRUEMOTION2
,
998 .priv_data_size
= sizeof(TM2Context
),
1000 .close
= decode_end
,
1001 .decode
= decode_frame
,
1002 .capabilities
= AV_CODEC_CAP_DR1
,