Skip to content

Commit 601b30b

Browse files
authored
Merge pull request #1047 from DolbyLaboratories/dolby/fix_ac4_memory_leak
fix ac4 memory leak
2 parents 8ec865d + 3d8c30b commit 601b30b

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

Source/C++/Codecs/Ap4Ac4Parser.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,35 @@ AP4_Ac4Parser::FindFrame(AP4_Ac4Frame& frame)
503503
frame.m_Info.m_Ac4Dsi.d.v1.ac4_bitrate_dsi.bit_rate = 0; // unknown, fixed value now
504504
frame.m_Info.m_Ac4Dsi.d.v1.ac4_bitrate_dsi.bit_rate_precision = 0xffffffff; // unknown, fixed value now
505505
frame.m_Info.m_Ac4Dsi.d.v1.n_presentations = ac4_header.m_NPresentations;
506-
frame.m_Info.m_Ac4Dsi.d.v1.presentations = ac4_header.m_PresentationV1;
506+
507+
if (ac4_header.m_PresentationV1) {
508+
assert(ac4_header.m_PresentationV1 != NULL);
509+
frame.m_Info.m_Ac4Dsi.d.v1.presentations = new AP4_Dac4Atom::Ac4Dsi::PresentationV1[ac4_header.m_NPresentations];
510+
AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations,
511+
ac4_header.m_PresentationV1,
512+
sizeof(AP4_Dac4Atom::Ac4Dsi::PresentationV1) * ac4_header.m_NPresentations);
513+
for (unsigned int pres_idx = 0; pres_idx < ac4_header.m_NPresentations; pres_idx++) {
514+
assert(ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups != NULL);
515+
int n_substream_group = ac4_header.m_PresentationV1[pres_idx].d.v1.n_substream_groups;
516+
frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups = new AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1[n_substream_group];
517+
frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_group_indexs = new AP4_UI32[n_substream_group];
518+
AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_group_indexs,
519+
ac4_header.m_PresentationV1[pres_idx].d.v1.substream_group_indexs,
520+
sizeof(AP4_UI32)*n_substream_group);
521+
AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups,
522+
ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups,
523+
sizeof(AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1)*n_substream_group);
524+
for (unsigned int sg_idx = 0; sg_idx < n_substream_group; sg_idx++) {
525+
assert(ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams != NULL);
526+
int n_substreams = ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.n_substreams;
527+
frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams
528+
= new AP4_Dac4Atom::Ac4Dsi::SubStream[n_substreams];
529+
AP4_CopyMemory(frame.m_Info.m_Ac4Dsi.d.v1.presentations[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams,
530+
ac4_header.m_PresentationV1[pres_idx].d.v1.substream_groups[sg_idx].d.v1.substreams,
531+
sizeof(AP4_Dac4Atom::Ac4Dsi::SubStream) * n_substreams);
532+
}
533+
}
534+
}
507535

508536
/* set the frame source */
509537
frame.m_Source = &m_Bits;

Source/C++/Core/Ap4Dac4Atom.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ AP4_Dac4Atom::Ac4Dsi::SubStream::ParseSubstreamIdxInfo(AP4_BitReader &bits, unsi
967967
{
968968
if (b_substreams_present == 1) {
969969
if (bits.ReadBits(2) == 3) { // substream_index
970-
AP4_Ac4VariableBits(bits, 2);
970+
ss_idx = AP4_Ac4VariableBits(bits, 2);
971971
}
972972
}
973973
return AP4_SUCCESS;

Source/C++/Core/Ap4Dac4Atom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class AP4_Dac4Atom : public AP4_Atom
8181
AP4_UI08 b_substream_contains_bed_objects;
8282
AP4_UI08 b_substream_contains_dynamic_objects;
8383
AP4_UI08 b_substream_contains_ISF_objects;
84+
AP4_UI08 ss_idx;
8485

8586
// methods
8687
AP4_Result ParseSubstreamInfoChan(AP4_BitReader &bits,

0 commit comments

Comments
 (0)