summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-04-08 23:41:43 +0000
committerHenri Herscher <henri@oreka.org>2006-04-08 23:41:43 +0000
commitabdf9da6f72462aff76e87f38a1ab9cb31f3e396 (patch)
tree419344577d1c05202bb52dd3326c774ba7a5a2cd
parent598aeab247a5ceba95a4e5664b1f78c382377b5d (diff)
Improved robustness of filters (sanity checks for each incoming audio chunk)
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@210 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r--orkaudio/filters/rtpmixer/RtpMixer.cpp28
-rw-r--r--orkbasecxx/Filter.cpp45
2 files changed, 59 insertions, 14 deletions
diff --git a/orkaudio/filters/rtpmixer/RtpMixer.cpp b/orkaudio/filters/rtpmixer/RtpMixer.cpp
index 6219b84..225af98 100644
--- a/orkaudio/filters/rtpmixer/RtpMixer.cpp
+++ b/orkaudio/filters/rtpmixer/RtpMixer.cpp
@@ -26,6 +26,7 @@
#include <queue>
#include "Filter.h"
#include "AudioCapture.h"
+#include <log4cxx/logger.h>
extern "C"
{
#include "g711.h"
@@ -68,7 +69,7 @@ private:
short* m_bufferEnd;
short m_buffer[NUM_SAMPLES_CIRCULAR_BUFFER];
unsigned int m_shippedSamples;
-
+ log4cxx::LoggerPtr m_log;
};
RtpMixer::RtpMixer()
@@ -78,7 +79,7 @@ RtpMixer::RtpMixer()
m_bufferEnd = m_buffer + NUM_SAMPLES_CIRCULAR_BUFFER;
m_writeTimestamp = 0;
m_readTimestamp = 0;
- //m_log = Logger::getLogger("rtpringbuffer");
+ m_log = log4cxx::Logger::getLogger("rtpmixer");
m_shippedSamples = 0;
}
@@ -89,7 +90,20 @@ FilterRef RtpMixer::Instanciate()
}
void RtpMixer::AudioChunkIn(AudioChunkRef& chunk)
-{
+{
+ CStdString logMsg;
+
+ if(chunk.get() == NULL)
+ {
+ LOG4CXX_DEBUG(m_log, "Null input chunk");
+ return;
+ }
+ else if(chunk->GetNumSamples() == 0)
+ {
+ LOG4CXX_DEBUG(m_log, "Empty input chunk");
+ return;
+ }
+
AudioChunkDetails* details = chunk->GetDetails();
if(details->m_encoding != PcmAudio)
{
@@ -144,9 +158,11 @@ void RtpMixer::AudioChunkIn(AudioChunkRef& chunk)
{
//LOG4CXX_DEBUG(m_log, m_capturePort + " packet too old, dropped");
}
- CStdString debug;
- debug.Format("free:%u used:%u wr:%x rd:%x wrts:%u rdts:%d", FreeSpace(), UsedSpace(), m_writePtr, m_readPtr, m_writeTimestamp, m_readTimestamp);
- //LOG4CXX_DEBUG(m_log, debug);
+ if(m_log->isDebugEnabled())
+ {
+ logMsg.Format("free:%u used:%u wr:%x rd:%x wrts:%u rdts:%d", FreeSpace(), UsedSpace(), m_writePtr, m_readPtr, m_writeTimestamp, m_readTimestamp);
+ LOG4CXX_DEBUG(m_log, logMsg);
+ }
}
void RtpMixer::AudioChunkOut(AudioChunkRef& chunk)
diff --git a/orkbasecxx/Filter.cpp b/orkbasecxx/Filter.cpp
index b1c0d4c..ae0c2c9 100644
--- a/orkbasecxx/Filter.cpp
+++ b/orkbasecxx/Filter.cpp
@@ -99,10 +99,25 @@ FilterRef AlawToPcmFilter::Instanciate()
void AlawToPcmFilter::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());
- AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails(); // pass through all details
- outputDetails.m_rtpPayloadType = -1; // and override the ones that this filter changes
+ outputDetails.m_rtpPayloadType = -1; // Override details that this filter changes
outputDetails.m_encoding = PcmAudio;
int numSamples = inputAudioChunk->GetNumSamples();
@@ -114,7 +129,6 @@ void AlawToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
outputBuffer[i] = (short)alaw2linear(inputBuffer[i]);
}
-
}
void AlawToPcmFilter::AudioChunkOut(AudioChunkRef& chunk)
@@ -154,10 +168,26 @@ FilterRef UlawToPcmFilter::Instanciate()
void UlawToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
{
+ m_outputAudioChunk.reset();
+
+ if(inputAudioChunk.get() == NULL)
+ {
+ return;
+ }
+ else if(inputAudioChunk->GetNumSamples() == 0)
+ {
+ return;
+ }
+
+ AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails();
+ if(outputDetails.m_rtpPayloadType != GetInputRtpPayloadType())
+ {
+ return;
+ }
+
// Create output buffer
m_outputAudioChunk.reset(new AudioChunk());
- AudioChunkDetails outputDetails = *inputAudioChunk->GetDetails(); // pass through all details
- outputDetails.m_rtpPayloadType = -1; // and override the ones that this filter changes
+ outputDetails.m_rtpPayloadType = -1; // Override details that this filter changes
outputDetails.m_encoding = PcmAudio;
int numSamples = inputAudioChunk->GetNumSamples();
@@ -168,8 +198,7 @@ void UlawToPcmFilter::AudioChunkIn(AudioChunkRef& inputAudioChunk)
for(int i=0; i<numSamples; i++)
{
outputBuffer[i] = (short)ulaw2linear(inputBuffer[i]);
- }
-
+ }
}
void UlawToPcmFilter::AudioChunkOut(AudioChunkRef& chunk)
@@ -195,4 +224,4 @@ CStdString UlawToPcmFilter::GetName()
int UlawToPcmFilter::GetInputRtpPayloadType()
{
return 0x0;
-} \ No newline at end of file
+}