From 9f383c9799bd3ee4c73c2220d8a606e653d6ad96 Mon Sep 17 00:00:00 2001 From: Richard Alam <ritzalam@gmail.com> Date: Mon, 21 Nov 2016 20:14:47 +0000 Subject: [PATCH] - do not use another thread to do the transcoding. The thread doesn't get cleaned up when the call ends and the thread is waiting for packet in the queue. I am noticing a lot of threads hanging around in Yourkit from the mem dump. Not sure if this is contributing to OOM. --- .../SpeexFlashToSipTranscoderImp.java | 64 +++++++++---------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/transcoder/SpeexFlashToSipTranscoderImp.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/transcoder/SpeexFlashToSipTranscoderImp.java index 3c52546801..012c6de0e8 100755 --- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/transcoder/SpeexFlashToSipTranscoderImp.java +++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/media/transcoder/SpeexFlashToSipTranscoderImp.java @@ -19,11 +19,7 @@ package org.bigbluebutton.voiceconf.red5.media.transcoder; import java.util.Random; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import org.bigbluebutton.voiceconf.red5.media.FlashToSipAudioStream.TranscodedAudioListener; import org.red5.app.sip.codecs.Codec; @@ -42,15 +38,15 @@ public class SpeexFlashToSipTranscoderImp implements FlashToSipTranscoder { private long timestamp = 0; private final static int TS_INCREMENT = 320; // Determined from PCAP traces. - private final Executor exec = Executors.newSingleThreadExecutor(); - private Runnable audioDataProcessor; - private volatile boolean processAudioData = false; - private BlockingQueue<SpeexRtpAudioData> audioDataQ; + //private final Executor exec = Executors.newSingleThreadExecutor(); + //private Runnable audioDataProcessor; + //private volatile boolean processAudioData = false; + //private BlockingQueue<SpeexRtpAudioData> audioDataQ; private TranscodedAudioListener transcodedAudioListener; public SpeexFlashToSipTranscoderImp(Codec audioCodec) { - audioDataQ = new LinkedBlockingQueue<SpeexRtpAudioData>(); + //audioDataQ = new LinkedBlockingQueue<SpeexRtpAudioData>(); this.audioCodec = audioCodec; Random rgen = new Random(); timestamp = rgen.nextInt(1000); @@ -63,11 +59,13 @@ public class SpeexFlashToSipTranscoderImp implements FlashToSipTranscoder { System.arraycopy(audioData, startOffset, transcodedAudio, 0, length); SpeexRtpAudioData srad = new SpeexRtpAudioData(transcodedAudio, timestamp += TS_INCREMENT); - try { - audioDataQ.offer(srad, 100, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - log.warn("Failed to add speex audio data into queue."); - } + transcodedAudioListener.handleTranscodedAudioData(srad.audioData, srad.timestamp); + + //try { + // audioDataQ.offer(srad, 100, TimeUnit.MILLISECONDS); + //} catch (InterruptedException e) { + // log.warn("Failed to add speex audio data into queue."); + //} } public int getCodecId() { @@ -93,31 +91,31 @@ public class SpeexFlashToSipTranscoderImp implements FlashToSipTranscoder { } private void processAudioData() { - while (processAudioData) { - SpeexRtpAudioData srad; - try { - srad = audioDataQ.take(); - transcodedAudioListener.handleTranscodedAudioData(srad.audioData, srad.timestamp); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } + //while (processAudioData) { + // SpeexRtpAudioData srad; + // try { + // srad = audioDataQ.take(); + // transcodedAudioListener.handleTranscodedAudioData(srad.audioData, srad.timestamp); + // } catch (InterruptedException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } + //} } @Override public void start() { - processAudioData = true; - audioDataProcessor = new Runnable() { - public void run() { - processAudioData(); - } - }; - exec.execute(audioDataProcessor); + //processAudioData = true; + //audioDataProcessor = new Runnable() { + // public void run() { + // processAudioData(); + // } + //}; + //exec.execute(audioDataProcessor); } @Override public void stop() { - processAudioData = false; + //processAudioData = false; } } -- GitLab