Skip to content

Commit db013e6

Browse files
Merge pull request #62 from lynckia/master
Merge lynckia:master to development
2 parents b2741e1 + 2a5ea08 commit db013e6

File tree

12 files changed

+201
-137
lines changed

12 files changed

+201
-137
lines changed

erizo/src/erizo/rtp/QualityManager.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ void QualityManager::calculateMaxActiveLayer() {
109109
break;
110110
}
111111
}
112+
stats_->getNode()["qualityLayers"].insertStat("maxActiveSpatialLayer",
113+
CumulativeStat{static_cast<uint64_t>(max_active_spatial_layer_)});
114+
stats_->getNode()["qualityLayers"].insertStat("maxActiveTemporalLayer",
115+
CumulativeStat{static_cast<uint64_t>(max_active_temporal_layer_)});
116+
112117
max_active_spatial_layer_ = max_active_spatial_layer;
113118
max_active_temporal_layer_ = max_active_temporal_layer;
114119
}
@@ -134,6 +139,7 @@ bool QualityManager::isInMaxLayer() {
134139

135140
void QualityManager::forceLayers(int spatial_layer, int temporal_layer) {
136141
forced_layers_ = true;
142+
padding_enabled_ = false;
137143
spatial_layer_ = spatial_layer;
138144
temporal_layer_ = temporal_layer;
139145
}
@@ -142,11 +148,15 @@ void QualityManager::setSpatialLayer(int spatial_layer) {
142148
if (!forced_layers_) {
143149
spatial_layer_ = spatial_layer;
144150
}
151+
stats_->getNode()["qualityLayers"].insertStat("selectedSpatialLayer",
152+
CumulativeStat{static_cast<uint64_t>(spatial_layer_)});
145153
}
146154
void QualityManager::setTemporalLayer(int temporal_layer) {
147155
if (!forced_layers_) {
148156
temporal_layer_ = temporal_layer;
149157
}
158+
stats_->getNode()["qualityLayers"].insertStat("selectedTemporalLayer",
159+
CumulativeStat{static_cast<uint64_t>(temporal_layer_)});
150160
}
151161

152162
} // namespace erizo

