OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/filters/source_buffer_stream.h" | 5 #include "media/filters/source_buffer_stream.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, | 96 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, |
97 const LogCB& log_cb, | 97 const LogCB& log_cb, |
98 bool splice_frames_enabled) | 98 bool splice_frames_enabled) |
99 : log_cb_(log_cb), | 99 : log_cb_(log_cb), |
100 current_config_index_(0), | 100 current_config_index_(0), |
101 append_config_index_(0), | 101 append_config_index_(0), |
102 seek_pending_(false), | 102 seek_pending_(false), |
103 end_of_stream_(false), | 103 end_of_stream_(false), |
104 seek_buffer_timestamp_(kNoTimestamp()), | 104 seek_buffer_timestamp_(kNoTimestamp()), |
105 selected_range_(NULL), | 105 selected_range_(NULL), |
| 106 current_media_time_(kNoDecodeTimestamp()), |
106 media_segment_start_time_(kNoDecodeTimestamp()), | 107 media_segment_start_time_(kNoDecodeTimestamp()), |
107 range_for_next_append_(ranges_.end()), | 108 range_for_next_append_(ranges_.end()), |
108 new_media_segment_(false), | 109 new_media_segment_(false), |
109 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), | 110 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
110 last_appended_buffer_is_keyframe_(false), | 111 last_appended_buffer_is_keyframe_(false), |
111 last_output_buffer_timestamp_(kNoDecodeTimestamp()), | 112 last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
112 max_interbuffer_distance_(kNoTimestamp()), | 113 max_interbuffer_distance_(kNoTimestamp()), |
113 memory_limit_(kSourceBufferAudioMemoryLimit), | 114 memory_limit_(kSourceBufferAudioMemoryLimit), |
114 config_change_pending_(false), | 115 config_change_pending_(false), |
115 splice_buffers_index_(0), | 116 splice_buffers_index_(0), |
116 pending_buffers_complete_(false), | 117 pending_buffers_complete_(false), |
117 splice_frames_enabled_(splice_frames_enabled) { | 118 splice_frames_enabled_(splice_frames_enabled) { |
118 DCHECK(audio_config.IsValidConfig()); | 119 DCHECK(audio_config.IsValidConfig()); |
119 audio_configs_.push_back(audio_config); | 120 audio_configs_.push_back(audio_config); |
120 } | 121 } |
121 | 122 |
122 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, | 123 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, |
123 const LogCB& log_cb, | 124 const LogCB& log_cb, |
124 bool splice_frames_enabled) | 125 bool splice_frames_enabled) |
125 : log_cb_(log_cb), | 126 : log_cb_(log_cb), |
126 current_config_index_(0), | 127 current_config_index_(0), |
127 append_config_index_(0), | 128 append_config_index_(0), |
128 seek_pending_(false), | 129 seek_pending_(false), |
129 end_of_stream_(false), | 130 end_of_stream_(false), |
130 seek_buffer_timestamp_(kNoTimestamp()), | 131 seek_buffer_timestamp_(kNoTimestamp()), |
131 selected_range_(NULL), | 132 selected_range_(NULL), |
| 133 current_media_time_(kNoDecodeTimestamp()), |
132 media_segment_start_time_(kNoDecodeTimestamp()), | 134 media_segment_start_time_(kNoDecodeTimestamp()), |
133 range_for_next_append_(ranges_.end()), | 135 range_for_next_append_(ranges_.end()), |
134 new_media_segment_(false), | 136 new_media_segment_(false), |
135 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), | 137 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
136 last_appended_buffer_is_keyframe_(false), | 138 last_appended_buffer_is_keyframe_(false), |
137 last_output_buffer_timestamp_(kNoDecodeTimestamp()), | 139 last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
138 max_interbuffer_distance_(kNoTimestamp()), | 140 max_interbuffer_distance_(kNoTimestamp()), |
139 memory_limit_(kSourceBufferVideoMemoryLimit), | 141 memory_limit_(kSourceBufferVideoMemoryLimit), |
140 config_change_pending_(false), | 142 config_change_pending_(false), |
141 splice_buffers_index_(0), | 143 splice_buffers_index_(0), |
142 pending_buffers_complete_(false), | 144 pending_buffers_complete_(false), |
143 splice_frames_enabled_(splice_frames_enabled) { | 145 splice_frames_enabled_(splice_frames_enabled) { |
144 DCHECK(video_config.IsValidConfig()); | 146 DCHECK(video_config.IsValidConfig()); |
145 video_configs_.push_back(video_config); | 147 video_configs_.push_back(video_config); |
146 } | 148 } |
147 | 149 |
148 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, | 150 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, |
149 const LogCB& log_cb, | 151 const LogCB& log_cb, |
150 bool splice_frames_enabled) | 152 bool splice_frames_enabled) |
151 : log_cb_(log_cb), | 153 : log_cb_(log_cb), |
152 current_config_index_(0), | 154 current_config_index_(0), |
153 append_config_index_(0), | 155 append_config_index_(0), |
154 text_track_config_(text_config), | 156 text_track_config_(text_config), |
155 seek_pending_(false), | 157 seek_pending_(false), |
156 end_of_stream_(false), | 158 end_of_stream_(false), |
157 seek_buffer_timestamp_(kNoTimestamp()), | 159 seek_buffer_timestamp_(kNoTimestamp()), |
158 selected_range_(NULL), | 160 selected_range_(NULL), |
| 161 current_media_time_(kNoDecodeTimestamp()), |
159 media_segment_start_time_(kNoDecodeTimestamp()), | 162 media_segment_start_time_(kNoDecodeTimestamp()), |
160 range_for_next_append_(ranges_.end()), | 163 range_for_next_append_(ranges_.end()), |
161 new_media_segment_(false), | 164 new_media_segment_(false), |
162 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), | 165 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
163 last_appended_buffer_is_keyframe_(false), | 166 last_appended_buffer_is_keyframe_(false), |
164 last_output_buffer_timestamp_(kNoDecodeTimestamp()), | 167 last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
165 max_interbuffer_distance_(kNoTimestamp()), | 168 max_interbuffer_distance_(kNoTimestamp()), |
166 memory_limit_(kSourceBufferAudioMemoryLimit), | 169 memory_limit_(kSourceBufferAudioMemoryLimit), |
167 config_change_pending_(false), | 170 config_change_pending_(false), |
168 splice_buffers_index_(0), | 171 splice_buffers_index_(0), |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 DCHECK_EQ(current_range, selected_range_); | 703 DCHECK_EQ(current_range, selected_range_); |
701 break; | 704 break; |
702 } | 705 } |
703 bytes_deleted = current_range->DeleteGOPFromBack(&buffers); | 706 bytes_deleted = current_range->DeleteGOPFromBack(&buffers); |
704 } else { | 707 } else { |
705 current_range = ranges_.front(); | 708 current_range = ranges_.front(); |
706 if (current_range->FirstGOPContainsNextBufferPosition()) { | 709 if (current_range->FirstGOPContainsNextBufferPosition()) { |
707 DCHECK_EQ(current_range, selected_range_); | 710 DCHECK_EQ(current_range, selected_range_); |
708 break; | 711 break; |
709 } | 712 } |
| 713 if (current_media_time_ != kNoDecodeTimestamp() && |
| 714 !current_range->FirstGOPEarlierThanMediaTime(current_media_time_)) { |
| 715 break; |
| 716 } |
710 bytes_deleted = current_range->DeleteGOPFromFront(&buffers); | 717 bytes_deleted = current_range->DeleteGOPFromFront(&buffers); |
711 } | 718 } |
712 | 719 |
713 // Check to see if we've just deleted the GOP that was last appended. | 720 // Check to see if we've just deleted the GOP that was last appended. |
714 DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); | 721 DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); |
715 if (end_timestamp == last_appended_buffer_timestamp_) { | 722 if (end_timestamp == last_appended_buffer_timestamp_) { |
716 DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); | 723 DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); |
717 DCHECK(!new_range_for_append); | 724 DCHECK(!new_range_for_append); |
718 // Create a new range containing these buffers. | 725 // Create a new range containing these buffers. |
719 new_range_for_append = new SourceBufferRange( | 726 new_range_for_append = new SourceBufferRange( |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 // merges. | 884 // merges. |
878 if (transfer_current_position) | 885 if (transfer_current_position) |
879 SetSelectedRange(range_with_new_buffers); | 886 SetSelectedRange(range_with_new_buffers); |
880 | 887 |
881 if (next_range_itr == range_for_next_append_) | 888 if (next_range_itr == range_for_next_append_) |
882 range_for_next_append_ = range_with_new_buffers_itr; | 889 range_for_next_append_ = range_with_new_buffers_itr; |
883 | 890 |
884 DeleteAndRemoveRange(&next_range_itr); | 891 DeleteAndRemoveRange(&next_range_itr); |
885 } | 892 } |
886 | 893 |
| 894 void SourceBufferStream::NotifyMediaTimeUpdate(DecodeTimestamp media_time) { |
| 895 if (current_media_time_ != kNoDecodeTimestamp() && |
| 896 media_time < current_media_time_) { |
| 897 DLOG(WARNING) << "Time should be monotonically increasing: " |
| 898 << media_time.InMilliseconds() |
| 899 << " " << current_media_time_.InMilliseconds(); |
| 900 return; |
| 901 } |
| 902 current_media_time_ = media_time; |
| 903 } |
| 904 |
887 void SourceBufferStream::Seek(base::TimeDelta timestamp) { | 905 void SourceBufferStream::Seek(base::TimeDelta timestamp) { |
888 DCHECK(timestamp >= base::TimeDelta()); | 906 DCHECK(timestamp >= base::TimeDelta()); |
889 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() | 907 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
890 << " (" << timestamp.InSecondsF() << ")"; | 908 << " (" << timestamp.InSecondsF() << ")"; |
891 ResetSeekState(); | 909 ResetSeekState(); |
| 910 current_media_time_ = kNoDecodeTimestamp(); |
892 | 911 |
893 if (ShouldSeekToStartOfBuffered(timestamp)) { | 912 if (ShouldSeekToStartOfBuffered(timestamp)) { |
894 ranges_.front()->SeekToStart(); | 913 ranges_.front()->SeekToStart(); |
895 SetSelectedRange(ranges_.front()); | 914 SetSelectedRange(ranges_.front()); |
896 seek_pending_ = false; | 915 seek_pending_ = false; |
897 return; | 916 return; |
898 } | 917 } |
899 | 918 |
900 seek_buffer_timestamp_ = timestamp; | 919 seek_buffer_timestamp_ = timestamp; |
901 seek_pending_ = true; | 920 seek_pending_ = true; |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 return false; | 1581 return false; |
1563 | 1582 |
1564 DCHECK_NE(have_splice_buffers, have_preroll_buffer); | 1583 DCHECK_NE(have_splice_buffers, have_preroll_buffer); |
1565 splice_buffers_index_ = 0; | 1584 splice_buffers_index_ = 0; |
1566 pending_buffer_.swap(*out_buffer); | 1585 pending_buffer_.swap(*out_buffer); |
1567 pending_buffers_complete_ = false; | 1586 pending_buffers_complete_ = false; |
1568 return true; | 1587 return true; |
1569 } | 1588 } |
1570 | 1589 |
1571 } // namespace media | 1590 } // namespace media |
OLD | NEW |