Skip to content

Commit

Permalink
Implemented workaround for negative timestamp misinterpretation
Browse files Browse the repository at this point in the history
  • Loading branch information
PyvesB committed Oct 2, 2018
1 parent fe794da commit 42ab1d9
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
Expand Up @@ -144,8 +144,9 @@ public void pushMessage(IPipe pipe, IMessage message) {
int eventTime = msg.getTimestamp();
log.debug("Message timestamp: {}", eventTime);
if (eventTime < 0) {
log.debug("Message has negative timestamp: {}", eventTime);
return;
eventTime += Integer.MIN_VALUE;
msg.setTimestamp(eventTime);
log.debug("Message has negative timestamp, applying {} offset: {}", Integer.MIN_VALUE, eventTime);
}
// get the data type
byte dataType = msg.getDataType();
Expand Down
@@ -0,0 +1,61 @@
package org.red5.server.stream.consumer;

import static org.junit.Assert.assertEquals;

import org.junit.Before;
import org.junit.Test;
import org.red5.server.net.rtmp.Channel;
import org.red5.server.net.rtmp.RTMPMinaConnection;
import org.red5.server.net.rtmp.event.VideoData;
import org.red5.server.stream.message.RTMPMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestConnectionConsumer {

private final Logger log = LoggerFactory.getLogger(TestConnectionConsumer.class);

private RTMPMinaConnection connection;
private Channel channel;
private ConnectionConsumer underTest;

@Before
public void setUp() {
connection = new RTMPMinaConnection();
channel = new Channel(connection, 1);
underTest = new ConnectionConsumer(connection, channel, channel, channel);
}

@Test
public void testNegativeTimestampsAreRolledOver() {
log.debug("\n testNegativeTimestampsAreRolledOver");
VideoData videoData1 = new VideoData();
videoData1.setTimestamp(-1);
underTest.pushMessage(null, RTMPMessage.build(videoData1));

assertEquals(Integer.MAX_VALUE, videoData1.getTimestamp());

VideoData videoData2 = new VideoData();
videoData2.setTimestamp(Integer.MIN_VALUE);
underTest.pushMessage(null, RTMPMessage.build(videoData2));

assertEquals(0, videoData2.getTimestamp());
}

@Test
public void testPositiveTimestampsAreUnaffected() {
log.debug("\n testPositiveTimestampsAreUnaffected");
VideoData videoData1 = new VideoData();
videoData1.setTimestamp(0);
underTest.pushMessage(null, RTMPMessage.build(videoData1));

assertEquals(0, videoData1.getTimestamp());

VideoData videoData2 = new VideoData();
videoData2.setTimestamp(Integer.MAX_VALUE);
underTest.pushMessage(null, RTMPMessage.build(videoData2));

assertEquals(Integer.MAX_VALUE, videoData2.getTimestamp());
}

}

0 comments on commit 42ab1d9

Please sign in to comment.