From f1e2727775f547c99b9f92c2f62ccbc05291a6b9 Mon Sep 17 00:00:00 2001 From: Xingzhao Yun Date: Wed, 4 Dec 2024 15:38:49 +0800 Subject: [PATCH] manually merge https://github.com/axiomatic-systems/Bento4/pull/982 --- Source/C++/Codecs/Ap4Ac4Parser.cpp | 38 ++++++++++++++++++++++++++++-- Source/C++/Core/Ap4Dac4Atom.cpp | 2 +- Source/C++/Core/Ap4Dac4Atom.h | 1 + 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Source/C++/Codecs/Ap4Ac4Parser.cpp b/Source/C++/Codecs/Ap4Ac4Parser.cpp index 0a57299d..24a2892e 100644 --- a/Source/C++/Codecs/Ap4Ac4Parser.cpp +++ b/Source/C++/Codecs/Ap4Ac4Parser.cpp @@ -181,11 +181,17 @@ AP4_Ac4Header::AP4_Ac4Header(const AP4_UI08* bytes, unsigned int size) AP4_Ac4Header::~AP4_Ac4Header() { if (m_PresentationV1) { + bool removed_ss[32]; + AP4_SetMemory(removed_ss, false, sizeof(removed_ss)); assert(m_PresentationV1 != NULL); for (unsigned int pres_idx = 0; pres_idx < m_NPresentations; pres_idx++) { assert(m_PresentationV1[pres_idx].d.v1.substream_groups != NULL); for (int j = 0; j < m_PresentationV1[pres_idx].d.v1.n_substream_groups; j++) - delete[] m_PresentationV1[pres_idx].d.v1.substream_groups[j].d.v1.substreams; + if (removed_ss[m_PresentationV1[pres_idx].d.v1.substream_groups[j].d.v1.substreams->ss_idx]) break; + else{ + removed_ss[m_PresentationV1[pres_idx].d.v1.substream_groups[j].d.v1.substreams->ss_idx] = true; + delete[] m_PresentationV1[pres_idx].d.v1.substream_groups[j].d.v1.substreams; + } delete[] m_PresentationV1[pres_idx].d.v1.substream_groups; delete[] m_PresentationV1[pres_idx].d.v1.substream_group_indexs; } @@ -494,7 +500,35 @@ AP4_Ac4Parser::FindFrame(AP4_Ac4Frame& frame) frame.m_Info.m_Ac4Dsi.d.v1.ac4_bitrate_dsi.bit_rate = 0; // unknown, fixed value now frame.m_Info.m_Ac4Dsi.d.v1.ac4_bitrate_dsi.bit_rate_precision = 0xffffffff; // unknown, fixed value now frame.m_Info.m_Ac4Dsi.d.v1.n_presentations = ac4_header.m_NPresentations; - frame.m_Info.m_Ac4Dsi.d.v1.presentations = ac4_header.m_PresentationV1; + + if (ac4_header.m_PresentationV1) { + assert(ac4_header.m_PresentationV1 != NULL); + frame.m_Info.m_Ac4Dsi.d.v1.presentations = new AP4_Dac4Atom::Ac4Dsi::PresentationV1[ac4_header.m_NPresentations]; + AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations, + ac4_header.m_PresentationV1, + sizeof(AP4_Dac4Atom::Ac4Dsi::PresentationV1) * ac4_header.m_NPresentations); + for (unsigned int pres_idx = 0; pres_idx < ac4_header.m_NPresentations; pres_idx++) { + assert(ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups != NULL); + int n_substream_group = ac4_header.m_PresentationV1[pres_idx].d.v1.n_substream_groups; + frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups = new AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1[n_substream_group]; + frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_group_indexs = new AP4_UI32[n_substream_group]; + AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_group_indexs, + ac4_header.m_PresentationV1[pres_idx].d.v1.substream_group_indexs, + sizeof(AP4_UI32)*n_substream_group); + AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups, + ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups, + sizeof(AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1)*n_substream_group); + for (unsigned int sg_idx = 0; sg_idx < n_substream_group; sg_idx++) { + assert(ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams != NULL); + int n_substreams = ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.n_substreams; + frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams + = new AP4_Dac4Atom::Ac4Dsi::SubStream[n_substreams]; + AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams, + ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams, + sizeof(AP4_Dac4Atom::Ac4Dsi::SubStream) * n_substreams); + } + } + } /* set the frame source */ frame.m_Source = &m_Bits; diff --git a/Source/C++/Core/Ap4Dac4Atom.cpp b/Source/C++/Core/Ap4Dac4Atom.cpp index 942f753b..07315f79 100644 --- a/Source/C++/Core/Ap4Dac4Atom.cpp +++ b/Source/C++/Core/Ap4Dac4Atom.cpp @@ -967,7 +967,7 @@ AP4_Dac4Atom::Ac4Dsi::SubStream::ParseSubstreamIdxInfo(AP4_BitReader &bits, unsi { if (b_substreams_present == 1) { if (bits.ReadBits(2) == 3) { // substream_index - AP4_Ac4VariableBits(bits, 2); + ss_idx = AP4_Ac4VariableBits(bits, 2); } } return AP4_SUCCESS; diff --git a/Source/C++/Core/Ap4Dac4Atom.h b/Source/C++/Core/Ap4Dac4Atom.h index 227c50a8..f39f6446 100644 --- a/Source/C++/Core/Ap4Dac4Atom.h +++ b/Source/C++/Core/Ap4Dac4Atom.h @@ -81,6 +81,7 @@ class AP4_Dac4Atom : public AP4_Atom AP4_UI08 b_substream_contains_bed_objects; AP4_UI08 b_substream_contains_dynamic_objects; AP4_UI08 b_substream_contains_ISF_objects; + AP4_UI08 ss_idx; // methods AP4_Result ParseSubstreamInfoChan(AP4_BitReader &bits,