Commit 3d55fbea authored by daniel's avatar daniel

Add RF64 support to wav demuxer.



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20181 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent c0400c0e
...@@ -40,6 +40,7 @@ version <next>: ...@@ -40,6 +40,7 @@ version <next>:
- Core Audio Format demuxer - Core Audio Format demuxer
- Atrac1 decoder - Atrac1 decoder
- MD STUDIO audio demuxer - MD STUDIO audio demuxer
- RF64 support in WAV demuxer
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* Copyright (c) 2001, 2002 Fabrice Bellard * Copyright (c) 2001, 2002 Fabrice Bellard
* *
* Sony Wave64 demuxer * Sony Wave64 demuxer
* RF64 demuxer
* Copyright (c) 2009 Daniel Verkamp * Copyright (c) 2009 Daniel Verkamp
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
...@@ -160,17 +161,18 @@ static int wav_probe(AVProbeData *p) ...@@ -160,17 +161,18 @@ static int wav_probe(AVProbeData *p)
/* check file header */ /* check file header */
if (p->buf_size <= 32) if (p->buf_size <= 32)
return 0; return 0;
if (p->buf[ 0] == 'R' && p->buf[ 1] == 'I' && if (!memcmp(p->buf + 8, "WAVE", 4)) {
p->buf[ 2] == 'F' && p->buf[ 3] == 'F' && if (!memcmp(p->buf, "RIFF", 4))
p->buf[ 8] == 'W' && p->buf[ 9] == 'A' &&
p->buf[10] == 'V' && p->buf[11] == 'E')
/* /*
Since ACT demuxer has standard WAV header at top of it's own, Since ACT demuxer has standard WAV header at top of it's own,
returning score is decreased to avoid probe conflict returning score is decreased to avoid probe conflict
between ACT and WAV. between ACT and WAV.
*/ */
return AVPROBE_SCORE_MAX - 1; return AVPROBE_SCORE_MAX - 1;
else else if (!memcmp(p->buf, "RF64", 4) &&
!memcmp(p->buf + 12, "ds64", 4))
return AVPROBE_SCORE_MAX;
}
return 0; return 0;
} }
...@@ -178,7 +180,8 @@ static int wav_probe(AVProbeData *p) ...@@ -178,7 +180,8 @@ static int wav_probe(AVProbeData *p)
static int wav_read_header(AVFormatContext *s, static int wav_read_header(AVFormatContext *s,
AVFormatParameters *ap) AVFormatParameters *ap)
{ {
int64_t size; int64_t size, av_uninit(data_size);
int rf64;
unsigned int tag; unsigned int tag;
ByteIOContext *pb = s->pb; ByteIOContext *pb = s->pb;
AVStream *st; AVStream *st;
...@@ -187,13 +190,25 @@ static int wav_read_header(AVFormatContext *s, ...@@ -187,13 +190,25 @@ static int wav_read_header(AVFormatContext *s,
/* check RIFF header */ /* check RIFF header */
tag = get_le32(pb); tag = get_le32(pb);
if (tag != MKTAG('R', 'I', 'F', 'F')) rf64 = tag == MKTAG('R', 'F', '6', '4');
if (!rf64 && tag != MKTAG('R', 'I', 'F', 'F'))
return -1; return -1;
get_le32(pb); /* file size */ get_le32(pb); /* file size */
tag = get_le32(pb); tag = get_le32(pb);
if (tag != MKTAG('W', 'A', 'V', 'E')) if (tag != MKTAG('W', 'A', 'V', 'E'))
return -1; return -1;
if (rf64) {
if (get_le32(pb) != MKTAG('d', 's', '6', '4'))
return -1;
size = get_le32(pb);
if (size < 16)
return -1;
get_le64(pb); /* RIFF size */
data_size = get_le64(pb);
url_fskip(pb, size - 16); /* skip rest of ds64 chunk */
}
/* parse fmt header */ /* parse fmt header */
size = find_tag(pb, MKTAG('f', 'm', 't', ' ')); size = find_tag(pb, MKTAG('f', 'm', 't', ' '));
if (size < 0) if (size < 0)
...@@ -208,6 +223,8 @@ static int wav_read_header(AVFormatContext *s, ...@@ -208,6 +223,8 @@ static int wav_read_header(AVFormatContext *s,
av_set_pts_info(st, 64, 1, st->codec->sample_rate); av_set_pts_info(st, 64, 1, st->codec->sample_rate);
size = find_tag(pb, MKTAG('d', 'a', 't', 'a')); size = find_tag(pb, MKTAG('d', 'a', 't', 'a'));
if (rf64)
size = data_size;
if (size < 0) if (size < 0)
return -1; return -1;
wav->data_end= url_ftell(pb) + size; wav->data_end= url_ftell(pb) + size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment