Added functions on libjingle API to start and stop the recording of an RtcEventLog.
BUG=webrtc:4741 Review URL: https://codereview.webrtc.org/1374253002 Cr-Commit-Position: refs/heads/master@{#10297}
This commit is contained in:
@ -218,6 +218,16 @@ bool PeerConnectionFactory::StartAecDump(rtc::PlatformFile file) {
|
|||||||
return channel_manager_->StartAecDump(file);
|
return channel_manager_->StartAecDump(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PeerConnectionFactory::StartRtcEventLog(rtc::PlatformFile file) {
|
||||||
|
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||||
|
return channel_manager_->StartRtcEventLog(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PeerConnectionFactory::StopRtcEventLog() {
|
||||||
|
RTC_DCHECK(signaling_thread_->IsCurrent());
|
||||||
|
channel_manager_->StopRtcEventLog();
|
||||||
|
}
|
||||||
|
|
||||||
rtc::scoped_refptr<PeerConnectionInterface>
|
rtc::scoped_refptr<PeerConnectionInterface>
|
||||||
PeerConnectionFactory::CreatePeerConnection(
|
PeerConnectionFactory::CreatePeerConnection(
|
||||||
const PeerConnectionInterface::RTCConfiguration& configuration,
|
const PeerConnectionInterface::RTCConfiguration& configuration,
|
||||||
|
@ -80,6 +80,8 @@ class PeerConnectionFactory : public PeerConnectionFactoryInterface {
|
|||||||
AudioSourceInterface* audio_source) override;
|
AudioSourceInterface* audio_source) override;
|
||||||
|
|
||||||
bool StartAecDump(rtc::PlatformFile file) override;
|
bool StartAecDump(rtc::PlatformFile file) override;
|
||||||
|
bool StartRtcEventLog(rtc::PlatformFile file) override;
|
||||||
|
void StopRtcEventLog() override;
|
||||||
|
|
||||||
virtual webrtc::MediaControllerInterface* CreateMediaController() const;
|
virtual webrtc::MediaControllerInterface* CreateMediaController() const;
|
||||||
virtual rtc::Thread* signaling_thread();
|
virtual rtc::Thread* signaling_thread();
|
||||||
|
@ -62,6 +62,8 @@ BEGIN_PROXY_MAP(PeerConnectionFactory)
|
|||||||
PROXY_METHOD2(rtc::scoped_refptr<AudioTrackInterface>,
|
PROXY_METHOD2(rtc::scoped_refptr<AudioTrackInterface>,
|
||||||
CreateAudioTrack, const std::string&, AudioSourceInterface*)
|
CreateAudioTrack, const std::string&, AudioSourceInterface*)
|
||||||
PROXY_METHOD1(bool, StartAecDump, rtc::PlatformFile)
|
PROXY_METHOD1(bool, StartAecDump, rtc::PlatformFile)
|
||||||
|
PROXY_METHOD1(bool, StartRtcEventLog, rtc::PlatformFile)
|
||||||
|
PROXY_METHOD0(void, StopRtcEventLog)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection_ot(
|
rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection_ot(
|
||||||
|
@ -619,6 +619,22 @@ class PeerConnectionFactoryInterface : public rtc::RefCountInterface {
|
|||||||
// http://crbug.com/264611.
|
// http://crbug.com/264611.
|
||||||
virtual bool StartAecDump(rtc::PlatformFile file) = 0;
|
virtual bool StartAecDump(rtc::PlatformFile file) = 0;
|
||||||
|
|
||||||
|
// Starts RtcEventLog using existing file. Takes ownership of |file| and
|
||||||
|
// passes it on to VoiceEngine, which will take the ownership. If the
|
||||||
|
// operation fails the file will be closed. The logging will stop
|
||||||
|
// automatically after 10 minutes have passed, or when the StopRtcEventLog
|
||||||
|
// function is called.
|
||||||
|
// This function as well as the StopRtcEventLog don't really belong on this
|
||||||
|
// interface, this is a temporary solution until we move the logging object
|
||||||
|
// from inside voice engine to webrtc::Call, which will happen when the VoE
|
||||||
|
// restructuring effort is further along.
|
||||||
|
// TODO(ivoc): Move this into being:
|
||||||
|
// PeerConnection => MediaController => webrtc::Call.
|
||||||
|
virtual bool StartRtcEventLog(rtc::PlatformFile file) = 0;
|
||||||
|
|
||||||
|
// Stops logging the RtcEventLog.
|
||||||
|
virtual void StopRtcEventLog() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Dtor and ctor protected as objects shouldn't be created or deleted via
|
// Dtor and ctor protected as objects shouldn't be created or deleted via
|
||||||
// this interface.
|
// this interface.
|
||||||
|
@ -785,6 +785,10 @@ class FakeVoiceEngine : public FakeBaseEngine {
|
|||||||
|
|
||||||
bool StartAecDump(rtc::PlatformFile file) { return false; }
|
bool StartAecDump(rtc::PlatformFile file) { return false; }
|
||||||
|
|
||||||
|
bool StartRtcEventLog(rtc::PlatformFile file) { return false; }
|
||||||
|
|
||||||
|
void StopRtcEventLog() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<FakeVoiceMediaChannel*> channels_;
|
std::vector<FakeVoiceMediaChannel*> channels_;
|
||||||
std::vector<AudioCodec> codecs_;
|
std::vector<AudioCodec> codecs_;
|
||||||
|
@ -121,6 +121,12 @@ class MediaEngineInterface {
|
|||||||
|
|
||||||
// Starts AEC dump using existing file.
|
// Starts AEC dump using existing file.
|
||||||
virtual bool StartAecDump(rtc::PlatformFile file) = 0;
|
virtual bool StartAecDump(rtc::PlatformFile file) = 0;
|
||||||
|
|
||||||
|
// Starts RtcEventLog using existing file.
|
||||||
|
virtual bool StartRtcEventLog(rtc::PlatformFile file) = 0;
|
||||||
|
|
||||||
|
// Stops recording an RtcEventLog.
|
||||||
|
virtual void StopRtcEventLog() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -219,6 +225,12 @@ class CompositeMediaEngine : public MediaEngineInterface {
|
|||||||
return voice_.StartAecDump(file);
|
return voice_.StartAecDump(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool StartRtcEventLog(rtc::PlatformFile file) {
|
||||||
|
return voice_.StartRtcEventLog(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void StopRtcEventLog() { voice_.StopRtcEventLog(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VOICE voice_;
|
VOICE voice_;
|
||||||
VIDEO video_;
|
VIDEO video_;
|
||||||
@ -251,6 +263,8 @@ class NullVoiceEngine {
|
|||||||
}
|
}
|
||||||
void SetLogging(int min_sev, const char* filter) {}
|
void SetLogging(int min_sev, const char* filter) {}
|
||||||
bool StartAecDump(rtc::PlatformFile file) { return false; }
|
bool StartAecDump(rtc::PlatformFile file) { return false; }
|
||||||
|
bool StartRtcEventLog(rtc::PlatformFile file) { return false; }
|
||||||
|
void StopRtcEventLog() {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<AudioCodec> codecs_;
|
std::vector<AudioCodec> codecs_;
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
#include "webrtc/base/logging.h"
|
#include "webrtc/base/logging.h"
|
||||||
#include "webrtc/base/stringencode.h"
|
#include "webrtc/base/stringencode.h"
|
||||||
#include "webrtc/base/stringutils.h"
|
#include "webrtc/base/stringutils.h"
|
||||||
|
#include "webrtc/call/rtc_event_log.h"
|
||||||
#include "webrtc/common.h"
|
#include "webrtc/common.h"
|
||||||
#include "webrtc/modules/audio_processing/include/audio_processing.h"
|
#include "webrtc/modules/audio_processing/include/audio_processing.h"
|
||||||
#include "webrtc/system_wrappers/interface/field_trial.h"
|
#include "webrtc/system_wrappers/interface/field_trial.h"
|
||||||
@ -1306,6 +1307,14 @@ void WebRtcVoiceEngine::StopAecDump() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WebRtcVoiceEngine::StartRtcEventLog(rtc::PlatformFile file) {
|
||||||
|
return voe_wrapper_->codec()->GetEventLog()->StartLogging(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebRtcVoiceEngine::StopRtcEventLog() {
|
||||||
|
voe_wrapper_->codec()->GetEventLog()->StopLogging();
|
||||||
|
}
|
||||||
|
|
||||||
int WebRtcVoiceEngine::CreateVoiceChannel(VoEWrapper* voice_engine_wrapper) {
|
int WebRtcVoiceEngine::CreateVoiceChannel(VoEWrapper* voice_engine_wrapper) {
|
||||||
return voice_engine_wrapper->base()->CreateChannel(voe_config_);
|
return voice_engine_wrapper->base()->CreateChannel(voe_config_);
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,13 @@ class WebRtcVoiceEngine
|
|||||||
// Starts AEC dump using existing file.
|
// Starts AEC dump using existing file.
|
||||||
bool StartAecDump(rtc::PlatformFile file);
|
bool StartAecDump(rtc::PlatformFile file);
|
||||||
|
|
||||||
|
// Starts recording an RtcEventLog using an existing file until 10 minutes
|
||||||
|
// pass or the StopRtcEventLog function is called.
|
||||||
|
bool StartRtcEventLog(rtc::PlatformFile file);
|
||||||
|
|
||||||
|
// Stops recording the RtcEventLog.
|
||||||
|
void StopRtcEventLog();
|
||||||
|
|
||||||
// Create a VoiceEngine Channel.
|
// Create a VoiceEngine Channel.
|
||||||
int CreateMediaVoiceChannel();
|
int CreateMediaVoiceChannel();
|
||||||
|
|
||||||
|
@ -630,4 +630,14 @@ bool ChannelManager::StartAecDump(rtc::PlatformFile file) {
|
|||||||
Bind(&MediaEngineInterface::StartAecDump, media_engine_.get(), file));
|
Bind(&MediaEngineInterface::StartAecDump, media_engine_.get(), file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChannelManager::StartRtcEventLog(rtc::PlatformFile file) {
|
||||||
|
return worker_thread_->Invoke<bool>(
|
||||||
|
Bind(&MediaEngineInterface::StartRtcEventLog, media_engine_.get(), file));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelManager::StopRtcEventLog() {
|
||||||
|
worker_thread_->Invoke<void>(
|
||||||
|
Bind(&MediaEngineInterface::StopRtcEventLog, media_engine_.get()));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace cricket
|
} // namespace cricket
|
||||||
|
@ -170,6 +170,12 @@ class ChannelManager : public rtc::MessageHandler,
|
|||||||
// Starts AEC dump using existing file.
|
// Starts AEC dump using existing file.
|
||||||
bool StartAecDump(rtc::PlatformFile file);
|
bool StartAecDump(rtc::PlatformFile file);
|
||||||
|
|
||||||
|
// Starts RtcEventLog using existing file.
|
||||||
|
bool StartRtcEventLog(rtc::PlatformFile file);
|
||||||
|
|
||||||
|
// Stops logging RtcEventLog.
|
||||||
|
void StopRtcEventLog();
|
||||||
|
|
||||||
sigslot::signal2<VideoCapturer*, CaptureState> SignalVideoCaptureStateChange;
|
sigslot::signal2<VideoCapturer*, CaptureState> SignalVideoCaptureStateChange;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -37,6 +37,7 @@ namespace webrtc {
|
|||||||
class RtcEventLogImpl final : public RtcEventLog {
|
class RtcEventLogImpl final : public RtcEventLog {
|
||||||
public:
|
public:
|
||||||
void StartLogging(const std::string& file_name, int duration_ms) override {}
|
void StartLogging(const std::string& file_name, int duration_ms) override {}
|
||||||
|
bool StartLogging(rtc::PlatformFile log_file) override { return false; }
|
||||||
void StopLogging(void) override {}
|
void StopLogging(void) override {}
|
||||||
void LogVideoReceiveStreamConfig(
|
void LogVideoReceiveStreamConfig(
|
||||||
const VideoReceiveStream::Config& config) override {}
|
const VideoReceiveStream::Config& config) override {}
|
||||||
@ -57,9 +58,8 @@ class RtcEventLogImpl final : public RtcEventLog {
|
|||||||
|
|
||||||
class RtcEventLogImpl final : public RtcEventLog {
|
class RtcEventLogImpl final : public RtcEventLog {
|
||||||
public:
|
public:
|
||||||
RtcEventLogImpl();
|
|
||||||
|
|
||||||
void StartLogging(const std::string& file_name, int duration_ms) override;
|
void StartLogging(const std::string& file_name, int duration_ms) override;
|
||||||
|
bool StartLogging(rtc::PlatformFile log_file) override;
|
||||||
void StopLogging() override;
|
void StopLogging() override;
|
||||||
void LogVideoReceiveStreamConfig(
|
void LogVideoReceiveStreamConfig(
|
||||||
const VideoReceiveStream::Config& config) override;
|
const VideoReceiveStream::Config& config) override;
|
||||||
@ -75,6 +75,9 @@ class RtcEventLogImpl final : public RtcEventLog {
|
|||||||
void LogAudioPlayout(uint32_t ssrc) override;
|
void LogAudioPlayout(uint32_t ssrc) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// Starts logging. This function assumes the file_ has been opened succesfully
|
||||||
|
// and that the start_time_us_ and _duration_us_ have been set.
|
||||||
|
void StartLoggingLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_);
|
||||||
// Stops logging and clears the stored data and buffers.
|
// Stops logging and clears the stored data and buffers.
|
||||||
void StopLoggingLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_);
|
void StopLoggingLocked() EXCLUSIVE_LOCKS_REQUIRED(crit_);
|
||||||
// Adds a new event to the logfile if logging is active, or adds it to the
|
// Adds a new event to the logfile if logging is active, or adds it to the
|
||||||
@ -93,13 +96,16 @@ class RtcEventLogImpl final : public RtcEventLog {
|
|||||||
const int recent_log_duration_us = 10000000;
|
const int recent_log_duration_us = 10000000;
|
||||||
|
|
||||||
rtc::CriticalSection crit_;
|
rtc::CriticalSection crit_;
|
||||||
rtc::scoped_ptr<FileWrapper> file_ GUARDED_BY(crit_);
|
rtc::scoped_ptr<FileWrapper> file_ GUARDED_BY(crit_) =
|
||||||
|
rtc::scoped_ptr<FileWrapper>(FileWrapper::Create());
|
||||||
|
rtc::PlatformFile platform_file_ GUARDED_BY(crit_) =
|
||||||
|
rtc::kInvalidPlatformFileValue;
|
||||||
rtclog::EventStream stream_ GUARDED_BY(crit_);
|
rtclog::EventStream stream_ GUARDED_BY(crit_);
|
||||||
std::deque<rtclog::Event> recent_log_events_ GUARDED_BY(crit_);
|
std::deque<rtclog::Event> recent_log_events_ GUARDED_BY(crit_);
|
||||||
bool currently_logging_ GUARDED_BY(crit_);
|
bool currently_logging_ GUARDED_BY(crit_) = false;
|
||||||
int64_t start_time_us_ GUARDED_BY(crit_);
|
int64_t start_time_us_ GUARDED_BY(crit_) = 0;
|
||||||
int64_t duration_us_ GUARDED_BY(crit_);
|
int64_t duration_us_ GUARDED_BY(crit_) = 0;
|
||||||
const Clock* const clock_;
|
const Clock* const clock_ = Clock::GetRealTimeClock();
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -143,14 +149,6 @@ rtclog::MediaType ConvertMediaType(MediaType media_type) {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// RtcEventLogImpl member functions.
|
// RtcEventLogImpl member functions.
|
||||||
RtcEventLogImpl::RtcEventLogImpl()
|
|
||||||
: file_(FileWrapper::Create()),
|
|
||||||
stream_(),
|
|
||||||
currently_logging_(false),
|
|
||||||
start_time_us_(0),
|
|
||||||
duration_us_(0),
|
|
||||||
clock_(Clock::GetRealTimeClock()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void RtcEventLogImpl::StartLogging(const std::string& file_name,
|
void RtcEventLogImpl::StartLogging(const std::string& file_name,
|
||||||
int duration_ms) {
|
int duration_ms) {
|
||||||
@ -161,9 +159,39 @@ void RtcEventLogImpl::StartLogging(const std::string& file_name,
|
|||||||
if (file_->OpenFile(file_name.c_str(), false) != 0) {
|
if (file_->OpenFile(file_name.c_str(), false) != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
currently_logging_ = true;
|
|
||||||
start_time_us_ = clock_->TimeInMicroseconds();
|
start_time_us_ = clock_->TimeInMicroseconds();
|
||||||
duration_us_ = static_cast<int64_t>(duration_ms) * 1000;
|
duration_us_ = static_cast<int64_t>(duration_ms) * 1000;
|
||||||
|
StartLoggingLocked();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RtcEventLogImpl::StartLogging(rtc::PlatformFile log_file) {
|
||||||
|
rtc::CritScope lock(&crit_);
|
||||||
|
|
||||||
|
if (currently_logging_) {
|
||||||
|
StopLoggingLocked();
|
||||||
|
}
|
||||||
|
RTC_DCHECK(platform_file_ == rtc::kInvalidPlatformFileValue);
|
||||||
|
|
||||||
|
FILE* file_stream = rtc::FdopenPlatformFileForWriting(log_file);
|
||||||
|
if (!file_stream) {
|
||||||
|
rtc::ClosePlatformFile(log_file);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_->OpenFromFileHandle(file_stream, true, false) != 0) {
|
||||||
|
rtc::ClosePlatformFile(log_file);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
platform_file_ = log_file;
|
||||||
|
// Set the start time and duration to keep logging for 10 minutes.
|
||||||
|
start_time_us_ = clock_->TimeInMicroseconds();
|
||||||
|
duration_us_ = 10 * 60 * 1000000;
|
||||||
|
StartLoggingLocked();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RtcEventLogImpl::StartLoggingLocked() {
|
||||||
|
currently_logging_ = true;
|
||||||
// Write all the recent events to the log file, ignoring any old events.
|
// Write all the recent events to the log file, ignoring any old events.
|
||||||
for (auto& event : recent_log_events_) {
|
for (auto& event : recent_log_events_) {
|
||||||
if (event.timestamp_us() >= start_time_us_ - recent_log_duration_us) {
|
if (event.timestamp_us() >= start_time_us_ - recent_log_duration_us) {
|
||||||
@ -339,6 +367,10 @@ void RtcEventLogImpl::StopLoggingLocked() {
|
|||||||
RTC_DCHECK(file_->Open());
|
RTC_DCHECK(file_->Open());
|
||||||
StoreToFile(&event);
|
StoreToFile(&event);
|
||||||
file_->CloseFile();
|
file_->CloseFile();
|
||||||
|
if (platform_file_ != rtc::kInvalidPlatformFileValue) {
|
||||||
|
rtc::ClosePlatformFile(platform_file_);
|
||||||
|
platform_file_ = rtc::kInvalidPlatformFileValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
RTC_DCHECK(!file_->Open());
|
RTC_DCHECK(!file_->Open());
|
||||||
stream_.Clear();
|
stream_.Clear();
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "webrtc/base/platform_file.h"
|
||||||
#include "webrtc/base/scoped_ptr.h"
|
#include "webrtc/base/scoped_ptr.h"
|
||||||
#include "webrtc/video_receive_stream.h"
|
#include "webrtc/video_receive_stream.h"
|
||||||
#include "webrtc/video_send_stream.h"
|
#include "webrtc/video_send_stream.h"
|
||||||
@ -41,6 +42,11 @@ class RtcEventLog {
|
|||||||
// If the file cannot be opened, the RtcEventLog will not start logging.
|
// If the file cannot be opened, the RtcEventLog will not start logging.
|
||||||
virtual void StartLogging(const std::string& file_name, int duration_ms) = 0;
|
virtual void StartLogging(const std::string& file_name, int duration_ms) = 0;
|
||||||
|
|
||||||
|
// Starts logging until either the 10 minute timer runs out or the StopLogging
|
||||||
|
// function is called. The RtcEventLog takes ownership of the supplied
|
||||||
|
// rtc::PlatformFile.
|
||||||
|
virtual bool StartLogging(rtc::PlatformFile log_file) = 0;
|
||||||
|
|
||||||
virtual void StopLogging() = 0;
|
virtual void StopLogging() = 0;
|
||||||
|
|
||||||
// Logs configuration information for webrtc::VideoReceiveStream
|
// Logs configuration information for webrtc::VideoReceiveStream
|
||||||
|
Reference in New Issue
Block a user