summaryrefslogtreecommitdiff
path: root/orkbasecxx/filters
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-11-07 14:59:50 +0000
committerHenri Herscher <henri@oreka.org>2006-11-07 14:59:50 +0000
commit3801002d76f57d2d4828a0bea289af7099af8455 (patch)
tree1b440d738ea5923ece1ed9eae51b5590a94ad140 /orkbasecxx/filters
parentc6919c520ee806d068bb957445f964bbe77a0733 (diff)
GSM 6.10 now supported as an RTP payload type under Windows.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@349 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/filters')
-rw-r--r--orkbasecxx/filters/gsm/GsmFilters.cpp102
-rw-r--r--orkbasecxx/filters/gsm/GsmFilters.h38
2 files changed, 140 insertions, 0 deletions
diff --git a/orkbasecxx/filters/gsm/GsmFilters.cpp b/orkbasecxx/filters/gsm/GsmFilters.cpp
new file mode 100644
index 0000000..e35017c
--- /dev/null
+++ b/orkbasecxx/filters/gsm/GsmFilters.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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)
+ short* outputBuffer = (short*)m_outputAudioChunk->CreateBuffer(numSamples*2, 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)
+{
+ ;
+} \ No newline at end of file
diff --git a/orkbasecxx/filters/gsm/GsmFilters.h b/orkbasecxx/filters/gsm/GsmFilters.h
new file mode 100644
index 0000000..b030fb0
--- /dev/null
+++ b/orkbasecxx/filters/gsm/GsmFilters.h
@@ -0,0 +1,38 @@
+/*
+ * 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
+ *
+ */
+#include "Filter.h"
+extern "C"
+{
+#include "gsm.h"
+}
+
+class DLL_IMPORT_EXPORT_ORKBASE GsmToPcmFilter : public Filter
+{
+public:
+ GsmToPcmFilter();
+ ~GsmToPcmFilter();
+
+ FilterRef __CDECL__ Instanciate();
+ void __CDECL__ AudioChunkIn(AudioChunkRef& chunk);
+ void __CDECL__ AudioChunkOut(AudioChunkRef& chunk);
+ AudioEncodingEnum __CDECL__ GetInputAudioEncoding();
+ AudioEncodingEnum __CDECL__ GetOutputAudioEncoding();
+ CStdString __CDECL__ GetName();
+ int __CDECL__ GetInputRtpPayloadType();
+ void __CDECL__ CaptureEventIn(CaptureEventRef& event);
+ void __CDECL__ CaptureEventOut(CaptureEventRef& event);
+
+private:
+ AudioChunkRef m_outputAudioChunk;
+ struct gsm_state * gsmState;
+}; \ No newline at end of file