Signed-off-by: Paul B Mahol <onemda@gmail.com>
Paul B Mahol authored on 2015/10/13 21:16:24... | ... |
@@ -687,6 +687,7 @@ OBJS-$(CONFIG_ADPCM_IMA_WAV_ENCODER) += adpcmenc.o adpcm_data.o |
687 | 687 |
OBJS-$(CONFIG_ADPCM_IMA_WS_DECODER) += adpcm.o adpcm_data.o |
688 | 688 |
OBJS-$(CONFIG_ADPCM_MS_DECODER) += adpcm.o adpcm_data.o |
689 | 689 |
OBJS-$(CONFIG_ADPCM_MS_ENCODER) += adpcmenc.o adpcm_data.o |
690 |
+OBJS-$(CONFIG_ADPCM_PSX_DECODER) += adpcm.o adpcm_data.o |
|
690 | 691 |
OBJS-$(CONFIG_ADPCM_SBPRO_2_DECODER) += adpcm.o adpcm_data.o |
691 | 692 |
OBJS-$(CONFIG_ADPCM_SBPRO_3_DECODER) += adpcm.o adpcm_data.o |
692 | 693 |
OBJS-$(CONFIG_ADPCM_SBPRO_4_DECODER) += adpcm.o adpcm_data.o |
... | ... |
@@ -152,6 +152,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) |
152 | 152 |
case AV_CODEC_ID_ADPCM_THP_LE: |
153 | 153 |
case AV_CODEC_ID_ADPCM_AFC: |
154 | 154 |
case AV_CODEC_ID_ADPCM_DTK: |
155 |
+ case AV_CODEC_ID_ADPCM_PSX: |
|
155 | 156 |
avctx->sample_fmt = AV_SAMPLE_FMT_S16P; |
156 | 157 |
break; |
157 | 158 |
case AV_CODEC_ID_ADPCM_IMA_WS: |
... | ... |
@@ -665,6 +666,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, |
665 | 665 |
nb_samples = (buf_size / 128) * 224 / ch; |
666 | 666 |
break; |
667 | 667 |
case AV_CODEC_ID_ADPCM_DTK: |
668 |
+ case AV_CODEC_ID_ADPCM_PSX: |
|
668 | 669 |
nb_samples = buf_size / (16 * ch) * 28; |
669 | 670 |
break; |
670 | 671 |
} |
... | ... |
@@ -1548,6 +1550,43 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, |
1548 | 1548 |
bytestream2_seek(&gb, 0, SEEK_SET); |
1549 | 1549 |
} |
1550 | 1550 |
break; |
1551 |
+ case AV_CODEC_ID_ADPCM_PSX: |
|
1552 |
+ for (channel = 0; channel < avctx->channels; channel++) { |
|
1553 |
+ samples = samples_p[channel]; |
|
1554 |
+ |
|
1555 |
+ /* Read in every sample for this channel. */ |
|
1556 |
+ for (i = 0; i < nb_samples / 28; i++) { |
|
1557 |
+ int filter, shift, flag, byte; |
|
1558 |
+ |
|
1559 |
+ filter = bytestream2_get_byteu(&gb); |
|
1560 |
+ shift = filter & 0xf; |
|
1561 |
+ filter = filter >> 4; |
|
1562 |
+ if (filter >= FF_ARRAY_ELEMS(xa_adpcm_table)) |
|
1563 |
+ return AVERROR_INVALIDDATA; |
|
1564 |
+ flag = bytestream2_get_byteu(&gb); |
|
1565 |
+ |
|
1566 |
+ /* Decode 28 samples. */ |
|
1567 |
+ for (n = 0; n < 28; n++) { |
|
1568 |
+ int sample = 0, scale; |
|
1569 |
+ |
|
1570 |
+ if (flag < 0x07) { |
|
1571 |
+ if (n & 1) { |
|
1572 |
+ scale = sign_extend(byte >> 4, 4); |
|
1573 |
+ } else { |
|
1574 |
+ byte = bytestream2_get_byteu(&gb); |
|
1575 |
+ scale = sign_extend(byte, 4); |
|
1576 |
+ } |
|
1577 |
+ |
|
1578 |
+ scale = scale << 12; |
|
1579 |
+ sample = (int)((scale >> shift) + (c->status[channel].sample1 * xa_adpcm_table[filter][0] + c->status[channel].sample2 * xa_adpcm_table[filter][1]) / 64); |
|
1580 |
+ } |
|
1581 |
+ *samples++ = av_clip_int16(sample); |
|
1582 |
+ c->status[channel].sample2 = c->status[channel].sample1; |
|
1583 |
+ c->status[channel].sample1 = sample; |
|
1584 |
+ } |
|
1585 |
+ } |
|
1586 |
+ } |
|
1587 |
+ break; |
|
1551 | 1588 |
|
1552 | 1589 |
default: |
1553 | 1590 |
return -1; |
... | ... |
@@ -1622,6 +1661,7 @@ ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_SMJPEG, sample_fmts_s16, adpcm_ima_smjpeg, |
1622 | 1622 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WAV, sample_fmts_s16p, adpcm_ima_wav, "ADPCM IMA WAV"); |
1623 | 1623 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_IMA_WS, sample_fmts_both, adpcm_ima_ws, "ADPCM IMA Westwood"); |
1624 | 1624 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_MS, sample_fmts_s16, adpcm_ms, "ADPCM Microsoft"); |
1625 |
+ADPCM_DECODER(AV_CODEC_ID_ADPCM_PSX, sample_fmts_s16p, adpcm_psx, "ADPCM PSX"); |
|
1625 | 1626 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_2, sample_fmts_s16, adpcm_sbpro_2, "ADPCM Sound Blaster Pro 2-bit"); |
1626 | 1627 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_3, sample_fmts_s16, adpcm_sbpro_3, "ADPCM Sound Blaster Pro 2.6-bit"); |
1627 | 1628 |
ADPCM_DECODER(AV_CODEC_ID_ADPCM_SBPRO_4, sample_fmts_s16, adpcm_sbpro_4, "ADPCM Sound Blaster Pro 4-bit"); |
... | ... |
@@ -509,6 +509,7 @@ void avcodec_register_all(void) |
509 | 509 |
REGISTER_ENCDEC (ADPCM_IMA_WAV, adpcm_ima_wav); |
510 | 510 |
REGISTER_DECODER(ADPCM_IMA_WS, adpcm_ima_ws); |
511 | 511 |
REGISTER_ENCDEC (ADPCM_MS, adpcm_ms); |
512 |
+ REGISTER_DECODER(ADPCM_PSX, adpcm_psx); |
|
512 | 513 |
REGISTER_DECODER(ADPCM_SBPRO_2, adpcm_sbpro_2); |
513 | 514 |
REGISTER_DECODER(ADPCM_SBPRO_3, adpcm_sbpro_3); |
514 | 515 |
REGISTER_DECODER(ADPCM_SBPRO_4, adpcm_sbpro_4); |
... | ... |
@@ -1978,6 +1978,13 @@ static const AVCodecDescriptor codec_descriptors[] = { |
1978 | 1978 |
.long_name = NULL_IF_CONFIG_SMALL("LucasArts VIMA audio"), |
1979 | 1979 |
.props = AV_CODEC_PROP_LOSSY, |
1980 | 1980 |
}, |
1981 |
+ { |
|
1982 |
+ .id = AV_CODEC_ID_ADPCM_PSX, |
|
1983 |
+ .type = AVMEDIA_TYPE_AUDIO, |
|
1984 |
+ .name = "adpcm_psx", |
|
1985 |
+ .long_name = NULL_IF_CONFIG_SMALL("ADPCM PSX"), |
|
1986 |
+ .props = AV_CODEC_PROP_LOSSY, |
|
1987 |
+ }, |
|
1981 | 1988 |
|
1982 | 1989 |
/* AMR */ |
1983 | 1990 |
{ |
... | ... |
@@ -3063,6 +3063,7 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) |
3063 | 3063 |
switch (id) { |
3064 | 3064 |
case AV_CODEC_ID_ADPCM_AFC: |
3065 | 3065 |
return frame_bytes / (9 * ch) * 16; |
3066 |
+ case AV_CODEC_ID_ADPCM_PSX: |
|
3066 | 3067 |
case AV_CODEC_ID_ADPCM_DTK: |
3067 | 3068 |
return frame_bytes / (16 * ch) * 28; |
3068 | 3069 |
case AV_CODEC_ID_ADPCM_4XM: |
... | ... |
@@ -29,7 +29,7 @@ |
29 | 29 |
#include "libavutil/version.h" |
30 | 30 |
|
31 | 31 |
#define LIBAVCODEC_VERSION_MAJOR 57 |
32 |
-#define LIBAVCODEC_VERSION_MINOR 6 |
|
32 |
+#define LIBAVCODEC_VERSION_MINOR 7 |
|
33 | 33 |
#define LIBAVCODEC_VERSION_MICRO 100 |
34 | 34 |
|
35 | 35 |
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |