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

Unified Diff: media/cast/cast_environment.cc

Issue 184813009: Cast Streaming API end-to-end browser_test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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: media/cast/cast_environment.cc
diff --git a/media/cast/cast_environment.cc b/media/cast/cast_environment.cc
index 9b1a5696486d5c85187121c5bf7c95ea647ab4e6..f3e18507e63bb6f397081df0903889ebf7792e57 100644
--- a/media/cast/cast_environment.cc
+++ b/media/cast/cast_environment.cc
@@ -7,6 +7,8 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
+#include "base/threading/thread.h"
+#include "base/time/default_tick_clock.h"
using base::SingleThreadTaskRunner;
@@ -21,6 +23,14 @@ void DeleteLoggingOnMainThread(scoped_ptr<media::cast::LoggingImpl> logging) {
namespace media {
namespace cast {
+CastEnvironment::CastEnvironment()
+ : clock_(new base::DefaultTickClock()),
+ logging_(new LoggingImpl(CastLoggingConfig())) {}
+
+CastEnvironment::CastEnvironment(const CastLoggingConfig& logging_config)
+ : clock_(new base::DefaultTickClock()),
+ logging_(new LoggingImpl(logging_config)) {}
+
CastEnvironment::CastEnvironment(
scoped_ptr<base::TickClock> clock,
scoped_refptr<SingleThreadTaskRunner> main_thread_proxy,
@@ -29,7 +39,7 @@ CastEnvironment::CastEnvironment(
scoped_refptr<SingleThreadTaskRunner> video_encode_thread_proxy,
scoped_refptr<SingleThreadTaskRunner> video_decode_thread_proxy,
scoped_refptr<SingleThreadTaskRunner> transport_thread_proxy,
- const CastLoggingConfig& config)
+ const CastLoggingConfig& logging_config)
: clock_(clock.Pass()),
main_thread_proxy_(main_thread_proxy),
audio_encode_thread_proxy_(audio_encode_thread_proxy),
@@ -37,15 +47,13 @@ CastEnvironment::CastEnvironment(
video_encode_thread_proxy_(video_encode_thread_proxy),
video_decode_thread_proxy_(video_decode_thread_proxy),
transport_thread_proxy_(transport_thread_proxy),
- logging_(new LoggingImpl(main_thread_proxy, config)) {
+ logging_(new LoggingImpl(logging_config)) {
DCHECK(main_thread_proxy);
}
CastEnvironment::~CastEnvironment() {
// Logging must be deleted on the main thread.
- if (main_thread_proxy_->RunsTasksOnCurrentThread()) {
- logging_.reset();
- } else {
+ if (main_thread_proxy_ && !main_thread_proxy_->RunsTasksOnCurrentThread()) {
main_thread_proxy_->PostTask(
FROM_HERE,
base::Bind(&DeleteLoggingOnMainThread, base::Passed(&logging_)));
@@ -75,52 +83,71 @@ bool CastEnvironment::PostDelayedTask(
scoped_refptr<SingleThreadTaskRunner>
CastEnvironment::GetMessageSingleThreadTaskRunnerForThread(
ThreadId identifier) {
+// A convenience macro to efficiently check and create a missing task runner
hubbe 2014/03/04 22:42:26 I don't think this is a good idea. I think it woul
miu 2014/03/06 06:09:15 Done.
+// on-demand.
+#define AUTO_CREATE_TASK_RUNNER(name, options) \
+ if (!name##_thread_proxy_) { \
+ base::AutoLock auto_lock(create_lock_); \
+ if (!name##_thread_proxy_) { \
+ name##_thread_.reset(new base::Thread("CastEnvironment/" #name)); \
+ name##_thread_->StartWithOptions(options); \
+ name##_thread_proxy_ = name##_thread_->message_loop_proxy(); \
+ } \
+ }
+
switch (identifier) {
case CastEnvironment::MAIN:
+ AUTO_CREATE_TASK_RUNNER(
+ main, base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
return main_thread_proxy_;
case CastEnvironment::AUDIO_ENCODER:
+ AUTO_CREATE_TASK_RUNNER(audio_encode, base::Thread::Options());
return audio_encode_thread_proxy_;
case CastEnvironment::AUDIO_DECODER:
+ AUTO_CREATE_TASK_RUNNER(audio_decode, base::Thread::Options());
return audio_decode_thread_proxy_;
case CastEnvironment::VIDEO_ENCODER:
+ AUTO_CREATE_TASK_RUNNER(video_encode, base::Thread::Options());
return video_encode_thread_proxy_;
case CastEnvironment::VIDEO_DECODER:
+ AUTO_CREATE_TASK_RUNNER(video_decode, base::Thread::Options());
return video_decode_thread_proxy_;
case CastEnvironment::TRANSPORT:
+ AUTO_CREATE_TASK_RUNNER(transport, base::Thread::Options());
return transport_thread_proxy_;
default:
NOTREACHED() << "Invalid Thread identifier";
return NULL;
}
+
+#undef AUTO_CREATE_TASK_RUNNER
}
bool CastEnvironment::CurrentlyOn(ThreadId identifier) {
switch (identifier) {
case CastEnvironment::MAIN:
- return main_thread_proxy_->RunsTasksOnCurrentThread();
+ return main_thread_proxy_ &&
+ main_thread_proxy_->RunsTasksOnCurrentThread();
case CastEnvironment::AUDIO_ENCODER:
- return audio_encode_thread_proxy_->RunsTasksOnCurrentThread();
+ return audio_encode_thread_proxy_ &&
+ audio_encode_thread_proxy_->RunsTasksOnCurrentThread();
case CastEnvironment::AUDIO_DECODER:
- return audio_decode_thread_proxy_->RunsTasksOnCurrentThread();
+ return audio_decode_thread_proxy_ &&
+ audio_decode_thread_proxy_->RunsTasksOnCurrentThread();
case CastEnvironment::VIDEO_ENCODER:
- return video_encode_thread_proxy_->RunsTasksOnCurrentThread();
+ return video_encode_thread_proxy_ &&
+ video_encode_thread_proxy_->RunsTasksOnCurrentThread();
case CastEnvironment::VIDEO_DECODER:
- return video_decode_thread_proxy_->RunsTasksOnCurrentThread();
+ return video_decode_thread_proxy_ &&
+ video_decode_thread_proxy_->RunsTasksOnCurrentThread();
case CastEnvironment::TRANSPORT:
- return transport_thread_proxy_->RunsTasksOnCurrentThread();
+ return transport_thread_proxy_ &&
+ transport_thread_proxy_->RunsTasksOnCurrentThread();
default:
NOTREACHED() << "Invalid thread identifier";
return false;
}
}
-base::TickClock* CastEnvironment::Clock() const { return clock_.get(); }
-
-LoggingImpl* CastEnvironment::Logging() {
- DCHECK(CurrentlyOn(CastEnvironment::MAIN))
- << "Must be called from main thread";
- return logging_.get();
-}
-
} // namespace cast
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698