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 "bytestream.h"
35 #include "aandcttab.h"
40 #include "mpeg12data.h"
41 #include "libavutil/imgutils.h"
43 #define EA_PREAMBLE_SIZE 8
44 #define MADk_TAG MKTAG('M', 'A', 'D', 'k') /* MAD i-frame */
45 #define MADm_TAG MKTAG('M', 'A', 'D', 'm') /* MAD p-frame */
46 #define MADe_TAG MKTAG('M', 'A', 'D', 'e') /* MAD lqp-frame */
48 typedef struct MadContext
{
49 AVCodecContext
*avctx
;
51 BswapDSPContext bbdsp
;
56 unsigned int bitstream_buf_size
;
57 DECLARE_ALIGNED(16, int16_t, block
)[64];
59 uint16_t quant_matrix
[64];
64 static av_cold
int decode_init(AVCodecContext
*avctx
)
66 MadContext
*s
= avctx
->priv_data
;
68 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
69 ff_blockdsp_init(&s
->bdsp
, avctx
);
70 ff_bswapdsp_init(&s
->bbdsp
);
71 ff_idctdsp_init(&s
->idsp
, avctx
);
72 ff_init_scantable_permutation(s
->idsp
.idct_permutation
, FF_IDCT_PERM_NONE
);
73 ff_init_scantable(s
->idsp
.idct_permutation
, &s
->scantable
, ff_zigzag_direct
);
74 ff_mpeg12_init_vlcs();
76 s
->last_frame
= av_frame_alloc();
78 return AVERROR(ENOMEM
);
83 static inline void comp(unsigned char *dst
, int dst_stride
,
84 unsigned char *src
, int src_stride
, int add
)
89 dst
[j
*dst_stride
+ i
] = av_clip_uint8(src
[j
*src_stride
+ i
] + add
);
92 static inline void comp_block(MadContext
*t
, AVFrame
*frame
,
94 int j
, int mv_x
, int mv_y
, int add
)
97 comp(frame
->data
[0] + (mb_y
*16 + ((j
&2)<<2))*frame
->linesize
[0] + mb_x
*16 + ((j
&1)<<3),
99 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
,
100 t
->last_frame
->linesize
[0], add
);
101 } else if (!(t
->avctx
->flags
& CODEC_FLAG_GRAY
)) {
103 comp(frame
->data
[index
] + (mb_y
*8)*frame
->linesize
[index
] + mb_x
* 8,
104 frame
->linesize
[index
],
105 t
->last_frame
->data
[index
] + (mb_y
* 8 + (mv_y
/2))*t
->last_frame
->linesize
[index
] + mb_x
* 8 + (mv_x
/2),
106 t
->last_frame
->linesize
[index
], add
);
110 static inline void idct_put(MadContext
*t
, AVFrame
*frame
, int16_t *block
,
111 int mb_x
, int mb_y
, int j
)
115 frame
->data
[0] + (mb_y
*16 + ((j
&2)<<2))*frame
->linesize
[0] + mb_x
*16 + ((j
&1)<<3),
116 frame
->linesize
[0], block
);
117 } else if (!(t
->avctx
->flags
& CODEC_FLAG_GRAY
)) {
120 frame
->data
[index
] + (mb_y
*8)*frame
->linesize
[index
] + mb_x
*8,
121 frame
->linesize
[index
], block
);
125 static inline void decode_block_intra(MadContext
*s
, int16_t * block
)
127 int level
, i
, j
, run
;
128 RLTable
*rl
= &ff_rl_mpeg1
;
129 const uint8_t *scantable
= s
->scantable
.permutated
;
130 int16_t *quant_matrix
= s
->quant_matrix
;
132 block
[0] = (128 + get_sbits(&s
->gb
, 8)) * quant_matrix
[0];
134 /* The RL decoder is derived from mpeg1_decode_block_intra;
135 Escaped level and run values a decoded differently */
138 OPEN_READER(re
, &s
->gb
);
139 /* now quantify & encode AC coefficients */
141 UPDATE_CACHE(re
, &s
->gb
);
142 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2, 0);
146 } else if (level
!= 0) {
149 av_log(s
->avctx
, AV_LOG_ERROR
,
150 "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
154 level
= (level
*quant_matrix
[j
]) >> 4;
156 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
157 LAST_SKIP_BITS(re
, &s
->gb
, 1);
160 UPDATE_CACHE(re
, &s
->gb
);
161 level
= SHOW_SBITS(re
, &s
->gb
, 10); SKIP_BITS(re
, &s
->gb
, 10);
163 UPDATE_CACHE(re
, &s
->gb
);
164 run
= SHOW_UBITS(re
, &s
->gb
, 6)+1; LAST_SKIP_BITS(re
, &s
->gb
, 6);
168 av_log(s
->avctx
, AV_LOG_ERROR
,
169 "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
175 level
= (level
*quant_matrix
[j
]) >> 4;
179 level
= (level
*quant_matrix
[j
]) >> 4;
186 CLOSE_READER(re
, &s
->gb
);
190 static int decode_motion(GetBitContext
*gb
)
196 value
+= get_bits(gb
, 4) + 1;
201 static void decode_mb(MadContext
*s
, AVFrame
*frame
, int inter
)
208 int v
= decode210(&s
->gb
);
210 mv_map
= v ?
get_bits(&s
->gb
, 6) : 63;
211 mv_x
= decode_motion(&s
->gb
);
212 mv_y
= decode_motion(&s
->gb
);
218 for (j
=0; j
<6; j
++) {
219 if (mv_map
& (1<<j
)) { // mv_x and mv_y are guarded by mv_map
220 int add
= 2*decode_motion(&s
->gb
);
221 comp_block(s
, frame
, s
->mb_x
, s
->mb_y
, j
, mv_x
, mv_y
, add
);
223 s
->bdsp
.clear_block(s
->block
);
224 decode_block_intra(s
, s
->block
);
225 idct_put(s
, frame
, s
->block
, s
->mb_x
, s
->mb_y
, j
);
230 static void calc_quant_matrix(MadContext
*s
, int qscale
)
234 s
->quant_matrix
[0] = (ff_inv_aanscales
[0]*ff_mpeg1_default_intra_matrix
[0]) >> 11;
236 s
->quant_matrix
[i
] = (ff_inv_aanscales
[i
]*ff_mpeg1_default_intra_matrix
[i
]*qscale
+ 32) >> 10;
239 static int decode_frame(AVCodecContext
*avctx
,
240 void *data
, int *got_frame
,
243 const uint8_t *buf
= avpkt
->data
;
244 int buf_size
= avpkt
->size
;
245 MadContext
*s
= avctx
->priv_data
;
246 AVFrame
*frame
= data
;
252 bytestream2_init(&gb
, buf
, buf_size
);
254 chunk_type
= bytestream2_get_le32(&gb
);
255 inter
= (chunk_type
== MADm_TAG
|| chunk_type
== MADe_TAG
);
256 bytestream2_skip(&gb
, 10);
258 av_reduce(&avctx
->framerate
.den
, &avctx
->framerate
.num
,
259 bytestream2_get_le16(&gb
), 1000, 1<<30);
261 width
= bytestream2_get_le16(&gb
);
262 height
= bytestream2_get_le16(&gb
);
263 bytestream2_skip(&gb
, 1);
264 calc_quant_matrix(s
, bytestream2_get_byte(&gb
));
265 bytestream2_skip(&gb
, 2);
267 if (bytestream2_get_bytes_left(&gb
) < 2) {
268 av_log(avctx
, AV_LOG_ERROR
, "Input data too small\n");
269 return AVERROR_INVALIDDATA
;
272 if (avctx
->width
!= width
|| avctx
->height
!= height
) {
273 av_frame_unref(s
->last_frame
);
274 if ((ret
= ff_set_dimensions(avctx
, width
, height
)) < 0)
278 if ((ret
= ff_get_buffer(avctx
, frame
, AV_GET_BUFFER_FLAG_REF
)) < 0) {
279 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
283 if (inter
&& !s
->last_frame
->data
[0]) {
284 av_log(avctx
, AV_LOG_WARNING
, "Missing reference frame.\n");
285 ret
= ff_get_buffer(avctx
, s
->last_frame
, AV_GET_BUFFER_FLAG_REF
);
288 memset(s
->last_frame
->data
[0], 0, s
->last_frame
->height
*
289 s
->last_frame
->linesize
[0]);
290 memset(s
->last_frame
->data
[1], 0x80, s
->last_frame
->height
/ 2 *
291 s
->last_frame
->linesize
[1]);
292 memset(s
->last_frame
->data
[2], 0x80, s
->last_frame
->height
/ 2 *
293 s
->last_frame
->linesize
[2]);
296 av_fast_padded_malloc(&s
->bitstream_buf
, &s
->bitstream_buf_size
,
297 bytestream2_get_bytes_left(&gb
));
298 if (!s
->bitstream_buf
)
299 return AVERROR(ENOMEM
);
300 s
->bbdsp
.bswap16_buf(s
->bitstream_buf
, (const uint16_t *)(buf
+ bytestream2_tell(&gb
)),
301 bytestream2_get_bytes_left(&gb
) / 2);
302 init_get_bits(&s
->gb
, s
->bitstream_buf
, 8*(bytestream2_get_bytes_left(&gb
)));
304 for (s
->mb_y
=0; s
->mb_y
< (avctx
->height
+15)/16; s
->mb_y
++)
305 for (s
->mb_x
=0; s
->mb_x
< (avctx
->width
+15)/16; s
->mb_x
++)
306 decode_mb(s
, frame
, inter
);
310 if (chunk_type
!= MADe_TAG
) {
311 av_frame_unref(s
->last_frame
);
312 if ((ret
= av_frame_ref(s
->last_frame
, frame
)) < 0)
319 static av_cold
int decode_end(AVCodecContext
*avctx
)
321 MadContext
*t
= avctx
->priv_data
;
322 av_frame_free(&t
->last_frame
);
323 av_free(t
->bitstream_buf
);
327 AVCodec ff_eamad_decoder
= {
329 .long_name
= NULL_IF_CONFIG_SMALL("Electronic Arts Madcow Video"),
330 .type
= AVMEDIA_TYPE_VIDEO
,
331 .id
= AV_CODEC_ID_MAD
,
332 .priv_data_size
= sizeof(MadContext
),
335 .decode
= decode_frame
,
336 .capabilities
= CODEC_CAP_DR1
,