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 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.
|
* \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
|
stream().seekg(3, ios_base::cur); // skip flags
|
||||||
switch (version) {
|
switch (version) {
|
||||||
case 0:
|
case 0:
|
||||||
m_creationTime
|
m_creationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
|
||||||
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
|
m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
|
||||||
m_modificationTime
|
|
||||||
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()));
|
|
||||||
m_timeScale = reader().readUInt32BE();
|
m_timeScale = reader().readUInt32BE();
|
||||||
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()))
|
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt32BE()))
|
||||||
/ static_cast<TimeSpan::TickType>(m_timeScale);
|
/ static_cast<TimeSpan::TickType>(m_timeScale);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
m_creationTime
|
m_creationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
|
||||||
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
|
m_modificationTime = epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
|
||||||
m_modificationTime
|
|
||||||
= DateTime::fromDate(1904, 1, 1) + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()));
|
|
||||||
m_timeScale = reader().readUInt32BE();
|
m_timeScale = reader().readUInt32BE();
|
||||||
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()))
|
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(reader().readUInt64BE()))
|
||||||
/ static_cast<TimeSpan::TickType>(m_timeScale);
|
/ static_cast<TimeSpan::TickType>(m_timeScale);
|
||||||
|
|
|
@ -26,6 +26,8 @@ public:
|
||||||
ElementPosition determineTagPosition(Diagnostics &diag) const override;
|
ElementPosition determineTagPosition(Diagnostics &diag) const override;
|
||||||
ElementPosition determineIndexPosition(Diagnostics &diag) const override;
|
ElementPosition determineIndexPosition(Diagnostics &diag) const override;
|
||||||
|
|
||||||
|
static const CppUtilities::DateTime epoch;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
|
void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
|
||||||
void internalParseTags(Diagnostics &diag, AbortableProgressFeedback &progress) override;
|
void internalParseTags(Diagnostics &diag, AbortableProgressFeedback &progress) override;
|
||||||
|
|
|
@ -89,9 +89,6 @@ constexpr std::uint8_t Mp4Timings::requiredMdhdVersion() const
|
||||||
: 0;
|
: 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
|
* \class Mpeg4AudioSpecificConfig
|
||||||
* \brief The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAudioSpecificConfig().
|
* \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.mdhdModificationTime = m_rawMdhdModificationTime;
|
||||||
timings.mdhdDuration = m_rawMdhdDuration;
|
timings.mdhdDuration = m_rawMdhdDuration;
|
||||||
} else {
|
} else {
|
||||||
timings.tkhdCreationTime = timings.mdhdCreationTime = static_cast<std::uint64_t>((m_creationTime - 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 - startDate).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);
|
timings.tkhdDuration = timings.mdhdDuration = static_cast<std::uint64_t>(m_duration.totalTicks() * m_timeScale / TimeSpan::ticksPerSecond);
|
||||||
}
|
}
|
||||||
return timings;
|
return timings;
|
||||||
|
@ -1634,8 +1632,8 @@ void Mp4Track::internalParseHeader(Diagnostics &diag, AbortableProgressFeedback
|
||||||
m_timeScale = 0;
|
m_timeScale = 0;
|
||||||
m_duration = TimeSpan();
|
m_duration = TimeSpan();
|
||||||
}
|
}
|
||||||
m_creationTime = startDate + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdCreationTime));
|
m_creationTime = Mp4Container::epoch + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdCreationTime));
|
||||||
m_modificationTime = startDate + TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdModificationTime));
|
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);
|
m_duration = TimeSpan::fromSeconds(static_cast<TimeSpan::TickType>(m_rawMdhdDuration)) / static_cast<TimeSpan::TickType>(m_timeScale);
|
||||||
|
|
||||||
std::uint16_t tmp = reader.readUInt16BE();
|
std::uint16_t tmp = reader.readUInt16BE();
|
||||||
|
|
Loading…
Reference in New Issue