| 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());
|
| }
|
|
|
|
|