From 27d7a182d94ae780281d16e7feeffbc997c367fe Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 17 Apr 2019 17:51:04 +0200 Subject: [PATCH] Preserve all child elements within trak element --- mp4/mp4atom.cpp | 1 + mp4/mp4ids.h | 5 +++-- mp4/mp4track.cpp | 42 +++++++++++++++++++++++------------------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/mp4/mp4atom.cpp b/mp4/mp4atom.cpp index 1839f40..e772e9d 100644 --- a/mp4/mp4atom.cpp +++ b/mp4/mp4atom.cpp @@ -195,6 +195,7 @@ bool Mp4Atom::isParent() const switch (id()) { case Movie: case Track: + case Edit: case Media: case MediaInformation: case MediaInformationHeader: diff --git a/mp4/mp4ids.h b/mp4/mp4ids.h index 6787b24..500a086 100644 --- a/mp4/mp4ids.h +++ b/mp4/mp4ids.h @@ -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, diff --git a/mp4/mp4track.cpp b/mp4/mp4track.cpp index 88887ea..391fc1c 100644 --- a/mp4/mp4track.cpp +++ b/mp4/mp4track.cpp @@ -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); }