| 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
|
|
|