Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index d482c83a39084918f82eed1361f642b353f2582e..7b4f698805a9b1495cd25f1780bf5f7699fb7101 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -252,7 +252,9 @@ FFmpegDemuxer::FFmpegDemuxer(MessageLoop* message_loop) |
read_event_(false, false), |
read_has_failed_(false), |
last_read_bytes_(0), |
- read_position_(0) { |
+ read_position_(0), |
+ max_duration_(base::TimeDelta::FromMicroseconds(-1)), |
+ deferred_status_(PIPELINE_OK) { |
DCHECK(message_loop_); |
} |
@@ -315,8 +317,20 @@ void FFmpegDemuxer::OnAudioRendererDisabled() { |
NewRunnableMethod(this, &FFmpegDemuxer::DisableAudioStreamTask)); |
} |
+void FFmpegDemuxer::set_host(FilterHost* filter_host) { |
+ Demuxer::set_host(filter_host); |
+ if (data_source_) |
+ data_source_->set_host(filter_host); |
+ if (max_duration_.InMicroseconds() >= 0) |
+ host()->SetDuration(max_duration_); |
+ if (read_position_ > 0) |
+ host()->SetCurrentReadPosition(read_position_); |
+ if (deferred_status_ != PIPELINE_OK) |
+ host()->SetError(deferred_status_); |
+} |
+ |
void FFmpegDemuxer::Initialize(DataSource* data_source, |
- FilterCallback* callback) { |
+ PipelineStatusCallback* callback) { |
message_loop_->PostTask( |
FROM_HERE, |
NewRunnableMethod(this, |
@@ -358,7 +372,10 @@ int FFmpegDemuxer::Read(int size, uint8* data) { |
// let FFmpeg demuxer methods to run on. |
size_t last_read_bytes = WaitForRead(); |
if (last_read_bytes == DataSource::kReadError) { |
- host()->SetError(PIPELINE_ERROR_READ); |
+ if (host()) |
+ host()->SetError(PIPELINE_ERROR_READ); |
+ else |
+ deferred_status_ = PIPELINE_ERROR_READ; |
// Returns with a negative number to signal an error to FFmpeg. |
read_has_failed_ = true; |
@@ -366,7 +383,8 @@ int FFmpegDemuxer::Read(int size, uint8* data) { |
} |
read_position_ += last_read_bytes; |
- host()->SetCurrentReadPosition(read_position_); |
+ if (host()) |
+ host()->SetCurrentReadPosition(read_position_); |
return last_read_bytes; |
} |
@@ -405,11 +423,13 @@ MessageLoop* FFmpegDemuxer::message_loop() { |
} |
void FFmpegDemuxer::InitializeTask(DataSource* data_source, |
- FilterCallback* callback) { |
+ PipelineStatusCallback* callback) { |
DCHECK_EQ(MessageLoop::current(), message_loop_); |
- scoped_ptr<FilterCallback> c(callback); |
+ scoped_ptr<PipelineStatusCallback> callback_deleter(callback); |
data_source_ = data_source; |
+ if (host()) |
+ data_source_->set_host(host()); |
// Add ourself to Protocol list and get our unique key. |
std::string key = FFmpegGlue::GetInstance()->AddProtocol(this); |
@@ -423,8 +443,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, |
FFmpegGlue::GetInstance()->RemoveProtocol(this); |
if (result < 0) { |
- host()->SetError(DEMUXER_ERROR_COULD_NOT_OPEN); |
- callback->Run(); |
+ callback->Run(DEMUXER_ERROR_COULD_NOT_OPEN); |
return; |
} |
@@ -434,8 +453,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, |
// Fully initialize AVFormatContext by parsing the stream a little. |
result = av_find_stream_info(format_context_); |
if (result < 0) { |
- host()->SetError(DEMUXER_ERROR_COULD_NOT_PARSE); |
- callback->Run(); |
+ callback->Run(DEMUXER_ERROR_COULD_NOT_PARSE); |
return; |
} |
@@ -466,8 +484,7 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, |
} |
} |
if (streams_.empty()) { |
- host()->SetError(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
- callback->Run(); |
+ callback->Run(DEMUXER_ERROR_NO_SUPPORTED_STREAMS); |
return; |
} |
if (format_context_->duration != static_cast<int64_t>(AV_NOPTS_VALUE)) { |
@@ -485,8 +502,10 @@ void FFmpegDemuxer::InitializeTask(DataSource* data_source, |
} |
// Good to go: set the duration and notify we're done initializing. |
- host()->SetDuration(max_duration); |
- callback->Run(); |
+ if (host()) |
+ host()->SetDuration(max_duration); |
+ max_duration_ = max_duration; |
+ callback->Run(PIPELINE_OK); |
} |
void FFmpegDemuxer::SeekTask(base::TimeDelta time, FilterCallback* callback) { |
@@ -574,7 +593,9 @@ void FFmpegDemuxer::StopTask(FilterCallback* callback) { |
for (iter = streams_.begin(); iter != streams_.end(); ++iter) { |
(*iter)->Stop(); |
} |
- if (callback) { |
+ if (data_source_) { |
+ data_source_->Stop(callback); |
+ } else { |
callback->Run(); |
delete callback; |
} |