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