blob: 3cc8f364af05505170ad33278381eb5cf1523447 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/*
* Oreka -- A media capture and retrieval platform
*
* Copyright (C) 2005, orecx LLC
*
* http://www.orecx.com
*
* This program is free software, distributed under the terms of
* the GNU General Public License.
* Please refer to http://www.gnu.org/copyleft/gpl.html
*
*/
//#pragma warning( disable: 4786 ) // disables truncated symbols in browse-info warning
#include "GsmFilters.h"
GsmToPcmFilter::GsmToPcmFilter()
{
CStdString logMsg;
gsmState = gsm_create();
if(!gsmState)
{
logMsg = "gsm_create() returned memory allocation problem";
throw(logMsg);
}
}
GsmToPcmFilter::~GsmToPcmFilter()
{
gsm_destroy(gsmState);
}
FilterRef GsmToPcmFilter::Instanciate()
{
FilterRef Filter(new GsmToPcmFilter());
return Filter;
}
void GsmToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
m_outputAudioChunk.reset();
if(inputAudioChunk.get() == NULL)
{
return;
}
if(inputAudioChunk->GetNumSamples() == 0)
{
return;
}
AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();
if(outputDetails.m_rtpPayloadType != GetInputRtpPayloadType())
{
return;
}
// Create output buffer
m_outputAudioChunk.reset(new AudioChunk());
outputDetails.m_rtpPayloadType = -1; // Override details that this filter changes
outputDetails.m_encoding = PcmAudio;
int numSamples = 160; // standard GSM frame is 33 bytes for 160 PCM samples (20 ms)
outputDetails.m_numBytes = numSamples*2;
short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(outputDetails);
unsigned char* inputBuffer = (unsigned char*)inputAudioChunk->m_pBuffer;
gsm_decode(gsmState, inputBuffer, outputBuffer);
}
void GsmToPcmFilter::AudioChunkOut(AudioChunkRef& chunk)
{
chunk = m_outputAudioChunk;
}
AudioEncodingEnum GsmToPcmFilter::GetInputAudioEncoding()
{
return GsmAudio;
}
AudioEncodingEnum GsmToPcmFilter::GetOutputAudioEncoding()
{
return PcmAudio;
}
CStdString GsmToPcmFilter::GetName()
{
return "GsmToPcm";
}
int GsmToPcmFilter::GetInputRtpPayloadType()
{
return 0x3;
}
void GsmToPcmFilter::CaptureEventIn(CaptureEventRef& event)
{
;
}
void GsmToPcmFilter::CaptureEventOut(CaptureEventRef& event)
{
;
}
|