package org.red5.app.sip.stream;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.red5.app.sip.trancoders.Transcoder;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import local.net.RtpPacket;
public class ReceivedRtpPacketProcessor {
final private Logger log = Red5LoggerFactory.getLogger(ReceivedRtpPacketProcessor.class, "sip");
private BlockingQueue<RtpPacket> packets = new LinkedBlockingQueue<RtpPacket>();
private final Executor exec = Executors.newSingleThreadExecutor();
private Runnable packetProcessor;
private volatile boolean processPacket = false;
private final Transcoder transcoder;
public ReceivedRtpPacketProcessor(Transcoder transcoder) {
this.transcoder = transcoder;
}
public void start() {
processPacket = true;
packetProcessor = new Runnable() {
public void run() {
while (processPacket) {
try {
RtpPacket packet = packets.take();
processPacket(packet);
} catch (InterruptedException e) {
log.warn("InterruptedExeption while taking event.");
}
}
}
};
exec.execute(packetProcessor);
}
private void processPacket(RtpPacket packet) {
byte[] payload = packet.getPayload();
transcoder.transcode(payload);
}
public void process(RtpPacket packet) throws InterruptedException {
packets.put(packet);
}
public void stop() {
System.out.println("processPacket stopped");
processPacket = false;
clearQueue();
}
private void clearQueue() {
packets.clear();
}
}