diff --git a/Source/C++/Codecs/Ap4Ac4Parser.cpp b/Source/C++/Codecs/Ap4Ac4Parser.cpp index 7d0386dc..7fc7f835 100644 --- a/Source/C++/Codecs/Ap4Ac4Parser.cpp +++ b/Source/C++/Codecs/Ap4Ac4Parser.cpp @@ -503,7 +503,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,