@@ -181,11 +181,17 @@ AP4_Ac4Header::AP4_Ac4Header(const AP4_UI08* bytes, unsigned int size)
181181AP4_Ac4Header::~AP4_Ac4Header ()
182182{
183183 if (m_PresentationV1) {
184+ bool removed_ss[32 ];
185+ AP4_SetMemory (removed_ss, false , sizeof (removed_ss));
184186 assert (m_PresentationV1 != NULL );
185187 for (unsigned int pres_idx = 0 ; pres_idx < m_NPresentations; pres_idx++) {
186188 assert (m_PresentationV1[pres_idx].d .v1 .substream_groups != NULL );
187189 for (int j = 0 ; j < m_PresentationV1[pres_idx].d .v1 .n_substream_groups ; j++)
188- delete[] m_PresentationV1[pres_idx].d .v1 .substream_groups [j].d .v1 .substreams ;
190+ if (removed_ss[m_PresentationV1[pres_idx].d .v1 .substream_groups [j].d .v1 .substreams ->ss_idx ]) break ;
191+ else {
192+ removed_ss[m_PresentationV1[pres_idx].d .v1 .substream_groups [j].d .v1 .substreams ->ss_idx ] = true ;
193+ delete[] m_PresentationV1[pres_idx].d .v1 .substream_groups [j].d .v1 .substreams ;
194+ }
189195 delete[] m_PresentationV1[pres_idx].d .v1 .substream_groups ;
190196 delete[] m_PresentationV1[pres_idx].d .v1 .substream_group_indexs ;
191197 }
@@ -494,7 +500,35 @@ AP4_Ac4Parser::FindFrame(AP4_Ac4Frame& frame)
494500 frame.m_Info .m_Ac4Dsi .d .v1 .ac4_bitrate_dsi .bit_rate = 0 ; // unknown, fixed value now
495501 frame.m_Info .m_Ac4Dsi .d .v1 .ac4_bitrate_dsi .bit_rate_precision = 0xffffffff ; // unknown, fixed value now
496502 frame.m_Info .m_Ac4Dsi .d .v1 .n_presentations = ac4_header.m_NPresentations ;
497- frame.m_Info .m_Ac4Dsi .d .v1 .presentations = ac4_header.m_PresentationV1 ;
503+
504+ if (ac4_header.m_PresentationV1 ) {
505+ assert (ac4_header.m_PresentationV1 != NULL );
506+ frame.m_Info .m_Ac4Dsi .d .v1 .presentations = new AP4_Dac4Atom::Ac4Dsi::PresentationV1[ac4_header.m_NPresentations ];
507+ AP4_CopyMemory (frame.m_Info .m_Ac4Dsi .d .v1 .presentations ,
508+ ac4_header.m_PresentationV1 ,
509+ sizeof (AP4_Dac4Atom::Ac4Dsi::PresentationV1) * ac4_header.m_NPresentations );
510+ for (unsigned int pres_idx = 0 ; pres_idx < ac4_header.m_NPresentations ; pres_idx++) {
511+ assert (ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_groups != NULL );
512+ int n_substream_group = ac4_header.m_PresentationV1 [pres_idx].d .v1 .n_substream_groups ;
513+ frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_groups = new AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1[n_substream_group];
514+ frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_group_indexs = new AP4_UI32[n_substream_group];
515+ AP4_CopyMemory (frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_group_indexs ,
516+ ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_group_indexs ,
517+ sizeof (AP4_UI32)*n_substream_group);
518+ AP4_CopyMemory (frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_groups ,
519+ ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_groups ,
520+ sizeof (AP4_Dac4Atom::Ac4Dsi::SubStreamGroupV1)*n_substream_group);
521+ for (unsigned int sg_idx = 0 ; sg_idx < n_substream_group; sg_idx++) {
522+ assert (ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_groups [sg_idx].d .v1 .substreams != NULL );
523+ int n_substreams = ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_groups [sg_idx].d .v1 .n_substreams ;
524+ frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_groups [sg_idx].d .v1 .substreams
525+ = new AP4_Dac4Atom::Ac4Dsi::SubStream[n_substreams];
526+ AP4_CopyMemory (frame.m_Info .m_Ac4Dsi .d .v1 .presentations [pres_idx].d .v1 .substream_groups [sg_idx].d .v1 .substreams ,
527+ ac4_header.m_PresentationV1 [pres_idx].d .v1 .substream_groups [sg_idx].d .v1 .substreams ,
528+ sizeof (AP4_Dac4Atom::Ac4Dsi::SubStream) * n_substreams);
529+ }
530+ }
531+ }
498532
499533 /* set the frame source */
500534 frame.m_Source = &m_Bits;
0 commit comments