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