diff options
author | stefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-18 11:57:34 +0000 |
---|---|---|
committer | stefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-18 11:57:34 +0000 |
commit | c2c8e6a059762f5d9a2cd9bcc89432be372426fe (patch) | |
tree | 9f833470c46ff7b3c5b7c9a484f4b8775ac64cf7 /modules/video_coding | |
parent | 1ddd57f2065eb52f8eb7edfbb4653fb399ce9c74 (diff) | |
download | webrtc-c2c8e6a059762f5d9a2cd9bcc89432be372426fe.tar.gz |
Fix races in vcm::Process().
R=pbos@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/2241004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4775 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'modules/video_coding')
-rw-r--r-- | modules/video_coding/main/source/video_coding_impl.h | 2 | ||||
-rw-r--r-- | modules/video_coding/main/source/video_receiver.cc | 27 | ||||
-rw-r--r-- | modules/video_coding/main/source/video_sender.cc | 4 |
3 files changed, 24 insertions, 9 deletions
diff --git a/modules/video_coding/main/source/video_coding_impl.h b/modules/video_coding/main/source/video_coding_impl.h index 1ead48d6..53005898 100644 --- a/modules/video_coding/main/source/video_coding_impl.h +++ b/modules/video_coding/main/source/video_coding_impl.h @@ -102,6 +102,7 @@ class VideoSender { int32_t _id; Clock* clock_; + scoped_ptr<CriticalSectionWrapper> process_crit_sect_; CriticalSectionWrapper* _sendCritSect; VCMGenericEncoder* _encoder; VCMEncodedFrameCallback _encodedFrameCallback; @@ -184,6 +185,7 @@ class VideoReceiver { int32_t _id; Clock* clock_; + scoped_ptr<CriticalSectionWrapper> process_crit_sect_; CriticalSectionWrapper* _receiveCritSect; bool _receiverInited; VCMTiming _timing; diff --git a/modules/video_coding/main/source/video_receiver.cc b/modules/video_coding/main/source/video_receiver.cc index 03f6ab1e..7528aabf 100644 --- a/modules/video_coding/main/source/video_receiver.cc +++ b/modules/video_coding/main/source/video_receiver.cc @@ -29,6 +29,7 @@ VideoReceiver::VideoReceiver(const int32_t id, EventFactory* event_factory) : _id(id), clock_(clock), + process_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), _receiveCritSect(CriticalSectionWrapper::CreateCriticalSection()), _receiverInited(false), _timing(clock_, id, 1), @@ -76,6 +77,7 @@ int32_t VideoReceiver::Process() { // Receive-side statistics if (_receiveStatsTimer.TimeUntilProcess() == 0) { _receiveStatsTimer.Processed(); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_receiveStatsCallback != NULL) { uint32_t bitRate; uint32_t frameRate; @@ -93,6 +95,7 @@ int32_t VideoReceiver::Process() { // Key frame requests if (_keyRequestTimer.TimeUntilProcess() == 0) { _keyRequestTimer.Processed(); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_scheduleKeyRequest && _frameTypeCallback != NULL) { const int32_t ret = RequestKeyFrame(); if (ret != VCM_OK && returnValue == VCM_OK) { @@ -106,7 +109,7 @@ int32_t VideoReceiver::Process() { // disabled when NACK is off. if (_retransmissionTimer.TimeUntilProcess() == 0) { _retransmissionTimer.Processed(); - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_packetRequestCallback != NULL) { uint16_t length = max_nack_list_size_; std::vector<uint16_t> nackList(length); @@ -233,7 +236,8 @@ int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection, // Initialize receiver, resets codec database etc int32_t VideoReceiver::InitializeReceiver() { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped receive_cs(_receiveCritSect); + CriticalSectionScoped process_cs(process_crit_sect_.get()); int32_t ret = _receiver.Initialize(); if (ret < 0) { return ret; @@ -269,7 +273,7 @@ int32_t VideoReceiver::RegisterReceiveCallback( int32_t VideoReceiver::RegisterReceiveStatisticsCallback( VCMReceiveStatisticsCallback* receiveStats) { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); _receiveStatsCallback = receiveStats; return VCM_OK; } @@ -294,21 +298,21 @@ int32_t VideoReceiver::RegisterExternalDecoder(VideoDecoder* externalDecoder, // Register a frame type request callback. int32_t VideoReceiver::RegisterFrameTypeCallback( VCMFrameTypeCallback* frameTypeCallback) { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); _frameTypeCallback = frameTypeCallback; return VCM_OK; } int32_t VideoReceiver::RegisterPacketRequestCallback( VCMPacketRequestCallback* callback) { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); _packetRequestCallback = callback; return VCM_OK; } int VideoReceiver::RegisterRenderBufferSizeCallback( VCMRenderBufferSizeCallback* callback) { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); render_buffer_callback_ = callback; return VCM_OK; } @@ -386,6 +390,7 @@ int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) { int32_t VideoReceiver::RequestSliceLossIndication( const uint64_t pictureID) const { TRACE_EVENT1("webrtc", "RequestSLI", "picture_id", pictureID); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_frameTypeCallback != NULL) { const int32_t ret = _frameTypeCallback->SliceLossIndicationRequest(pictureID); @@ -408,6 +413,7 @@ int32_t VideoReceiver::RequestSliceLossIndication( int32_t VideoReceiver::RequestKeyFrame() { TRACE_EVENT0("webrtc", "RequestKeyFrame"); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_frameTypeCallback != NULL) { const int32_t ret = _frameTypeCallback->RequestKeyFrame(); if (ret < 0) { @@ -519,6 +525,7 @@ int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) { _decodedFrameCallback.LastReceivedPictureID() + 1); } if (!frame.Complete() || frame.MissingFrame()) { + CriticalSectionScoped cs(process_crit_sect_.get()); switch (_keyRequestMode) { case kKeyOnKeyLoss: { if (frame.FrameType() == kVideoFrameKey) { @@ -545,7 +552,10 @@ int32_t VideoReceiver::ResetDecoder() { if (_decoder != NULL) { _receiver.Initialize(); _timing.Reset(); - _scheduleKeyRequest = false; + { + CriticalSectionScoped cs(process_crit_sect_.get()); + _scheduleKeyRequest = false; + } _decoder->Reset(); } if (_dualReceiver.State() != kPassive) { @@ -758,7 +768,8 @@ void VideoReceiver::SetNackSettings(size_t max_nack_list_size, int max_packet_age_to_nack, int max_incomplete_time_ms) { if (max_nack_list_size != 0) { - CriticalSectionScoped cs(_receiveCritSect); + CriticalSectionScoped receive_cs(_receiveCritSect); + CriticalSectionScoped process_cs(process_crit_sect_.get()); max_nack_list_size_ = max_nack_list_size; } _receiver.SetNackSettings( diff --git a/modules/video_coding/main/source/video_sender.cc b/modules/video_coding/main/source/video_sender.cc index f83a3d2b..c5d6d41d 100644 --- a/modules/video_coding/main/source/video_sender.cc +++ b/modules/video_coding/main/source/video_sender.cc @@ -22,6 +22,7 @@ namespace vcm { VideoSender::VideoSender(const int32_t id, Clock* clock) : _id(id), clock_(clock), + process_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), _sendCritSect(CriticalSectionWrapper::CreateCriticalSection()), _encoder(), _encodedFrameCallback(), @@ -45,6 +46,7 @@ int32_t VideoSender::Process() { if (_sendStatsTimer.TimeUntilProcess() == 0) { _sendStatsTimer.Processed(); + CriticalSectionScoped cs(process_crit_sect_.get()); if (_sendStatsCallback != NULL) { uint32_t bitRate; uint32_t frameRate; @@ -235,7 +237,7 @@ int32_t VideoSender::RegisterTransportCallback( // average frame rate and bit rate. int32_t VideoSender::RegisterSendStatisticsCallback( VCMSendStatisticsCallback* sendStats) { - CriticalSectionScoped cs(_sendCritSect); + CriticalSectionScoped cs(process_crit_sect_.get()); _sendStatsCallback = sendStats; return VCM_OK; } |