From ee0a05c32ee85c276ba98a1bb1882b618be5ca57 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 17 Mar 2012 14:18:17 -0400 Subject: COMMON: Add a dummy edit when a QuickTime file contains none The edit just takes up the entire length of the track --- common/quicktime.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'common/quicktime.cpp') diff --git a/common/quicktime.cpp b/common/quicktime.cpp index 248d8b2b3a..fb01e8de28 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -111,19 +111,29 @@ bool QuickTimeParser::parseStream(SeekableReadStream *stream, DisposeAfterUse::F } void QuickTimeParser::init() { - // Remove unknown/unhandled tracks for (uint32 i = 0; i < _tracks.size(); i++) { + // Remove unknown/unhandled tracks if (_tracks[i]->codecType == CODEC_TYPE_MOV_OTHER) { delete _tracks[i]; _tracks.remove_at(i); i--; + } else { + // If this track doesn't have a declared scale, use the movie scale + if (_tracks[i]->timeScale == 0) + _tracks[i]->timeScale = _timeScale; + + // If this track doesn't have an edit list (like in MPEG-4 files), + // fake an entry of one edit that takes up the entire sample + if (_tracks[i]->editCount == 0) { + _tracks[i]->editCount = 1; + _tracks[i]->editList = new EditListEntry[1]; + _tracks[i]->editList[0].trackDuration = _tracks[i]->duration; + _tracks[i]->editList[0].timeOffset = 0; + _tracks[i]->editList[0].mediaTime = 0; + _tracks[i]->editList[0].mediaRate = 1; + } } } - - // Adjust time scale - for (uint32 i = 0; i < _tracks.size(); i++) - if (!_tracks[i]->timeScale) - _tracks[i]->timeScale = _timeScale; } void QuickTimeParser::initParseTable() { -- cgit v1.2.3 From 7c4787e0dcef994999185faf594faf748d5f2ad8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 30 Mar 2012 13:27:20 -0400 Subject: COMMON: Read in QuickTime extra data for SVQ3 --- common/quicktime.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'common/quicktime.cpp') diff --git a/common/quicktime.cpp b/common/quicktime.cpp index fb01e8de28..ae009da805 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -164,6 +164,7 @@ void QuickTimeParser::initParseTable() { { &QuickTimeParser::readCMOV, MKTAG('c', 'm', 'o', 'v') }, { &QuickTimeParser::readWAVE, MKTAG('w', 'a', 'v', 'e') }, { &QuickTimeParser::readESDS, MKTAG('e', 's', 'd', 's') }, + { &QuickTimeParser::readSMI, MKTAG('S', 'M', 'I', ' ') }, { 0, 0 } }; @@ -761,6 +762,18 @@ int QuickTimeParser::readESDS(Atom atom) { return 0; } +int QuickTimeParser::readSMI(Atom atom) { + if (_tracks.empty()) + return 0; + + Track *track = _tracks.back(); + + // This atom just contains SVQ3 extra data + track->extraData = _fd->readStream(atom.size); + + return 0; +} + void QuickTimeParser::close() { for (uint32 i = 0; i < _tracks.size(); i++) delete _tracks[i]; -- cgit v1.2.3 From 68e1a0418347ed79e3fe1bc9797b4ac32365b960 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 30 Mar 2012 14:40:14 -0400 Subject: AUDIO: Fix QDM2 extra data parsing --- common/quicktime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common/quicktime.cpp') diff --git a/common/quicktime.cpp b/common/quicktime.cpp index ae009da805..5176f83a35 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -688,7 +688,7 @@ int QuickTimeParser::readWAVE(Atom atom) { return -1; if (track->sampleDescs[0]->getCodecTag() == MKTAG('Q', 'D', 'M', '2')) // Read extra data for QDM2 - track->extraData = _fd->readStream(atom.size - 8); + track->extraData = _fd->readStream(atom.size); else if (atom.size > 8) return readDefault(atom); else -- cgit v1.2.3 From ed4232cfeb3ab16ee6046f422f5827fa6c4992c8 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Mon, 21 May 2012 18:57:18 -0400 Subject: COMMON: Skip junk found at the end of QuickTime files Can occur in files and is ignored by QuickTime --- common/quicktime.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'common/quicktime.cpp') diff --git a/common/quicktime.cpp b/common/quicktime.cpp index 5176f83a35..173d3c6a97 100644 --- a/common/quicktime.cpp +++ b/common/quicktime.cpp @@ -217,7 +217,11 @@ int QuickTimeParser::readDefault(Atom atom) { a.size -= 8; - if (_parseTable[i].type == 0) { // skip leaf atoms data + if (a.size + (uint32)_fd->pos() > (uint32)_fd->size()) { + _fd->seek(_fd->size()); + debug(0, "Skipping junk found at the end of the QuickTime file"); + return 0; + } else if (_parseTable[i].type == 0) { // skip leaf atom data debug(0, ">>> Skipped [%s]", tag2str(a.type)); _fd->seek(a.size, SEEK_CUR); -- cgit v1.2.3