From 0cfd4a993f30785219c958e2ac9fea75a687ab34 Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Mon, 9 Nov 2015 10:31:24 +0100
Subject: [PATCH] avformat/rsd: add XMA support

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavformat/rsd.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/libavformat/rsd.c b/libavformat/rsd.c
index 98e793e9ef5..5dd590f7869 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) {
-- 
GitLab