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

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

Issue 294393002: MSE: Allow fully discarding frames with resulting timestamps below 0 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | media/filters/frame_processor_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/frame_processor.h" 5 #include "media/filters/frame_processor.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "media/base/buffers.h" 8 #include "media/base/buffers.h"
9 #include "media/base/stream_parser_buffer.h" 9 #include "media/base/stream_parser_buffer.h"
10 10
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 // 7.2. - 7.5.: 229 // 7.2. - 7.5.:
230 Reset(); 230 Reset();
231 231
232 // 7.6. Jump to the Loop Top step above to restart processing of the 232 // 7.6. Jump to the Loop Top step above to restart processing of the
233 // current coded frame. 233 // current coded frame.
234 DVLOG(3) << __FUNCTION__ << ": Discontinuity: reprocessing frame"; 234 DVLOG(3) << __FUNCTION__ << ": Discontinuity: reprocessing frame";
235 continue; 235 continue;
236 } 236 }
237 } 237 }
238 238
239 // 8. If the presentation timestamp or decode timestamp is less than the
240 // presentation start time, then run the end of stream algorithm with the
241 // error parameter set to "decode", and abort these steps.
242 if (presentation_timestamp < base::TimeDelta() ||
243 decode_timestamp < base::TimeDelta()) {
244 DVLOG(2) << __FUNCTION__
245 << ": frame PTS=" << presentation_timestamp.InSecondsF()
246 << " or DTS=" << decode_timestamp.InSecondsF()
247 << " negative after applying timestampOffset and handling any "
248 << " discontinuity";
249 return false;
250 }
251
252 // 9. Let frame end timestamp equal the sum of presentation timestamp and 239 // 9. Let frame end timestamp equal the sum of presentation timestamp and
253 // frame duration. 240 // frame duration.
254 base::TimeDelta frame_end_timestamp = presentation_timestamp + 241 base::TimeDelta frame_end_timestamp = presentation_timestamp +
255 frame_duration; 242 frame_duration;
256 243
257 // 10. If presentation timestamp is less than appendWindowStart, then set 244 // 10. If presentation timestamp is less than appendWindowStart, then set
258 // the need random access point flag to true, drop the coded frame, and 245 // the need random access point flag to true, drop the coded frame, and
259 // jump to the top of the loop to start processing the next coded 246 // jump to the top of the loop to start processing the next coded
260 // frame. 247 // frame.
261 // Note: We keep the result of partial discard of a buffer that overlaps 248 // Note: We keep the result of partial discard of a buffer that overlaps
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 // This also triggers a discontinuity so we need to treat the next 284 // This also triggers a discontinuity so we need to treat the next
298 // frames appended within the append window as if they were the 285 // frames appended within the append window as if they were the
299 // beginning of a new segment. 286 // beginning of a new segment.
300 *new_media_segment = true; 287 *new_media_segment = true;
301 } 288 }
302 289
303 return true; 290 return true;
304 } 291 }
305 } 292 }
306 293
294 // Note: This step is relocated, versus April 1 spec, to after append window
295 // filtering to allow more than 1 full frame preroll to support gapless
acolwell GONE FROM CHROMIUM 2014/05/24 05:27:36 nit: I don't think this comment needs to be AAC sp
wolenetz 2014/05/27 19:35:14 Done.
296 // AAC beginning at time 0. This relocation verifies only the frames that
297 // survive append window filtering, rather than checking before append
298 // window filtering.
299 // 8. If the presentation timestamp or decode timestamp is less than the
300 // presentation start time, then run the end of stream algorithm with the
301 // error parameter set to "decode", and abort these steps.
302 if (presentation_timestamp < base::TimeDelta() ||
acolwell GONE FROM CHROMIUM 2014/05/24 05:27:36 Yes. I believe the spec should probably be updated
wolenetz 2014/05/27 19:35:14 For PTS, added DCHECK. For DTS < 0: I've added a n
303 decode_timestamp < base::TimeDelta()) {
304 DVLOG(2) << __FUNCTION__
305 << ": frame PTS=" << presentation_timestamp.InSecondsF()
306 << " or DTS=" << decode_timestamp.InSecondsF()
307 << " negative after applying timestampOffset and handling any "
308 << " discontinuity";
309 return false;
310 }
311
307 // 12. If the need random access point flag on track buffer equals true, 312 // 12. If the need random access point flag on track buffer equals true,
308 // then run the following steps: 313 // then run the following steps:
309 if (track_buffer->needs_random_access_point()) { 314 if (track_buffer->needs_random_access_point()) {
310 // 12.1. If the coded frame is not a random access point, then drop the 315 // 12.1. If the coded frame is not a random access point, then drop the
311 // coded frame and jump to the top of the loop to start processing 316 // coded frame and jump to the top of the loop to start processing
312 // the next coded frame. 317 // the next coded frame.
313 if (!frame->IsKeyframe()) { 318 if (!frame->IsKeyframe()) {
314 DVLOG(3) << __FUNCTION__ 319 DVLOG(3) << __FUNCTION__
315 << ": Dropping frame that is not a random access point"; 320 << ": Dropping frame that is not a random access point";
316 return true; 321 return true;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 355
351 // 21. If highest presentation timestamp for track buffer is unset or frame 356 // 21. If highest presentation timestamp for track buffer is unset or frame
352 // end timestamp is greater than highest presentation timestamp, then 357 // end timestamp is greater than highest presentation timestamp, then
353 // set highest presentation timestamp for track buffer to frame end 358 // set highest presentation timestamp for track buffer to frame end
354 // timestamp. 359 // timestamp.
355 track_buffer->SetHighestPresentationTimestampIfIncreased( 360 track_buffer->SetHighestPresentationTimestampIfIncreased(
356 frame_end_timestamp); 361 frame_end_timestamp);
357 362
358 // 22. If frame end timestamp is greater than group end timestamp, then set 363 // 22. If frame end timestamp is greater than group end timestamp, then set
359 // group end timestamp equal to frame end timestamp. 364 // group end timestamp equal to frame end timestamp.
360 DCHECK(group_end_timestamp_ >= base::TimeDelta());
361 if (frame_end_timestamp > group_end_timestamp_) 365 if (frame_end_timestamp > group_end_timestamp_)
362 group_end_timestamp_ = frame_end_timestamp; 366 group_end_timestamp_ = frame_end_timestamp;
367 DCHECK(group_end_timestamp_ >= base::TimeDelta());
363 368
364 return true; 369 return true;
365 } 370 }
366 371
367 NOTREACHED(); 372 NOTREACHED();
368 return false; 373 return false;
369 } 374 }
370 375
371 void FrameProcessor::SetAllTrackBuffersNeedRandomAccessPoint() { 376 void FrameProcessor::SetAllTrackBuffersNeedRandomAccessPoint() {
372 for (TrackBufferMap::iterator itr = track_buffers_.begin(); 377 for (TrackBufferMap::iterator itr = track_buffers_.begin();
373 itr != track_buffers_.end(); ++itr) { 378 itr != track_buffers_.end(); ++itr) {
374 itr->second->set_needs_random_access_point(true); 379 itr->second->set_needs_random_access_point(true);
375 } 380 }
376 } 381 }
377 382
378 } // namespace media 383 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/frame_processor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698