1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a BSD-style license that can
4  *  be found in the License.html file in the root of the source tree.
5  */
6 
7 //---------------------------------------------------------------------------
8 // Pre-compilation
9 #include "MediaInfo/PreComp.h"
10 #ifdef __BORLANDC__
11     #pragma hdrstop
12 #endif
13 //---------------------------------------------------------------------------
14 
15 //---------------------------------------------------------------------------
16 #include "MediaInfo/Setup.h"
17 //---------------------------------------------------------------------------
18 
19 //---------------------------------------------------------------------------
20 #if defined(MEDIAINFO_AAC_YES)
21 //---------------------------------------------------------------------------
22 
23 //---------------------------------------------------------------------------
24 #include "MediaInfo/Audio/File_Aac.h"
25 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
26 //---------------------------------------------------------------------------
27 
28 namespace MediaInfoLib
29 {
30 
31 //***************************************************************************
32 // Infos
33 //***************************************************************************
34 
35 extern const size_t Aac_sampling_frequency_Size;
36 
37 //***************************************************************************
38 // Constructor/Destructor
39 //***************************************************************************
40 
41 //---------------------------------------------------------------------------
File_Aac()42 File_Aac::File_Aac()
43 :File_Usac(), File__Tags_Helper()
44 {
45     //Config
46     #if MEDIAINFO_EVENTS
47         ParserIDs[0]=MediaInfo_Parser_Aac;
48         StreamIDs_Width[0]=0;
49     #endif //MEDIAINFO_EVENTS
50 
51     //File__Tags_Helper
52     Base=this;
53 
54     //Configuration
55     #if MEDIAINFO_TRACE
56         Trace_Layers_Update(8); //Stream
57     #endif //MEDIAINFO_TRACE
58     MustSynchronize=true;
59     Buffer_TotalBytes_FirstSynched_Max=64*1024;
60     PTS_DTS_Needed=true;
61     StreamSource=IsStream;
62 
63     //In
64     Frame_Count_Valid=0;
65     FrameIsAlwaysComplete=false;
66     Mode=Mode_Unknown;
67 
68     audioObjectType=(int8u)-1;
69     extensionAudioObjectType=(int8u)-1;
70     frame_length=1024;
71     extension_sampling_frequency=(int32u)-1;
72     aacSpectralDataResilienceFlag=false;
73     aacSectionDataResilienceFlag=false;
74     aacScalefactorDataResilienceFlag=false;
75     FrameSize_Min=(int64u)-1;
76     FrameSize_Max=0;
77     adts_buffer_fullness_Is7FF=false;
78     #if MEDIAINFO_ADVANCED
79         aac_frame_length_Total=0;
80     #endif //MEDIAINFO_ADVANCED
81 
82     //Temp - Main
83     muxConfigPresent=true;
84     audioMuxVersionA=false;
85 
86     //Temp - General Audio
87     sbr=NULL;
88     ps=NULL;
89     raw_data_block_Pos=0;
90 
91     //Temp
92     CanFill=true;
93 }
94 
95 //---------------------------------------------------------------------------
~File_Aac()96 File_Aac::~File_Aac()
97 {
98     for (size_t i=0; i<sbrs.size(); i++)
99         delete sbrs[i];
100     for (size_t i=0; i<pss.size(); i++)
101         delete pss[i];
102 }
103 
104 //***************************************************************************
105 // Streams management
106 //***************************************************************************
107 
108 //---------------------------------------------------------------------------
Streams_Accept()109 void File_Aac::Streams_Accept()
110 {
111     switch (Mode)
112     {
113          case Mode_ADTS :
114                        if (!IsSub)
115                             TestContinuousFileNames();
116         default : ;
117     }
118 }
119 
120 //---------------------------------------------------------------------------
Streams_Fill()121 void File_Aac::Streams_Fill()
122 {
123     switch(Mode)
124     {
125         case Mode_LATM : Fill(Stream_General, 0, General_Format, "LATM"); if (IsSub) Fill(Stream_Audio, 0, Audio_MuxingMode, "LATM"); break;
126         default : ;
127     }
128 
129     for (std::map<std::string, Ztring>::iterator Info=Infos_General.begin(); Info!=Infos_General.end(); ++Info)
130         Fill(Stream_General, 0, Info->first.c_str(), Info->second);
131     File__Tags_Helper::Stream_Prepare(Stream_Audio);
132     for (std::map<std::string, Ztring>::iterator Info_AudioSpecificConfig=Infos_AudioSpecificConfig.begin(); Info_AudioSpecificConfig!=Infos_AudioSpecificConfig.end(); ++Info_AudioSpecificConfig)
133         if (Infos.find(Info_AudioSpecificConfig->first)==Infos.end())
134             Infos[Info_AudioSpecificConfig->first]=Info_AudioSpecificConfig->second; // Use AudioSpecificConfig info if info not present in stream itself
135     for (std::map<std::string, Ztring>::iterator Info=Infos.begin(); Info!=Infos.end(); ++Info)
136         Fill(Stream_Audio, StreamPos_Last, Info->first.c_str(), Info->second);
137 
138     switch(Mode)
139     {
140         case Mode_ADTS    : File__Tags_Helper::Streams_Fill(); break;
141         default           : ;
142     }
143 
144     if (Retrieve_Const(Stream_Audio, StreamPos_Last, Audio_SamplesPerFrame).empty())
145     {
146     int16u frame_length_Multiplier=1;
147     if (!MediaInfoLib::Config.LegacyStreamDisplay_Get() && Retrieve_Const(Stream_Audio, StreamPos_Last, Audio_Format).find(__T("AAC"))==0 && Retrieve_Const(Stream_Audio, StreamPos_Last, Audio_Format_Settings_SBR).find(__T("Yes"))==0)
148         frame_length_Multiplier=2;
149     Fill(Stream_Audio, StreamPos_Last, Audio_SamplesPerFrame, frame_length*frame_length_Multiplier);
150     }
151 }
152 
153 //---------------------------------------------------------------------------
Streams_Update()154 void File_Aac::Streams_Update()
155 {
156     if (Frame_Count)
157     {
158         if (Mode==Mode_ADTS)
159             Infos["BitRate_Mode"].From_UTF8(adts_buffer_fullness_Is7FF?"VBR":"CBR");
160 
161         #if MEDIAINFO_ADVANCED
162             switch(Mode)
163             {
164                 case Mode_ADTS    :
165                 case Mode_LATM    : if (Config->File_RiskyBitRateEstimation_Get() && !adts_buffer_fullness_Is7FF && (Config->ParseSpeed<1.0 || File_Offset+Buffer_Offset<File_Size))
166                                     {
167                                         float64 BitRate=((float64)Frequency_b)/frame_length;
168                                         BitRate*=aac_frame_length_Total*8;
169                                         BitRate/=Frame_Count;
170 
171                                         Fill(Stream_Audio, 0, Audio_BitRate, BitRate, 10, true);
172                                         Fill(Stream_Audio, 0, Audio_Duration, (File_Size-Buffer_TotalBytes_FirstSynched)/BitRate*8*1000, 0, true);
173                                     }
174                                     break;
175                 default           : ;
176             }
177         #endif //MEDIAINFO_ADVANCED
178     }
179 }
180 
181 //---------------------------------------------------------------------------
Streams_Finish()182 void File_Aac::Streams_Finish()
183 {
184     switch(Mode)
185     {
186         case Mode_ADIF    :
187         case Mode_ADTS    : File__Tags_Helper::Streams_Finish(); break;
188         default           : ;
189     }
190 
191     if (FrameSize_Min!=(int32u)-1 && FrameSize_Max)
192     {
193         if (FrameSize_Max>FrameSize_Min*1.02)
194         {
195             Fill(Stream_Audio, 0, Audio_BitRate_Mode, "VBR", Unlimited, true, true);
196             if (Config->ParseSpeed>=1.0)
197             {
198                 Fill(Stream_Audio, 0, Audio_BitRate_Minimum, ((float64)FrameSize_Min)/frame_length*Frequency_b*8, 0);
199                 Fill(Stream_Audio, 0, Audio_BitRate_Maximum, ((float64)FrameSize_Max)/frame_length*Frequency_b*8, 0);
200                 Fill(Stream_Audio, 0, Audio_SamplingCount, Frame_Count*frame_length);
201                 Fill(Stream_Audio, 0, Audio_Duration, ((float64)Frame_Count)*frame_length/Frequency_b*1000, 0);
202             }
203         }
204         else if (Config->ParseSpeed>=1.0)
205         {
206             Fill(Stream_Audio, 0, Audio_BitRate_Mode, "CBR");
207         }
208     }
209 }
210 
211 //***************************************************************************
212 // Buffer - File header
213 //***************************************************************************
214 
215 //---------------------------------------------------------------------------
FileHeader_Begin()216 bool File_Aac::FileHeader_Begin()
217 {
218     if (!Frame_Count_Valid)
219         Frame_Count_Valid=Config->ParseSpeed>=0.5?128:(Config->ParseSpeed>=0.3?32:8);
220 
221     switch(Mode)
222     {
223         case Mode_AudioSpecificConfig :
224         case Mode_ADIF                :
225                                         MustSynchronize=false; break;
226         default                       : ; //Synchronization is requested, and this is the default
227     }
228 
229     switch(Mode)
230     {
231         case Mode_Unknown             :
232         case Mode_ADIF                :
233         case Mode_ADTS                :
234                                         break;
235         default                       : return true; //no file header test with other modes
236     }
237 
238     //Tags
239     if (!File__Tags_Helper::FileHeader_Begin())
240         return false;
241 
242     //Testing
243     if (Buffer_Size<4)
244         return false;
245     if (Buffer[0]==0x41 //"ADIF"
246      && Buffer[1]==0x44
247      && Buffer[2]==0x49
248      && Buffer[3]==0x46)
249     {
250         Mode=Mode_ADIF;
251         File__Tags_Helper::Accept("ADIF");
252         MustSynchronize=false;
253     }
254 
255     return true;
256 }
257 
258 //---------------------------------------------------------------------------
FileHeader_Parse()259 void File_Aac::FileHeader_Parse()
260 {
261     switch (Mode)
262     {
263         case Mode_ADIF    : FileHeader_Parse_ADIF(); break;
264         default           : ; //no file header test with other modes
265     }
266 }
267 
268 //---------------------------------------------------------------------------
FileHeader_Parse_ADIF()269 void File_Aac::FileHeader_Parse_ADIF()
270 {
271     adif_header();
272     BS_Begin();
273     raw_data_block();
274     BS_End();
275 
276     FILLING_BEGIN();
277         File__Tags_Helper::Finish();
278     FILLING_END();
279 }
280 
281 //***************************************************************************
282 // Buffer - Global
283 //***************************************************************************
284 
285 //---------------------------------------------------------------------------
Read_Buffer_Continue()286 void File_Aac::Read_Buffer_Continue()
287 {
288     if (Element_Size==0)
289         return;
290 
291     if (Frame_Count==0)
292         PTS_Begin=FrameInfo.PTS;
293 
294     switch(Mode)
295     {
296         case Mode_AudioSpecificConfig : Read_Buffer_Continue_AudioSpecificConfig(); break;
297         case Mode_raw_data_block      : Read_Buffer_Continue_raw_data_block(); break;
298         case Mode_ADIF                :
299         case Mode_ADTS                : File__Tags_Helper::Read_Buffer_Continue(); break;
300         default                       : ;
301     }
302 }
303 
304 //---------------------------------------------------------------------------
Read_Buffer_Continue_AudioSpecificConfig()305 void File_Aac::Read_Buffer_Continue_AudioSpecificConfig()
306 {
307     File__Analyze::Accept(); //We automaticly trust it
308 
309     BS_Begin();
310     AudioSpecificConfig(0); //Up to the end of the block
311     BS_End();
312 
313     Infos_AudioSpecificConfig=Infos;
314     Mode=Mode_raw_data_block; //Mode_AudioSpecificConfig only once
315 }
316 
317 //---------------------------------------------------------------------------
Read_Buffer_Continue_raw_data_block()318 void File_Aac::Read_Buffer_Continue_raw_data_block()
319 {
320     if (Frame_Count>Frame_Count_Valid)
321     {
322         Skip_XX(Element_Size,                                   "Data");
323         return; //Parsing completely only the 1st frame
324     }
325 
326     BS_Begin();
327     raw_data_block();
328     BS_End();
329     if (FrameIsAlwaysComplete && Element_Offset<Element_Size)
330         Skip_XX(Element_Size-Element_Offset,                    "Unknown");
331 
332     FILLING_BEGIN();
333         //Counting
334         Frame_Count++;
335         if (Frame_Count_NotParsedIncluded!=(int64u)-1)
336             Frame_Count_NotParsedIncluded++;
337         Element_Info1(Ztring::ToZtring(Frame_Count));
338 
339         //Filling
340         if (!Status[IsAccepted])
341             File__Analyze::Accept();
342         if (Frame_Count>=Frame_Count_Valid)
343         {
344             //No more need data
345             if (Mode==Mode_LATM)
346                 File__Analyze::Accept();
347             File__Analyze::Finish();
348         }
349     FILLING_ELSE();
350         Infos=Infos_AudioSpecificConfig;
351     FILLING_END();
352 }
353 
354 //***************************************************************************
355 // Buffer - Synchro
356 //***************************************************************************
357 
358 //---------------------------------------------------------------------------
Synchronize()359 bool File_Aac::Synchronize()
360 {
361     switch (Mode)
362     {
363         case Mode_Unknown     : if (Synchronize_LATM()) return true; Buffer_Offset=0; return Synchronize_ADTS();
364         case Mode_ADTS        : return Synchronize_ADTS();
365         case Mode_LATM        : return Synchronize_LATM();
366         default               : return true; //No synchro
367     }
368 }
369 
370 //---------------------------------------------------------------------------
Synchronize_ADTS()371 bool File_Aac::Synchronize_ADTS()
372 {
373     //Tags
374     bool Tag_Found;
375     if (!File__Tags_Helper::Synchronize(Tag_Found))
376         return false;
377     if (Tag_Found)
378         return true;
379 
380     //Synchronizing
381     while (Buffer_Offset+6<=Buffer_Size)
382     {
383          while (Buffer_Offset+6<=Buffer_Size && (Buffer[Buffer_Offset  ]!=0xFF
384                                               || (Buffer[Buffer_Offset+1]&0xF6)!=0xF0))
385             Buffer_Offset++;
386 
387         if (Buffer_Offset+6<=Buffer_Size)//Testing if size is coherant
388         {
389             //Testing next start, to be sure
390             int8u sampling_frequency_index=(CC1(Buffer+Buffer_Offset+2)>>2)&0xF;
391             if (sampling_frequency_index>=Aac_sampling_frequency_Size)
392             {
393                 Buffer_Offset++;
394                 continue;
395             }
396             int16u aac_frame_length=(CC3(Buffer+Buffer_Offset+3)>>5)&0x1FFF;
397             if (IsSub && Buffer_Offset+aac_frame_length==Buffer_Size)
398                 break;
399             if (File_Offset+Buffer_Offset+aac_frame_length!=File_Size-File_EndTagSize)
400             {
401                 //Padding
402                 while (Buffer_Offset+aac_frame_length+2<=Buffer_Size && Buffer[Buffer_Offset+aac_frame_length]==0x00)
403                     aac_frame_length++;
404 
405                 if (IsSub && Buffer_Offset+aac_frame_length==Buffer_Size)
406                     break; //while()
407                 if (Buffer_Offset+aac_frame_length+2>Buffer_Size)
408                     return false; //Need more data
409 
410                 //Testing
411                 if (aac_frame_length<=7 || (CC2(Buffer+Buffer_Offset+aac_frame_length)&0xFFF6)!=0xFFF0)
412                     Buffer_Offset++;
413                 else
414                 {
415                     //Testing next start, to be sure
416                     if (Buffer_Offset+aac_frame_length+3+3>Buffer_Size)
417                         return false; //Need more data
418                     sampling_frequency_index=(CC1(Buffer+Buffer_Offset+aac_frame_length+2)>>2)&0xF;
419                     if (sampling_frequency_index>=Aac_sampling_frequency_Size)
420                     {
421                         Buffer_Offset++;
422                         continue;
423                     }
424                     int16u aac_frame_length2=(CC3(Buffer+Buffer_Offset+aac_frame_length+3)>>5)&0x1FFF;
425                     if (File_Offset+Buffer_Offset+aac_frame_length+aac_frame_length2!=File_Size-File_EndTagSize)
426                     {
427                         //Padding
428                         while (Buffer_Offset+aac_frame_length+aac_frame_length2+2<=Buffer_Size && Buffer[Buffer_Offset+aac_frame_length+aac_frame_length2]==0x00)
429                             aac_frame_length2++;
430 
431                         if (IsSub && Buffer_Offset+aac_frame_length+aac_frame_length2==Buffer_Size)
432                             break; //while()
433                         if (Buffer_Offset+aac_frame_length+aac_frame_length2+2>Buffer_Size)
434                             return false; //Need more data
435 
436                         //Testing
437                         if (aac_frame_length2<=7 || (CC2(Buffer+Buffer_Offset+aac_frame_length+aac_frame_length2)&0xFFF6)!=0xFFF0)
438                             Buffer_Offset++;
439                         else
440                         {
441                             //Testing next start, to be sure
442                             if (Buffer_Offset+aac_frame_length+aac_frame_length2+3+3>Buffer_Size)
443                                 return false; //Need more data
444                             sampling_frequency_index=(CC1(Buffer+Buffer_Offset+aac_frame_length+aac_frame_length2+2)>>2)&0xF;
445                             if (sampling_frequency_index>=Aac_sampling_frequency_Size)
446                             {
447                                 Buffer_Offset++;
448                                 continue;
449                             }
450                             int16u aac_frame_length3=(CC3(Buffer+Buffer_Offset+aac_frame_length+aac_frame_length2+3)>>5)&0x1FFF;
451                             if (File_Offset+Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3!=File_Size-File_EndTagSize)
452                             {
453                                 //Padding
454                                 while (Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3+2<=Buffer_Size && Buffer[Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3]==0x00)
455                                     aac_frame_length3++;
456 
457                                 if (IsSub && Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3==Buffer_Size)
458                                     break; //while()
459                                 if (Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3+2>Buffer_Size)
460                                     return false; //Need more data
461 
462                                 //Testing
463                                 if (aac_frame_length3<=7 || (CC2(Buffer+Buffer_Offset+aac_frame_length+aac_frame_length2+aac_frame_length3)&0xFFF6)!=0xFFF0)
464                                     Buffer_Offset++;
465                                 else
466                                     break; //while()
467                             }
468                             else
469                                 break; //while()
470                         }
471                     }
472                     else
473                         break; //while()
474                 }
475             }
476             else
477                 break; //while()
478         }
479     }
480 
481     //Parsing last bytes if needed
482     if (Buffer_Offset+6>Buffer_Size)
483     {
484         if (Buffer_Offset+5==Buffer_Size && (CC2(Buffer+Buffer_Offset)&0xFFF6)!=0xFFF0)
485             Buffer_Offset++;
486         if (Buffer_Offset+4==Buffer_Size && (CC2(Buffer+Buffer_Offset)&0xFFF6)!=0xFFF0)
487             Buffer_Offset++;
488         if (Buffer_Offset+3==Buffer_Size && (CC2(Buffer+Buffer_Offset)&0xFFF6)!=0xFFF0)
489             Buffer_Offset++;
490         if (Buffer_Offset+2==Buffer_Size && (CC2(Buffer+Buffer_Offset)&0xFFF6)!=0xFFF0)
491             Buffer_Offset++;
492         if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0xFF)
493             Buffer_Offset++;
494         return false;
495     }
496 
497     //Synched is OK
498     Mode=Mode_ADTS;
499     File__Analyze::Accept();
500     return true;
501 }
502 
503 //---------------------------------------------------------------------------
Synchronize_LATM()504 bool File_Aac::Synchronize_LATM()
505 {
506     //Synchronizing
507     while (Buffer_Offset+3<=Buffer_Size)
508     {
509          while (Buffer_Offset+3<=Buffer_Size && (Buffer[Buffer_Offset  ]!=0x56
510                                               || (Buffer[Buffer_Offset+1]&0xE0)!=0xE0))
511             Buffer_Offset++;
512 
513         if (Buffer_Offset+3<=Buffer_Size)//Testing if size is coherant
514         {
515             //Testing next start, to be sure
516             int16u audioMuxLengthBytes=CC2(Buffer+Buffer_Offset+1)&0x1FFF;
517             if (IsSub && Buffer_Offset+3+audioMuxLengthBytes==Buffer_Size)
518                 break;
519             if (File_Offset+Buffer_Offset+3+audioMuxLengthBytes!=File_Size)
520             {
521                 if (Buffer_Offset+3+audioMuxLengthBytes+3>Buffer_Size)
522                     return false; //Need more data
523 
524                 //Testing
525                 if ((CC2(Buffer+Buffer_Offset+3+audioMuxLengthBytes)&0xFFE0)!=0x56E0)
526                     Buffer_Offset++;
527                 else
528                 {
529                     //Testing next start, to be sure
530                     int16u audioMuxLengthBytes2=CC2(Buffer+Buffer_Offset+3+audioMuxLengthBytes+1)&0x1FFF;
531                     if (File_Offset+Buffer_Offset+3+audioMuxLengthBytes+3+audioMuxLengthBytes2!=File_Size)
532                     {
533                         if (Buffer_Offset+3+audioMuxLengthBytes+3+audioMuxLengthBytes2+3>Buffer_Size)
534                             return false; //Need more data
535 
536                         //Testing
537                         if ((CC2(Buffer+Buffer_Offset+3+audioMuxLengthBytes+3+audioMuxLengthBytes2)&0xFFE0)!=0x56E0)
538                             Buffer_Offset++;
539                         else
540                             break; //while()
541                     }
542                     else
543                         break; //while()
544                 }
545             }
546             else
547                 break; //while()
548         }
549     }
550 
551 
552     //Synchronizing
553     while (Buffer_Offset+2<=Buffer_Size && (Buffer[Buffer_Offset  ]!=0x56
554                                          || (Buffer[Buffer_Offset+1]&0xE0)!=0xE0))
555         Buffer_Offset++;
556     if (Buffer_Offset+2>=Buffer_Size)
557         return false;
558 
559     //Synched is OK
560     Mode=Mode_LATM;
561     return true;
562 }
563 
564 //---------------------------------------------------------------------------
Synched_Test()565 bool File_Aac::Synched_Test()
566 {
567     switch (Mode)
568     {
569         case Mode_ADTS        : return Synched_Test_ADTS();
570         case Mode_LATM        : return Synched_Test_LATM();
571         default               : return true; //No synchro
572     }
573 }
574 
575 //---------------------------------------------------------------------------
Synched_Test_ADTS()576 bool File_Aac::Synched_Test_ADTS()
577 {
578     //Tags
579     if (!File__Tags_Helper::Synched_Test())
580         return false;
581 
582     //Null padding
583     while (Buffer_Offset+2<=Buffer_Size && Buffer[Buffer_Offset]==0x00)
584         Buffer_Offset++;
585 
586     //Must have enough buffer for having header
587     if (Buffer_Offset+2>Buffer_Size)
588         return false;
589 
590     //Quick test of synchro
591     if ((CC2(Buffer+Buffer_Offset)&0xFFF6)!=0xFFF0)
592         Synched=false;
593 
594     //We continue
595     return true;
596 }
597 
598 //---------------------------------------------------------------------------
Synched_Test_LATM()599 bool File_Aac::Synched_Test_LATM()
600 {
601     //Must have enough buffer for having header
602     if (Buffer_Offset+2>Buffer_Size)
603         return false;
604 
605     //Quick test of synchro
606     if ((CC2(Buffer+Buffer_Offset)&0xFFE0)!=0x56E0)
607         Synched=false;
608 
609     //We continue
610     return true;
611 }
612 
613 //***************************************************************************
614 // Buffer - Demux
615 //***************************************************************************
616 
617 //---------------------------------------------------------------------------
618 #if MEDIAINFO_DEMUX
Demux_UnpacketizeContainer_Test()619 bool File_Aac::Demux_UnpacketizeContainer_Test()
620 {
621     switch (Mode)
622     {
623         case Mode_ADTS        : return Demux_UnpacketizeContainer_Test_ADTS();
624         case Mode_LATM        : return Demux_UnpacketizeContainer_Test_LATM();
625         default               : return true; //No header
626     }
627 }
Demux_UnpacketizeContainer_Test_ADTS()628 bool File_Aac::Demux_UnpacketizeContainer_Test_ADTS()
629 {
630     int16u aac_frame_length=(BigEndian2int24u(Buffer+Buffer_Offset+3)>>5)&0x1FFF; //13 bits
631     Demux_Offset=Buffer_Offset+aac_frame_length;
632 
633     if (Demux_Offset>Buffer_Size && File_Offset+Buffer_Size!=File_Size)
634         return false; //No complete frame
635 
636     Demux_UnpacketizeContainer_Demux();
637 
638     return true;
639 }
Demux_UnpacketizeContainer_Test_LATM()640 bool File_Aac::Demux_UnpacketizeContainer_Test_LATM()
641 {
642     int16u audioMuxLengthBytes=BigEndian2int16u(Buffer+Buffer_Offset+1)&0x1FFF; //13 bits
643     Demux_Offset=Buffer_Offset+3+audioMuxLengthBytes;
644 
645     if (Demux_Offset>Buffer_Size && File_Offset+Buffer_Size!=File_Size)
646         return false; //No complete frame
647 
648     Demux_UnpacketizeContainer_Demux();
649 
650     return true;
651 }
652 #endif //MEDIAINFO_DEMUX
653 
654 //***************************************************************************
655 // Buffer - Per element
656 //***************************************************************************
657 
658 //---------------------------------------------------------------------------
Header_Begin()659 bool File_Aac::Header_Begin()
660 {
661     switch (Mode)
662     {
663         case Mode_ADTS        : return Header_Begin_ADTS();
664         case Mode_LATM        : return Header_Begin_LATM();
665         default               : return true; //No header
666     }
667 }
668 
669 //---------------------------------------------------------------------------
Header_Begin_ADTS()670 bool File_Aac::Header_Begin_ADTS()
671 {
672     //There is no real header in ADTS, retrieving only the frame length
673     if (Buffer_Offset+8>Buffer_Size) //size of adts_fixed_header + adts_variable_header
674         return false;
675 
676     return true;
677 }
678 
679 //---------------------------------------------------------------------------
Header_Begin_LATM()680 bool File_Aac::Header_Begin_LATM()
681 {
682     if (Buffer_Offset+3>Buffer_Size) //fixed 24-bit header
683         return false;
684 
685     return true;
686 }
687 
688 //---------------------------------------------------------------------------
Header_Parse()689 void File_Aac::Header_Parse()
690 {
691     switch (Mode)
692     {
693         case Mode_ADTS        : Header_Parse_ADTS(); break;
694         case Mode_LATM        : Header_Parse_LATM(); break;
695         default               : ; //No header
696     }
697 }
698 
699 //---------------------------------------------------------------------------
Header_Parse_ADTS()700 void File_Aac::Header_Parse_ADTS()
701 {
702     //There is no "header" in ADTS, retrieving only the frame length
703     int16u aac_frame_length=(BigEndian2int24u(Buffer+Buffer_Offset+3)>>5)&0x1FFF; //13 bits
704 
705     //Filling
706     Header_Fill_Size(aac_frame_length);
707     Header_Fill_Code(0, "adts_frame");
708 }
709 
710 //---------------------------------------------------------------------------
Header_Parse_LATM()711 void File_Aac::Header_Parse_LATM()
712 {
713     int16u audioMuxLengthBytes;
714     BS_Begin();
715     Skip_S2(11,                                                 "syncword");
716     Get_S2 (13, audioMuxLengthBytes,                            "audioMuxLengthBytes");
717     BS_End();
718 
719     //Filling
720     Header_Fill_Size(3+audioMuxLengthBytes);
721     Header_Fill_Code(0, "LATM");
722 }
723 
724 //---------------------------------------------------------------------------
Data_Parse()725 void File_Aac::Data_Parse()
726 {
727     if (FrameSize_Min>Header_Size+Element_Size)
728         FrameSize_Min=Header_Size+Element_Size;
729     if (FrameSize_Max<Header_Size+Element_Size)
730         FrameSize_Max=Header_Size+Element_Size;
731 
732     switch (Mode)
733     {
734         case Mode_ADTS        : Data_Parse_ADTS(); break;
735         case Mode_LATM        : Data_Parse_LATM(); break;
736         default               : ; //No header
737     }
738 
739     FILLING_BEGIN();
740         //Counting
741         if (File_Offset+Buffer_Offset+Element_Size==File_Size)
742             Frame_Count_Valid=Frame_Count; //Finish frames in case of there are less than Frame_Count_Valid frames
743 
744         #if MEDIAINFO_ADVANCED
745             switch(Mode)
746             {
747                 case Mode_LATM    :
748                                     aac_frame_length_Total+=Element_Size;
749                                     break;
750                 default           : ;
751             }
752         #endif //MEDIAINFO_ADVANCED
753 
754         if (!Status[IsAccepted])
755             File__Analyze::Accept();
756 
757         //Filling
758         if (Frame_Count>=Frame_Count_Valid && Config->ParseSpeed<1.0)
759         {
760             //No more need data
761             switch (Mode)
762             {
763                 case Mode_ADTS        :
764                 case Mode_LATM        :
765                                         if (!Status[IsFilled])
766                                         {
767                                             Fill();
768                                             if (!IsSub)
769                                                 File__Tags_Helper::Finish();
770                                         }
771                                         break;
772                 default               : ; //No header
773             }
774 
775         }
776 
777         TS_Add(frame_length);
778     FILLING_END();
779 }
780 
781 //---------------------------------------------------------------------------
Data_Parse_ADTS()782 void File_Aac::Data_Parse_ADTS()
783 {
784     //Parsing
785     BS_Begin();
786     adts_frame();
787     BS_End();
788 }
789 
790 //---------------------------------------------------------------------------
Data_Parse_LATM()791 void File_Aac::Data_Parse_LATM()
792 {
793     BS_Begin();
794     AudioMuxElement();
795     BS_End();
796 }
797 
798 //***************************************************************************
799 // C++
800 //***************************************************************************
801 
802 } //NameSpace
803 
804 #endif //MEDIAINFO_AAC_YES
805