Index: media/filters/media_source_state.cc |
diff --git a/media/filters/media_source_state.cc b/media/filters/media_source_state.cc |
index 68ae666c93c29e4c2d1b1649d2081d6f1797eb79..c3152a2d51bbd7d2c238c28ebc4cd7f2b21ea96d 100644 |
--- a/media/filters/media_source_state.cc |
+++ b/media/filters/media_source_state.cc |
@@ -776,16 +776,21 @@ void MediaSourceState::OnEndOfMediaSegment() { |
} |
bool MediaSourceState::OnNewBuffers( |
- const StreamParser::BufferQueue& audio_buffers, |
- const StreamParser::BufferQueue& video_buffers, |
- const StreamParser::TextBufferQueueMap& text_map) { |
+ const StreamParser::BufferQueueMap& buffer_queue_map) { |
DVLOG(2) << "OnNewBuffers()"; |
DCHECK_EQ(state_, PARSER_INITIALIZED); |
DCHECK(timestamp_offset_during_append_); |
DCHECK(parsing_media_segment_); |
- media_segment_contained_audio_frame_ |= !audio_buffers.empty(); |
- media_segment_contained_video_frame_ |= !video_buffers.empty(); |
+ for (const auto& it : buffer_queue_map) { |
+ const StreamParser::BufferQueue& bufq = it.second; |
+ DCHECK(!bufq.empty()); |
+ if (bufq[0]->type() == DemuxerStream::AUDIO) { |
+ media_segment_contained_audio_frame_ = true; |
+ } else if (bufq[0]->type() == DemuxerStream::VIDEO) { |
+ media_segment_contained_video_frame_ = true; |
+ } |
+ } |
const TimeDelta timestamp_offset_before_processing = |
*timestamp_offset_during_append_; |
@@ -794,22 +799,23 @@ bool MediaSourceState::OnNewBuffers( |
// parser has requested automatic updates. |
TimeDelta new_timestamp_offset = timestamp_offset_before_processing; |
if (auto_update_timestamp_offset_) { |
- const bool have_audio_buffers = !audio_buffers.empty(); |
- const bool have_video_buffers = !video_buffers.empty(); |
- if (have_audio_buffers && have_video_buffers) { |
- new_timestamp_offset += |
- std::min(EndTimestamp(audio_buffers), EndTimestamp(video_buffers)); |
- } else if (have_audio_buffers) { |
- new_timestamp_offset += EndTimestamp(audio_buffers); |
- } else if (have_video_buffers) { |
- new_timestamp_offset += EndTimestamp(video_buffers); |
+ TimeDelta min_end_timestamp = kNoTimestamp; |
+ for (const auto& it : buffer_queue_map) { |
+ const StreamParser::BufferQueue& bufq = it.second; |
+ DCHECK(!bufq.empty()); |
+ if (min_end_timestamp == kNoTimestamp || |
+ EndTimestamp(bufq) < min_end_timestamp) { |
+ min_end_timestamp = EndTimestamp(bufq); |
+ DCHECK_NE(kNoTimestamp, min_end_timestamp); |
+ } |
} |
+ if (min_end_timestamp != kNoTimestamp) |
+ new_timestamp_offset += min_end_timestamp; |
} |
- if (!frame_processor_->ProcessFrames(audio_buffers, video_buffers, text_map, |
- append_window_start_during_append_, |
- append_window_end_during_append_, |
- timestamp_offset_during_append_)) { |
+ if (!frame_processor_->ProcessFrames( |
+ buffer_queue_map, append_window_start_during_append_, |
+ append_window_end_during_append_, timestamp_offset_during_append_)) { |
return false; |
} |