Browse code

Add RF64 support to wav demuxer.

Originally committed as revision 20181 to svn://svn.ffmpeg.org/ffmpeg/trunk

Daniel Verkamp authored on 2009/10/07 02:50:10
Showing 2 changed files
... ...
@@ -40,6 +40,7 @@ version <next>:
40 40
 - Core Audio Format demuxer
41 41
 - Atrac1 decoder
42 42
 - MD STUDIO audio demuxer
43
+- RF64 support in WAV demuxer
43 44
 
44 45
 
45 46
 
... ...
@@ -3,6 +3,7 @@
3 3
  * Copyright (c) 2001, 2002 Fabrice Bellard
4 4
  *
5 5
  * Sony Wave64 demuxer
6
+ * RF64 demuxer
6 7
  * Copyright (c) 2009 Daniel Verkamp
7 8
  *
8 9
  * This file is part of FFmpeg.
... ...
@@ -160,17 +161,18 @@ static int wav_probe(AVProbeData *p)
160 160
     /* check file header */
161 161
     if (p->buf_size <= 32)
162 162
         return 0;
163
-    if (p->buf[ 0] == 'R' && p->buf[ 1] == 'I' &&
164
-        p->buf[ 2] == 'F' && p->buf[ 3] == 'F' &&
165
-        p->buf[ 8] == 'W' && p->buf[ 9] == 'A' &&
166
-        p->buf[10] == 'V' && p->buf[11] == 'E')
163
+    if (!memcmp(p->buf + 8, "WAVE", 4)) {
164
+        if (!memcmp(p->buf, "RIFF", 4))
167 165
         /*
168 166
           Since ACT demuxer has standard WAV header at top of it's own,
169 167
           returning score is decreased to avoid probe conflict
170 168
           between ACT and WAV.
171 169
         */
172 170
         return AVPROBE_SCORE_MAX - 1;
173
-    else
171
+        else if (!memcmp(p->buf,      "RF64", 4) &&
172
+                 !memcmp(p->buf + 12, "ds64", 4))
173
+            return AVPROBE_SCORE_MAX;
174
+    }
174 175
         return 0;
175 176
 }
176 177
 
... ...
@@ -178,7 +180,8 @@ static int wav_probe(AVProbeData *p)
178 178
 static int wav_read_header(AVFormatContext *s,
179 179
                            AVFormatParameters *ap)
180 180
 {
181
-    int64_t size;
181
+    int64_t size, av_uninit(data_size);
182
+    int rf64;
182 183
     unsigned int tag;
183 184
     ByteIOContext *pb = s->pb;
184 185
     AVStream *st;
... ...
@@ -187,13 +190,25 @@ static int wav_read_header(AVFormatContext *s,
187 187
     /* check RIFF header */
188 188
     tag = get_le32(pb);
189 189
 
190
-    if (tag != MKTAG('R', 'I', 'F', 'F'))
190
+    rf64 = tag == MKTAG('R', 'F', '6', '4');
191
+    if (!rf64 && tag != MKTAG('R', 'I', 'F', 'F'))
191 192
         return -1;
192 193
     get_le32(pb); /* file size */
193 194
     tag = get_le32(pb);
194 195
     if (tag != MKTAG('W', 'A', 'V', 'E'))
195 196
         return -1;
196 197
 
198
+    if (rf64) {
199
+        if (get_le32(pb) != MKTAG('d', 's', '6', '4'))
200
+            return -1;
201
+        size = get_le32(pb);
202
+        if (size < 16)
203
+            return -1;
204
+        get_le64(pb); /* RIFF size */
205
+        data_size = get_le64(pb);
206
+        url_fskip(pb, size - 16); /* skip rest of ds64 chunk */
207
+    }
208
+
197 209
     /* parse fmt header */
198 210
     size = find_tag(pb, MKTAG('f', 'm', 't', ' '));
199 211
     if (size < 0)
... ...
@@ -208,6 +223,8 @@ static int wav_read_header(AVFormatContext *s,
208 208
     av_set_pts_info(st, 64, 1, st->codec->sample_rate);
209 209
 
210 210
     size = find_tag(pb, MKTAG('d', 'a', 't', 'a'));
211
+    if (rf64)
212
+        size = data_size;
211 213
     if (size < 0)
212 214
         return -1;
213 215
     wav->data_end= url_ftell(pb) + size;