summaryrefslogtreecommitdiff
path: root/libavformat/rsd.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2015-11-09 10:31:24 +0100
committerPaul B Mahol <onemda@gmail.com>2015-11-09 10:41:38 +0100
commit0cfd4a993f30785219c958e2ac9fea75a687ab34 (patch)
tree58506a51d8ebcd71a17e82b6c94bd79d7003696d /libavformat/rsd.c
parenta5202bc968cf3ca5b64c623b9271f76e8fa02211 (diff)
downloadffmpeg-0cfd4a993f30785219c958e2ac9fea75a687ab34.tar.gz
avformat/rsd: add XMA support
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavformat/rsd.c')
-rw-r--r--libavformat/rsd.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/libavformat/rsd.c b/libavformat/rsd.c
index 98e793e9ef..5dd590f786 100644
--- a/libavformat/rsd.c
+++ b/libavformat/rsd.c
@@ -33,12 +33,12 @@ static const AVCodecTag rsd_tags[] = {
{ 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_XMA1, MKTAG('X','M','A',' ') },
{ AV_CODEC_ID_NONE, 0 },
};
static const uint32_t rsd_unsupported_tags[] = {
MKTAG('O','G','G',' '),
- MKTAG('X','M','A',' '),
};
static int rsd_probe(AVProbeData *p)
@@ -95,6 +95,13 @@ static int rsd_read_header(AVFormatContext *s)
avio_skip(pb, 4); // Unknown
switch (codec->codec_id) {
+ case AV_CODEC_ID_XMA1:
+ codec->block_align = 2048;
+ ff_alloc_extradata(codec, 28);
+ if (!codec->extradata)
+ return AVERROR(ENOMEM);
+ memset(codec->extradata, 0, 28);
+ break;
case AV_CODEC_ID_ADPCM_PSX:
codec->block_align = 16 * codec->channels;
if (pb->seekable)
@@ -153,6 +160,10 @@ static int rsd_read_header(AVFormatContext *s)
}
avio_skip(pb, start - avio_tell(pb));
+ if (codec->codec_id == AV_CODEC_ID_XMA1) {
+ avio_skip(pb, avio_rb32(pb) + avio_rb32(pb));
+ st->duration = avio_rb32(pb);
+ }
avpriv_set_pts_info(st, 64, 1, codec->sample_rate);
@@ -169,7 +180,8 @@ static int rsd_read_packet(AVFormatContext *s, AVPacket *pkt)
if (codec->codec_id == AV_CODEC_ID_ADPCM_IMA_RAD ||
codec->codec_id == AV_CODEC_ID_ADPCM_PSX ||
- codec->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
+ codec->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV ||
+ codec->codec_id == AV_CODEC_ID_XMA1) {
ret = av_get_packet(s->pb, pkt, codec->block_align);
} else if (codec->codec_tag == MKTAG('W','A','D','P') &&
codec->channels > 1) {