eamad.c
Go to the documentation of this file.
1 /*
2  * Electronic Arts Madcow Video Decoder
3  * Copyright (c) 2007-2009 Peter Ross
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 St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Electronic Arts Madcow Video Decoder
25  * @author Peter Ross <pross@xvid.org>
26  *
27  * @see technical details at
28  * http://wiki.multimedia.cx/index.php?title=Electronic_Arts_MAD
29  */
30 
31 #include "avcodec.h"
32 #include "get_bits.h"
33 #include "aandcttab.h"
34 #include "eaidct.h"
35 #include "internal.h"
36 #include "mpeg12.h"
37 #include "mpeg12data.h"
38 #include "libavutil/imgutils.h"
39 
40 #define EA_PREAMBLE_SIZE 8
41 #define MADk_TAG MKTAG('M', 'A', 'D', 'k') /* MAD i-frame */
42 #define MADm_TAG MKTAG('M', 'A', 'D', 'm') /* MAD p-frame */
43 #define MADe_TAG MKTAG('M', 'A', 'D', 'e') /* MAD lqp-frame */
44 
45 typedef struct MadContext {
51  unsigned int bitstream_buf_size;
52  DECLARE_ALIGNED(16, int16_t, block)[64];
54  uint16_t quant_matrix[64];
55  int mb_x;
56  int mb_y;
57 } MadContext;
58 
60 {
61  MadContext *s = avctx->priv_data;
62  s->avctx = avctx;
63  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
64  ff_dsputil_init(&s->dsp, avctx);
68  return 0;
69 }
70 
71 static inline void comp(unsigned char *dst, int dst_stride,
72  unsigned char *src, int src_stride, int add)
73 {
74  int j, i;
75  for (j=0; j<8; j++)
76  for (i=0; i<8; i++)
77  dst[j*dst_stride + i] = av_clip_uint8(src[j*src_stride + i] + add);
78 }
79 
80 static inline void comp_block(MadContext *t, AVFrame *frame,
81  int mb_x, int mb_y,
82  int j, int mv_x, int mv_y, int add)
83 {
84  if (j < 4) {
85  unsigned offset = (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x;
86  if (offset >= (t->avctx->height - 7) * t->last_frame.linesize[0] - 7)
87  return;
88  comp(frame->data[0] + (mb_y*16 + ((j&2)<<2))*frame->linesize[0] + mb_x*16 + ((j&1)<<3),
89  frame->linesize[0],
90  t->last_frame.data[0] + offset,
91  t->last_frame.linesize[0], add);
92  } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) {
93  int index = j - 3;
94  unsigned offset = (mb_y * 8 + (mv_y/2))*t->last_frame.linesize[index] + mb_x * 8 + (mv_x/2);
95  if (offset >= (t->avctx->height/2 - 7) * t->last_frame.linesize[index] - 7)
96  return;
97  comp(frame->data[index] + (mb_y*8)*frame->linesize[index] + mb_x * 8,
98  frame->linesize[index],
99  t->last_frame.data[index] + offset,
100  t->last_frame.linesize[index], add);
101  }
102 }
103 
104 static inline void idct_put(MadContext *t, AVFrame *frame, int16_t *block,
105  int mb_x, int mb_y, int j)
106 {
107  if (j < 4) {
109  frame->data[0] + (mb_y*16 + ((j&2)<<2))*frame->linesize[0] + mb_x*16 + ((j&1)<<3),
110  frame->linesize[0], block);
111  } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) {
112  int index = j - 3;
114  frame->data[index] + (mb_y*8)*frame->linesize[index] + mb_x*8,
115  frame->linesize[index], block);
116  }
117 }
118 
119 static inline int decode_block_intra(MadContext *s, int16_t * block)
120 {
121  int level, i, j, run;
122  RLTable *rl = &ff_rl_mpeg1;
124  int16_t *quant_matrix = s->quant_matrix;
125 
126  block[0] = (128 + get_sbits(&s->gb, 8)) * quant_matrix[0];
127 
128  /* The RL decoder is derived from mpeg1_decode_block_intra;
129  Escaped level and run values a decoded differently */
130  i = 0;
131  {
132  OPEN_READER(re, &s->gb);
133  /* now quantify & encode AC coefficients */
134  for (;;) {
135  UPDATE_CACHE(re, &s->gb);
136  GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
137 
138  if (level == 127) {
139  break;
140  } else if (level != 0) {
141  i += run;
142  j = scantable[i];
143  level = (level*quant_matrix[j]) >> 4;
144  level = (level-1)|1;
145  level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
146  LAST_SKIP_BITS(re, &s->gb, 1);
147  } else {
148  /* escape */
149  UPDATE_CACHE(re, &s->gb);
150  level = SHOW_SBITS(re, &s->gb, 10); SKIP_BITS(re, &s->gb, 10);
151 
152  UPDATE_CACHE(re, &s->gb);
153  run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
154 
155  i += run;
156  j = scantable[i];
157  if (level < 0) {
158  level = -level;
159  level = (level*quant_matrix[j]) >> 4;
160  level = (level-1)|1;
161  level = -level;
162  } else {
163  level = (level*quant_matrix[j]) >> 4;
164  level = (level-1)|1;
165  }
166  }
167  if (i > 63) {
168  av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
169  return -1;
170  }
171 
172  block[j] = level;
173  }
174  CLOSE_READER(re, &s->gb);
175  }
176  return 0;
177 }
178 
180 {
181  int value = 0;
182  if (get_bits1(gb)) {
183  if (get_bits1(gb))
184  value = -17;
185  value += get_bits(gb, 4) + 1;
186  }
187  return value;
188 }
189 
190 static int decode_mb(MadContext *s, AVFrame *frame, int inter)
191 {
192  int mv_map = 0;
193  int mv_x, mv_y;
194  int j;
195 
196  if (inter) {
197  int v = decode210(&s->gb);
198  if (v < 2) {
199  mv_map = v ? get_bits(&s->gb, 6) : 63;
200  mv_x = decode_motion(&s->gb);
201  mv_y = decode_motion(&s->gb);
202  }
203  }
204 
205  for (j=0; j<6; j++) {
206  if (mv_map & (1<<j)) { // mv_x and mv_y are guarded by mv_map
207  int add = 2*decode_motion(&s->gb);
208  if (s->last_frame.data[0])
209  comp_block(s, frame, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
210  } else {
211  s->dsp.clear_block(s->block);
212  if(decode_block_intra(s, s->block) < 0)
213  return -1;
214  idct_put(s, frame, s->block, s->mb_x, s->mb_y, j);
215  }
216  }
217  return 0;
218 }
219 
220 static void calc_quant_matrix(MadContext *s, int qscale)
221 {
222  int i;
223 
225  for (i=1; i<64; i++)
226  s->quant_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10;
227 }
228 
230  void *data, int *got_frame,
231  AVPacket *avpkt)
232 {
233  const uint8_t *buf = avpkt->data;
234  int buf_size = avpkt->size;
235  const uint8_t *buf_end = buf+buf_size;
236  MadContext *s = avctx->priv_data;
237  AVFrame *frame = data;
238  int width, height;
239  int chunk_type;
240  int inter, ret;
241 
242  if (buf_size < 26) {
243  av_log(avctx, AV_LOG_ERROR, "Input buffer too small\n");
244  *got_frame = 0;
245  return AVERROR_INVALIDDATA;
246  }
247 
248  chunk_type = AV_RL32(&buf[0]);
249  inter = (chunk_type == MADm_TAG || chunk_type == MADe_TAG);
250  buf += 8;
251 
252  av_reduce(&avctx->time_base.num, &avctx->time_base.den,
253  AV_RL16(&buf[6]), 1000, 1<<30);
254 
255  width = AV_RL16(&buf[8]);
256  height = AV_RL16(&buf[10]);
257  calc_quant_matrix(s, buf[13]);
258  buf += 16;
259 
260  if (avctx->width != width || avctx->height != height) {
261  if((width * height)/2048*7 > buf_end-buf)
262  return AVERROR_INVALIDDATA;
263  if ((ret = av_image_check_size(width, height, 0, avctx)) < 0)
264  return ret;
265  avcodec_set_dimensions(avctx, width, height);
267  }
268 
269  if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
270  return ret;
271 
272  if (inter && !s->last_frame.data[0]) {
273  av_log(avctx, AV_LOG_WARNING, "Missing reference frame.\n");
275  if (ret < 0)
276  return ret;
277  memset(s->last_frame.data[0], 0, s->last_frame.height *
278  s->last_frame.linesize[0]);
279  memset(s->last_frame.data[1], 0x80, s->last_frame.height / 2 *
280  s->last_frame.linesize[1]);
281  memset(s->last_frame.data[2], 0x80, s->last_frame.height / 2 *
282  s->last_frame.linesize[2]);
283  }
284 
286  buf_end - buf);
287  if (!s->bitstream_buf)
288  return AVERROR(ENOMEM);
289  s->dsp.bswap16_buf(s->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2);
290  memset((uint8_t*)s->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
291  init_get_bits(&s->gb, s->bitstream_buf, 8*(buf_end-buf));
292 
293  for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++)
294  for (s->mb_x=0; s->mb_x < (avctx->width +15)/16; s->mb_x++)
295  if(decode_mb(s, frame, inter) < 0)
296  return AVERROR_INVALIDDATA;
297 
298  *got_frame = 1;
299 
300  if (chunk_type != MADe_TAG) {
302  if ((ret = av_frame_ref(&s->last_frame, frame)) < 0)
303  return ret;
304  }
305 
306  return buf_size;
307 }
308 
310 {
311  MadContext *t = avctx->priv_data;
314  return 0;
315 }
316 
318  .name = "eamad",
319  .type = AVMEDIA_TYPE_VIDEO,
320  .id = AV_CODEC_ID_MAD,
321  .priv_data_size = sizeof(MadContext),
322  .init = decode_init,
323  .close = decode_end,
324  .decode = decode_frame,
325  .capabilities = CODEC_CAP_DR1,
326  .long_name = NULL_IF_CONFIG_SMALL("Electronic Arts Madcow Video")
327 };
DSPContext dsp
Definition: eamad.c:47
float v
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
AVCodec ff_eamad_decoder
Definition: eamad.c:317
uint16_t quant_matrix[64]
Definition: eamad.c:54
misc image utilities
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
av_cold void ff_mpeg12_init_vlcs(void)
Definition: mpeg12.c:124
static void comp_block(MadContext *t, AVFrame *frame, int mb_x, int mb_y, int j, int mv_x, int mv_y, int add)
Definition: eamad.c:80
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
Scantable.
Definition: dsputil.h:114
int num
numerator
Definition: rational.h:44
void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
#define AV_RL16
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional FF_INPUT_BUFFER_PADDING_SIZE at the end w...
void(* bswap16_buf)(uint16_t *dst, const uint16_t *src, int len)
Definition: dsputil.h:209
uint8_t permutated[64]
Definition: dsputil.h:116
uint8_t run
Definition: svq3.c:136
void(* clear_block)(int16_t *block)
Definition: dsputil.h:145
RLTable.
Definition: rl.h:38
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:225
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
struct MadContext MadContext
DECLARE_ALIGNED(16, int16_t, block)[64]
uint8_t
#define av_cold
Definition: attributes.h:78
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
bitstream reader API header.
uint8_t idct_permutation[64]
idct input permutation.
Definition: dsputil.h:249
static void calc_quant_matrix(MadContext *s, int qscale)
Definition: eamad.c:220
AVCodecContext * avctx
Definition: eamad.c:46
frame
Definition: stft.m:14
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:160
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
int flags
CODEC_FLAG_*.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static av_cold int decode_end(AVCodecContext *avctx)
Definition: eamad.c:309
static int decode_block_intra(MadContext *s, int16_t *block)
Definition: eamad.c:119
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
#define CLOSE_READER(name, gb)
Definition: get_bits.h:140
external API header
#define GET_RL_VLC(level, run, name, gb, table, bits,max_depth, need_update)
Definition: get_bits.h:490
#define SKIP_BITS(name, gb, num)
Definition: get_bits.h:175
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:36
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition: imgutils.c:231
ScanTable scantable
Definition: eamad.c:53
ret
Definition: avfilter.c:821
int width
picture width / height.
RLTable ff_rl_mpeg1
Definition: mpeg12data.c:166
t
Definition: genspecsines3.m:6
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: eamad.c:229
#define FF_NO_IDCT_PERM
Definition: dsputil.h:251
#define LAST_SKIP_BITS(name, gb, num)
Definition: get_bits.h:181
#define AV_RL32
FIXME Range Coding of cr are level
Definition: snow.txt:367
RL_VLC_ELEM * rl_vlc[32]
decoding only
Definition: rl.h:48
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:187
static int decode210(GetBitContext *gb)
Definition: get_bits.h:549
GetBitContext gb
Definition: eamad.c:49
#define MADe_TAG
Definition: eamad.c:43
static int width
Definition: tests/utils.c:158
AVS_Value src
Definition: avisynth_c.h:523
AVFrame last_frame
Definition: eamad.c:48
static void idct_put(MadContext *t, AVFrame *frame, int16_t *block, int mb_x, int mb_y, int j)
Definition: eamad.c:104
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
const uint16_t ff_inv_aanscales[64]
Definition: aandcttab.c:38
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
MPEG1/2 tables.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define OPEN_READER(name, gb)
Definition: get_bits.h:126
static int decode_motion(GetBitContext *gb)
Definition: eamad.c:179
void * buf
Definition: avisynth_c.h:594
int mb_y
Definition: eamad.c:56
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
double value
Definition: eval.c:82
int index
Definition: gxfenc.c:89
#define TEX_VLC_BITS
Definition: dvdata.h:96
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
const uint16_t ff_mpeg1_default_intra_matrix[256]
Definition: mpeg12data.c:30
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
void ff_init_scantable_permutation(uint8_t *idct_permutation, int idct_permutation_type)
Definition: dsputil.c:131
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
int av_frame_ref(AVFrame *dst, AVFrame *src)
Setup a new reference to the data described by an given frame.
Definition: frame.c:228
#define MADm_TAG
Definition: eamad.c:42
AAN (Arai Agui Nakajima) (I)DCT tables.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
void ff_ea_idct_put_c(uint8_t *dest, int linesize, int16_t *block)
Definition: eaidct.c:80
#define SHOW_SBITS(name, gb, num)
Definition: get_bits.h:188
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
common internal api header.
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
void * bitstream_buf
Definition: eamad.c:50
int den
denominator
Definition: rational.h:45
float re
Definition: fft-test.c:64
static int decode_mb(MadContext *s, AVFrame *frame, int inter)
Definition: eamad.c:190
void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: dsputil.c:110
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int mb_x
Definition: eamad.c:55
int height
Definition: frame.h:122
static void comp(unsigned char *dst, int dst_stride, unsigned char *src, int src_stride, int add)
Definition: eamad.c:71
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
unsigned int bitstream_buf_size
Definition: eamad.c:51
This structure stores compressed data.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
static av_cold int decode_init(AVCodecContext *avctx)
Definition: eamad.c:59
DSPContext.
Definition: dsputil.h:127