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