forked from eschnou/ardrone-webflight
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
73 lines (61 loc) · 2.19 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
var fs = require('fs');
var df = require('dateformat');
var util = require('util');
var path = require('path');
var timers = require('timers');
var lineReader = require('line-reader');
var reader = require ("buffered-reader");
var config, client,video, navReader, vidReader, rawVideo, lastFrame;
var BinaryReader = reader.BinaryReader;
var NAV_INTERVAL = 1000/15; // Navdata sent 15/s in demo mode
var VIDEO_INTERVAL = 1000/30; // 30 fps
function replay(name, deps) {
config = deps.config;
client = deps.client;
video = client.getVideoStream();
// Open the navdata file for line-by-line read
var self = this;
var navPath = path.join(config.replay.path, 'navdata.txt');
lineReader.open(navPath, function(reader) {
navReader = reader;
});
// Open the video raw stream
var videoPath = path.join(config.replay.path, 'video.h264');
rawVideo = new BinaryReader(videoPath);
// Open the video headers stream
var headerPath = path.join(config.replay.path, 'paveHeaders.txt');
lineReader.open(headerPath, function(reader) {
vidReader = reader;
vidReader.nextLine(function(data) {
// Read the first line and send video immediately the first time
var frame = JSON.parse(data);
lastFrame = frame;
emitVideo();
});
});
// Schedule timer to simulate nav data emit
timers.setInterval(emitNav, NAV_INTERVAL);
}
function emitNav() {
if (navReader && navReader.hasNextLine()) {
navReader.nextLine(function(data) {
client.emit('navdata', JSON.parse(data));
});
}
}
function emitVideo() {
if (vidReader && vidReader.hasNextLine()) {
vidReader.nextLine(function(data) {
var frame = JSON.parse(data);
var next = frame.timestamp - lastFrame.timestamp;
lastFrame = frame;
// Read a block (based on the size in the lastFrame)
rawVideo.read(lastFrame.payload_size, function (error, bytes, bytesRead) {
if (error) throw error;
video.emit('data', bytes);
});
timers.setTimeout(emitVideo, next);
});
}
}
module.exports = replay;