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