Revision: 18977
Author: oleg.kulikoff
Date: Sun Jun 19 23:35:25 2011
Log: Frame header transmission
http://code.google.com/p/mobicents/source/detail?r=18977
Modified:
/trunk/servers/media/codecs/g711/src/main/java/org/mobicents/media/server/impl/dsp/audio/g711/alaw/Decoder.java
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/impl/AbstractSink.java
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/JitterBuffer.java
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverter.java
/trunk/servers/media/io/rtp/src/test/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverterTest.java
/trunk/servers/media/resources/telephony/dtmf/src/main/java/org/mobicents/media/server/impl/resource/dtmf/DetectorImpl.java
/trunk/servers/media/spi/src/main/java/org/mobicents/media/server/spi/memory/Partition.java
=======================================
---
/trunk/servers/media/codecs/g711/src/main/java/org/mobicents/media/server/impl/dsp/audio/g711/alaw/Decoder.java
Tue May 3 01:28:55 2011
+++
/trunk/servers/media/codecs/g711/src/main/java/org/mobicents/media/server/impl/dsp/audio/g711/alaw/Decoder.java
Sun Jun 19 23:35:25 2011
@@ -108,7 +108,7 @@
res.setSequenceNumber(frame.getSequenceNumber());
res.setEOM(frame.isEOM());
res.setFormat(linear);
-
+ res.setHeader(frame.getHeader());
return res;
}
=======================================
---
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
Mon Jun 13 03:15:58 2011
+++
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/component/audio/AudioMixer.java
Sun Jun 19 23:35:25 2011
@@ -358,7 +358,13 @@
}
//recycle received frames
for (int i = 0; i < frames.length; i++) {
- if (frames[i] != null) frames[i].recycle();
+ if (frames[i] != null) {
+ if (frames[i].getHeader() != null) {
+ frame.setHeader(frames[i].getHeader());
+ }
+ frames[i].recycle();
+ }
+
}
//assign attributes to the new frame
=======================================
---
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/impl/AbstractSink.java
Sun Jun 12 20:19:03 2011
+++
/trunk/servers/media/component/src/main/java/org/mobicents/media/server/impl/AbstractSink.java
Sun Jun 19 23:35:25 2011
@@ -387,7 +387,7 @@
//Reading next frame
Frame frame = pipe.read();
-
+
if (frame == null) {
//los of synchronization
isSynchronized = false;
=======================================
---
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/JitterBuffer.java
Wed Jun 15 06:14:45 2011
+++
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/JitterBuffer.java
Sun Jun 19 23:35:25 2011
@@ -111,6 +111,7 @@
this.rtpClock = clock;
this.jitter = rtpClock.convertToRtpTime(jitter);
this.dtmfConverter = new DtmfConverter();
+ this.dtmfConverter.setClock(clock);
}
public void setFormats(RTPFormats rtpFormats) {
@@ -164,16 +165,6 @@
rtpClock.synchronize(packet.getTimestamp());
isn = packet.getSeqNumber();
}
- //drop outstanding packets
- //packet is outstanding if its timestamp of arrived packet is less
- //then consumer media time
- if (packet.getTimestamp() < this.arrivalDeadLine) {
- System.out.println("drop packet: dead line=" + arrivalDeadLine
- + ", packet time=" + packet.getTimestamp() + ", seq="
+ packet.getSeqNumber()
- + ", payload length=" + packet.getPayloadLength());
- dropCount++;
- return;
- }
//checking format
if (this.format == null) {
@@ -209,9 +200,19 @@
queue[writeCursor].setSequenceNumber(packet.getSeqNumber());
queue[writeCursor].setTimestamp(rtpClock.convertToAbsoluteTime(packet.getTimestamp()));
} else {
+ //drop outstanding packets
+ //packet is outstanding if its timestamp of arrived packet is
less
+ //then consumer media time
+ if (packet.getTimestamp() < this.arrivalDeadLine) {
+ System.out.println("drop packet: dead line=" +
arrivalDeadLine
+ + ", packet time=" + packet.getTimestamp() + ",
seq=" + packet.getSeqNumber()
+ + ", payload length=" + packet.getPayloadLength());
+ dropCount++;
+ return;
+ }
//put packet into buffer irrespective of its sequence number
queue[writeCursor] =
Memory.allocate(packet.getPayloadLength());
-// queue[writeCursor].setHeader(null);
+ queue[writeCursor].setHeader(null);
queue[writeCursor].setSequenceNumber(packet.getSeqNumber());
//here time is in milliseconds
queue[writeCursor].setTimestamp(rtpClock.convertToAbsoluteTime(packet.getTimestamp()));
@@ -222,7 +223,6 @@
//set format
queue[writeCursor].setFormat(this.format.getFormat());
}
-
//we are expecting that sequence number still grow, if not
//move packet forward direction till its sequence number remains
//less then sequence number of previous
@@ -234,8 +234,12 @@
int p = dec(writeCursor);
//duration measured by wall clock
long d = queue[writeCursor].getTimestamp() -
queue[p].getTimestamp();
- queue[p].setDuration(d);
- duration += d;
+
+ //in case of RFC2833 event timestamp remains same
+ if (d > 0) {
+ queue[p].setDuration(d);
+ }
+ duration += queue[p].getDuration();
}
//compute interarrival jitter.
@@ -272,14 +276,13 @@
//extract packet
Frame frame = queue[readCursor];
queue[readCursor] = null;
-
this.updateReadPosition();
//buffer empty now? - change ready flag.
if (len < 0) {
this.ready = false;
arrivalDeadLine = 0;
- frame.setDuration(-1);
+ frame.setDuration(0);
} else {
long d = this.arrivalDeadLine;
arrivalDeadLine =
rtpClock.convertToRtpTime(frame.getTimestamp() + frame.getDuration());
@@ -291,6 +294,7 @@
//convert duration to nanoseconds
frame.setDuration(frame.getDuration() * 1000000L);
frame.setTimestamp(frame.getTimestamp() * 1000000L);
+
return frame;
}
=======================================
---
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
Tue Jun 14 23:49:00 2011
+++
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/RTPDataChannel.java
Sun Jun 19 23:35:25 2011
@@ -366,6 +366,7 @@
* transmission to the consumer.
*/
public void onFill() {
+ System.out.println("wake up");
this.wakeup();
}
}
=======================================
---
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverter.java
Wed Jun 15 06:14:45 2011
+++
/trunk/servers/media/io/rtp/src/main/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverter.java
Sun Jun 19 23:35:25 2011
@@ -114,7 +114,6 @@
}
public Frame process(RtpPacket event) {
- System.out.println("==== DTMF===");
//check is this begining of the tone
long now = System.nanoTime();
start = event.getMarker() || (now - timestamp) > 1000000000L;
@@ -134,25 +133,20 @@
//get the total duration of the tone in milliseconds
long duration = clock.convertToAbsoluteTime(((data[2] & 0xff) <<
8) | (data[3] & 0xff));
-
//get position in buffer and length
int offset = (int)(time * 16);
int len = (int)((duration - time) * 16);
//copy data
System.arraycopy(buffer[data[0]], offset, frame.getData(), 0, len);
-
+ long dd = (long)((duration - time));
//update time
time = duration;
-
frame.setOffset(0);
frame.setLength(320);
frame.setFormat(LINEAR_AUDIO);
-// System.out.println("tone=" + data[0]);
-// frame.setHeader(TONE[data[0]]);
-// frame.setDuration(d);
-// time += ((double) d) / 1000.0;
-
+ frame.setHeader(TONE[data[0]]);
+ frame.setDuration(20);
return frame;
}
=======================================
---
/trunk/servers/media/io/rtp/src/test/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverterTest.java
Fri Jun 3 07:03:28 2011
+++
/trunk/servers/media/io/rtp/src/test/java/org/mobicents/media/server/impl/rtp/rfc2833/DtmfConverterTest.java
Sun Jun 19 23:35:25 2011
@@ -89,6 +89,14 @@
Frame frame2 = dtmfConverter.process(packets[2]);
long finish = System.nanoTime();
+ assertTrue(frame0.getHeader() != null);
+ assertTrue(frame1.getHeader() != null);
+ assertTrue(frame2.getHeader() != null);
+
+ assertEquals(20L, frame0.getDuration());
+ assertEquals(20L, frame1.getDuration());
+ assertEquals(20L, frame2.getDuration());
+
for (int i = 0; i < 320; i++) {
assertEquals("Pos " + i, tone[i], frame0.getData()[i]);
}
=======================================
---
/trunk/servers/media/resources/telephony/dtmf/src/main/java/org/mobicents/media/server/impl/resource/dtmf/DetectorImpl.java
Wed Jun 15 06:14:45 2011
+++
/trunk/servers/media/resources/telephony/dtmf/src/main/java/org/mobicents/media/server/impl/resource/dtmf/DetectorImpl.java
Sun Jun 19 23:35:25 2011
@@ -101,7 +101,7 @@
private Listeners<DtmfDetectorListener> listeners = new Listeners();
private boolean isLazy = true;
-
+ private int count;
/**
* Creates new instance of Detector.
*/
@@ -144,6 +144,7 @@
*/
public void onMediaTransfer(Frame buffer) throws IOException {
if (buffer.getHeader() != null) {
+ System.out.println("Push=" + buffer.getHeader());
dtmfBuffer.push(buffer.getHeader());
return;
}
=======================================
---
/trunk/servers/media/spi/src/main/java/org/mobicents/media/server/spi/memory/Partition.java
Tue May 3 01:28:55 2011
+++
/trunk/servers/media/spi/src/main/java/org/mobicents/media/server/spi/memory/Partition.java
Sun Jun 19 23:35:25 2011
@@ -23,8 +23,6 @@
package org.mobicents.media.server.spi.memory;
import java.util.ArrayList;
-import java.util.concurrent.DelayQueue;
-import java.util.concurrent.TimeUnit;
/**
*
@@ -33,7 +31,6 @@
public class Partition {
protected int size;
- private static DelayQueue<Frame> queue = new DelayQueue();
private ArrayList<Frame> heap = new ArrayList();
protected Partition(int size) {
@@ -41,7 +38,7 @@
}
protected synchronized Frame allocate() {
- // if (true) return new Frame(this, new byte[size]);
+// if (true) return new Frame(this, new byte[size]);
if (heap.isEmpty()) {
return new Frame(this, new byte[size]);
}
@@ -49,6 +46,8 @@
}
protected synchronized void recycle(Frame frame) {
+ frame.setHeader(null);
+ frame.setDuration(Long.MAX_VALUE);
heap.add(frame);
//queue.offer(frame, frame.getDelay(TimeUnit.NANOSECONDS),
TimeUnit.NANOSECONDS);
}