diff --git a/mp4/mp4container.cpp b/mp4/mp4container.cpp index 4511fbd..2e80913 100644 --- a/mp4/mp4container.cpp +++ b/mp4/mp4container.cpp @@ -28,6 +28,11 @@ namespace TagParser { * \brief Implementation of GenericContainer. */ +/*! + * \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(reader().readUInt32BE())); - m_modificationTime - = DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast(reader().readUInt32BE())); + m_creationTime = epoch + TimeSpan::fromSeconds(static_cast(reader().readUInt32BE())); + m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast(reader().readUInt32BE())); m_timeScale = reader().readUInt32BE(); m_duration = TimeSpan::fromSeconds(static_cast(reader().readUInt32BE())) / static_cast(m_timeScale); break; case 1: - m_creationTime - = DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast(reader().readUInt64BE())); - m_modificationTime - = DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast(reader().readUInt64BE())); + m_creationTime = epoch + TimeSpan::fromSeconds(static_cast(reader().readUInt64BE())); + m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast(reader().readUInt64BE())); m_timeScale = reader().readUInt32BE(); m_duration = TimeSpan::fromSeconds(static_cast(reader().readUInt64BE())) / static_cast(m_timeScale); diff --git a/mp4/mp4container.h b/mp4/mp4container.h index e26f931..c636947 100644 --- a/mp4/mp4container.h +++ b/mp4/mp4container.h @@ -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; diff --git a/mp4/mp4track.cpp b/mp4/mp4track.cpp index 947197c..01372e9 100644 --- a/mp4/mp4track.cpp +++ b/mp4/mp4track.cpp @@ -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((m_creationTime - startDate).totalSeconds()); - timings.tkhdModificationTime = timings.mdhdModificationTime = static_cast((m_modificationTime - startDate).totalSeconds()); + timings.tkhdCreationTime = timings.mdhdCreationTime = static_cast((m_creationTime - Mp4Container::epoch).totalSeconds()); + timings.tkhdModificationTime = timings.mdhdModificationTime + = static_cast((m_modificationTime - Mp4Container::epoch).totalSeconds()); timings.tkhdDuration = timings.mdhdDuration = static_cast(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(m_rawMdhdCreationTime)); - m_modificationTime = startDate + TimeSpan::fromSeconds(static_cast(m_rawMdhdModificationTime)); + m_creationTime = Mp4Container::epoch + TimeSpan::fromSeconds(static_cast(m_rawMdhdCreationTime)); + m_modificationTime = Mp4Container::epoch + TimeSpan::fromSeconds(static_cast(m_rawMdhdModificationTime)); m_duration = TimeSpan::fromSeconds(static_cast(m_rawMdhdDuration)) / static_cast(m_timeScale); std::uint16_t tmp = reader.readUInt16BE();