Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: media/filters/source_buffer_stream.cc

Issue 1235793005: Deprecate LogCB in favor of using MediaLog (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 return SourceBufferRange::NO_GAPS_ALLOWED; 87 return SourceBufferRange::NO_GAPS_ALLOWED;
88 case SourceBufferStream::kText: 88 case SourceBufferStream::kText:
89 return SourceBufferRange::ALLOW_GAPS; 89 return SourceBufferRange::ALLOW_GAPS;
90 } 90 }
91 91
92 NOTREACHED(); 92 NOTREACHED();
93 return SourceBufferRange::NO_GAPS_ALLOWED; 93 return SourceBufferRange::NO_GAPS_ALLOWED;
94 } 94 }
95 95
96 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, 96 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config,
97 const LogCB& log_cb, 97 const scoped_refptr<MediaLog>& media_log,
98 bool splice_frames_enabled) 98 bool splice_frames_enabled)
99 : log_cb_(log_cb), 99 : media_log_(media_log),
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 media_segment_start_time_(kNoDecodeTimestamp()), 106 media_segment_start_time_(kNoDecodeTimestamp()),
107 range_for_next_append_(ranges_.end()), 107 range_for_next_append_(ranges_.end()),
108 new_media_segment_(false), 108 new_media_segment_(false),
109 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 109 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
110 last_appended_buffer_is_keyframe_(false), 110 last_appended_buffer_is_keyframe_(false),
111 last_output_buffer_timestamp_(kNoDecodeTimestamp()), 111 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
112 max_interbuffer_distance_(kNoTimestamp()), 112 max_interbuffer_distance_(kNoTimestamp()),
113 memory_limit_(kSourceBufferAudioMemoryLimit), 113 memory_limit_(kSourceBufferAudioMemoryLimit),
114 config_change_pending_(false), 114 config_change_pending_(false),
115 splice_buffers_index_(0), 115 splice_buffers_index_(0),
116 pending_buffers_complete_(false), 116 pending_buffers_complete_(false),
117 splice_frames_enabled_(splice_frames_enabled) { 117 splice_frames_enabled_(splice_frames_enabled),
118 audio_splice_count_(0),
wolenetz 2015/07/13 22:25:29 Ditto oops, here and below! (PS2 fixes this CL to
119 total_audio_splice_duration_(0.0),
120 min_audio_splice_duration_(0.0),
121 max_audio_splice_duration_(0.0) {
118 DCHECK(audio_config.IsValidConfig()); 122 DCHECK(audio_config.IsValidConfig());
119 audio_configs_.push_back(audio_config); 123 audio_configs_.push_back(audio_config);
120 } 124 }
121 125
122 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, 126 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config,
123 const LogCB& log_cb, 127 const scoped_refptr<MediaLog>& media_log,
124 bool splice_frames_enabled) 128 bool splice_frames_enabled)
125 : log_cb_(log_cb), 129 : media_log_(media_log),
126 current_config_index_(0), 130 current_config_index_(0),
127 append_config_index_(0), 131 append_config_index_(0),
128 seek_pending_(false), 132 seek_pending_(false),
129 end_of_stream_(false), 133 end_of_stream_(false),
130 seek_buffer_timestamp_(kNoTimestamp()), 134 seek_buffer_timestamp_(kNoTimestamp()),
131 selected_range_(NULL), 135 selected_range_(NULL),
132 media_segment_start_time_(kNoDecodeTimestamp()), 136 media_segment_start_time_(kNoDecodeTimestamp()),
133 range_for_next_append_(ranges_.end()), 137 range_for_next_append_(ranges_.end()),
134 new_media_segment_(false), 138 new_media_segment_(false),
135 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 139 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
136 last_appended_buffer_is_keyframe_(false), 140 last_appended_buffer_is_keyframe_(false),
137 last_output_buffer_timestamp_(kNoDecodeTimestamp()), 141 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
138 max_interbuffer_distance_(kNoTimestamp()), 142 max_interbuffer_distance_(kNoTimestamp()),
139 memory_limit_(kSourceBufferVideoMemoryLimit), 143 memory_limit_(kSourceBufferVideoMemoryLimit),
140 config_change_pending_(false), 144 config_change_pending_(false),
141 splice_buffers_index_(0), 145 splice_buffers_index_(0),
142 pending_buffers_complete_(false), 146 pending_buffers_complete_(false),
143 splice_frames_enabled_(splice_frames_enabled) { 147 splice_frames_enabled_(splice_frames_enabled),
148 audio_splice_count_(0),
149 total_audio_splice_duration_(0.0),
150 min_audio_splice_duration_(0.0),
151 max_audio_splice_duration_(0.0) {
144 DCHECK(video_config.IsValidConfig()); 152 DCHECK(video_config.IsValidConfig());
145 video_configs_.push_back(video_config); 153 video_configs_.push_back(video_config);
146 } 154 }
147 155
148 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, 156 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config,
149 const LogCB& log_cb, 157 const scoped_refptr<MediaLog>& media_log,
150 bool splice_frames_enabled) 158 bool splice_frames_enabled)
151 : log_cb_(log_cb), 159 : media_log_(media_log),
152 current_config_index_(0), 160 current_config_index_(0),
153 append_config_index_(0), 161 append_config_index_(0),
154 text_track_config_(text_config), 162 text_track_config_(text_config),
155 seek_pending_(false), 163 seek_pending_(false),
156 end_of_stream_(false), 164 end_of_stream_(false),
157 seek_buffer_timestamp_(kNoTimestamp()), 165 seek_buffer_timestamp_(kNoTimestamp()),
158 selected_range_(NULL), 166 selected_range_(NULL),
159 media_segment_start_time_(kNoDecodeTimestamp()), 167 media_segment_start_time_(kNoDecodeTimestamp()),
160 range_for_next_append_(ranges_.end()), 168 range_for_next_append_(ranges_.end()),
161 new_media_segment_(false), 169 new_media_segment_(false),
162 last_appended_buffer_timestamp_(kNoDecodeTimestamp()), 170 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
163 last_appended_buffer_is_keyframe_(false), 171 last_appended_buffer_is_keyframe_(false),
164 last_output_buffer_timestamp_(kNoDecodeTimestamp()), 172 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
165 max_interbuffer_distance_(kNoTimestamp()), 173 max_interbuffer_distance_(kNoTimestamp()),
166 memory_limit_(kSourceBufferAudioMemoryLimit), 174 memory_limit_(kSourceBufferAudioMemoryLimit),
167 config_change_pending_(false), 175 config_change_pending_(false),
168 splice_buffers_index_(0), 176 splice_buffers_index_(0),
169 pending_buffers_complete_(false), 177 pending_buffers_complete_(false),
170 splice_frames_enabled_(splice_frames_enabled) { 178 splice_frames_enabled_(splice_frames_enabled),
179 audio_splice_count_(0),
180 total_audio_splice_duration_(0.0),
181 min_audio_splice_duration_(0.0),
182 max_audio_splice_duration_(0.0) {
171 } 183 }
172 184
173 SourceBufferStream::~SourceBufferStream() { 185 SourceBufferStream::~SourceBufferStream() {
174 while (!ranges_.empty()) { 186 while (!ranges_.empty()) {
175 delete ranges_.front(); 187 delete ranges_.front();
176 ranges_.pop_front(); 188 ranges_.pop_front();
177 } 189 }
178 } 190 }
179 191
180 void SourceBufferStream::OnNewMediaSegment( 192 void SourceBufferStream::OnNewMediaSegment(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() << ": buffers dts=[" 228 DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() << ": buffers dts=["
217 << buffers.front()->GetDecodeTimestamp().InSecondsF() << ";" 229 << buffers.front()->GetDecodeTimestamp().InSecondsF() << ";"
218 << buffers.back()->GetDecodeTimestamp().InSecondsF() << "] pts=[" 230 << buffers.back()->GetDecodeTimestamp().InSecondsF() << "] pts=["
219 << buffers.front()->timestamp().InSecondsF() << ";" 231 << buffers.front()->timestamp().InSecondsF() << ";"
220 << buffers.back()->timestamp().InSecondsF() << "(last frame dur=" 232 << buffers.back()->timestamp().InSecondsF() << "(last frame dur="
221 << buffers.back()->duration().InSecondsF() << ")]"; 233 << buffers.back()->duration().InSecondsF() << ")]";
222 234
223 // New media segments must begin with a keyframe. 235 // New media segments must begin with a keyframe.
224 // TODO(wolenetz): Relax this requirement. See http://crbug.com/229412. 236 // TODO(wolenetz): Relax this requirement. See http://crbug.com/229412.
225 if (new_media_segment_ && !buffers.front()->is_key_frame()) { 237 if (new_media_segment_ && !buffers.front()->is_key_frame()) {
226 MEDIA_LOG(ERROR, log_cb_) << "Media segment did not begin with key frame."; 238 MEDIA_LOG(ERROR, media_log_)
239 << "Media segment did not begin with key frame.";
227 return false; 240 return false;
228 } 241 }
229 242
230 // Buffers within a media segment should be monotonically increasing. 243 // Buffers within a media segment should be monotonically increasing.
231 if (!IsMonotonicallyIncreasing(buffers)) 244 if (!IsMonotonicallyIncreasing(buffers))
232 return false; 245 return false;
233 246
234 if (media_segment_start_time_ < DecodeTimestamp() || 247 if (media_segment_start_time_ < DecodeTimestamp() ||
235 buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) { 248 buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) {
236 MEDIA_LOG(ERROR, log_cb_) 249 MEDIA_LOG(ERROR, media_log_)
237 << "Cannot append a media segment with negative timestamps."; 250 << "Cannot append a media segment with negative timestamps.";
238 return false; 251 return false;
239 } 252 }
240 253
241 if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(), 254 if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(),
242 buffers.front()->is_key_frame())) { 255 buffers.front()->is_key_frame())) {
243 const DecodeTimestamp& dts = buffers.front()->GetDecodeTimestamp(); 256 const DecodeTimestamp& dts = buffers.front()->GetDecodeTimestamp();
244 MEDIA_LOG(ERROR, log_cb_) << "Invalid same timestamp construct detected at" 257 MEDIA_LOG(ERROR, media_log_)
245 << " time " << dts.InSecondsF(); 258 << "Invalid same timestamp construct detected at"
259 << " time " << dts.InSecondsF();
246 260
247 return false; 261 return false;
248 } 262 }
249 263
250 UpdateMaxInterbufferDistance(buffers); 264 UpdateMaxInterbufferDistance(buffers);
251 SetConfigIds(buffers); 265 SetConfigIds(buffers);
252 266
253 // Save a snapshot of stream state before range modifications are made. 267 // Save a snapshot of stream state before range modifications are made.
254 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); 268 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
255 BufferQueue deleted_buffers; 269 BufferQueue deleted_buffers;
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 bool current_is_keyframe = (*itr)->is_key_frame(); 537 bool current_is_keyframe = (*itr)->is_key_frame();
524 DCHECK(current_timestamp != kNoDecodeTimestamp()); 538 DCHECK(current_timestamp != kNoDecodeTimestamp());
525 DCHECK((*itr)->duration() >= base::TimeDelta()) 539 DCHECK((*itr)->duration() >= base::TimeDelta())
526 << "Packet with invalid duration." 540 << "Packet with invalid duration."
527 << " pts " << (*itr)->timestamp().InSecondsF() 541 << " pts " << (*itr)->timestamp().InSecondsF()
528 << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF() 542 << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF()
529 << " dur " << (*itr)->duration().InSecondsF(); 543 << " dur " << (*itr)->duration().InSecondsF();
530 544
531 if (prev_timestamp != kNoDecodeTimestamp()) { 545 if (prev_timestamp != kNoDecodeTimestamp()) {
532 if (current_timestamp < prev_timestamp) { 546 if (current_timestamp < prev_timestamp) {
533 MEDIA_LOG(ERROR, log_cb_) << "Buffers did not monotonically increase."; 547 MEDIA_LOG(ERROR, media_log_)
548 << "Buffers did not monotonically increase.";
534 return false; 549 return false;
535 } 550 }
536 551
537 if (current_timestamp == prev_timestamp && 552 if (current_timestamp == prev_timestamp &&
538 !SourceBufferRange::AllowSameTimestamp(prev_is_keyframe, 553 !SourceBufferRange::AllowSameTimestamp(prev_is_keyframe,
539 current_is_keyframe)) { 554 current_is_keyframe)) {
540 MEDIA_LOG(ERROR, log_cb_) << "Unexpected combination of buffers with" 555 MEDIA_LOG(ERROR, media_log_) << "Unexpected combination of buffers with"
541 << " the same timestamp detected at " 556 << " the same timestamp detected at "
542 << current_timestamp.InSecondsF(); 557 << current_timestamp.InSecondsF();
543 return false; 558 return false;
544 } 559 }
545 } 560 }
546 561
547 prev_timestamp = current_timestamp; 562 prev_timestamp = current_timestamp;
548 prev_is_keyframe = current_is_keyframe; 563 prev_is_keyframe = current_is_keyframe;
549 } 564 }
550 return true; 565 return true;
551 } 566 }
552 567
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
1259 return base::TimeDelta::FromMilliseconds(kDefaultBufferDurationInMs); 1274 return base::TimeDelta::FromMilliseconds(kDefaultBufferDurationInMs);
1260 return max_interbuffer_distance_; 1275 return max_interbuffer_distance_;
1261 } 1276 }
1262 1277
1263 bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) { 1278 bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) {
1264 DCHECK(!audio_configs_.empty()); 1279 DCHECK(!audio_configs_.empty());
1265 DCHECK(video_configs_.empty()); 1280 DCHECK(video_configs_.empty());
1266 DVLOG(3) << "UpdateAudioConfig."; 1281 DVLOG(3) << "UpdateAudioConfig.";
1267 1282
1268 if (audio_configs_[0].codec() != config.codec()) { 1283 if (audio_configs_[0].codec() != config.codec()) {
1269 MEDIA_LOG(ERROR, log_cb_) << "Audio codec changes not allowed."; 1284 MEDIA_LOG(ERROR, media_log_) << "Audio codec changes not allowed.";
1270 return false; 1285 return false;
1271 } 1286 }
1272 1287
1273 if (audio_configs_[0].is_encrypted() != config.is_encrypted()) { 1288 if (audio_configs_[0].is_encrypted() != config.is_encrypted()) {
1274 MEDIA_LOG(ERROR, log_cb_) << "Audio encryption changes not allowed."; 1289 MEDIA_LOG(ERROR, media_log_) << "Audio encryption changes not allowed.";
1275 return false; 1290 return false;
1276 } 1291 }
1277 1292
1278 // Check to see if the new config matches an existing one. 1293 // Check to see if the new config matches an existing one.
1279 for (size_t i = 0; i < audio_configs_.size(); ++i) { 1294 for (size_t i = 0; i < audio_configs_.size(); ++i) {
1280 if (config.Matches(audio_configs_[i])) { 1295 if (config.Matches(audio_configs_[i])) {
1281 append_config_index_ = i; 1296 append_config_index_ = i;
1282 return true; 1297 return true;
1283 } 1298 }
1284 } 1299 }
1285 1300
1286 // No matches found so let's add this one to the list. 1301 // No matches found so let's add this one to the list.
1287 append_config_index_ = audio_configs_.size(); 1302 append_config_index_ = audio_configs_.size();
1288 DVLOG(2) << "New audio config - index: " << append_config_index_; 1303 DVLOG(2) << "New audio config - index: " << append_config_index_;
1289 audio_configs_.resize(audio_configs_.size() + 1); 1304 audio_configs_.resize(audio_configs_.size() + 1);
1290 audio_configs_[append_config_index_] = config; 1305 audio_configs_[append_config_index_] = config;
1291 return true; 1306 return true;
1292 } 1307 }
1293 1308
1294 bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) { 1309 bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) {
1295 DCHECK(!video_configs_.empty()); 1310 DCHECK(!video_configs_.empty());
1296 DCHECK(audio_configs_.empty()); 1311 DCHECK(audio_configs_.empty());
1297 DVLOG(3) << "UpdateVideoConfig."; 1312 DVLOG(3) << "UpdateVideoConfig.";
1298 1313
1299 if (video_configs_[0].codec() != config.codec()) { 1314 if (video_configs_[0].codec() != config.codec()) {
1300 MEDIA_LOG(ERROR, log_cb_) << "Video codec changes not allowed."; 1315 MEDIA_LOG(ERROR, media_log_) << "Video codec changes not allowed.";
1301 return false; 1316 return false;
1302 } 1317 }
1303 1318
1304 if (video_configs_[0].is_encrypted() != config.is_encrypted()) { 1319 if (video_configs_[0].is_encrypted() != config.is_encrypted()) {
1305 MEDIA_LOG(ERROR, log_cb_) << "Video encryption changes not allowed."; 1320 MEDIA_LOG(ERROR, media_log_) << "Video encryption changes not allowed.";
1306 return false; 1321 return false;
1307 } 1322 }
1308 1323
1309 // Check to see if the new config matches an existing one. 1324 // Check to see if the new config matches an existing one.
1310 for (size_t i = 0; i < video_configs_.size(); ++i) { 1325 for (size_t i = 0; i < video_configs_.size(); ++i) {
1311 if (config.Matches(video_configs_[i])) { 1326 if (config.Matches(video_configs_[i])) {
1312 append_config_index_ = i; 1327 append_config_index_ = i;
1313 return true; 1328 return true;
1314 } 1329 }
1315 } 1330 }
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 return false; 1615 return false;
1601 1616
1602 DCHECK_NE(have_splice_buffers, have_preroll_buffer); 1617 DCHECK_NE(have_splice_buffers, have_preroll_buffer);
1603 splice_buffers_index_ = 0; 1618 splice_buffers_index_ = 0;
1604 pending_buffer_.swap(*out_buffer); 1619 pending_buffer_.swap(*out_buffer);
1605 pending_buffers_complete_ = false; 1620 pending_buffers_complete_ = false;
1606 return true; 1621 return true;
1607 } 1622 }
1608 1623
1609 } // namespace media 1624 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698