Chromium Code Reviews| Index: media/filters/chunk_demuxer.cc |
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
| index f5fcf7dac7c7ca3995256ac9e2b01c4194a6cac5..939284200dc3d670e867b93010c95b245d7b46da 100644 |
| --- a/media/filters/chunk_demuxer.cc |
| +++ b/media/filters/chunk_demuxer.cc |
| @@ -301,11 +301,12 @@ class ChunkDemuxerStream : public DemuxerStream { |
| void CompletePendingReadIfPossible_Locked(); |
| - // Gets the value to pass to the next Read() callback. Returns true if |
| - // |status| and |buffer| should be passed to the callback. False indicates |
| - // that |status| and |buffer| were not set and more data is needed. |
| - bool GetNextBuffer_Locked(DemuxerStream::Status* status, |
| - scoped_refptr<StreamParserBuffer>* buffer); |
| + // Retrieves a new buffer from SourceBufferStream::GetNextBuffer() and handles |
| + // splice frame buffers. For normal buffers, the status is simply passed |
| + // through. Splice frame buffers will return kSuccess for buffer within the |
| + // crossfade along with a kConfigChange in between fade out and fade in. |
| + SourceBufferStream::Status GetNextBuffer_Locked( |
| + scoped_refptr<StreamParserBuffer>* buffer); |
| // Specifies the type of the stream. |
| Type type_; |
| @@ -316,6 +317,15 @@ class ChunkDemuxerStream : public DemuxerStream { |
| State state_; |
| ReadCB read_cb_; |
| + // Used by GetNextBuffer_Locked() when a buffer with fade out is returned from |
| + // the SourceBufferStream. Will be set to the returned buffer and will be |
| + // consumed after the fade out section has been exhausted. |
| + scoped_refptr<StreamParserBuffer> fade_in_buffer_; |
| + |
| + // Indicates which of the fade out preroll buffers in |fade_in_buffer_| should |
| + // be handled out next. |
| + size_t fade_out_preroll_index_; |
| + |
| DISALLOW_IMPLICIT_CONSTRUCTORS(ChunkDemuxerStream); |
| }; |
| @@ -749,7 +759,8 @@ void SourceState::FilterWithAppendWindow( |
| ChunkDemuxerStream::ChunkDemuxerStream(Type type) |
| : type_(type), |
| - state_(UNINITIALIZED) { |
| + state_(UNINITIALIZED), |
| + fade_out_preroll_index_(0) { |
| } |
| void ChunkDemuxerStream::StartReturningData() { |
| @@ -757,6 +768,8 @@ void ChunkDemuxerStream::StartReturningData() { |
| base::AutoLock auto_lock(lock_); |
| DCHECK(read_cb_.is_null()); |
| ChangeState_Locked(RETURNING_DATA_FOR_READS); |
| + fade_in_buffer_ = NULL; |
| + fade_out_preroll_index_ = 0; |
| } |
| void ChunkDemuxerStream::AbortReads() { |
| @@ -967,7 +980,7 @@ void ChunkDemuxerStream::CompletePendingReadIfPossible_Locked() { |
| NOTREACHED(); |
| return; |
| case RETURNING_DATA_FOR_READS: |
| - switch (stream_->GetNextBuffer(&buffer)) { |
| + switch (GetNextBuffer_Locked(&buffer)) { |
| case SourceBufferStream::kSuccess: |
| status = DemuxerStream::kOk; |
| break; |
| @@ -1002,6 +1015,51 @@ void ChunkDemuxerStream::CompletePendingReadIfPossible_Locked() { |
| base::ResetAndReturn(&read_cb_).Run(status, buffer); |
| } |
| +SourceBufferStream::Status ChunkDemuxerStream::GetNextBuffer_Locked( |
| + scoped_refptr<StreamParserBuffer>* out_buffer) { |
| + lock_.AssertAcquired(); |
| + |
| + if (!fade_in_buffer_) { |
| + const SourceBufferStream::Status status = |
| + stream_->GetNextBuffer(out_buffer); |
| + |
| + // Just return if GetNextBuffer() failed or there's no fade out preroll, |
| + // there's nothing else to do. |
| + if (status != SourceBufferStream::kSuccess || |
| + (*out_buffer)->GetFadeOutPreroll().empty()) { |
| + return status; |
| + } |
| + |
| + // Setup fade in buffer and fall through into splice frame buffer handling. |
| + fade_out_preroll_index_ = 0; |
| + fade_in_buffer_ = *out_buffer; |
| + } |
| + |
| + DCHECK(fade_in_buffer_); |
| + const size_t fade_out_size = fade_in_buffer_->GetFadeOutPreroll().size(); |
| + |
| + // Are there any fade out buffers left to hand out? |
| + if (fade_out_preroll_index_ < fade_out_size) { |
| + *out_buffer = |
|
acolwell GONE FROM CHROMIUM
2014/01/08 18:13:26
I think you need to be careful here because I beli
DaleCurtis
2014/01/08 18:45:55
Ah you're right on both counts. Crap; this will pr
DaleCurtis
2014/01/08 22:23:52
Actually, we could keep the code here if we extend
DaleCurtis
2014/01/08 23:00:38
Ahgh, an issue with this idea is when the next buf
|
| + fade_in_buffer_->GetFadeOutPreroll()[fade_out_preroll_index_++]; |
| + return SourceBufferStream::kSuccess; |
| + } |
| + |
| + // Did we hand out the last fade out buffer on the last call? |
| + if (fade_out_preroll_index_ == fade_out_size) { |
| + fade_out_preroll_index_++; |
| + return SourceBufferStream::kConfigChange; |
| + } |
| + |
| + // All fade out buffers have been handed out and a config change completed, so |
| + // hand out the final buffer for fade in. |
| + DCHECK_GT(fade_out_preroll_index_, fade_out_size); |
| + *out_buffer = fade_in_buffer_; |
| + fade_in_buffer_ = NULL; |
| + fade_out_preroll_index_ = 0; |
| + return SourceBufferStream::kSuccess; |
| +} |
| + |
| ChunkDemuxer::ChunkDemuxer(const base::Closure& open_cb, |
| const NeedKeyCB& need_key_cb, |
| const LogCB& log_cb) |