erizo/src/erizo/rtp/RtpPaddingGeneratorHandler.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ RtpPaddingGeneratorHandler::RtpPaddingGeneratorHandler(std::shared_ptr<erizo::Cl
2424
last_rate_calculation_time_{clock_->now()}, started_at_{clock_->now()},
2525
enabled_{false}, first_packet_received_{false},
2626
marker_rate_{std::chrono::milliseconds(100), 20, 1., clock_},
27-
padding_bitrate_{std::chrono::milliseconds(100), 10, 8., clock_},
2827
rtp_header_length_{12} {}
2928

3029

@@ -41,6 +40,8 @@ void RtpPaddingGeneratorHandler::notifyUpdate() {
4140
video_sink_ssrc_ = connection_->getVideoSinkSSRC();
4241
audio_source_ssrc_ = connection_->getAudioSinkSSRC();
4342
stats_ = pipeline->getService<Stats>();
43+
stats_->getNode()["total"].insertStat("paddingBitrate",
44+
MovingIntervalRateStat{std::chrono::milliseconds(100), 10, 8., clock_});
4445
}
4546

4647
auto quality_manager = pipeline->getService<QualityManager>();
@@ -91,7 +92,7 @@ void RtpPaddingGeneratorHandler::sendPaddingPacket(std::shared_ptr<dataPacket> p
9192
RtpHeader *rtp_header = reinterpret_cast<RtpHeader*>(padding_packet->data);
9293

9394
rtp_header->setSeqNumber(sequence_number.output);
94-
padding_bitrate_ += padding_packet->length;
95+
stats_->getNode()["total"]["paddingBitrate"] += padding_packet->length;
9596

9697
getContext()->fireWrite(padding_packet);
9798
}
@@ -151,7 +152,7 @@ void RtpPaddingGeneratorHandler::recalculatePaddingRate() {
151152
last_rate_calculation_time_ = clock_->now();
152153

153154
int64_t total_bitrate = getStat("bitrateCalculated");
154-
int64_t padding_bitrate = padding_bitrate_.value();
155+
int64_t padding_bitrate = stats_->getNode()["total"]["paddingBitrate"].value();
155156
int64_t media_bitrate = std::max(total_bitrate - padding_bitrate, int64_t(0));
156157

157158
uint64_t target_bitrate = getTargetBitrate();

erizo/src/erizo/rtp/RtpPaddingGeneratorHandler.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ class RtpPaddingGeneratorHandler: public Handler {
6161
bool enabled_;
6262
bool first_packet_received_;
6363
MovingIntervalRateStat marker_rate_;
64-
MovingIntervalRateStat padding_bitrate_;
6564
uint32_t rtp_header_length_;
6665
};
6766

erizo/src/erizo/rtp/RtpRetransmissionHandler.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ void RtpRetransmissionHandler::notifyUpdate() {
2121
auto pipeline = getContext()->getPipelineShared();
2222
if (pipeline && !connection_) {
2323
connection_ = pipeline->getService<WebRtcConnection>().get();
24+
stats_ = pipeline->getService<Stats>();
2425
}
2526
}
2627

@@ -63,6 +64,12 @@ void RtpRetransmissionHandler::read(Context *ctx, std::shared_ptr<dataPacket> pa
6364
if (recovered.get()) {
6465
RtpHeader *recovered_head = reinterpret_cast<RtpHeader*> (recovered->data);
6566
if (recovered_head->getSeqNumber() == seq_num) {
67+
if (!stats_->getNode()["total"].hasChild("rtxBitrate")) {
68+
stats_->getNode()["total"].insertStat("rtxBitrate",
69+
MovingIntervalRateStat{std::chrono::milliseconds(100),
70+
30, 8.});
71+
}
72+
stats_->getNode()["total"]["rtxBitrate"] += recovered->length;
6673
getContext()->fireWrite(recovered);
6774
continue;
6875
}

erizo/src/erizo/rtp/RtpRetransmissionHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class RtpRetransmissionHandler : public Handler {
3535
WebRtcConnection *connection_;
3636
std::vector<std::shared_ptr<dataPacket>> audio_;
3737
std::vector<std::shared_ptr<dataPacket>> video_;
38+
std::shared_ptr<Stats> stats_;
3839
};
3940
} // namespace erizo
4041

erizo/src/test/rtp/QualityManagerTest.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ TEST_F(QualityManagerTest, shouldNotGoToHigherLayerInEarlierThanInterval) {
158158
const int kArbitrarySpatialLayer = 1;
159159
const int kArbitraryTemporalLayer = 1;
160160

161+
quality_manager->notifyQualityUpdate();
161162
quality_manager->setSpatialLayer(kBaseSpatialLayer);
162163
quality_manager->setTemporalLayer(kBaseTemporalLayer);
163164

@@ -173,6 +174,7 @@ TEST_F(QualityManagerTest, shouldSwitchLayerImmediatelyWhenLayerIsGone) {
173174
const int kArbitrarySpatialLayer = 1;
174175
const int kArbitraryTemporalLayer = 1;
175176

177+
quality_manager->notifyQualityUpdate();
176178
quality_manager->setSpatialLayer(kArbitrarySpatialLayer);
177179
quality_manager->setTemporalLayer(kArbitraryTemporalLayer);
178180

@@ -188,6 +190,7 @@ TEST_F(QualityManagerTest, shouldStickToForcedLayer) {
188190
const int kArbitrarySpatialLayer = 1;
189191
const int kArbitraryTemporalLayer = 1;
190192

193+
quality_manager->notifyQualityUpdate();
191194
quality_manager->forceLayers(kBaseSpatialLayer, kBaseTemporalLayer);
192195
quality_manager->setSpatialLayer(kArbitrarySpatialLayer);
193196
quality_manager->setSpatialLayer(kArbitraryTemporalLayer);

erizo_controller/erizoClient/src/Room.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ Erizo.Room = function (spec) {
204204

205205

206206
myStream.pc[arg.peerSocket].oniceconnectionstatechange = function (state) {
207-
if (state === 'failed') {
207+
if (state === 'failed' || state === 'disconnected') {
208208
myStream.pc[arg.peerSocket].close();
209209
delete myStream.pc[arg.peerSocket];
210210
}

erizo_controller/erizoClient/src/webrtc-stacks/ChromeStableStack.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,10 @@ Erizo.ChromeStableStack = function (spec) {
487487
} else {
488488
obj = JSON.parse(msg.candidate);
489489
}
490+
if (obj.candidate === 'end') {
491+
// ignore the end candidate for chrome
492+
return;
493+
}
490494
obj.candidate = obj.candidate.replace(/a=/g, '');
491495
obj.sdpMLineIndex = parseInt(obj.sdpMLineIndex);
492496
var candidate = new RTCIceCandidate(obj);

extras/basic_example/basicServer.js

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,36 @@ app.use(function(req, res, next) {
4949
N.API.init(config.nuve.superserviceID, config.nuve.superserviceKey, 'http://localhost:3000/');
5050

5151
var defaultRoom;
52-
var defaultRoomName = 'basicExampleRoom';
52+
const defaultRoomName = 'basicExampleRoom';
5353

54-
var getOrCreateRoom = function (roomName, callback) {
54+
var getOrCreateRoom = function (name, type = 'erizo', callback) {
5555

56-
if (roomName === defaultRoomName && defaultRoom) {
56+
if (name === defaultRoomName && defaultRoom) {
5757
callback(defaultRoom);
5858
return;
5959
}
6060

6161
N.API.getRooms(function (roomlist){
6262
var theRoom = '';
6363
var rooms = JSON.parse(roomlist);
64-
for (var room in rooms) {
65-
if (rooms[room].name === roomName &&
66-
rooms[room].data &&
67-
rooms[room].data.basicExampleRoom){
64+
for (var room of rooms) {
65+
if (room.name === name &&
66+
room.data &&
67+
room.data.basicExampleRoom){
6868

69-
theRoom = rooms[room]._id;
69+
theRoom = room._id;
7070
callback(theRoom);
7171
return;
7272
}
7373
}
74-
N.API.createRoom(roomName, function (roomID) {
74+
75+
let extra = {data: {basicExampleRoom: true}};
76+
if (type === 'p2p') extra.p2p = true;
77+
78+
N.API.createRoom(name, function (roomID) {
7579
theRoom = roomID._id;
7680
callback(theRoom);
77-
}, function(){}, {data: {basicExampleRoom:true}});
81+
}, function(){}, extra);
7882
});
7983
};
8084

@@ -109,15 +113,16 @@ var deleteRoomsIfEmpty = function (theRooms, callback) {
109113
};
110114

111115
var cleanExampleRooms = function (callback) {
116+
console.log('Cleaning basic example rooms');
112117
N.API.getRooms(function (roomlist) {
113118
var rooms = JSON.parse(roomlist);
114119
var roomsToCheck = [];
115-
for (var room in rooms){
116-
if (rooms[room].data &&
117-
rooms[room].data.basicExampleRoom &&
118-
rooms[room].name !== defaultRoomName){
120+
for (var room of rooms){
121+
if (room.data &&
122+
room.data.basicExampleRoom &&
123+
room.name !== defaultRoomName){
119124

120-
roomsToCheck.push(rooms[room]);
125+
roomsToCheck.push(room);
121126
}
122127
}
123128
deleteRoomsIfEmpty (roomsToCheck, function () {
@@ -142,21 +147,22 @@ app.get('/getUsers/:room', function(req, res) {
142147

143148

144149
app.post('/createToken/', function(req, res) {
145-
console.log(req.body);
146-
var room = defaultRoomName;
147-
if (req.body.room && !isNaN(req.body.room)) {
148-
room = req.body.room;
149-
}
150+
console.log('Creating token. Request body: ',req.body);
151+
152+
let username = req.body.username;
153+
let role = req.body.role;
154+
155+
let room = defaultRoomName, type;
150156

151-
var username = req.body.username,
152-
role = req.body.role;
157+
if (req.body.room && !isNaN(req.body.room)) room = req.body.room;
158+
if (req.body.type) type = req.body.type;
153159

154-
getOrCreateRoom(room, function (roomId) {
160+
getOrCreateRoom(room, type, function (roomId) {
155161
N.API.createToken(roomId, username, role, function(token) {
156-
console.log(token);
162+
console.log('Token created', token);
157163
res.send(token);
158164
}, function(error) {
159-
console.log(error);
165+
console.log('Error creating token', error);
160166
res.status(401).send('No Erizo Controller found');
161167
});
162168
});
@@ -175,7 +181,7 @@ app.use(function(req, res, next) {
175181
});
176182

177183
cleanExampleRooms(function() {
178-
getOrCreateRoom(defaultRoomName, function (roomId) {
184+
getOrCreateRoom(defaultRoomName, undefined, function (roomId) {
179185
defaultRoom = roomId;
180186
app.listen(3001);
181187
var server = https.createServer(options, app);

extras/basic_example/public/quality_layers.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,5 @@
77
</head>
88

99
<body>
10-
<div id="chart" style="width: calc(100% - 640px); height:700px; float:right;"></div>
1110
</body>
1211
</html>

0 commit comments

Comments
 (0)