package org.mconf.bbb.bot;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.flazr.io.flv.FlvWriter;
import com.flazr.rtmp.RtmpMessage;
public class LimitedSizeFlvWriter extends FlvWriter {
private static final Logger log = LoggerFactory.getLogger(LimitedSizeFlvWriter.class);
private int size;
private long interval_acc = 0, interval_count = 0, delta = 0;
private long total_acc = 0, total_count = 0;
private long transmission_acc = 0, transmission_count = 0;
private static final long JITTER_INTERVAL = 1000;
private FlvWriter writer;
private long previous_pkt_timestamp, actual_pkt_timestamp, previous_timestamp, actual_timestamp, pkt_timestamp_delta = 0;
private boolean first_pkt = true;
public LimitedSizeFlvWriter(String fileName, int size) {
super(fileName);
this.size = size;
}
private void startWriter() {
SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss-SSS");
String filename = format.format(new Date()) + ".flv";
log.info(filename);
writer = new FlvWriter(filename);
}
private void stopWriter() {
writer.close();
}
@Override
public void write(RtmpMessage message) {
actual_pkt_timestamp = message.getHeader().getTime();
actual_timestamp = System.currentTimeMillis();
if (first_pkt) {
startWriter();
pkt_timestamp_delta = actual_pkt_timestamp;
first_pkt = false;
}
if (actual_pkt_timestamp == 0) {
// first packet of the stream
} else {
long diff_pkt_timestamp = actual_pkt_timestamp - previous_pkt_timestamp;
long diff_timestamp = actual_timestamp - previous_timestamp;
long t = Math.abs(diff_timestamp - diff_pkt_timestamp);
total_acc += t; interval_acc += t; transmission_acc += t;
total_count += 1; interval_count += 1; transmission_count += 1;
log.debug("actual_pkt_timestamp:{} | diff_pkt_timestamp: {} | actual_timestamp: {} | diff_timestamp: {}", new Object[] {actual_pkt_timestamp, diff_pkt_timestamp, actual_timestamp, diff_timestamp});
if (actual_pkt_timestamp - delta >= JITTER_INTERVAL) {
delta = actual_pkt_timestamp;
float avg = interval_acc / (float) interval_count;
log.info("Average jitter: {} ms{}", avg, avg >= diff_pkt_timestamp? " ***** POSSIBLE PROBLEM HERE! *****": "");
interval_acc = 0;
interval_count = 0;
}
}
previous_pkt_timestamp = actual_pkt_timestamp;
previous_timestamp = actual_timestamp;
if (actual_pkt_timestamp - pkt_timestamp_delta <= size) {
writer.write(message);
} else {
onFinished();
first_pkt = true;
stopWriter();
}
}
@Override
public void close() {
log.info("Average jitter of the whole transmission: {} ms", total_acc / (float) total_count);
writer.close();
super.close();
}
protected void onFinished() {
log.info("Recording done!");
log.info("Average jitter of the recorded transmission: {} ms", transmission_acc / (float) transmission_count);
transmission_acc = 0;
transmission_count = 0;
}
}