@@ -181,11 +181,17 @@ AP4_Ac4Header::AP4_Ac4Header(const AP4_UI08* bytes, unsigned int size)
181
181
AP4_Ac4Header::~AP4_Ac4Header ()
182
182
{
183
183
if (m_PresentationV1) {
184
+ bool removed_ss[32 ];
185
+ AP4_SetMemory (removed_ss, false , sizeof (removed_ss));
184
186
assert (m_PresentationV1 != NULL );
185
187
for (unsigned int pres_idx = 0 ; pres_idx < m_NPresentations; pres_idx++) {
186
188
assert (m_PresentationV1[pres_idx].d .v1 .substream_groups != NULL );
187
189
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
+ }
189
195
delete[] m_PresentationV1[pres_idx].d .v1 .substream_groups ;
190
196
delete[] m_PresentationV1[pres_idx].d .v1 .substream_group_indexs ;
191
197
}
@@ -494,7 +500,35 @@ AP4_Ac4Parser::FindFrame(AP4_Ac4Frame& frame)
494
500
frame.m_Info .m_Ac4Dsi .d .v1 .ac4_bitrate_dsi .bit_rate = 0 ; // unknown, fixed value now
495
501
frame.m_Info .m_Ac4Dsi .d .v1 .ac4_bitrate_dsi .bit_rate_precision = 0xffffffff ; // unknown, fixed value now
496
502
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
+ }
498
532
499
533
/* set the frame source */
500
534
frame.m_Source = &m_Bits;
0 commit comments