Index: talk/media/webrtc/fakewebrtcvideoengine.h |
diff --git a/talk/media/webrtc/fakewebrtcvideoengine.h b/talk/media/webrtc/fakewebrtcvideoengine.h |
index e0d4db52f849b4b9e25233a4cf20751b52206419..1fee5e3957fb5529ce6b246fd308f555d892a81f 100644 |
--- a/talk/media/webrtc/fakewebrtcvideoengine.h |
+++ b/talk/media/webrtc/fakewebrtcvideoengine.h |
@@ -56,6 +56,7 @@ static const int kMaxVideoBitrate = 1000; |
// renderer for a channel or it is adding a renderer for a capturer. |
static const int kViEChannelIdBase = 0; |
static const int kViEChannelIdMax = 1000; |
+static const int kEventTimeoutMs = 10000; |
// Fake class for mocking out webrtc::VideoDecoder |
class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder { |
@@ -140,16 +141,20 @@ class FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory { |
// Fake class for mocking out webrtc::VideoEnoder |
class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { |
public: |
- FakeWebRtcVideoEncoder() : num_frames_encoded_(0) {} |
+ FakeWebRtcVideoEncoder() |
+ : init_encode_event_(false, false), num_frames_encoded_(0) {} |
virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings, |
int32_t numberOfCores, |
size_t maxPayloadSize) { |
rtc::CritScope lock(&crit_); |
codec_settings_ = *codecSettings; |
+ init_encode_event_.Set(); |
return WEBRTC_VIDEO_CODEC_OK; |
} |
+ bool WaitForInitEncode() { return init_encode_event_.Wait(kEventTimeoutMs); } |
+ |
webrtc::VideoCodec GetCodecSettings() { |
rtc::CritScope lock(&crit_); |
return codec_settings_; |
@@ -185,6 +190,7 @@ class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { |
private: |
rtc::CriticalSection crit_; |
+ rtc::Event init_encode_event_; |
int num_frames_encoded_ GUARDED_BY(crit_); |
webrtc::VideoCodec codec_settings_ GUARDED_BY(crit_); |
}; |
@@ -193,20 +199,29 @@ class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder { |
class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory { |
public: |
FakeWebRtcVideoEncoderFactory() |
- : num_created_encoders_(0), encoders_have_internal_sources_(false) {} |
+ : created_video_encoder_event_(false, false), |
+ num_created_encoders_(0), |
+ encoders_have_internal_sources_(false) {} |
virtual webrtc::VideoEncoder* CreateVideoEncoder( |
webrtc::VideoCodecType type) { |
+ rtc::CritScope lock(&crit_); |
stefan-webrtc
2016/01/19 12:02:09
Why is this crit_ needed now? Maybe you could docu
pbos-webrtc
2016/01/19 15:27:57
Because the encoder factory can be called from Sim
|
if (supported_codec_types_.count(type) == 0) { |
return NULL; |
} |
FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder(); |
encoders_.push_back(encoder); |
num_created_encoders_++; |
+ created_video_encoder_event_.Set(); |
return encoder; |
} |
+ bool WaitForCreatedVideoEncoder() { |
+ return created_video_encoder_event_.Wait(kEventTimeoutMs); |
+ } |
+ |
virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) { |
+ rtc::CritScope lock(&crit_); |
encoders_.erase( |
std::remove(encoders_.begin(), encoders_.end(), encoder), |
encoders_.end()); |
@@ -235,18 +250,22 @@ class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory { |
} |
int GetNumCreatedEncoders() { |
+ rtc::CritScope lock(&crit_); |
return num_created_encoders_; |
} |
- const std::vector<FakeWebRtcVideoEncoder*>& encoders() { |
+ const std::vector<FakeWebRtcVideoEncoder*> encoders() { |
+ rtc::CritScope lock(&crit_); |
return encoders_; |
} |
private: |
+ rtc::CriticalSection crit_; |
+ rtc::Event created_video_encoder_event_; |
std::set<webrtc::VideoCodecType> supported_codec_types_; |
std::vector<WebRtcVideoEncoderFactory::VideoCodec> codecs_; |
- std::vector<FakeWebRtcVideoEncoder*> encoders_; |
- int num_created_encoders_; |
+ std::vector<FakeWebRtcVideoEncoder*> encoders_ GUARDED_BY(crit_); |
+ int num_created_encoders_ GUARDED_BY(crit_); |
bool encoders_have_internal_sources_; |
}; |