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

Side by Side Diff: media/base/android/media_source_player.cc

Issue 2239243002: Interpolate media time for mojo rendering pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 3 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/base/android/media_source_player.h" 5 #include "media/base/android/media_source_player.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <limits> 9 #include <limits>
10 #include <utility> 10 #include <utility>
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 RetryDecoderCreation(false, true); 97 RetryDecoderCreation(false, true);
98 } 98 }
99 99
100 void MediaSourcePlayer::ScheduleSeekEventAndStopDecoding( 100 void MediaSourcePlayer::ScheduleSeekEventAndStopDecoding(
101 base::TimeDelta seek_time) { 101 base::TimeDelta seek_time) {
102 DVLOG(1) << __FUNCTION__ << "(" << seek_time.InSecondsF() << ")"; 102 DVLOG(1) << __FUNCTION__ << "(" << seek_time.InSecondsF() << ")";
103 DCHECK(!IsEventPending(SEEK_EVENT_PENDING)); 103 DCHECK(!IsEventPending(SEEK_EVENT_PENDING));
104 104
105 pending_seek_ = false; 105 pending_seek_ = false;
106 106
107 interpolator_.SetBounds(seek_time, seek_time); 107 interpolator_.SetBounds(seek_time, seek_time, default_tick_clock_.NowTicks());
108 108
109 if (audio_decoder_job_->is_decoding()) 109 if (audio_decoder_job_->is_decoding())
110 audio_decoder_job_->StopDecode(); 110 audio_decoder_job_->StopDecode();
111 if (video_decoder_job_->is_decoding()) 111 if (video_decoder_job_->is_decoding())
112 video_decoder_job_->StopDecode(); 112 video_decoder_job_->StopDecode();
113 113
114 SetPendingEvent(SEEK_EVENT_PENDING); 114 SetPendingEvent(SEEK_EVENT_PENDING);
115 ProcessPendingEvents(); 115 ProcessPendingEvents();
116 } 116 }
117 117
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 // I-frame later than the requested one due to data removal or GC. Update 359 // I-frame later than the requested one due to data removal or GC. Update
360 // player clock to the actual seek target. 360 // player clock to the actual seek target.
361 if (doing_browser_seek_) { 361 if (doing_browser_seek_) {
362 DCHECK(actual_browser_seek_time != kNoTimestamp); 362 DCHECK(actual_browser_seek_time != kNoTimestamp);
363 base::TimeDelta seek_time = actual_browser_seek_time; 363 base::TimeDelta seek_time = actual_browser_seek_time;
364 // A browser seek must not jump into the past. Ideally, it seeks to the 364 // A browser seek must not jump into the past. Ideally, it seeks to the
365 // requested time, but it might jump into the future. 365 // requested time, but it might jump into the future.
366 DCHECK(seek_time >= GetCurrentTime()); 366 DCHECK(seek_time >= GetCurrentTime());
367 DVLOG(1) << __FUNCTION__ << " : setting clock to actual browser seek time: " 367 DVLOG(1) << __FUNCTION__ << " : setting clock to actual browser seek time: "
368 << seek_time.InSecondsF(); 368 << seek_time.InSecondsF();
369 interpolator_.SetBounds(seek_time, seek_time); 369 interpolator_.SetBounds(seek_time, seek_time,
370 default_tick_clock_.NowTicks());
370 audio_decoder_job_->SetBaseTimestamp(seek_time); 371 audio_decoder_job_->SetBaseTimestamp(seek_time);
371 } else { 372 } else {
372 DCHECK(actual_browser_seek_time == kNoTimestamp); 373 DCHECK(actual_browser_seek_time == kNoTimestamp);
373 } 374 }
374 375
375 base::TimeDelta current_time = GetCurrentTime(); 376 base::TimeDelta current_time = GetCurrentTime();
376 // TODO(qinmin): Simplify the logic by using |start_presentation_timestamp_| 377 // TODO(qinmin): Simplify the logic by using |start_presentation_timestamp_|
377 // to preroll media decoder jobs. Currently |start_presentation_timestamp_| 378 // to preroll media decoder jobs. Currently |start_presentation_timestamp_|
378 // is calculated from decoder output, while preroll relies on the access 379 // is calculated from decoder output, while preroll relies on the access
379 // unit's timestamp. There are some differences between the two. 380 // unit's timestamp. There are some differences between the two.
380 preroll_timestamp_ = current_time; 381 preroll_timestamp_ = current_time;
381 if (HasAudio()) 382 if (HasAudio())
382 audio_decoder_job_->BeginPrerolling(preroll_timestamp_); 383 audio_decoder_job_->BeginPrerolling(preroll_timestamp_);
383 if (HasVideo()) 384 if (HasVideo())
384 video_decoder_job_->BeginPrerolling(preroll_timestamp_); 385 video_decoder_job_->BeginPrerolling(preroll_timestamp_);
385 prerolling_ = true; 386 prerolling_ = true;
386 387
387 if (!doing_browser_seek_) 388 if (!doing_browser_seek_)
388 manager()->OnSeekComplete(player_id(), current_time); 389 manager()->OnSeekComplete(player_id(), current_time);
389 390
390 ProcessPendingEvents(); 391 ProcessPendingEvents();
391 } 392 }
392 393
393 void MediaSourcePlayer::UpdateTimestamps( 394 void MediaSourcePlayer::UpdateTimestamps(
394 base::TimeDelta current_presentation_timestamp, 395 base::TimeDelta current_presentation_timestamp,
395 base::TimeDelta max_presentation_timestamp) { 396 base::TimeDelta max_presentation_timestamp) {
397 base::TimeTicks now_ticks = default_tick_clock_.NowTicks();
396 interpolator_.SetBounds(current_presentation_timestamp, 398 interpolator_.SetBounds(current_presentation_timestamp,
397 max_presentation_timestamp); 399 max_presentation_timestamp, now_ticks);
398 manager()->OnTimeUpdate(player_id(), 400 manager()->OnTimeUpdate(player_id(), GetCurrentTime(), now_ticks);
399 GetCurrentTime(),
400 base::TimeTicks::Now());
401 } 401 }
402 402
403 void MediaSourcePlayer::ProcessPendingEvents() { 403 void MediaSourcePlayer::ProcessPendingEvents() {
404 DVLOG(1) << __FUNCTION__ << " : 0x" << std::hex << pending_event_; 404 DVLOG(1) << __FUNCTION__ << " : 0x" << std::hex << pending_event_;
405 // Wait for all the decoding jobs to finish before processing pending tasks. 405 // Wait for all the decoding jobs to finish before processing pending tasks.
406 if (video_decoder_job_->is_decoding()) { 406 if (video_decoder_job_->is_decoding()) {
407 DVLOG(1) << __FUNCTION__ << " : A video job is still decoding."; 407 DVLOG(1) << __FUNCTION__ << " : A video job is still decoding.";
408 return; 408 return;
409 } 409 }
410 410
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 is_waiting_for_key_ = false; 857 is_waiting_for_key_ = false;
858 key_added_while_decode_pending_ = false; 858 key_added_while_decode_pending_ = false;
859 859
860 // StartInternal() will trigger a prefetch, where in most cases we'll just 860 // StartInternal() will trigger a prefetch, where in most cases we'll just
861 // use previously received data. 861 // use previously received data.
862 if (playing_) 862 if (playing_)
863 StartInternal(); 863 StartInternal();
864 } 864 }
865 865
866 } // namespace media 866 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698