Index: chrome/renderer/media/cast_session_delegate.cc |
diff --git a/chrome/renderer/media/cast_session_delegate.cc b/chrome/renderer/media/cast_session_delegate.cc |
index 919324966b54de06f43a3120c02fc1665b98d290..3cdebdc7ecfbf03807744d51012238de831af196 100644 |
--- a/chrome/renderer/media/cast_session_delegate.cc |
+++ b/chrome/renderer/media/cast_session_delegate.cc |
@@ -13,11 +13,9 @@ |
#include "media/cast/cast_config.h" |
#include "media/cast/cast_environment.h" |
#include "media/cast/cast_sender.h" |
-#include "media/cast/logging/encoding_event_subscriber.h" |
#include "media/cast/logging/log_serializer.h" |
#include "media/cast/logging/logging_defines.h" |
-#include "media/cast/logging/stats_event_subscriber.h" |
-#include "media/cast/logging/stats_util.h" |
+#include "media/cast/logging/receiver_time_offset_estimator_impl.h" |
#include "media/cast/transport/cast_transport_config.h" |
#include "media/cast/transport/cast_transport_sender.h" |
@@ -51,17 +49,6 @@ CastSessionDelegate::CastSessionDelegate() |
CastSessionDelegate::~CastSessionDelegate() { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
- |
- if (cast_environment_.get()) { |
- if (audio_event_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- audio_event_subscriber_.get()); |
- } |
- if (video_event_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- video_event_subscriber_.get()); |
- } |
- } |
} |
void CastSessionDelegate::StartAudio( |
@@ -129,6 +116,8 @@ void CastSessionDelegate::StartUDP(const net::IPEndPoint& remote_endpoint) { |
g_cast_threads.Get().GetAudioEncodeMessageLoopProxy(), |
g_cast_threads.Get().GetVideoEncodeMessageLoopProxy()); |
+ event_subscribers_.reset(new RawEventSubscriberBundle(cast_environment_)); |
+ |
// Rationale for using unretained: The callback cannot be called after the |
// destruction of CastTransportSenderIPC, and they both share the same thread. |
cast_transport_.reset(new CastTransportSenderIPC( |
@@ -141,63 +130,100 @@ void CastSessionDelegate::StartUDP(const net::IPEndPoint& remote_endpoint) { |
cast_transport_->SetPacketReceiver(cast_sender_->packet_receiver()); |
} |
+RawEventSubscriberBundleForStream::RawEventSubscriberBundleForStream( |
+ bool is_audio, |
+ media::cast::ReceiverTimeOffsetEstimator* offset_estimator, |
+ const scoped_refptr<media::cast::CastEnvironment>& cast_environment) |
+ : cast_environment_(cast_environment), |
+ event_subscriber_( |
+ is_audio ? media::cast::AUDIO_EVENT : media::cast::VIDEO_EVENT, |
+ is_audio ? kMaxAudioEventEntries : kMaxVideoEventEntries), |
+ stats_subscriber_( |
+ is_audio ? media::cast::AUDIO_EVENT : media::cast::VIDEO_EVENT, |
+ cast_environment->Clock(), offset_estimator) { |
+ cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); |
+ cast_environment_->Logging()->AddRawEventSubscriber(&stats_subscriber_); |
+} |
+ |
+RawEventSubscriberBundleForStream::~RawEventSubscriberBundleForStream() { |
+ cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); |
+ cast_environment_->Logging()->RemoveRawEventSubscriber(&stats_subscriber_); |
+} |
+ |
+media::cast::EncodingEventSubscriber* |
+RawEventSubscriberBundleForStream::GetEncodingEventSubscriber() { |
+ return &event_subscriber_; |
+} |
+ |
+media::cast::StatsEventSubscriber* |
+RawEventSubscriberBundleForStream::GetStatsEventSubscriber() { |
+ return &stats_subscriber_; |
+} |
+ |
+RawEventSubscriberBundle::RawEventSubscriberBundle( |
+ const scoped_refptr<media::cast::CastEnvironment>& cast_environment) |
+ : cast_environment_(cast_environment) {} |
+ |
+RawEventSubscriberBundle::~RawEventSubscriberBundle() { |
+ if (receiver_offset_estimator_.get()) { |
+ cast_environment_->Logging()->RemoveRawEventSubscriber( |
+ receiver_offset_estimator_.get()); |
+ } |
+} |
+ |
+void RawEventSubscriberBundle::AddEventSubscribers(bool is_audio) { |
+ if (!receiver_offset_estimator_.get()) { |
+ receiver_offset_estimator_.reset( |
+ new media::cast::ReceiverTimeOffsetEstimatorImpl); |
+ cast_environment_->Logging()->AddRawEventSubscriber( |
+ receiver_offset_estimator_.get()); |
+ } |
+ SubscribersMapByStream::iterator it = subscribers_.find(is_audio); |
+ if (it != subscribers_.end()) |
+ return; |
+ |
+ subscribers_.insert(std::make_pair( |
+ is_audio, |
+ new RawEventSubscriberBundleForStream( |
+ is_audio, receiver_offset_estimator_.get(), cast_environment_))); |
+} |
+ |
+void RawEventSubscriberBundle::RemoveEventSubscribers(bool is_audio) { |
+ SubscribersMapByStream::iterator it = subscribers_.find(is_audio); |
+ if (it == subscribers_.end()) |
+ return; |
+ |
+ subscribers_.erase(it); |
+ if (subscribers_.empty()) { |
+ cast_environment_->Logging()->RemoveRawEventSubscriber( |
+ receiver_offset_estimator_.get()); |
+ receiver_offset_estimator_.reset(); |
+ } |
+} |
+ |
+media::cast::EncodingEventSubscriber* |
+RawEventSubscriberBundle::GetEncodingEventSubscriber(bool is_audio) { |
+ SubscribersMapByStream::iterator it = subscribers_.find(is_audio); |
+ return it == subscribers_.end() ? |
+ NULL : it->second->GetEncodingEventSubscriber(); |
+} |
+ |
+media::cast::StatsEventSubscriber* |
+RawEventSubscriberBundle::GetStatsEventSubscriber(bool is_audio) { |
+ SubscribersMapByStream::iterator it = subscribers_.find(is_audio); |
+ return it == subscribers_.end() ? |
+ NULL : it->second->GetStatsEventSubscriber(); |
+} |
+ |
void CastSessionDelegate::ToggleLogging(bool is_audio, bool enable) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
- if (!cast_environment_.get()) |
+ if (!event_subscribers_.get()) |
return; |
- if (enable) { |
- if (is_audio) { |
- if (!audio_event_subscriber_.get()) { |
- audio_event_subscriber_.reset(new media::cast::EncodingEventSubscriber( |
- media::cast::AUDIO_EVENT, kMaxAudioEventEntries)); |
- cast_environment_->Logging()->AddRawEventSubscriber( |
- audio_event_subscriber_.get()); |
- } |
- if (!audio_stats_subscriber_.get()) { |
- audio_stats_subscriber_.reset( |
- new media::cast::StatsEventSubscriber(media::cast::AUDIO_EVENT)); |
- cast_environment_->Logging()->AddRawEventSubscriber( |
- audio_stats_subscriber_.get()); |
- } |
- } else { |
- if (!video_event_subscriber_.get()) { |
- video_event_subscriber_.reset(new media::cast::EncodingEventSubscriber( |
- media::cast::VIDEO_EVENT, kMaxVideoEventEntries)); |
- cast_environment_->Logging()->AddRawEventSubscriber( |
- video_event_subscriber_.get()); |
- } |
- if (!video_stats_subscriber_.get()) { |
- video_stats_subscriber_.reset( |
- new media::cast::StatsEventSubscriber(media::cast::VIDEO_EVENT)); |
- cast_environment_->Logging()->AddRawEventSubscriber( |
- video_stats_subscriber_.get()); |
- } |
- } |
- } else { |
- if (is_audio) { |
- if (audio_event_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- audio_event_subscriber_.get()); |
- audio_event_subscriber_.reset(); |
- } |
- if (audio_stats_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- audio_stats_subscriber_.get()); |
- audio_stats_subscriber_.reset(); |
- } |
- } else { |
- if (video_event_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- video_event_subscriber_.get()); |
- video_event_subscriber_.reset(); |
- } |
- if (video_stats_subscriber_.get()) { |
- cast_environment_->Logging()->RemoveRawEventSubscriber( |
- video_stats_subscriber_.get()); |
- video_stats_subscriber_.reset(); |
- } |
- } |
- } |
+ |
+ if (enable) |
+ event_subscribers_->AddEventSubscribers(is_audio); |
+ else |
+ event_subscribers_->RemoveEventSubscribers(is_audio); |
} |
void CastSessionDelegate::GetEventLogsAndReset( |
@@ -205,8 +231,13 @@ void CastSessionDelegate::GetEventLogsAndReset( |
const EventLogsCallback& callback) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
+ if (!event_subscribers_.get()) { |
+ callback.Run(make_scoped_ptr(new base::BinaryValue).Pass()); |
+ return; |
+ } |
+ |
media::cast::EncodingEventSubscriber* subscriber = |
- is_audio ? audio_event_subscriber_.get() : video_event_subscriber_.get(); |
+ event_subscribers_->GetEncodingEventSubscriber(is_audio); |
if (!subscriber) { |
callback.Run(make_scoped_ptr(new base::BinaryValue).Pass()); |
return; |
@@ -243,22 +274,23 @@ void CastSessionDelegate::GetEventLogsAndReset( |
void CastSessionDelegate::GetStatsAndReset(bool is_audio, |
const StatsCallback& callback) { |
+ DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
+ |
+ if (!event_subscribers_.get()) { |
+ callback.Run(make_scoped_ptr(new base::DictionaryValue).Pass()); |
+ return; |
+ } |
+ |
media::cast::StatsEventSubscriber* subscriber = |
- is_audio ? audio_stats_subscriber_.get() : video_stats_subscriber_.get(); |
+ event_subscribers_->GetStatsEventSubscriber(is_audio); |
if (!subscriber) { |
callback.Run(make_scoped_ptr(new base::DictionaryValue).Pass()); |
return; |
} |
- media::cast::FrameStatsMap frame_stats; |
- subscriber->GetFrameStats(&frame_stats); |
- media::cast::PacketStatsMap packet_stats; |
- subscriber->GetPacketStats(&packet_stats); |
+ scoped_ptr<base::DictionaryValue> stats = subscriber->GetStats(); |
subscriber->Reset(); |
- scoped_ptr<base::DictionaryValue> stats = media::cast::ConvertStats( |
- frame_stats, packet_stats); |
- |
callback.Run(stats.Pass()); |
} |