Handle all permissible PCM fields with WavReader.
I discovered the hard way that Adobe Audition writes an 18 byte format
header with an extra (zero) extension size field. Although:
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
indicates this field shouldn't exist for PCM, the documentation here:
http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/WAVE.html
doesn't list it as strictly forbidden, only that it _must_ exist for
non-PCM formats.
Audition can write metadata to the file after the audio data, which is
also not forbidden. We now ensure to read only up to the audio payload
length to avoid reading the metadata.
R=aluebs@webrtc.org, kwiberg@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/33629004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7915 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/common_audio/wav_header.h b/webrtc/common_audio/wav_header.h
index 37f78a6..1a0fd7c 100644
--- a/webrtc/common_audio/wav_header.h
+++ b/webrtc/common_audio/wav_header.h
@@ -18,6 +18,13 @@
static const size_t kWavHeaderSize = 44;
+class ReadableWav {
+ public:
+ // Returns the number of bytes read.
+ size_t virtual Read(void* buf, size_t num_bytes) = 0;
+ virtual ~ReadableWav() {}
+};
+
enum WavFormat {
kWavFormatPcm = 1, // PCM, each sample of size bytes_per_sample
kWavFormatALaw = 6, // 8-bit ITU-T G.711 A-law
@@ -42,9 +49,10 @@
int bytes_per_sample,
uint32_t num_samples);
-// Read a kWavHeaderSize bytes long WAV header from buf and parse the values
-// into the provided output parameters. Returns false if the header is invalid.
-bool ReadWavHeader(const uint8_t* buf,
+// Read a WAV header from an implemented ReadableWav and parse the values into
+// the provided output parameters. ReadableWav is used because the header can
+// be variably sized. Returns false if the header is invalid.
+bool ReadWavHeader(ReadableWav* readable,
int* num_channels,
int* sample_rate,
WavFormat* format,