Avoid duplicating MP4 epoch
This commit is contained in:
parent
503fb725a2
commit
28abe151fd
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue