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 //
9 // Note : the buffer must be given in ONE call
10 //
11 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
13 //---------------------------------------------------------------------------
14 // Pre-compilation
15 #include "MediaInfo/PreComp.h"
16 #ifdef __BORLANDC__
17 #pragma hdrstop
18 #endif
19 //---------------------------------------------------------------------------
20
21 //---------------------------------------------------------------------------
22 #include "MediaInfo/Setup.h"
23 //---------------------------------------------------------------------------
24
25 //---------------------------------------------------------------------------
26 #if defined(MEDIAINFO_SPEEX_YES)
27 //---------------------------------------------------------------------------
28
29 //---------------------------------------------------------------------------
30 #include "MediaInfo/Audio/File_Speex.h"
31 using namespace std;
32 //---------------------------------------------------------------------------
33
34 namespace MediaInfoLib
35 {
36
37 //***************************************************************************
38 // Constructor/Destructor
39 //***************************************************************************
40
41 //---------------------------------------------------------------------------
File_Speex()42 File_Speex::File_Speex()
43 :File__Analyze()
44 {
45 //Internal
46 Identification_Done=false;
47 }
48
49 //***************************************************************************
50 // Buffer - Per element
51 //***************************************************************************
52
53 //---------------------------------------------------------------------------
Header_Parse()54 void File_Speex::Header_Parse()
55 {
56 //Filling
57 Header_Fill_Code(0, "Speex");
58 Header_Fill_Size(Element_Size);
59 }
60
61 //---------------------------------------------------------------------------
Data_Parse()62 void File_Speex::Data_Parse()
63 {
64 //Parsing
65 if (Identification_Done)
66 Comment();
67 else
68 Identification();
69 }
70
71 //***************************************************************************
72 // Elements
73 //***************************************************************************
74
75 //---------------------------------------------------------------------------
Identification()76 void File_Speex::Identification()
77 {
78 Element_Name("Identification");
79
80 //Parsing
81 Ztring speex_version;
82 int32u Speex_version_id, header_size, rate, nb_channels, bitrate, vbr;
83 Skip_Local(8, "speex_string");
84 Get_UTF8(20, speex_version, "speex_version");
85 Get_L4 (Speex_version_id, "Speex_version_id");
86 if (Speex_version_id==1)
87 {
88 Get_L4 (header_size, "header_size");
89 Get_L4 (rate, "rate");
90 Skip_L4( "mode");
91 Skip_L4( "mode_bitstream_version");
92 Get_L4 (nb_channels, "nb_channels");
93 Get_L4 (bitrate, "bitrate");
94 Skip_L4( "frame_size");
95 Get_L4 (vbr, "vbr");
96 Skip_L4( "frames_per_packet");
97 Skip_L4( "extra_headers");
98 Skip_L4( "reserved1");
99 Skip_L4( "reserved2");
100 if (header_size<Element_Size)
101 Skip_XX(Element_Size-header_size, "Unknown");
102 }
103
104 FILLING_BEGIN();
105 Accept("Speex");
106
107 Stream_Prepare(Stream_Audio);
108 Fill(Stream_Audio, 0, Audio_Format, "Speex");
109 Fill(Stream_Audio, 0, Audio_Codec, "Speex");
110 if (Speex_version_id==1)
111 {
112 if (!speex_version.empty())
113 Fill(Stream_Audio, 0, Audio_Encoded_Library, speex_version);
114 Fill(Stream_Audio, 0, Audio_SamplingRate, rate);
115 Fill(Stream_Audio, 0, Audio_Channel_s_, nb_channels);
116 if (bitrate!=(int32u)-1)
117 Fill(Stream_Audio, 0, Audio_BitRate, bitrate);
118 Fill(Stream_Audio, 0, Audio_BitRate_Mode, vbr?"VBR":"CBR");
119 }
120
121 Identification_Done=true;
122 FILLING_END();
123 }
124
125 //---------------------------------------------------------------------------
Comment()126 void File_Speex::Comment()
127 {
128 Element_Name("Comment?");
129
130 while (Element_Offset<Element_Size)
131 {
132 Ztring value;
133 int32u size;
134 Get_L4(size, "size");
135 if (size)
136 Get_UTF8(size, value, "value");
137
138 //Filling
139 if (!value.empty())
140 Fill(Stream_Audio, 0, "Comment", value);
141 }
142
143 Finish("Speex");
144 }
145
146 //***************************************************************************
147 // C++
148 //***************************************************************************
149
150 } //NameSpace
151
152 #endif //MEDIAINFO_SPEEX_YES
153