1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-15 14:13:16 +02:00

Add RF64 support to wav demuxer.

Originally committed as revision 20181 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Daniel Verkamp
2009-10-06 17:50:10 +00:00
parent 7ae8fb8f8f
commit 811e0fc2e8
2 changed files with 25 additions and 7 deletions

View File

@@ -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

View File

@@ -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)
/* 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)
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,
/* 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,
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;