@@ -40,6 +40,7 @@ version <next>: | |||||
- Matroska muxer can now put the index at the beginning of the file. | - Matroska muxer can now put the index at the beginning of the file. | ||||
- extractplanes filter | - extractplanes filter | ||||
- avectorscope filter | - avectorscope filter | ||||
- ADPCM DTK decoder | |||||
version 1.2: | version 1.2: | ||||
@@ -771,6 +771,7 @@ following image formats are supported: | |||||
@item ADPCM Microsoft @tab X @tab X | @item ADPCM Microsoft @tab X @tab X | ||||
@item ADPCM MS IMA @tab X @tab X | @item ADPCM MS IMA @tab X @tab X | ||||
@item ADPCM Nintendo Gamecube AFC @tab @tab X | @item ADPCM Nintendo Gamecube AFC @tab @tab X | ||||
@item ADPCM Nintendo Gamecube DTK @tab @tab X | |||||
@item ADPCM Nintendo Gamecube THP @tab @tab X | @item ADPCM Nintendo Gamecube THP @tab @tab X | ||||
@item ADPCM QT IMA @tab X @tab X | @item ADPCM QT IMA @tab X @tab X | ||||
@item ADPCM SEGA CRI ADX @tab X @tab X | @item ADPCM SEGA CRI ADX @tab X @tab X | ||||
@@ -569,6 +569,7 @@ OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o adx.o | |||||
OBJS-$(CONFIG_ADPCM_ADX_ENCODER) += adxenc.o adx.o | OBJS-$(CONFIG_ADPCM_ADX_ENCODER) += adxenc.o adx.o | ||||
OBJS-$(CONFIG_ADPCM_AFC_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_AFC_DECODER) += adpcm.o adpcm_data.o | ||||
OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o | ||||
OBJS-$(CONFIG_ADPCM_DTK_DECODER) += adpcm.o adpcm_data.o | |||||
OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o adpcm_data.o | ||||
OBJS-$(CONFIG_ADPCM_EA_MAXIS_XA_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_EA_MAXIS_XA_DECODER) += adpcm.o adpcm_data.o | ||||
OBJS-$(CONFIG_ADPCM_EA_R1_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_EA_R1_DECODER) += adpcm.o adpcm_data.o | ||||
@@ -95,6 +95,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) | |||||
unsigned int max_channels = 2; | unsigned int max_channels = 2; | ||||
switch(avctx->codec->id) { | switch(avctx->codec->id) { | ||||
case AV_CODEC_ID_ADPCM_DTK: | |||||
case AV_CODEC_ID_ADPCM_EA: | case AV_CODEC_ID_ADPCM_EA: | ||||
min_channels = 2; | min_channels = 2; | ||||
break; | break; | ||||
@@ -147,6 +148,7 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx) | |||||
case AV_CODEC_ID_ADPCM_EA_XAS: | case AV_CODEC_ID_ADPCM_EA_XAS: | ||||
case AV_CODEC_ID_ADPCM_THP: | case AV_CODEC_ID_ADPCM_THP: | ||||
case AV_CODEC_ID_ADPCM_AFC: | case AV_CODEC_ID_ADPCM_AFC: | ||||
case AV_CODEC_ID_ADPCM_DTK: | |||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16P; | avctx->sample_fmt = AV_SAMPLE_FMT_S16P; | ||||
break; | break; | ||||
case AV_CODEC_ID_ADPCM_IMA_WS: | case AV_CODEC_ID_ADPCM_IMA_WS: | ||||
@@ -602,6 +604,9 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb, | |||||
case AV_CODEC_ID_ADPCM_XA: | case AV_CODEC_ID_ADPCM_XA: | ||||
nb_samples = (buf_size / 128) * 224 / ch; | nb_samples = (buf_size / 128) * 224 / ch; | ||||
break; | break; | ||||
case AV_CODEC_ID_ADPCM_DTK: | |||||
nb_samples = buf_size / (16 * ch) * 28; | |||||
break; | |||||
} | } | ||||
/* validate coded sample count */ | /* validate coded sample count */ | ||||
@@ -1362,6 +1367,54 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
case AV_CODEC_ID_ADPCM_DTK: | |||||
for (channel = 0; channel < avctx->channels; channel++) { | |||||
samples = samples_p[channel]; | |||||
/* Read in every sample for this channel. */ | |||||
for (i = 0; i < nb_samples / 28; i++) { | |||||
int byte, header; | |||||
if (channel) | |||||
bytestream2_skipu(&gb, 1); | |||||
header = bytestream2_get_byteu(&gb); | |||||
bytestream2_skipu(&gb, 3 - channel); | |||||
/* Decode 28 samples. */ | |||||
for (n = 0; n < 28; n++) { | |||||
int32_t sampledat, prev; | |||||
switch (header >> 4) { | |||||
case 1: | |||||
prev = (c->status[channel].sample1 * 0x3c); | |||||
break; | |||||
case 2: | |||||
prev = (c->status[channel].sample1 * 0x73) - (c->status[channel].sample2 * 0x34); | |||||
break; | |||||
case 3: | |||||
prev = (c->status[channel].sample1 * 0x62) - (c->status[channel].sample2 * 0x37); | |||||
break; | |||||
default: | |||||
prev = 0; | |||||
} | |||||
prev = av_clip((prev + 0x20) >> 6, -0x200000, 0x1fffff); | |||||
byte = bytestream2_get_byteu(&gb); | |||||
if (!channel) | |||||
sampledat = sign_extend(byte, 4); | |||||
else | |||||
sampledat = sign_extend(byte >> 4, 4); | |||||
sampledat = (((sampledat << 12) >> (header & 0xf)) << 6) + prev; | |||||
*samples++ = av_clip_int16(sampledat >> 6); | |||||
c->status[channel].sample2 = c->status[channel].sample1; | |||||
c->status[channel].sample1 = sampledat; | |||||
} | |||||
} | |||||
if (!channel) | |||||
bytestream2_seek(&gb, 0, SEEK_SET); | |||||
} | |||||
break; | |||||
default: | default: | ||||
return -1; | return -1; | ||||
@@ -1403,6 +1456,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ | |||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM, sample_fmts_s16p, adpcm_4xm, "ADPCM 4X Movie"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_4XM, sample_fmts_s16p, adpcm_4xm, "ADPCM 4X Movie"); | ||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC, sample_fmts_s16p, adpcm_afc, "ADPCM Nintendo Gamecube AFC"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_AFC, sample_fmts_s16p, adpcm_afc, "ADPCM Nintendo Gamecube AFC"); | ||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT, sample_fmts_s16, adpcm_ct, "ADPCM Creative Technology"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_CT, sample_fmts_s16, adpcm_ct, "ADPCM Creative Technology"); | ||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_DTK, sample_fmts_s16p, adpcm_dtk, "ADPCM Nintendo Gamecube DTK"); | |||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA, sample_fmts_s16, adpcm_ea, "ADPCM Electronic Arts"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA, sample_fmts_s16, adpcm_ea, "ADPCM Electronic Arts"); | ||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_MAXIS_XA, sample_fmts_s16, adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_MAXIS_XA, sample_fmts_s16, adpcm_ea_maxis_xa, "ADPCM Electronic Arts Maxis CDROM XA"); | ||||
ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R1, sample_fmts_s16p, adpcm_ea_r1, "ADPCM Electronic Arts R1"); | ADPCM_DECODER(AV_CODEC_ID_ADPCM_EA_R1, sample_fmts_s16p, adpcm_ea_r1, "ADPCM Electronic Arts R1"); | ||||
@@ -38,8 +38,8 @@ typedef struct ADPCMChannelStatus { | |||||
int prev_sample; | int prev_sample; | ||||
/* MS version */ | /* MS version */ | ||||
int16_t sample1; | |||||
int16_t sample2; | |||||
int sample1; | |||||
int sample2; | |||||
int coeff1; | int coeff1; | ||||
int coeff2; | int coeff2; | ||||
int idelta; | int idelta; | ||||
@@ -419,6 +419,7 @@ void avcodec_register_all(void) | |||||
REGISTER_ENCDEC (ADPCM_ADX, adpcm_adx); | REGISTER_ENCDEC (ADPCM_ADX, adpcm_adx); | ||||
REGISTER_DECODER(ADPCM_AFC, adpcm_afc); | REGISTER_DECODER(ADPCM_AFC, adpcm_afc); | ||||
REGISTER_DECODER(ADPCM_CT, adpcm_ct); | REGISTER_DECODER(ADPCM_CT, adpcm_ct); | ||||
REGISTER_DECODER(ADPCM_DTK, adpcm_dtk); | |||||
REGISTER_DECODER(ADPCM_EA, adpcm_ea); | REGISTER_DECODER(ADPCM_EA, adpcm_ea); | ||||
REGISTER_DECODER(ADPCM_EA_MAXIS_XA, adpcm_ea_maxis_xa); | REGISTER_DECODER(ADPCM_EA_MAXIS_XA, adpcm_ea_maxis_xa); | ||||
REGISTER_DECODER(ADPCM_EA_R1, adpcm_ea_r1); | REGISTER_DECODER(ADPCM_EA_R1, adpcm_ea_r1); | ||||
@@ -362,6 +362,7 @@ enum AVCodecID { | |||||
AV_CODEC_ID_VIMA = MKBETAG('V','I','M','A'), | AV_CODEC_ID_VIMA = MKBETAG('V','I','M','A'), | ||||
AV_CODEC_ID_ADPCM_AFC = MKBETAG('A','F','C',' '), | AV_CODEC_ID_ADPCM_AFC = MKBETAG('A','F','C',' '), | ||||
AV_CODEC_ID_ADPCM_IMA_OKI = MKBETAG('O','K','I',' '), | AV_CODEC_ID_ADPCM_IMA_OKI = MKBETAG('O','K','I',' '), | ||||
AV_CODEC_ID_ADPCM_DTK = MKBETAG('D','T','K',' '), | |||||
/* AMR */ | /* AMR */ | ||||
AV_CODEC_ID_AMR_NB = 0x12000, | AV_CODEC_ID_AMR_NB = 0x12000, | ||||
@@ -1816,6 +1816,13 @@ static const AVCodecDescriptor codec_descriptors[] = { | |||||
.long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Dialogic OKI"), | .long_name = NULL_IF_CONFIG_SMALL("ADPCM IMA Dialogic OKI"), | ||||
.props = AV_CODEC_PROP_LOSSY, | .props = AV_CODEC_PROP_LOSSY, | ||||
}, | }, | ||||
{ | |||||
.id = AV_CODEC_ID_ADPCM_DTK, | |||||
.type = AVMEDIA_TYPE_AUDIO, | |||||
.name = "adpcm_dtk", | |||||
.long_name = NULL_IF_CONFIG_SMALL("ADPCM Nintendo Gamecube DTK"), | |||||
.props = AV_CODEC_PROP_LOSSY, | |||||
}, | |||||
/* AMR */ | /* AMR */ | ||||
{ | { | ||||
@@ -2835,6 +2835,8 @@ int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes) | |||||
switch (id) { | switch (id) { | ||||
case AV_CODEC_ID_ADPCM_AFC: | case AV_CODEC_ID_ADPCM_AFC: | ||||
return frame_bytes / (9 * ch) * 16; | return frame_bytes / (9 * ch) * 16; | ||||
case AV_CODEC_ID_ADPCM_DTK: | |||||
return frame_bytes / (16 * ch) * 28; | |||||
case AV_CODEC_ID_ADPCM_4XM: | case AV_CODEC_ID_ADPCM_4XM: | ||||
case AV_CODEC_ID_ADPCM_IMA_ISS: | case AV_CODEC_ID_ADPCM_IMA_ISS: | ||||
return (frame_bytes - 4 * ch) * 2 / ch; | return (frame_bytes - 4 * ch) * 2 / ch; | ||||
@@ -29,7 +29,7 @@ | |||||
#include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
#define LIBAVCODEC_VERSION_MAJOR 55 | #define LIBAVCODEC_VERSION_MAJOR 55 | ||||
#define LIBAVCODEC_VERSION_MINOR 7 | |||||
#define LIBAVCODEC_VERSION_MINOR 8 | |||||
#define LIBAVCODEC_VERSION_MICRO 100 | #define LIBAVCODEC_VERSION_MICRO 100 | ||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||