From afbfd504fe75d553b398957bd6e97007cf2bf6c6 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 18 Nov 2022 02:19:04 +0100 Subject: [PATCH] Implemented MP4 "wave" box, added support for QuickTime-style ISOBMF AAC audio tracks ( = mp4a containing wave containing esds) --- lib/mp4.cpp | 1 + lib/mp4_generic.cpp | 2 ++ lib/mp4_generic.h | 5 +++++ src/input/input_mp4.cpp | 20 +++++++++++++++++--- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/mp4.cpp b/lib/mp4.cpp index 033f7f71..e528f080 100644 --- a/lib/mp4.cpp +++ b/lib/mp4.cpp @@ -238,6 +238,7 @@ namespace MP4{ case 0x6D646961: return ((MDIA *)this)->toPrettyString(indent); break; case 0x6D696E66: return ((MINF *)this)->toPrettyString(indent); break; case 0x64696E66: return ((DINF *)this)->toPrettyString(indent); break; + case 0x77617665: return ((WAVE *)this)->toPrettyString(indent); break; case 0x6D66726F: return ((MFRO *)this)->toPrettyString(indent); break; case 0x68646C72: return ((HDLR *)this)->toPrettyString(indent); break; case 0x766D6864: return ((VMHD *)this)->toPrettyString(indent); break; diff --git a/lib/mp4_generic.cpp b/lib/mp4_generic.cpp index b6d7a6a6..97e902e2 100644 --- a/lib/mp4_generic.cpp +++ b/lib/mp4_generic.cpp @@ -1318,6 +1318,8 @@ namespace MP4{ DINF::DINF(){memcpy(data + 4, "dinf", 4);} + WAVE::WAVE(){memcpy(data + 4, "wave", 4);} + MFRA::MFRA(){memcpy(data + 4, "mfra", 4);} MFRO::MFRO(){memcpy(data + 4, "mfro", 4);} diff --git a/lib/mp4_generic.h b/lib/mp4_generic.h index 5f507ebc..3f509f17 100644 --- a/lib/mp4_generic.h +++ b/lib/mp4_generic.h @@ -346,6 +346,11 @@ namespace MP4{ DINF(); }; + class WAVE : public containerBox{ + public: + WAVE(); + }; + class MFRO : public Box{ public: MFRO(); diff --git a/src/input/input_mp4.cpp b/src/input/input_mp4.cpp index 5eae18b6..8dc2d7b7 100644 --- a/src/input/input_mp4.cpp +++ b/src/input/input_mp4.cpp @@ -373,9 +373,23 @@ namespace Mist{ if (sType == "ac-3"){ meta.setCodec(tNumber, "AC3"); }else{ - MP4::ESDS esdsBox = (MP4::ESDS &)(aEntryBox.getCodecBox()); - meta.setCodec(tNumber, esdsBox.getCodec()); - meta.setInit(tNumber, esdsBox.getInitData()); + MP4::Box codingBox = aEntryBox.getCodecBox(); + if (codingBox.getType() == "esds"){ + MP4::ESDS & esdsBox = (MP4::ESDS &)codingBox; + meta.setCodec(tNumber, esdsBox.getCodec()); + meta.setInit(tNumber, esdsBox.getInitData()); + } + if (codingBox.getType() == "wave"){ + MP4::WAVE & waveBox = (MP4::WAVE &)codingBox; + for (size_t c = 0; c < waveBox.getContentCount(); ++c){ + MP4::Box content = waveBox.getContent(c); + if (content.getType() == "esds"){ + MP4::ESDS & esdsBox = (MP4::ESDS &)content; + meta.setCodec(tNumber, esdsBox.getCodec()); + meta.setInit(tNumber, esdsBox.getInitData()); + } + } + } } meta.setSize(tNumber, 16); ///\todo this might be nice to calculate from mp4 file; }