2 * Electronic Arts Madcow Video Decoder
3 * Copyright (c) 2007-2009 Peter Ross
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 St, Fifth Floor, Boston, MA 02110-1301 USA
24 * Electronic Arts Madcow Video Decoder
25 * @author Peter Ross <pross@xvid.org>
27 * @see technical details at
28 * http://wiki.multimedia.cx/index.php?title=Electronic_Arts_MAD
32 #include "bitstream.h"
34 #include "bytestream.h"
36 #include "aandcttab.h"
40 #include "mpeg12data.h"
41 #include "mpeg12vlc.h"
44 #define EA_PREAMBLE_SIZE 8
45 #define MADk_TAG MKTAG('M', 'A', 'D', 'k') /* MAD I-frame */
46 #define MADm_TAG MKTAG('M', 'A', 'D', 'm') /* MAD P-frame */
47 #define MADe_TAG MKTAG('M', 'A', 'D', 'e') /* MAD lqp-frame */
49 typedef struct MadContext
{
50 AVCodecContext
*avctx
;
52 BswapDSPContext bbdsp
;
57 unsigned int bitstream_buf_size
;
58 DECLARE_ALIGNED(16, int16_t, block
)[64];
60 uint16_t quant_matrix
[64];
65 static av_cold
int decode_init(AVCodecContext
*avctx
)
67 MadContext
*s
= avctx
->priv_data
;
69 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
70 ff_blockdsp_init(&s
->bdsp
);
71 ff_bswapdsp_init(&s
->bbdsp
);
72 ff_idctdsp_init(&s
->idsp
, avctx
);
73 ff_init_scantable_permutation(s
->idsp
.idct_permutation
, FF_IDCT_PERM_NONE
);
74 ff_init_scantable(s
->idsp
.idct_permutation
, &s
->scantable
, ff_zigzag_direct
);
75 ff_mpeg12_init_vlcs();
77 s
->last_frame
= av_frame_alloc();
79 return AVERROR(ENOMEM
);
84 static inline void comp(unsigned char *dst
, ptrdiff_t dst_stride
,
85 unsigned char *src
, ptrdiff_t src_stride
, int add
)
90 dst
[j
*dst_stride
+ i
] = av_clip_uint8(src
[j
*src_stride
+ i
] + add
);
93 static inline void comp_block(MadContext
*t
, AVFrame
*frame
,
95 int j
, int mv_x
, int mv_y
, int add
)
98 comp(frame
->data
[0] + (mb_y
*16 + ((j
&2)<<2))*frame
->linesize
[0] + mb_x
*16 + ((j
&1)<<3),
100 t
->last_frame
->data
[0] + (mb_y
*16 + ((j
&2)<<2) + mv_y
)*t
->last_frame
->linesize
[0] + mb_x
*16 + ((j
&1)<<3) + mv_x
,
101 t
->last_frame
->linesize
[0], add
);
102 } else if (!(t
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
104 comp(frame
->data
[index
] + (mb_y
*8)*frame
->linesize
[index
] + mb_x
* 8,
105 frame
->linesize
[index
],
106 t
->last_frame
->data
[index
] + (mb_y
* 8 + (mv_y
/2))*t
->last_frame
->linesize
[index
] + mb_x
* 8 + (mv_x
/2),
107 t
->last_frame
->linesize
[index
], add
);
111 static inline void idct_put(MadContext
*t
, AVFrame
*frame
, int16_t *block
,
112 int mb_x
, int mb_y
, int j
)
116 frame
->data
[0] + (mb_y
*16 + ((j
&2)<<2))*frame
->linesize
[0] + mb_x
*16 + ((j
&1)<<3),
117 frame
->linesize
[0], block
);
118 } else if (!(t
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
121 frame
->data
[index
] + (mb_y
*8)*frame
->linesize
[index
] + mb_x
*8,
122 frame
->linesize
[index
], block
);
126 static inline void decode_block_intra(MadContext
*s
, int16_t * block
)
128 int level
, i
, j
, run
;
129 RLTable
*rl
= &ff_rl_mpeg1
;
130 const uint8_t *scantable
= s
->scantable
.permutated
;
131 int16_t *quant_matrix
= s
->quant_matrix
;
133 block
[0] = (128 + bitstream_read_signed(&s
->bc
, 8)) * quant_matrix
[0];
135 /* The RL decoder is derived from mpeg1_decode_block_intra;
136 Escaped level and run values a decoded differently */
139 /* now quantify & encode AC coefficients */
141 BITSTREAM_RL_VLC(level
, run
, &s
->bc
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2);
145 } else if (level
!= 0) {
148 av_log(s
->avctx
, AV_LOG_ERROR
,
149 "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
153 level
= (level
*quant_matrix
[j
]) >> 4;
155 level
= bitstream_apply_sign(&s
->bc
, level
);
158 level
= bitstream_read_signed(&s
->bc
, 10);
160 run
= bitstream_read(&s
->bc
, 6) + 1;
164 av_log(s
->avctx
, AV_LOG_ERROR
,
165 "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
171 level
= (level
*quant_matrix
[j
]) >> 4;
175 level
= (level
*quant_matrix
[j
]) >> 4;
185 static int decode_motion(BitstreamContext
*bc
)
189 if (bitstream_read_bit(bc
)) {
190 if (bitstream_read_bit(bc
))
192 value
+= bitstream_read(bc
, 4) + 1;
197 static void decode_mb(MadContext
*s
, AVFrame
*frame
, int inter
)
204 int v
= bitstream_decode210(&s
->bc
);
206 mv_map
= v
? bitstream_read(&s
->bc
, 6) : 63;
207 mv_x
= decode_motion(&s
->bc
);
208 mv_y
= decode_motion(&s
->bc
);
214 for (j
=0; j
<6; j
++) {
215 if (mv_map
& (1<<j
)) { // mv_x and mv_y are guarded by mv_map
216 int add
= 2 * decode_motion(&s
->bc
);
217 comp_block(s
, frame
, s
->mb_x
, s
->mb_y
, j
, mv_x
, mv_y
, add
);
219 s
->bdsp
.clear_block(s
->block
);
220 decode_block_intra(s
, s
->block
);
221 idct_put(s
, frame
, s
->block
, s
->mb_x
, s
->mb_y
, j
);
226 static void calc_quant_matrix(MadContext
*s
, int qscale
)
230 s
->quant_matrix
[0] = (ff_inv_aanscales
[0]*ff_mpeg1_default_intra_matrix
[0]) >> 11;
232 s
->quant_matrix
[i
] = (ff_inv_aanscales
[i
]*ff_mpeg1_default_intra_matrix
[i
]*qscale
+ 32) >> 10;
235 static int decode_frame(AVCodecContext
*avctx
,
236 void *data
, int *got_frame
,
239 const uint8_t *buf
= avpkt
->data
;
240 int buf_size
= avpkt
->size
;
241 MadContext
*s
= avctx
->priv_data
;
242 AVFrame
*frame
= data
;
248 bytestream2_init(&gb
, buf
, buf_size
);
250 chunk_type
= bytestream2_get_le32(&gb
);
251 inter
= (chunk_type
== MADm_TAG
|| chunk_type
== MADe_TAG
);
252 bytestream2_skip(&gb
, 10);
254 av_reduce(&avctx
->framerate
.den
, &avctx
->framerate
.num
,
255 bytestream2_get_le16(&gb
), 1000, 1<<30);
257 width
= bytestream2_get_le16(&gb
);
258 height
= bytestream2_get_le16(&gb
);
259 bytestream2_skip(&gb
, 1);
260 calc_quant_matrix(s
, bytestream2_get_byte(&gb
));
261 bytestream2_skip(&gb
, 2);
263 if (bytestream2_get_bytes_left(&gb
) < 2) {
264 av_log(avctx
, AV_LOG_ERROR
, "Input data too small\n");
265 return AVERROR_INVALIDDATA
;
268 if (avctx
->width
!= width
|| avctx
->height
!= height
) {
269 av_frame_unref(s
->last_frame
);
270 if ((ret
= ff_set_dimensions(avctx
, width
, height
)) < 0)
274 if ((ret
= ff_get_buffer(avctx
, frame
, AV_GET_BUFFER_FLAG_REF
)) < 0) {
275 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
279 if (inter
&& !s
->last_frame
->data
[0]) {
280 av_log(avctx
, AV_LOG_WARNING
, "Missing reference frame.\n");
281 ret
= ff_get_buffer(avctx
, s
->last_frame
, AV_GET_BUFFER_FLAG_REF
);
284 memset(s
->last_frame
->data
[0], 0, s
->last_frame
->height
*
285 s
->last_frame
->linesize
[0]);
286 memset(s
->last_frame
->data
[1], 0x80, s
->last_frame
->height
/ 2 *
287 s
->last_frame
->linesize
[1]);
288 memset(s
->last_frame
->data
[2], 0x80, s
->last_frame
->height
/ 2 *
289 s
->last_frame
->linesize
[2]);
292 av_fast_padded_malloc(&s
->bitstream_buf
, &s
->bitstream_buf_size
,
293 bytestream2_get_bytes_left(&gb
));
294 if (!s
->bitstream_buf
)
295 return AVERROR(ENOMEM
);
296 s
->bbdsp
.bswap16_buf(s
->bitstream_buf
, (const uint16_t *)(buf
+ bytestream2_tell(&gb
)),
297 bytestream2_get_bytes_left(&gb
) / 2);
298 bitstream_init8(&s
->bc
, s
->bitstream_buf
, bytestream2_get_bytes_left(&gb
));
300 for (s
->mb_y
=0; s
->mb_y
< (avctx
->height
+15)/16; s
->mb_y
++)
301 for (s
->mb_x
=0; s
->mb_x
< (avctx
->width
+15)/16; s
->mb_x
++)
302 decode_mb(s
, frame
, inter
);
306 if (chunk_type
!= MADe_TAG
) {
307 av_frame_unref(s
->last_frame
);
308 if ((ret
= av_frame_ref(s
->last_frame
, frame
)) < 0)
315 static av_cold
int decode_end(AVCodecContext
*avctx
)
317 MadContext
*t
= avctx
->priv_data
;
318 av_frame_free(&t
->last_frame
);
319 av_free(t
->bitstream_buf
);
323 AVCodec ff_eamad_decoder
= {
325 .long_name
= NULL_IF_CONFIG_SMALL("Electronic Arts Madcow Video"),
326 .type
= AVMEDIA_TYPE_VIDEO
,
327 .id
= AV_CODEC_ID_MAD
,
328 .priv_data_size
= sizeof(MadContext
),
331 .decode
= decode_frame
,
332 .capabilities
= AV_CODEC_CAP_DR1
,