mdec.c
Go to the documentation of this file.
1 /*
2  * Sony PlayStation MDEC (Motion DECoder)
3  * Copyright (c) 2003 Michael Niedermayer
4  *
5  * based upon code from Sebastian Jedruszkiewicz <elf@frogger.rules.pl>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 /**
25  * @file
26  * Sony PlayStation MDEC (Motion DECoder)
27  * This is very similar to intra-only MPEG-1.
28  */
29 
30 #include "avcodec.h"
31 #include "mpegvideo.h"
32 #include "mpeg12.h"
33 #include "thread.h"
34 
35 typedef struct MDECContext {
41  int version;
42  int qscale;
43  int last_dc[3];
44  int mb_width;
45  int mb_height;
46  int mb_x, mb_y;
47  DECLARE_ALIGNED(16, int16_t, block)[6][64];
49  unsigned int bitstream_buffer_size;
51 } MDECContext;
52 
53 //very similar to MPEG-1
54 static inline int mdec_decode_block_intra(MDECContext *a, int16_t *block, int n)
55 {
56  int level, diff, i, j, run;
57  int component;
58  RLTable *rl = &ff_rl_mpeg1;
60  const uint16_t *quant_matrix = ff_mpeg1_default_intra_matrix;
61  const int qscale = a->qscale;
62 
63  /* DC coefficient */
64  if (a->version == 2) {
65  block[0] = 2 * get_sbits(&a->gb, 10) + 1024;
66  } else {
67  component = (n <= 3 ? 0 : n - 4 + 1);
68  diff = decode_dc(&a->gb, component);
69  if (diff >= 0xffff)
70  return AVERROR_INVALIDDATA;
71  a->last_dc[component] += diff;
72  block[0] = a->last_dc[component] << 3;
73  }
74 
75  i = 0;
76  {
77  OPEN_READER(re, &a->gb);
78  /* now quantify & encode AC coefficients */
79  for (;;) {
80  UPDATE_CACHE(re, &a->gb);
81  GET_RL_VLC(level, run, re, &a->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
82 
83  if (level == 127) {
84  break;
85  } else if (level != 0) {
86  i += run;
87  j = scantable[i];
88  level = (level * qscale * quant_matrix[j]) >> 3;
89  level = (level ^ SHOW_SBITS(re, &a->gb, 1)) - SHOW_SBITS(re, &a->gb, 1);
90  LAST_SKIP_BITS(re, &a->gb, 1);
91  } else {
92  /* escape */
93  run = SHOW_UBITS(re, &a->gb, 6)+1; LAST_SKIP_BITS(re, &a->gb, 6);
94  UPDATE_CACHE(re, &a->gb);
95  level = SHOW_SBITS(re, &a->gb, 10); SKIP_BITS(re, &a->gb, 10);
96  i += run;
97  j = scantable[i];
98  if (level < 0) {
99  level = -level;
100  level = (level * qscale * quant_matrix[j]) >> 3;
101  level = (level - 1) | 1;
102  level = -level;
103  } else {
104  level = (level * qscale * quant_matrix[j]) >> 3;
105  level = (level - 1) | 1;
106  }
107  }
108  if (i > 63) {
109  av_log(a->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", a->mb_x, a->mb_y);
110  return AVERROR_INVALIDDATA;
111  }
112 
113  block[j] = level;
114  }
115  CLOSE_READER(re, &a->gb);
116  }
117  a->block_last_index[n] = i;
118  return 0;
119 }
120 
121 static inline int decode_mb(MDECContext *a, int16_t block[6][64])
122 {
123  int i, ret;
124  const int block_index[6] = { 5, 4, 0, 1, 2, 3 };
125 
126  a->dsp.clear_blocks(block[0]);
127 
128  for (i = 0; i < 6; i++) {
129  if ((ret = mdec_decode_block_intra(a, block[block_index[i]],
130  block_index[i])) < 0)
131  return ret;
132  if (get_bits_left(&a->gb) < 0)
133  return AVERROR_INVALIDDATA;
134  }
135  return 0;
136 }
137 
138 static inline void idct_put(MDECContext *a, AVFrame *frame, int mb_x, int mb_y)
139 {
140  int16_t (*block)[64] = a->block;
141  int linesize = frame->linesize[0];
142 
143  uint8_t *dest_y = frame->data[0] + (mb_y * 16* linesize ) + mb_x * 16;
144  uint8_t *dest_cb = frame->data[1] + (mb_y * 8 * frame->linesize[1]) + mb_x * 8;
145  uint8_t *dest_cr = frame->data[2] + (mb_y * 8 * frame->linesize[2]) + mb_x * 8;
146 
147  a->dsp.idct_put(dest_y, linesize, block[0]);
148  a->dsp.idct_put(dest_y + 8, linesize, block[1]);
149  a->dsp.idct_put(dest_y + 8 * linesize, linesize, block[2]);
150  a->dsp.idct_put(dest_y + 8 * linesize + 8, linesize, block[3]);
151 
152  if (!(a->avctx->flags & CODEC_FLAG_GRAY)) {
153  a->dsp.idct_put(dest_cb, frame->linesize[1], block[4]);
154  a->dsp.idct_put(dest_cr, frame->linesize[2], block[5]);
155  }
156 }
157 
159  void *data, int *got_frame,
160  AVPacket *avpkt)
161 {
162  MDECContext * const a = avctx->priv_data;
163  const uint8_t *buf = avpkt->data;
164  int buf_size = avpkt->size;
165  ThreadFrame frame = { .f = data };
166  int i, ret;
167 
168  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
169  return ret;
170  frame.f->pict_type = AV_PICTURE_TYPE_I;
171  frame.f->key_frame = 1;
172 
174  if (!a->bitstream_buffer)
175  return AVERROR(ENOMEM);
176  for (i = 0; i < buf_size; i += 2) {
177  a->bitstream_buffer[i] = buf[i + 1];
178  a->bitstream_buffer[i + 1] = buf[i];
179  }
180  init_get_bits(&a->gb, a->bitstream_buffer, buf_size * 8);
181 
182  /* skip over 4 preamble bytes in stream (typically 0xXX 0xXX 0x00 0x38) */
183  skip_bits(&a->gb, 32);
184 
185  a->qscale = get_bits(&a->gb, 16);
186  a->version = get_bits(&a->gb, 16);
187 
188  a->last_dc[0] = a->last_dc[1] = a->last_dc[2] = 128;
189 
190  for (a->mb_x = 0; a->mb_x < a->mb_width; a->mb_x++) {
191  for (a->mb_y = 0; a->mb_y < a->mb_height; a->mb_y++) {
192  if ((ret = decode_mb(a, a->block)) < 0)
193  return ret;
194 
195  idct_put(a, frame.f, a->mb_x, a->mb_y);
196  }
197  }
198 
199  *got_frame = 1;
200 
201  return (get_bits_count(&a->gb) + 31) / 32 * 4;
202 }
203 
205 {
206  MDECContext * const a = avctx->priv_data;
207 
208  a->mb_width = (avctx->coded_width + 15) / 16;
209  a->mb_height = (avctx->coded_height + 15) / 16;
210 
211  a->avctx = avctx;
212 
213  ff_dsputil_init(&a->dsp, avctx);
216 
217  if (avctx->idct_algo == FF_IDCT_AUTO)
218  avctx->idct_algo = FF_IDCT_SIMPLE;
219  avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
220 
221  return 0;
222 }
223 
225 {
226  MDECContext * const a = avctx->priv_data;
227 
228  a->avctx = avctx;
229 
230  return 0;
231 }
232 
234 {
235  MDECContext * const a = avctx->priv_data;
236 
238  a->bitstream_buffer_size = 0;
239 
240  return 0;
241 }
242 
244  .name = "mdec",
245  .type = AVMEDIA_TYPE_VIDEO,
246  .id = AV_CODEC_ID_MDEC,
247  .priv_data_size = sizeof(MDECContext),
248  .init = decode_init,
249  .close = decode_end,
250  .decode = decode_frame,
251  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
252  .long_name = NULL_IF_CONFIG_SMALL("Sony PlayStation MDEC (Motion DECoder)"),
254 };
static int decode_mb(MDECContext *a, int16_t block[6][64])
Definition: mdec.c:121
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
AVCodecContext * avctx
Definition: mdec.c:36
#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
int coded_width
Bitstream width / height, may be different from width/height e.g.
DSPContext dsp
Definition: mdec.c:37
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
AVFrame * f
Definition: thread.h:36
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
ThreadFrame frame
Definition: mdec.c:38
int mb_x
Definition: mdec.c:46
Scantable.
Definition: dsputil.h:114
GetBitContext gb
Definition: mdec.c:39
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
mpegvideo header.
uint8_t permutated[64]
Definition: dsputil.h:116
uint8_t run
Definition: svq3.c:136
RLTable.
Definition: rl.h:38
static int get_sbits(GetBitContext *s, int n)
Definition: get_bits.h:225
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
DECLARE_ALIGNED(16, int16_t, block)[6][64]
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
uint8_t
#define av_cold
Definition: attributes.h:78
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: mdec.c:158
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
uint8_t * data
int mb_width
Definition: mdec.c:44
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
uint8_t idct_permutation[64]
idct input permutation.
Definition: dsputil.h:249
int block_last_index[6]
Definition: mdec.c:50
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:557
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:160
int qscale
Definition: mdec.c:42
Multithreading support functions.
struct MDECContext MDECContext
#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(* clear_blocks)(int16_t *blocks)
Definition: dsputil.h:146
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
#define CLOSE_READER(name, gb)
Definition: get_bits.h:140
static int decode_dc(GetBitContext *gb, int component)
Definition: mpeg12.h:49
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
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
#define FF_IDCT_SIMPLE
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_...
Definition: pixfmt.h:80
ret
Definition: avfilter.c:821
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
RLTable ff_rl_mpeg1
Definition: mpeg12data.c:166
int mb_height
Definition: mdec.c:45
unsigned int bitstream_buffer_size
Definition: mdec.c:49
#define LAST_SKIP_BITS(name, gb, num)
Definition: get_bits.h:181
uint8_t * bitstream_buffer
Definition: mdec.c:48
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
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
#define FF_IDCT_AUTO
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
ScanTable scantable
Definition: mdec.c:40
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#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 av_cold int decode_end(AVCodecContext *avctx)
Definition: mdec.c:233
static av_cold int decode_init_thread_copy(AVCodecContext *avctx)
Definition: mdec.c:224
void * buf
Definition: avisynth_c.h:594
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:265
static int mdec_decode_block_intra(MDECContext *a, int16_t *block, int n)
Definition: mdec.c:54
#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
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread.c:1066
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
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define SHOW_SBITS(name, gb, num)
Definition: get_bits.h:188
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
#define CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
int mb_y
Definition: mdec.c:46
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
Definition: dsputil.h:229
float re
Definition: fft-test.c:64
void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: dsputil.c:110
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
AVCodec ff_mdec_decoder
Definition: mdec.c:243
static void idct_put(MDECContext *a, AVFrame *frame, int mb_x, int mb_y)
Definition: mdec.c:138
static av_cold int decode_init(AVCodecContext *avctx)
Definition: mdec.c:204
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
This structure stores compressed data.
int last_dc[3]
Definition: mdec.c:43
DSPContext.
Definition: dsputil.h:127
int version
Definition: mdec.c:41