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

Unified Diff: media/filters/ffmpeg_video_decoder.cc

Issue 9632024: Create video and audio decoder threads on demand. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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/filters/ffmpeg_video_decoder.cc
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index fe53f35c76ae9a57506190d9f1d6c48166452e50..ca512f896bfb62d24e785484f3c3d8631dbc0d67 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -12,6 +12,7 @@
#include "media/base/filter_host.h"
#include "media/base/limits.h"
#include "media/base/media_switches.h"
+#include "media/base/message_loop_factory.h"
#include "media/base/pipeline.h"
#include "media/base/video_decoder_config.h"
#include "media/base/video_frame.h"
@@ -51,8 +52,11 @@ static int GetThreadCount(CodecID codec_id) {
return decode_threads;
}
-FFmpegVideoDecoder::FFmpegVideoDecoder(MessageLoop* message_loop)
- : message_loop_(message_loop),
+FFmpegVideoDecoder::FFmpegVideoDecoder(MessageLoopFactory* loop_factory,
+ const std::string& loop_name)
+ : message_loop_factory_(loop_factory),
+ loop_name_(loop_name),
+ message_loop_(NULL),
state_(kUninitialized),
codec_context_(NULL),
av_frame_(NULL),
@@ -67,10 +71,11 @@ FFmpegVideoDecoder::~FFmpegVideoDecoder() {
void FFmpegVideoDecoder::Initialize(DemuxerStream* demuxer_stream,
const PipelineStatusCB& callback,
const StatisticsCallback& stats_callback) {
- if (MessageLoop::current() != message_loop_) {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::Initialize, this,
- make_scoped_refptr(demuxer_stream), callback, stats_callback));
+ if (MessageLoop::current() != EnsureMessageLoop()) {
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::Initialize, this,
+ make_scoped_refptr(demuxer_stream), callback,
+ stats_callback));
return;
}
@@ -125,9 +130,9 @@ void FFmpegVideoDecoder::Initialize(DemuxerStream* demuxer_stream,
}
void FFmpegVideoDecoder::Stop(const base::Closure& callback) {
- if (MessageLoop::current() != message_loop_) {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::Stop, this, callback));
+ if (MessageLoop::current() != EnsureMessageLoop()) {
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::Stop, this, callback));
return;
}
@@ -137,9 +142,9 @@ void FFmpegVideoDecoder::Stop(const base::Closure& callback) {
}
void FFmpegVideoDecoder::Seek(base::TimeDelta time, const FilterStatusCB& cb) {
- if (MessageLoop::current() != message_loop_) {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::Seek, this, time, cb));
+ if (MessageLoop::current() != EnsureMessageLoop()) {
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::Seek, this, time, cb));
return;
}
@@ -147,9 +152,9 @@ void FFmpegVideoDecoder::Seek(base::TimeDelta time, const FilterStatusCB& cb) {
}
void FFmpegVideoDecoder::Pause(const base::Closure& callback) {
- if (MessageLoop::current() != message_loop_) {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::Pause, this, callback));
+ if (MessageLoop::current() != EnsureMessageLoop()) {
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::Pause, this, callback));
return;
}
@@ -157,9 +162,9 @@ void FFmpegVideoDecoder::Pause(const base::Closure& callback) {
}
void FFmpegVideoDecoder::Flush(const base::Closure& callback) {
- if (MessageLoop::current() != message_loop_) {
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::Flush, this, callback));
+ if (MessageLoop::current() != EnsureMessageLoop()) {
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::Flush, this, callback));
return;
}
@@ -171,8 +176,8 @@ void FFmpegVideoDecoder::Flush(const base::Closure& callback) {
void FFmpegVideoDecoder::Read(const ReadCB& callback) {
// Complete operation asynchronously on different stack of execution as per
// the API contract of VideoDecoder::Read()
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::DoRead, this, callback));
+ EnsureMessageLoop()->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::DoRead, this, callback));
}
const gfx::Size& FFmpegVideoDecoder::natural_size() {
@@ -211,8 +216,8 @@ void FFmpegVideoDecoder::ReadFromDemuxerStream() {
void FFmpegVideoDecoder::DecodeBuffer(const scoped_refptr<Buffer>& buffer) {
// TODO(scherkus): fix FFmpegDemuxerStream::Read() to not execute our read
// callback on the same execution stack so we can get rid of forced task post.
- message_loop_->PostTask(FROM_HERE, base::Bind(
- &FFmpegVideoDecoder::DoDecodeBuffer, this, buffer));
+ EnsureMessageLoop()->PostTask(FROM_HERE,
+ base::Bind(&FFmpegVideoDecoder::DoDecodeBuffer, this, buffer));
}
void FFmpegVideoDecoder::DoDecodeBuffer(const scoped_refptr<Buffer>& buffer) {
@@ -423,4 +428,11 @@ scoped_refptr<VideoFrame> FFmpegVideoDecoder::AllocateVideoFrame() {
kNoTimestamp(), kNoTimestamp());
}
+MessageLoop* FFmpegVideoDecoder::EnsureMessageLoop() {
+ if (!message_loop_)
+ message_loop_ = message_loop_factory_->GetMessageLoop(loop_name_);
+ return message_loop_;
+}
+
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698