• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #ifndef PVWAVFILEPARSER_H_INCLUDED
19 #define PVWAVFILEPARSER_H_INCLUDED
20 
21 //----------------------------------------------------------------------------
22 // INCLUDES
23 //----------------------------------------------------------------------------
24 
25 #ifndef OSCL_BASE_H_INCLUDED
26 #include "oscl_base.h"
27 #endif
28 
29 #ifndef OSCL_STRING_H_INCLUDED
30 #include "oscl_string.h"
31 #endif
32 
33 #ifndef OSCL_FILE_IO_H_INCLUDED
34 #include "oscl_file_io.h"
35 #endif
36 
37 #ifndef OSCL_MEM_H_INCLUDED
38 #include "oscl_mem.h"
39 #endif
40 
41 #ifndef OSCL_VECTOR_H_INCLUDED
42 #include "oscl_vector.h"
43 #endif
44 
45 
46 //////////////////////////////////WAV File parser
47 
48 // This enumeration lists the formats currently supported
49 enum PVWavAudioFormats
50 {
51     PVWAV_UNKNOWN_AUDIO_FORMAT = 0,
52     PVWAV_PCM_AUDIO_FORMAT = 1,
53     PVWAV_ITU_G711_ALAW = 6,
54     PVWAV_ITU_G711_ULAW = 7
55 };
56 
57 
58 typedef struct
59 {
60     int32  AudioFormat;
61     uint16 NumChannels;
62     uint16 BlockAlign;
63     uint16 BitsPerSample;
64     uint16 BytesPerSample;  // takes into account byte alignment
65     uint32 SampleRate;
66     uint32 ByteRate;
67     uint32 NumSamples;  // Total number of Samples
68     bool isLittleEndian;    // 1 if data is little endian and 0 if it is big endian
69 } PVWAVFileInfo;
70 
71 enum PVWavParserReturnCode
72 {
73     // Return codes
74     PVWAVPARSER_OK = 0,
75     PVWAVPARSER_READ_ERROR = -1,
76     PVWAVPARSER_MISC_ERROR = -2,
77     PVWAVPARSER_UNSUPPORTED_FORMAT = -3,
78     PVWAVPARSER_END_OF_FILE = -4
79 };
80 
81 class PV_Wav_Parser
82 {
83     public:
PV_Wav_Parser()84         OSCL_IMPORT_REF PV_Wav_Parser()
85         {
86             AudioFormat = 0;
87             NumChannels = 0;
88             SampleRate = 0;
89             ByteRate = 0;
90             BlockAlign = 0;
91             BitsPerSample = 0;
92             BytesPerSample = 0;
93             xLawTable = NULL;
94             PCMBytesRead = 0;
95             PCMBytesPresent = 0;
96             ipWAVFile = NULL;
97             iHeaderSize = 0;
98             isLittleEndian = 1; // little endian by default
99             iEndOfDataSubChunkOffset = 0;
100         }
101 
102         OSCL_IMPORT_REF ~PV_Wav_Parser();
103         //{
104         //  CleanupWAVFile();
105         //}
106 
107         // Will parse WAVE File
108         OSCL_IMPORT_REF PVWavParserReturnCode InitWavParser(OSCL_wString& aClip, Oscl_FileServer* aFileSession);
109 
110         // Returns number of samples copied to the buffer
111         OSCL_IMPORT_REF PVWavParserReturnCode GetPCMData(uint8* inBuff, uint32 inBufSize, uint32 NumberOfSamples, uint32& NumSamplesRead);
112 
113         // Copies Number of Channels, Sampling rate and Bits per sample to input parameters
114         OSCL_IMPORT_REF bool RetrieveFileInfo(PVWAVFileInfo& aInfo);
115 
116         //Seek in PCM Data (Seeks the file position to SampleNumber specified so that user can then get PCM data starting from that Sample)
117         OSCL_IMPORT_REF PVWavParserReturnCode SeekPCMSample(uint32 SampleNumber);
118 
119         //Set the paser output to uncompressed PCM.
120         OSCL_IMPORT_REF bool SetOutputToUncompressedPCM(void);
121     private:
122         PVWavParserReturnCode ReadData(uint8* buff, uint32 size, uint32& bytesread);
123         OSCL_IMPORT_REF void CleanupWAVFile(void);
124 
125         //Subchunk 1
126         uint16 AudioFormat;
127         uint16 NumChannels;
128         uint32 SampleRate;
129         uint32 ByteRate;
130         uint16 BlockAlign;
131         uint16 BitsPerSample;
132         uint16 BytesPerSample;
133         bool isLittleEndian;    // 1 if data is little endian and 0 if it is big endian
134 
135         short *xLawTable;
136 
137         // It will be incremented when PCM data is read and compared to Subchunk2_size to determine whether whole file has been read or not
138         uint32 PCMBytesRead;
139         uint32 PCMBytesPresent;// PCM data size in bytes
140         uint32 NumSamples;
141         uint32 iEndOfDataSubChunkOffset;
142 
143         // Pointer to input file (File to be opened and file pointer kept with the class. It will be closed when no data is left in file descriptor of class)
144         Oscl_File* ipWAVFile;
145 
146         // header size (size of data before data subchunk)
147         uint32 iHeaderSize;
148 };
149 
150 
151 #endif // PVWAVFILEPARSER_H_INCLUDED
152