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 // Contributor: Lionel Duchateau, kurtnoise@free.fr
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_RKAU_YES)
27 //---------------------------------------------------------------------------
28
29 //---------------------------------------------------------------------------
30 #include "MediaInfo/Audio/File_Rkau.h"
31 //---------------------------------------------------------------------------
32
33 namespace MediaInfoLib
34 {
35
36 //***************************************************************************
37 // Constructor/Destructor
38 //***************************************************************************
39
40 //---------------------------------------------------------------------------
File_Rkau()41 File_Rkau::File_Rkau()
42 :File__Analyze(), File__Tags_Helper()
43 {
44 //File__Tags_Helper
45 Base=this;
46 }
47
48 //***************************************************************************
49 // Streams management
50 //***************************************************************************
51
52 //---------------------------------------------------------------------------
Streams_Finish()53 void File_Rkau::Streams_Finish()
54 {
55 //Filling
56 int64u CompressedSize=File_Size-TagsSize;
57 float32 CompressionRatio=((float32)UncompressedSize)/CompressedSize;
58
59 Fill(Stream_Audio, 0, Audio_StreamSize, CompressedSize);
60 Fill(Stream_Audio, 0, Audio_Compression_Ratio, CompressionRatio);
61 Fill(Stream_Audio, 0, Audio_BitRate_Mode, "VBR");
62
63 File__Tags_Helper::Streams_Finish();
64 }
65
66 //***************************************************************************
67 // Buffer - File header
68 //***************************************************************************
69
70 //---------------------------------------------------------------------------
FileHeader_Begin()71 bool File_Rkau::FileHeader_Begin()
72 {
73 if (!File__Tags_Helper::FileHeader_Begin())
74 return false;
75
76 //Synchro
77 if (Buffer_Offset+3>Buffer_Size)
78 return false;
79 if (CC3(Buffer+Buffer_Offset)!=0x524B41) //"RKA"
80 {
81 File__Tags_Helper::Reject("RKAU");
82 return false;
83 }
84
85 return true;
86 }
87
88 //---------------------------------------------------------------------------
FileHeader_Parse()89 void File_Rkau::FileHeader_Parse()
90 {
91 //Parsing
92 Ztring version;
93 int32u SampleRate, source_bytes;
94 int8u Channels, BitsPerSample, Quality, Flags;
95 bool joint_stereo, streaming, vrq_lossy_mode;
96
97 Skip_Local(3, "Signature");
98 Get_Local (1, version, "Version");
99 Get_L4 (source_bytes, "SourceBytes");
100 Get_L4 (SampleRate, "SampleRate");
101 Get_L1 (Channels, "Channels");
102 Get_L1 (BitsPerSample, "BitsPerSample");
103 Get_L1 (Quality, "Quality");
104 Get_L1 (Flags, "Flags");
105 Get_Flags (Flags, 0, joint_stereo, "JointStereo");
106 Get_Flags (Flags, 1, streaming, "Streaming");
107 Get_Flags (Flags, 2, vrq_lossy_mode, "VRQLossyMode");
108
109 FILLING_BEGIN();
110 if (SampleRate==0)
111 return;
112 Duration=(((int64u)source_bytes*1000)/4)/SampleRate;
113 if (Duration==0)
114 return;
115 UncompressedSize = ((int64u)Channels) * ((int64u)BitsPerSample / 8);
116 if (UncompressedSize==0)
117 return;
118
119 //Filling data
120 File__Tags_Helper::Accept("RKAU");
121
122 File__Tags_Helper::Stream_Prepare(Stream_Audio);
123 Fill(Stream_Audio, 0, Audio_Format, "RK Audio");
124 Fill(Stream_Audio, 0, Audio_Codec, "Rkau");
125 Fill(Stream_Audio, 0, Audio_Encoded_Library, __T("1.0") + version);
126 Fill(Stream_Audio, 0, Audio_Compression_Mode, (Quality==0)?"Lossless":"Lossy");
127 Fill(Stream_Audio, 0, Audio_BitDepth, BitsPerSample);
128 Fill(Stream_Audio, 0, Audio_Channel_s_, Channels);
129 Fill(Stream_Audio, 0, Audio_SamplingRate, SampleRate);
130 Fill(Stream_Audio, 0, Audio_Duration, Duration);
131
132 FILLING_END();
133
134 //No more needed data
135 File__Tags_Helper::Finish("RKAU");
136 }
137
138 //***************************************************************************
139 // C++
140 //***************************************************************************
141
142 } //NameSpace
143
144 #endif //MEDIAINFO_RKAU_YES
145