Preserve all child elements within trak element

This commit is contained in:
Martchus 2019-04-17 17:51:04 +02:00
parent ccffe4f1e3
commit 27d7a182d9
3 changed files with 27 additions and 21 deletions

View File

@ -195,6 +195,7 @@ bool Mp4Atom::isParent() const
switch (id()) {
case Movie:
case Track:
case Edit:
case Media:
case MediaInformation:
case MediaInformationHeader:

View File

@ -21,8 +21,9 @@ enum KnownValue : uint32 {
DataInformation = 0x64696e66,
DataReference = 0x64726566,
Drms = 0x64726D73,
Edts = 0x65647473,
Edit = 0x656C7374,
Edts = 0x65647473, // FIXME: remove in next major release
Edit = 0x65647473,
EditList = 0x656C7374,
Free = 0x66726565,
FileType = 0x66747970,
HandlerReference = 0x68646c72,

View File

@ -1066,11 +1066,11 @@ void Mp4Track::bufferTrackAtoms(Diagnostics &diag)
if (m_tkhdAtom) {
m_tkhdAtom->makeBuffer();
}
if (Mp4Atom *trefAtom = m_trakAtom->childById(Mp4AtomIds::TrackReference, diag)) {
trefAtom->makeBuffer();
}
if (Mp4Atom *edtsAtom = m_trakAtom->childById(Mp4AtomIds::Edit, diag)) {
edtsAtom->makeBuffer();
for (Mp4Atom *trakChild = m_trakAtom->firstChild(); trakChild; trakChild = trakChild->nextSibling()) {
if (trakChild->id() == Mp4AtomIds::Media) {
continue;
}
trakChild->makeBuffer();
}
if (m_minfAtom) {
for (Mp4Atom *childAtom = m_minfAtom->firstChild(); childAtom; childAtom = childAtom->nextSibling()) {
@ -1084,18 +1084,19 @@ void Mp4Track::bufferTrackAtoms(Diagnostics &diag)
*/
uint64 Mp4Track::requiredSize(Diagnostics &diag) const
{
VAR_UNUSED(diag)
// add size of
// ... trak header
std::uint64_t size = 8;
// ... tkhd atom (TODO: buffer TrackHeaderInfo in next major release)
size += verifyPresentTrackHeader().requiredSize;
// ... tref atom (if one exists)
if (Mp4Atom *trefAtom = m_trakAtom->childById(Mp4AtomIds::TrackReference, diag)) {
size += trefAtom->totalSize();
}
// ... edts atom (if one exists)
if (Mp4Atom *edtsAtom = m_trakAtom->childById(Mp4AtomIds::Edit, diag)) {
size += edtsAtom->totalSize();
// ... children beside tkhd and mdia
for (Mp4Atom *trakChild = m_trakAtom->firstChild(); trakChild; trakChild = trakChild->nextSibling()) {
if (trakChild->id() == Mp4AtomIds::Media || trakChild->id() == Mp4AtomIds::TrackHeader) {
continue;
}
size += trakChild->totalSize();
}
// ... mdia header + mdhd total size + hdlr total size + minf header
size += 8 + 44 + (33 + m_name.size()) + 8;
@ -1130,18 +1131,21 @@ void Mp4Track::makeTrack(Diagnostics &diag)
ostream::pos_type trakStartOffset = outputStream().tellp();
m_writer.writeUInt32BE(0); // write size later
m_writer.writeUInt32BE(Mp4AtomIds::Track);
// write tkhd atom
makeTrackHeader(diag);
// write tref atom (if one exists)
if (Mp4Atom *const trefAtom = trakAtom().childById(Mp4AtomIds::TrackReference, diag)) {
trefAtom->copyPreferablyFromBuffer(outputStream(), diag, nullptr);
}
// write edts atom (if one exists)
if (Mp4Atom *const edtsAtom = trakAtom().childById(Mp4AtomIds::Edit, diag)) {
edtsAtom->copyPreferablyFromBuffer(outputStream(), diag, nullptr);
// write children of trak atom except mdia
for (Mp4Atom *trakChild = trakAtom().firstChild(); trakChild; trakChild = trakChild->nextSibling()) {
if (trakChild->id() == Mp4AtomIds::Media || trakChild->id() == Mp4AtomIds::TrackHeader) {
continue;
}
trakChild->copyPreferablyFromBuffer(outputStream(), diag, nullptr);
}
// write mdia atom
makeMedia(diag);
// write size (of trak atom)
Mp4Atom::seekBackAndWriteAtomSize(outputStream(), trakStartOffset, diag);
}