Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Unified Diff: chrome/renderer/media/cast_session_delegate.cc

Issue 236123003: Cast: Provide more meaningful stats. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minor fix Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
}

Powered by Google App Engine
This is Rietveld 408576698