Avoid duplicating MP4 epoch

This commit is contained in:
Martchus 2022-02-16 00:04:09 +01:00
parent 503fb725a2
commit 28abe151fd
3 changed files with 16 additions and 15 deletions

View File

@ -28,6 +28,11 @@ namespace TagParser {
* \brief Implementation of GenericContainer<MediaFileInfo, Mp4Tag, Mp4Track, Mp4Atom>.
*/
/*!
* \brief Dates within MP4 tracks are expressed as the number of seconds since this date.
*/
const CppUtilities::DateTime Mp4Container::epoch = DateTime::fromDate(1904, 1, 1);
/*!
* \brief Constructs a new container for the specified \a fileInfo at the specified \a startOffset.
*/
@ -132,19 +137,15 @@ void Mp4Container::internalParseTracks(Diagnostics &diag, AbortableProgressFeedb
stream().seekg(3, ios_base::cur); // skip flags
switch (version) {
case 0:
m_creationTime
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
m_modificationTime
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
m_creationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
m_timeScale = reader().readUInt32BE();
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()))
/ static_cast<TimeSpan::TickType>(m_timeScale);
break;
case 1:
m_creationTime
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
m_modificationTime
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
m_creationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
m_timeScale = reader().readUInt32BE();
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()))
/ static_cast<TimeSpan::TickType>(m_timeScale);

View File

@ -26,6 +26,8 @@ public:
ElementPosition determineTagPosition(Diagnostics &diag) const override;
ElementPosition determineIndexPosition(Diagnostics &diag) const override;
static const CppUtilities::DateTime epoch;
protected:
void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalParseTags(Diagnostics &diag, AbortableProgressFeedback &progress) override;

View File

@ -89,9 +89,6 @@ constexpr std::uint8_t Mp4Timings::requiredMdhdVersion() const
: 0;
}
/// \brief Dates within MP4 tracks are expressed as the number of seconds since this date.
static const auto startDate = DateTime::fromDate(1904, 1, 1);
/*!
* \class Mpeg4AudioSpecificConfig
* \brief The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAudioSpecificConfig().
@ -499,8 +496,9 @@ Mp4Timings Mp4Track::computeTimings() const
timings.mdhdModificationTime = m_rawMdhdModificationTime;
timings.mdhdDuration = m_rawMdhdDuration;
} else {
timings.tkhdCreationTime = timings.mdhdCreationTime = static_cast<std::uint64_t>((m_creationTime - startDate).totalSeconds());
timings.tkhdModificationTime = timings.mdhdModificationTime = static_cast<std::uint64_t>((m_modificationTime - startDate).totalSeconds());
timings.tkhdCreationTime = timings.mdhdCreationTime = static_cast<std::uint64_t>((m_creationTime - Mp4Container::epoch).totalSeconds());
timings.tkhdModificationTime = timings.mdhdModificationTime
= static_cast<std::uint64_t>((m_modificationTime - Mp4Container::epoch).totalSeconds());
timings.tkhdDuration = timings.mdhdDuration = static_cast<std::uint64_t>(m_duration.totalTicks() * m_timeScale / TimeSpan::ticksPerSecond);
}
return timings;
@ -1634,8 +1632,8 @@ void Mp4Track::internalParseHeader(Diagnostics &diag, AbortableProgressFeedback
m_timeScale = 0;
m_duration = TimeSpan();
}
m_creationTime = startDate + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdCreationTime));
m_modificationTime = startDate + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdModificationTime));
m_creationTime = Mp4Container::epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdCreationTime));
m_modificationTime = Mp4Container::epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdModificationTime));
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdDuration)) / static_cast<TimeSpan::TickType>(m_timeScale);
std::uint16_t tmp = reader.readUInt16BE();