From: RĂ©mi Denis-Courmont Date: Wed, 30 Apr 2008 18:30:13 +0000 (+0300) Subject: Support for RIFF/MIDI files X-Git-Tag: 0.9.0-test0~1283 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=df3af6f13455675fb4815cee000ff17edffebc99;p=vlc Support for RIFF/MIDI files --- diff --git a/modules/demux/smf.c b/modules/demux/smf.c index 1ca2dbb22b..e9a92d996b 100644 --- a/modules/demux/smf.c +++ b/modules/demux/smf.c @@ -87,6 +87,44 @@ static int Open (vlc_object_t * p_this) if (stream_Peek (stream, &peek, 14) < 14) return VLC_EGENERIC; + /* Skip RIFF MIDI header if present */ + if (!memcmp (peek, "RIFF", 4) && !memcmp (peek + 8, "RMID", 4)) + { + uint32_t riff_len = GetDWLE (peek + 4); + + msg_Dbg (p_this, "detected RIFF MIDI file (%u bytes)", + (unsigned)riff_len); + if ((stream_Read (stream, NULL, 12) < 12)) + return VLC_EGENERIC; + + /* Look for the RIFF data chunk */ + for (;;) + { + char chnk_hdr[8]; + uint32_t chnk_len; + + if ((riff_len < 8) + || (stream_Read (stream, chnk_hdr, 8) < 8)) + return VLC_EGENERIC; + + riff_len -= 8; + chnk_len = GetDWLE (chnk_hdr + 4); + if (riff_len < chnk_len) + return VLC_EGENERIC; + riff_len -= chnk_len; + + if (!memcmp (chnk_hdr, "data", 4)) + break; /* found! */ + + if (stream_Read (stream, NULL, chnk_len) < (ssize_t)chnk_len) + return VLC_EGENERIC; + } + + /* Read real SMF header. Assume RIFF data chunk length is proper. */ + if (stream_Peek (stream, &peek, 14) < 14) + return VLC_EGENERIC; + } + if (memcmp (peek, "MThd\x00\x00\x00\x06", 8)) return VLC_EGENERIC; peek += 8;