Configure RTX send status on new modules.

Fixes bug where newly-allocated modules wouldn't send payload-based
padding (or probably not send over RTX at all).

As the newly-added test exposed lock-inversions shown on tsan in
VideoReceiver, VideoReceiver was thread-annotated and locks taken less.
BUG=chromium:391085
R=mflodman@webrtc.org, stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/21819004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6601 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pbos@webrtc.org
2014-07-04 10:58:12 +00:00
parent 88e0dda475
commit 20c1f56992
4 changed files with 112 additions and 22 deletions

View File

@ -25,6 +25,7 @@
#include "webrtc/modules/video_coding/main/source/timing.h"
#include "webrtc/system_wrappers/interface/clock.h"
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
#include "webrtc/system_wrappers/interface/thread_annotations.h"
namespace webrtc {
@ -199,21 +200,25 @@ class VideoReceiver {
// in any frame
};
Clock* clock_;
Clock* const clock_;
scoped_ptr<CriticalSectionWrapper> process_crit_sect_;
CriticalSectionWrapper* _receiveCritSect;
bool _receiverInited;
bool _receiverInited GUARDED_BY(_receiveCritSect);
VCMTiming _timing;
VCMTiming _dualTiming;
VCMReceiver _receiver;
VCMReceiver _dualReceiver;
VCMDecodedFrameCallback _decodedFrameCallback;
VCMDecodedFrameCallback _dualDecodedFrameCallback;
VCMFrameTypeCallback* _frameTypeCallback;
VCMReceiveStatisticsCallback* _receiveStatsCallback;
VCMDecoderTimingCallback* _decoderTimingCallback;
VCMPacketRequestCallback* _packetRequestCallback;
VCMRenderBufferSizeCallback* render_buffer_callback_;
VCMFrameTypeCallback* _frameTypeCallback GUARDED_BY(process_crit_sect_);
VCMReceiveStatisticsCallback* _receiveStatsCallback
GUARDED_BY(process_crit_sect_);
VCMDecoderTimingCallback* _decoderTimingCallback
GUARDED_BY(process_crit_sect_);
VCMPacketRequestCallback* _packetRequestCallback
GUARDED_BY(process_crit_sect_);
VCMRenderBufferSizeCallback* render_buffer_callback_
GUARDED_BY(process_crit_sect_);
VCMGenericDecoder* _decoder;
VCMGenericDecoder* _dualDecoder;
#ifdef DEBUG_DECODER_BIT_STREAM
@ -221,9 +226,9 @@ class VideoReceiver {
#endif
VCMFrameBuffer _frameFromFile;
VCMKeyRequestMode _keyRequestMode;
bool _scheduleKeyRequest;
size_t max_nack_list_size_;
EncodedImageCallback* pre_decode_image_callback_;
bool _scheduleKeyRequest GUARDED_BY(process_crit_sect_);
size_t max_nack_list_size_ GUARDED_BY(process_crit_sect_);
EncodedImageCallback* pre_decode_image_callback_ GUARDED_BY(_receiveCritSect);
VCMCodecDataBase _codecDataBase;
VCMProcessTimer _receiveStatsTimer;

View File

@ -271,8 +271,6 @@ int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection,
// Initialize receiver, resets codec database etc
int32_t VideoReceiver::InitializeReceiver() {
CriticalSectionScoped receive_cs(_receiveCritSect);
CriticalSectionScoped process_cs(process_crit_sect_.get());
int32_t ret = _receiver.Initialize();
if (ret < 0) {
return ret;
@ -285,15 +283,22 @@ int32_t VideoReceiver::InitializeReceiver() {
_codecDataBase.ResetReceiver();
_timing.Reset();
_decoder = NULL;
_decodedFrameCallback.SetUserReceiveCallback(NULL);
_receiverInited = true;
_frameTypeCallback = NULL;
_receiveStatsCallback = NULL;
_decoderTimingCallback = NULL;
_packetRequestCallback = NULL;
_keyRequestMode = kKeyOnError;
_scheduleKeyRequest = false;
{
CriticalSectionScoped receive_cs(_receiveCritSect);
_receiverInited = true;
}
{
CriticalSectionScoped process_cs(process_crit_sect_.get());
_decoder = NULL;
_decodedFrameCallback.SetUserReceiveCallback(NULL);
_frameTypeCallback = NULL;
_receiveStatsCallback = NULL;
_decoderTimingCallback = NULL;
_packetRequestCallback = NULL;
_keyRequestMode = kKeyOnError;
_scheduleKeyRequest = false;
}
return VCM_OK;
}
@ -781,7 +786,6 @@ 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 receive_cs(_receiveCritSect);
CriticalSectionScoped process_cs(process_crit_sect_.get());
max_nack_list_size_ = max_nack_list_size;
}