diff options
author | Paul B Mahol <onemda@gmail.com> | 2015-10-11 19:33:57 +0300 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2015-10-11 19:39:23 +0300 |
commit | a99226133e078d5b27d5f1b29c04535790c8ed5d (patch) | |
tree | 64a0e5eef7ef729648906b164788b79069f37537 | |
parent | 98b8bf12bcf5418ccbbe0c23933f5d1b25d94ddd (diff) |
avformat/rsd: support XADP tag
It appears that Xbox ADPCM is same as WAV adpcm.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | libavformat/rsd.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/libavformat/rsd.c b/libavformat/rsd.c index 1eff5de7e6..115dee7f61 100644 --- a/libavformat/rsd.c +++ b/libavformat/rsd.c @@ -28,6 +28,7 @@ static const AVCodecTag rsd_tags[] = { { AV_CODEC_ID_ADPCM_THP, MKTAG('G','A','D','P') }, { AV_CODEC_ID_ADPCM_IMA_RAD, MKTAG('R','A','D','P') }, + { AV_CODEC_ID_ADPCM_IMA_WAV, MKTAG('X','A','D','P') }, { AV_CODEC_ID_PCM_S16BE, MKTAG('P','C','M','B') }, { AV_CODEC_ID_PCM_S16LE, MKTAG('P','C','M',' ') }, { AV_CODEC_ID_NONE, 0 }, @@ -37,7 +38,6 @@ static const uint32_t rsd_unsupported_tags[] = { MKTAG('O','G','G',' '), MKTAG('V','A','G',' '), MKTAG('W','A','D','P'), - MKTAG('X','A','D','P'), MKTAG('X','M','A',' '), }; @@ -100,6 +100,15 @@ static int rsd_read_header(AVFormatContext *s) if (pb->seekable) st->duration = av_get_audio_frame_duration(codec, avio_size(pb) - start); break; + case AV_CODEC_ID_ADPCM_IMA_WAV: + if (version == 2) + start = avio_rl32(pb); + + codec->bits_per_coded_sample = 4; + codec->block_align = 36 * codec->channels; + if (pb->seekable) + st->duration = av_get_audio_frame_duration(codec, avio_size(pb) - start); + break; case AV_CODEC_ID_ADPCM_THP: /* RSD3GADP is mono, so only alloc enough memory to store the coeff table for a single channel. */ @@ -140,7 +149,8 @@ static int rsd_read_packet(AVFormatContext *s, AVPacket *pkt) if (avio_feof(s->pb)) return AVERROR_EOF; - if (codec->codec_id == AV_CODEC_ID_ADPCM_IMA_RAD) + if (codec->codec_id == AV_CODEC_ID_ADPCM_IMA_RAD || + codec->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) ret = av_get_packet(s->pb, pkt, codec->block_align); else ret = av_get_packet(s->pb, pkt, size); |