| Index: webrtc/modules/video_coding/video_sender.cc
|
| diff --git a/webrtc/modules/video_coding/video_sender.cc b/webrtc/modules/video_coding/video_sender.cc
|
| index f47c420bd56f73b032d349e285da3c649eafa327..a407c9e3deefb40c381766fcd7c8e6f40e2c755f 100644
|
| --- a/webrtc/modules/video_coding/video_sender.cc
|
| +++ b/webrtc/modules/video_coding/video_sender.cc
|
| @@ -27,12 +27,13 @@ namespace vcm {
|
| VideoSender::VideoSender(Clock* clock,
|
| EncodedImageCallback* post_encode_callback,
|
| VideoEncoderRateObserver* encoder_rate_observer,
|
| - VCMQMSettingsCallback* qm_settings_callback)
|
| + VCMQMSettingsCallback* qm_settings_callback,
|
| + VCMSendStatisticsCallback* send_stats_callback)
|
| : clock_(clock),
|
| _encoder(nullptr),
|
| - _encodedFrameCallback(post_encode_callback),
|
| _mediaOpt(clock_),
|
| - _sendStatsCallback(nullptr),
|
| + _encodedFrameCallback(post_encode_callback, &_mediaOpt),
|
| + send_stats_callback_(send_stats_callback),
|
| _codecDataBase(encoder_rate_observer, &_encodedFrameCallback),
|
| frame_dropper_enabled_(true),
|
| _sendStatsTimer(1000, clock_),
|
| @@ -54,12 +55,19 @@ VideoSender::~VideoSender() {}
|
|
|
| void VideoSender::Process() {
|
| if (_sendStatsTimer.TimeUntilProcess() == 0) {
|
| + // |_sendStatsTimer.Processed()| must be called. Otherwise
|
| + // VideoSender::Process() will be called in an infinite loop.
|
| _sendStatsTimer.Processed();
|
| - rtc::CritScope cs(&process_crit_);
|
| - if (_sendStatsCallback != nullptr) {
|
| + if (send_stats_callback_) {
|
| uint32_t bitRate = _mediaOpt.SentBitRate();
|
| uint32_t frameRate = _mediaOpt.SentFrameRate();
|
| - _sendStatsCallback->SendStatistics(bitRate, frameRate);
|
| + std::string encoder_name;
|
| + {
|
| + rtc::CritScope cs(¶ms_crit_);
|
| + // Copy the string here so that we don't hold |params_crit_| in the CB.
|
| + encoder_name = encoder_name_;
|
| + }
|
| + send_stats_callback_->SendStatistics(bitRate, frameRate, encoder_name);
|
| }
|
| }
|
|
|
| @@ -235,24 +243,6 @@ void VideoSender::SetEncoderParameters(EncoderParameters params) {
|
| _encoder->SetEncoderParameters(params);
|
| }
|
|
|
| -int32_t VideoSender::RegisterTransportCallback(
|
| - VCMPacketizationCallback* transport) {
|
| - rtc::CritScope lock(&encoder_crit_);
|
| - _encodedFrameCallback.SetMediaOpt(&_mediaOpt);
|
| - _encodedFrameCallback.SetTransportCallback(transport);
|
| - return VCM_OK;
|
| -}
|
| -
|
| -// Register video output information callback which will be called to deliver
|
| -// information about the video stream produced by the encoder, for instance the
|
| -// average frame rate and bit rate.
|
| -int32_t VideoSender::RegisterSendStatisticsCallback(
|
| - VCMSendStatisticsCallback* sendStats) {
|
| - rtc::CritScope cs(&process_crit_);
|
| - _sendStatsCallback = sendStats;
|
| - return VCM_OK;
|
| -}
|
| -
|
| // Register a video protection callback which will be called to deliver the
|
| // requested FEC rate and NACK status (on/off).
|
| // Note: this callback is assumed to only be registered once and before it is
|
| @@ -329,9 +319,12 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
|
| LOG(LS_ERROR) << "Failed to encode frame. Error code: " << ret;
|
| return ret;
|
| }
|
| +
|
| {
|
| - // Change all keyframe requests to encode delta frames the next time.
|
| rtc::CritScope lock(¶ms_crit_);
|
| + encoder_name_ = _encoder->ImplementationName();
|
| +
|
| + // Change all keyframe requests to encode delta frames the next time.
|
| for (size_t i = 0; i < next_frame_types_.size(); ++i) {
|
| // Check for equality (same requested as before encoding) to not
|
| // accidentally drop a keyframe request while encoding.
|
|
|