Skip to content

Commit 8b4692c

Browse files
authored
Fix concurrency issues in video bitrate stats access (#1305)
1 parent 93ca6e6 commit 8b4692c

File tree

6 files changed

+13
-17
lines changed

6 files changed

+13
-17
lines changed

erizo/src/erizo/MediaStream.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ MediaStream::MediaStream(std::shared_ptr<Worker> worker,
6262
pipeline_initialized_{false},
6363
is_publisher_{is_publisher},
6464
simulcast_{false},
65-
bitrate_from_max_quality_layer_{0} {
65+
bitrate_from_max_quality_layer_{0},
66+
video_bitrate_{0} {
6667
setVideoSinkSSRC(kDefaultVideoSinkSSRC);
6768
setAudioSinkSSRC(kDefaultAudioSinkSSRC);
6869
ELOG_INFO("%s message: constructor, id: %s",
@@ -98,16 +99,6 @@ uint32_t MediaStream::getMaxVideoBW() {
9899
return bitrate;
99100
}
100101

101-
uint32_t MediaStream::getBitrateSent() {
102-
uint32_t bitrate = 0;
103-
std::string video_ssrc = std::to_string(is_publisher_ ? getVideoSourceSSRC() : getVideoSinkSSRC());
104-
if (stats_->getNode().hasChild(video_ssrc) &&
105-
stats_->getNode()[video_ssrc].hasChild("bitrateCalculated")) {
106-
bitrate = stats_->getNode()[video_ssrc]["bitrateCalculated"].value();
107-
}
108-
return bitrate;
109-
}
110-
111102
void MediaStream::setMaxVideoBW(uint32_t max_video_bw) {
112103
asyncTask([max_video_bw] (std::shared_ptr<MediaStream> stream) {
113104
if (stream->rtcp_processor_) {

erizo/src/erizo/MediaStream.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ class MediaStream: public MediaSink, public MediaSource, public FeedbackSink,
7171
void close() override;
7272
virtual uint32_t getMaxVideoBW();
7373
virtual uint32_t getBitrateFromMaxQualityLayer() { return bitrate_from_max_quality_layer_; }
74-
virtual uint32_t getBitrateSent();
74+
virtual uint32_t getVideoBitrate() { return video_bitrate_; }
75+
void setVideoBitrate(uint32_t bitrate) { video_bitrate_ = bitrate; }
7576
void setMaxVideoBW(uint32_t max_video_bw);
7677
void syncClose();
7778
bool setRemoteSdp(std::shared_ptr<SdpInfo> sdp);
@@ -211,6 +212,7 @@ class MediaStream: public MediaSink, public MediaSource, public FeedbackSink,
211212

212213
std::atomic_bool simulcast_;
213214
std::atomic<uint64_t> bitrate_from_max_quality_layer_;
215+
std::atomic<uint32_t> video_bitrate_;
214216
protected:
215217
std::shared_ptr<SdpInfo> remote_sdp_;
216218
};

erizo/src/erizo/bandwidth/TargetVideoBWDistributor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void TargetVideoBWDistributor::distribute(uint32_t remb, uint32_t ssrc,
2020
stream_infos.push_back({stream,
2121
stream->isSimulcast(),
2222
stream->isSlideShowModeEnabled(),
23-
stream->getBitrateSent(),
23+
stream->getVideoBitrate(),
2424
stream->getMaxVideoBW(),
2525
stream->getBitrateFromMaxQualityLayer()});
2626
});

erizo/src/erizo/rtp/StatsHandler.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,11 @@ void StatsCalculator::processRtpPacket(std::shared_ptr<DataPacket> packet) {
5353
}
5454
getStatsInfo()[ssrc]["bitrateCalculated"] += len;
5555
getStatsInfo()["total"]["bitrateCalculated"] += len;
56-
if (packet->type == VIDEO_PACKET && packet->is_keyframe) {
57-
incrStat(ssrc, "keyFrames");
56+
if (packet->type == VIDEO_PACKET) {
57+
stream_->setVideoBitrate(getStatsInfo()[ssrc]["bitrateCalculated"].value());
58+
if (packet->is_keyframe) {
59+
incrStat(ssrc, "keyFrames");
60+
}
5861
}
5962
}
6063

erizo/src/test/bandwidth/TargetVideoBWDistributor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class BasicTargetVideoBWDistributor {
6464
media_stream->setAudioSourceSSRC(audio_source_ssrc);
6565

6666
EXPECT_CALL(*media_stream, getMaxVideoBW()).Times(AtLeast(0)).WillRepeatedly(Return(config.max_video_bw));
67-
EXPECT_CALL(*media_stream, getBitrateSent()).Times(AtLeast(0)).WillRepeatedly(Return(config.bitrate_sent));
67+
EXPECT_CALL(*media_stream, getVideoBitrate()).Times(AtLeast(0)).WillRepeatedly(Return(config.bitrate_sent));
6868
EXPECT_CALL(*media_stream, getBitrateFromMaxQualityLayer()).Times(AtLeast(0))
6969
.WillRepeatedly(Return(config.max_quality_bitrate));
7070
EXPECT_CALL(*media_stream, isSlideShowModeEnabled()).Times(AtLeast(0)).WillRepeatedly(Return(config.slideshow));

erizo/src/test/utils/Mocks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class MockMediaStream: public MediaStream {
107107
}
108108

109109
MOCK_METHOD0(getMaxVideoBW, uint32_t());
110-
MOCK_METHOD0(getBitrateSent, uint32_t());
110+
MOCK_METHOD0(getVideoBitrate, uint32_t());
111111
MOCK_METHOD0(getBitrateFromMaxQualityLayer, uint32_t());
112112
MOCK_METHOD0(isSlideShowModeEnabled, bool());
113113
MOCK_METHOD0(isSimulcast, bool());

0 commit comments

Comments
 (0)