2 * Sony PlayStation MDEC (Motion DECoder)
3 * Copyright (c) 2003 Michael Niedermayer
5 * based upon code from Sebastian Jedruszkiewicz <elf@frogger.rules.pl>
7 * This file is part of FFmpeg.
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.
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.
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
26 * Sony PlayStation MDEC (Motion DECoder)
27 * This is very similar to intra-only MPEG-1.
30 #include "libavutil/mem.h"
31 #include "libavutil/mem_internal.h"
36 #include "codec_internal.h"
38 #include "mpeg12data.h"
39 #include "mpeg12dec.h"
42 typedef struct MDECContext
{
43 AVCodecContext
*avctx
;
45 BswapDSPContext bbdsp
;
48 uint8_t permutated_scantable
[64];
55 DECLARE_ALIGNED(32, int16_t, block
)[6][64];
56 DECLARE_ALIGNED(16, uint16_t, quant_matrix
)[64];
57 uint8_t *bitstream_buffer
;
58 unsigned int bitstream_buffer_size
;
59 int block_last_index
[6];
62 //very similar to MPEG-1
63 static inline int mdec_decode_block_intra(MDECContext
*a
, int16_t *block
, int n
)
65 int level
, diff
, i
, j
, run
;
67 const uint8_t *const scantable
= a
->permutated_scantable
;
68 const uint16_t *quant_matrix
= a
->quant_matrix
;
69 const int qscale
= a
->qscale
;
72 if (a
->version
<= 2) {
73 block
[0] = 2 * get_sbits(&a
->gb
, 10) + 1024;
75 component
= (n
<= 3 ? 0 : n
- 4 + 1);
76 diff
= decode_dc(&a
->gb
, component
);
77 a
->last_dc
[component
] += diff
;
78 block
[0] = a
->last_dc
[component
] * (1 << 3);
83 OPEN_READER(re
, &a
->gb
);
84 /* now quantify & encode AC coefficients */
86 UPDATE_CACHE(re
, &a
->gb
);
87 GET_RL_VLC(level
, run
, re
, &a
->gb
, ff_mpeg1_rl_vlc
, TEX_VLC_BITS
, 2, 0);
91 } else if (level
!= 0) {
94 av_log(a
->avctx
, AV_LOG_ERROR
,
95 "ac-tex damaged at %d %d\n", a
->mb_x
, a
->mb_y
);
96 return AVERROR_INVALIDDATA
;
99 level
= (level
* qscale
* quant_matrix
[j
]) >> 3;
100 level
= (level
^ SHOW_SBITS(re
, &a
->gb
, 1)) - SHOW_SBITS(re
, &a
->gb
, 1);
101 LAST_SKIP_BITS(re
, &a
->gb
, 1);
104 run
= SHOW_UBITS(re
, &a
->gb
, 6)+1; LAST_SKIP_BITS(re
, &a
->gb
, 6);
105 UPDATE_CACHE(re
, &a
->gb
);
106 level
= SHOW_SBITS(re
, &a
->gb
, 10); SKIP_BITS(re
, &a
->gb
, 10);
109 av_log(a
->avctx
, AV_LOG_ERROR
,
110 "ac-tex damaged at %d %d\n", a
->mb_x
, a
->mb_y
);
111 return AVERROR_INVALIDDATA
;
116 level
= (level
* (unsigned)qscale
* quant_matrix
[j
]) >> 3;
117 level
= (level
- 1) | 1;
120 level
= (level
* (unsigned)qscale
* quant_matrix
[j
]) >> 3;
121 level
= (level
- 1) | 1;
127 CLOSE_READER(re
, &a
->gb
);
129 a
->block_last_index
[n
] = i
;
133 static inline int decode_mb(MDECContext
*a
, int16_t block
[6][64])
136 static const int block_index
[6] = { 5, 4, 0, 1, 2, 3 };
138 a
->bdsp
.clear_blocks(block
[0]);
140 for (i
= 0; i
< 6; i
++) {
141 if ((ret
= mdec_decode_block_intra(a
, block
[block_index
[i
]],
142 block_index
[i
])) < 0)
144 if (get_bits_left(&a
->gb
) < 0)
145 return AVERROR_INVALIDDATA
;
150 static inline void idct_put(MDECContext
*a
, AVFrame
*frame
, int mb_x
, int mb_y
)
152 int16_t (*block
)[64] = a
->block
;
153 int linesize
= frame
->linesize
[0];
155 uint8_t *dest_y
= frame
->data
[0] + (mb_y
* 16* linesize
) + mb_x
* 16;
156 uint8_t *dest_cb
= frame
->data
[1] + (mb_y
* 8 * frame
->linesize
[1]) + mb_x
* 8;
157 uint8_t *dest_cr
= frame
->data
[2] + (mb_y
* 8 * frame
->linesize
[2]) + mb_x
* 8;
159 a
->idsp
.idct_put(dest_y
, linesize
, block
[0]);
160 a
->idsp
.idct_put(dest_y
+ 8, linesize
, block
[1]);
161 a
->idsp
.idct_put(dest_y
+ 8 * linesize
, linesize
, block
[2]);
162 a
->idsp
.idct_put(dest_y
+ 8 * linesize
+ 8, linesize
, block
[3]);
164 if (!(a
->avctx
->flags
& AV_CODEC_FLAG_GRAY
)) {
165 a
->idsp
.idct_put(dest_cb
, frame
->linesize
[1], block
[4]);
166 a
->idsp
.idct_put(dest_cr
, frame
->linesize
[2], block
[5]);
170 static int decode_frame(AVCodecContext
*avctx
, AVFrame
*frame
,
171 int *got_frame
, AVPacket
*avpkt
)
173 MDECContext
* const a
= avctx
->priv_data
;
174 const uint8_t *buf
= avpkt
->data
;
175 int buf_size
= avpkt
->size
;
178 if ((ret
= ff_thread_get_buffer(avctx
, frame
, 0)) < 0)
181 av_fast_padded_malloc(&a
->bitstream_buffer
, &a
->bitstream_buffer_size
, buf_size
);
182 if (!a
->bitstream_buffer
)
183 return AVERROR(ENOMEM
);
184 a
->bbdsp
.bswap16_buf((uint16_t *)a
->bitstream_buffer
, (uint16_t *)buf
, (buf_size
+ 1) / 2);
185 if ((ret
= init_get_bits8(&a
->gb
, a
->bitstream_buffer
, buf_size
)) < 0)
188 /* skip over 4 preamble bytes in stream (typically 0xXX 0xXX 0x00 0x38) */
189 skip_bits(&a
->gb
, 32);
191 a
->qscale
= get_bits(&a
->gb
, 16);
192 a
->version
= get_bits(&a
->gb
, 16);
194 a
->last_dc
[0] = a
->last_dc
[1] = a
->last_dc
[2] = 128;
196 for (a
->mb_x
= 0; a
->mb_x
< a
->mb_width
; a
->mb_x
++) {
197 for (a
->mb_y
= 0; a
->mb_y
< a
->mb_height
; a
->mb_y
++) {
198 if ((ret
= decode_mb(a
, a
->block
)) < 0)
201 idct_put(a
, frame
, a
->mb_x
, a
->mb_y
);
207 return (get_bits_count(&a
->gb
) + 31) / 32 * 4;
210 static av_cold
int decode_init(AVCodecContext
*avctx
)
212 MDECContext
* const a
= avctx
->priv_data
;
215 a
->mb_width
= (avctx
->coded_width
+ 15) / 16;
216 a
->mb_height
= (avctx
->coded_height
+ 15) / 16;
220 ff_blockdsp_init(&a
->bdsp
);
221 ff_bswapdsp_init(&a
->bbdsp
);
222 ff_idctdsp_init(&a
->idsp
, avctx
);
223 ff_mpeg12_init_vlcs();
224 ff_permute_scantable(a
->permutated_scantable
, ff_zigzag_direct
,
225 a
->idsp
.idct_permutation
);
227 avctx
->pix_fmt
= AV_PIX_FMT_YUVJ420P
;
228 avctx
->color_range
= AVCOL_RANGE_JPEG
;
231 for (i
= 0; i
< 64; i
++) {
232 int j
= a
->idsp
.idct_permutation
[i
];
234 a
->quant_matrix
[j
] = ff_mpeg1_default_intra_matrix
[i
];
240 static av_cold
int decode_end(AVCodecContext
*avctx
)
242 MDECContext
* const a
= avctx
->priv_data
;
244 av_freep(&a
->bitstream_buffer
);
245 a
->bitstream_buffer_size
= 0;
250 const FFCodec ff_mdec_decoder
= {
252 CODEC_LONG_NAME("Sony PlayStation MDEC (Motion DECoder)"),
253 .p
.type
= AVMEDIA_TYPE_VIDEO
,
254 .p
.id
= AV_CODEC_ID_MDEC
,
255 .priv_data_size
= sizeof(MDECContext
),
258 FF_CODEC_DECODE_CB(decode_frame
),
259 .p
.capabilities
= AV_CODEC_CAP_DR1
| AV_CODEC_CAP_FRAME_THREADS
,