summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-03-15 14:12:22 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-03-15 14:12:22 +0000
commitcde570e129e1d7e3d7b994b9c90be2b8b7c0d303 (patch)
tree6bf28fec99ef18b8e748fdda9b8abe5f03b2c797 /libmpdemux
parent05ee4cfa8f908df648feb9b69c66a7375576fa1d (diff)
downloadmpv-cde570e129e1d7e3d7b994b9c90be2b8b7c0d303.tar.bz2
mpv-cde570e129e1d7e3d7b994b9c90be2b8b7c0d303.tar.xz
Read extradata for wav files, based on patch by <dimakar(at)yahoo.com>. Required for truespeech files.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9592 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_audio.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index 425a796701..2a9f8d8dfb 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -157,21 +157,32 @@ int demux_audio_open(demuxer_t* demuxer) {
unsigned int chunk_size;
WAVEFORMATEX* w;
int l;
- sh_audio->wf = w = (WAVEFORMATEX*)malloc(sizeof(WAVEFORMATEX));
l = stream_read_dword_le(s);
- if(l < 16) {
- printf("Bad wav header length : too short !!!\n");
+ if(l < sizeof(WAVEFORMATEX)) {
+ mp_msg(MSGT_DEMUX,MSGL_ERR,"[demux_audio] Bad wav header length: too short (%d)!!!\n",l);
free_sh_audio(sh_audio);
return 0;
}
+ sh_audio->wf = w = (WAVEFORMATEX*)malloc(l);
w->wFormatTag = sh_audio->format = stream_read_word_le(s);
w->nChannels = sh_audio->channels = stream_read_word_le(s);
w->nSamplesPerSec = sh_audio->samplerate = stream_read_dword_le(s);
w->nAvgBytesPerSec = stream_read_dword_le(s);
w->nBlockAlign = stream_read_word_le(s);
w->wBitsPerSample = sh_audio->samplesize = stream_read_word_le(s);
- w->cbSize = 0;
- l -= 16;
+ w->cbSize = stream_read_word_le(s);
+ l -= sizeof(WAVEFORMATEX);
+ if (w->cbSize > 0)
+ if (l < w->cbSize) {
+ mp_msg(MSGT_DEMUX,MSGL_ERR,"[demux_audio] truncated extradata (%d < %d)\n",
+ l,w->cbSize);
+ stream_read(s,(char*)((char*)(w)+sizeof(WAVEFORMATEX)),l);
+ l = 0;
+ } else {
+ stream_read(s,(char*)((char*)(w)+sizeof(WAVEFORMATEX)),w->cbSize);
+ l -= w->cbSize;
+ }
+
if(verbose>0) print_wave_header(w);
if(l)
stream_skip(s,l);