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 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 } | 921 } |
922 | 922 |
923 if (itr == ranges_.end()) | 923 if (itr == ranges_.end()) |
924 return; | 924 return; |
925 | 925 |
926 SeekAndSetSelectedRange(*itr, seek_dts); | 926 SeekAndSetSelectedRange(*itr, seek_dts); |
927 seek_pending_ = false; | 927 seek_pending_ = false; |
928 } | 928 } |
929 | 929 |
930 bool SourceBufferStream::IsSeekPending() const { | 930 bool SourceBufferStream::IsSeekPending() const { |
931 return !(end_of_stream_ && IsEndSelected()) && seek_pending_; | 931 return seek_pending_ && !IsEndOfStreamReached(); |
932 } | 932 } |
933 | 933 |
934 void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { | 934 void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { |
935 DecodeTimestamp duration_dts = | 935 DecodeTimestamp duration_dts = |
936 DecodeTimestamp::FromPresentationTime(duration); | 936 DecodeTimestamp::FromPresentationTime(duration); |
937 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() | 937 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
938 << " (" << duration.InSecondsF() << ")"; | 938 << " (" << duration.InSecondsF() << ")"; |
939 | 939 |
940 RangeList::iterator itr = ranges_.end(); | 940 RangeList::iterator itr = ranges_.end(); |
941 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { | 941 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp(); | 1091 last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp(); |
1092 | 1092 |
1093 // If the track buffer becomes empty, then try to set the selected range | 1093 // If the track buffer becomes empty, then try to set the selected range |
1094 // based on the timestamp of this buffer being returned. | 1094 // based on the timestamp of this buffer being returned. |
1095 if (track_buffer_.empty()) | 1095 if (track_buffer_.empty()) |
1096 SetSelectedRangeIfNeeded(last_output_buffer_timestamp_); | 1096 SetSelectedRangeIfNeeded(last_output_buffer_timestamp_); |
1097 | 1097 |
1098 return kSuccess; | 1098 return kSuccess; |
1099 } | 1099 } |
1100 | 1100 |
| 1101 DCHECK(track_buffer_.empty()); |
1101 if (!selected_range_ || !selected_range_->HasNextBuffer()) { | 1102 if (!selected_range_ || !selected_range_->HasNextBuffer()) { |
1102 if (end_of_stream_ && IsEndSelected()) | 1103 if (IsEndOfStreamReached()) { |
1103 return kEndOfStream; | 1104 return kEndOfStream; |
| 1105 } |
1104 DVLOG(3) << __FUNCTION__ << " " << GetStreamTypeName() | 1106 DVLOG(3) << __FUNCTION__ << " " << GetStreamTypeName() |
1105 << ": returning kNeedBuffer " | 1107 << ": returning kNeedBuffer " |
1106 << (selected_range_ ? "(selected range has no next buffer)" | 1108 << (selected_range_ ? "(selected range has no next buffer)" |
1107 : "(no selected range)"); | 1109 : "(no selected range)"); |
1108 return kNeedBuffer; | 1110 return kNeedBuffer; |
1109 } | 1111 } |
1110 | 1112 |
1111 if (selected_range_->GetNextConfigId() != current_config_index_) { | 1113 if (selected_range_->GetNextConfigId() != current_config_index_) { |
1112 config_change_pending_ = true; | 1114 config_change_pending_ = true; |
1113 DVLOG(1) << "Config change (selected range config ID does not match)."; | 1115 DVLOG(1) << "Config change (selected range config ID does not match)."; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 void SourceBufferStream::MarkEndOfStream() { | 1200 void SourceBufferStream::MarkEndOfStream() { |
1199 DCHECK(!end_of_stream_); | 1201 DCHECK(!end_of_stream_); |
1200 end_of_stream_ = true; | 1202 end_of_stream_ = true; |
1201 } | 1203 } |
1202 | 1204 |
1203 void SourceBufferStream::UnmarkEndOfStream() { | 1205 void SourceBufferStream::UnmarkEndOfStream() { |
1204 DCHECK(end_of_stream_); | 1206 DCHECK(end_of_stream_); |
1205 end_of_stream_ = false; | 1207 end_of_stream_ = false; |
1206 } | 1208 } |
1207 | 1209 |
1208 bool SourceBufferStream::IsEndSelected() const { | 1210 bool SourceBufferStream::IsEndOfStreamReached() const { |
| 1211 if (!end_of_stream_ || !track_buffer_.empty()) |
| 1212 return false; |
| 1213 |
1209 if (ranges_.empty()) | 1214 if (ranges_.empty()) |
1210 return true; | 1215 return true; |
1211 | 1216 |
1212 if (seek_pending_) { | 1217 if (seek_pending_) { |
1213 base::TimeDelta last_range_end_time = | 1218 base::TimeDelta last_range_end_time = |
1214 ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); | 1219 ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); |
1215 return seek_buffer_timestamp_ >= last_range_end_time; | 1220 return seek_buffer_timestamp_ >= last_range_end_time; |
1216 } | 1221 } |
1217 | 1222 |
| 1223 if (!selected_range_) |
| 1224 return true; |
| 1225 |
1218 return selected_range_ == ranges_.back(); | 1226 return selected_range_ == ranges_.back(); |
1219 } | 1227 } |
1220 | 1228 |
1221 const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() { | 1229 const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() { |
1222 if (config_change_pending_) | 1230 if (config_change_pending_) |
1223 CompleteConfigChange(); | 1231 CompleteConfigChange(); |
1224 return audio_configs_[current_config_index_]; | 1232 return audio_configs_[current_config_index_]; |
1225 } | 1233 } |
1226 | 1234 |
1227 const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() { | 1235 const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() { |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1575 return false; | 1583 return false; |
1576 | 1584 |
1577 DCHECK_NE(have_splice_buffers, have_preroll_buffer); | 1585 DCHECK_NE(have_splice_buffers, have_preroll_buffer); |
1578 splice_buffers_index_ = 0; | 1586 splice_buffers_index_ = 0; |
1579 pending_buffer_.swap(*out_buffer); | 1587 pending_buffer_.swap(*out_buffer); |
1580 pending_buffers_complete_ = false; | 1588 pending_buffers_complete_ = false; |
1581 return true; | 1589 return true; |
1582 } | 1590 } |
1583 | 1591 |
1584 } // namespace media | 1592 } // namespace media |
OLD | NEW |