88
static const int sol_table_old[16] =
89
{ 0x0, 0x1, 0x2 , 0x3, 0x6, 0xA, 0xF, 0x15,
90
-0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0};
92
static const int sol_table_new[16] =
93
{ 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
94
0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15};
96
static const int sol_table_16[128] = {
88
static const int8_t sol_table_old[16] = {
89
0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
90
-0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
93
static const int8_t sol_table_new[16] = {
94
0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
95
0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
98
static const int16_t sol_table_16[128] = {
97
99
0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
98
100
0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
99
101
0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
158
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
161
if (avctx->codec->id == CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
162
avctx->sample_fmt = AV_SAMPLE_FMT_U8;
164
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
166
avcodec_get_frame_defaults(&s->frame);
167
avctx->coded_frame = &s->frame;
162
static int dpcm_decode_frame(AVCodecContext *avctx,
163
void *data, int *data_size,
173
static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
174
int *got_frame_ptr, AVPacket *avpkt)
166
176
const uint8_t *buf = avpkt->data;
167
177
int buf_size = avpkt->size;
178
const uint8_t *buf_end = buf + buf_size;
168
179
DPCMContext *s = avctx->priv_data;
170
181
int predictor[2];
171
int channel_number = 0;
172
short *output_samples = data;
180
// almost every DPCM variant expands one byte of data into two
181
if(*data_size/2 < buf_size)
184
switch(avctx->codec->id) {
186
case CODEC_ID_ROQ_DPCM:
187
if (s->channels == 1)
188
predictor[0] = AV_RL16(&buf[6]);
190
predictor[0] = buf[7] << 8;
191
predictor[1] = buf[6] << 8;
183
int stereo = s->channels - 1;
184
int16_t *output_samples;
186
/* calculate output size */
187
switch(avctx->codec->id) {
188
case CODEC_ID_ROQ_DPCM:
191
case CODEC_ID_INTERPLAY_DPCM:
192
out = buf_size - 6 - s->channels;
194
case CODEC_ID_XAN_DPCM:
195
out = buf_size - 2 * s->channels;
197
case CODEC_ID_SOL_DPCM:
198
if (avctx->codec_tag != 3)
205
av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
206
return AVERROR(EINVAL);
209
/* get output buffer */
210
s->frame.nb_samples = out / s->channels;
211
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
212
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
215
output_samples = (int16_t *)s->frame.data[0];
217
switch(avctx->codec->id) {
219
case CODEC_ID_ROQ_DPCM:
223
predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8);
224
predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8);
226
predictor[0] = (int16_t)bytestream_get_le16(&buf);
193
SE_16BIT(predictor[0]);
194
SE_16BIT(predictor[1]);
196
229
/* decode the samples */
197
for (in = 8, out = 0; in < buf_size; in++, out++) {
198
predictor[channel_number] += s->roq_square_array[buf[in]];
199
predictor[channel_number] = av_clip_int16(predictor[channel_number]);
200
output_samples[out] = predictor[channel_number];
230
while (buf < buf_end) {
231
predictor[ch] += s->roq_square_array[*buf++];
232
predictor[ch] = av_clip_int16(predictor[ch]);
233
*output_samples++ = predictor[ch];
202
235
/* toggle channel */
203
channel_number ^= s->channels - 1;
207
240
case CODEC_ID_INTERPLAY_DPCM:
208
in = 6; /* skip over the stream mask and stream length */
209
predictor[0] = AV_RL16(&buf[in]);
211
SE_16BIT(predictor[0])
212
output_samples[out++] = predictor[0];
213
if (s->channels == 2) {
214
predictor[1] = AV_RL16(&buf[in]);
216
SE_16BIT(predictor[1])
217
output_samples[out++] = predictor[1];
241
buf += 6; /* skip over the stream mask and stream length */
243
for (ch = 0; ch < s->channels; ch++) {
244
predictor[ch] = (int16_t)bytestream_get_le16(&buf);
245
*output_samples++ = predictor[ch];
220
while (in < buf_size) {
221
predictor[channel_number] += interplay_delta_table[buf[in++]];
222
predictor[channel_number] = av_clip_int16(predictor[channel_number]);
223
output_samples[out++] = predictor[channel_number];
249
while (buf < buf_end) {
250
predictor[ch] += interplay_delta_table[*buf++];
251
predictor[ch] = av_clip_int16(predictor[ch]);
252
*output_samples++ = predictor[ch];
225
254
/* toggle channel */
226
channel_number ^= s->channels - 1;
231
259
case CODEC_ID_XAN_DPCM:
233
shift[0] = shift[1] = 4;
234
predictor[0] = AV_RL16(&buf[in]);
236
SE_16BIT(predictor[0]);
237
if (s->channels == 2) {
238
predictor[1] = AV_RL16(&buf[in]);
240
SE_16BIT(predictor[1]);
243
while (in < buf_size) {
245
diff = (byte & 0xFC) << 8;
246
if ((byte & 0x03) == 3)
247
shift[channel_number]++;
261
int shift[2] = { 4, 4 };
263
for (ch = 0; ch < s->channels; ch++)
264
predictor[ch] = (int16_t)bytestream_get_le16(&buf);
267
while (buf < buf_end) {
269
int16_t diff = (n & 0xFC) << 8;
249
shift[channel_number] -= (2 * (byte & 3));
273
shift[ch] -= (2 * (n & 3));
250
274
/* saturate the shifter to a lower limit of 0 */
251
if (shift[channel_number] < 0)
252
shift[channel_number] = 0;
254
diff >>= shift[channel_number];
255
predictor[channel_number] += diff;
257
predictor[channel_number] = av_clip_int16(predictor[channel_number]);
258
output_samples[out++] = predictor[channel_number];
279
predictor[ch] += diff;
281
predictor[ch] = av_clip_int16(predictor[ch]);
282
*output_samples++ = predictor[ch];
260
284
/* toggle channel */
261
channel_number ^= s->channels - 1;
264
289
case CODEC_ID_SOL_DPCM:
266
290
if (avctx->codec_tag != 3) {
267
if(*data_size/4 < buf_size)
269
while (in < buf_size) {
271
n1 = (buf[in] >> 4) & 0xF;
272
n2 = buf[in++] & 0xF;
273
s->sample[0] += s->sol_table[n1];
274
if (s->sample[0] < 0) s->sample[0] = 0;
275
if (s->sample[0] > 255) s->sample[0] = 255;
276
output_samples[out++] = (s->sample[0] - 128) << 8;
277
s->sample[s->channels - 1] += s->sol_table[n2];
278
if (s->sample[s->channels - 1] < 0) s->sample[s->channels - 1] = 0;
279
if (s->sample[s->channels - 1] > 255) s->sample[s->channels - 1] = 255;
280
output_samples[out++] = (s->sample[s->channels - 1] - 128) << 8;
291
uint8_t *output_samples_u8 = s->frame.data[0];
292
while (buf < buf_end) {
295
s->sample[0] += s->sol_table[n >> 4];
296
s->sample[0] = av_clip_uint8(s->sample[0]);
297
*output_samples_u8++ = s->sample[0];
299
s->sample[stereo] += s->sol_table[n & 0x0F];
300
s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
301
*output_samples_u8++ = s->sample[stereo];
283
while (in < buf_size) {
286
if (n & 0x80) s->sample[channel_number] -= s->sol_table[n & 0x7F];
287
else s->sample[channel_number] += s->sol_table[n & 0x7F];
288
s->sample[channel_number] = av_clip_int16(s->sample[channel_number]);
289
output_samples[out++] = s->sample[channel_number];
304
while (buf < buf_end) {
306
if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
307
else s->sample[ch] += sol_table_16[n & 0x7F];
308
s->sample[ch] = av_clip_int16(s->sample[ch]);
309
*output_samples++ = s->sample[ch];
290
310
/* toggle channel */
291
channel_number ^= s->channels - 1;
297
*data_size = out * sizeof(short);
318
*(AVFrame *)data = s->frame;
301
#define DPCM_DECODER(id, name, long_name_) \
302
AVCodec ff_ ## name ## _decoder = { \
304
AVMEDIA_TYPE_AUDIO, \
306
sizeof(DPCMContext), \
311
.long_name = NULL_IF_CONFIG_SMALL(long_name_), \
323
#define DPCM_DECODER(id_, name_, long_name_) \
324
AVCodec ff_ ## name_ ## _decoder = { \
326
.type = AVMEDIA_TYPE_AUDIO, \
328
.priv_data_size = sizeof(DPCMContext), \
329
.init = dpcm_decode_init, \
330
.decode = dpcm_decode_frame, \
331
.capabilities = CODEC_CAP_DR1, \
332
.long_name = NULL_IF_CONFIG_SMALL(long_name_), \
314
335
DPCM_DECODER(CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
315
DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
316
DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
317
DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");
336
DPCM_DECODER(CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
337
DPCM_DECODER(CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
338
DPCM_DECODER(CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");