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

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

Issue 1254293003: MediaCodecPlayer implementation (stage 4 - preroll) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mtplayer-browserseek
Patch Set: Moved pending buffer to Java side, preroll after decoder creation and Release() Created 5 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_codec_player.h" 5 #include "media/base/android/media_codec_player.h"
6 6
7 #include "base/barrier_closure.h" 7 #include "base/barrier_closure.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 425
426 // Restrict the current time to be equal to seek_time 426 // Restrict the current time to be equal to seek_time
427 // for the next StartPlaybackDecoders() call. 427 // for the next StartPlaybackDecoders() call.
428 428
429 base::TimeDelta seek_time = seek_info_->is_browser_seek 429 base::TimeDelta seek_time = seek_info_->is_browser_seek
430 ? actual_browser_seek_time 430 ? actual_browser_seek_time
431 : seek_info_->seek_time; 431 : seek_info_->seek_time;
432 432
433 interpolator_.SetBounds(seek_time, seek_time); 433 interpolator_.SetBounds(seek_time, seek_time);
434 audio_decoder_->SetBaseTimestamp(seek_time); 434 audio_decoder_->SetBaseTimestamp(seek_time);
435 audio_decoder_->SetNeedsPreroll(true);
Tima Vaisburd 2015/08/01 04:34:43 Would it be better to put needs_preroll = true ins
436 video_decoder_->SetNeedsPreroll(true);
435 437
436 // The Flush() might set the state to kStateError. 438 // The Flush() might set the state to kStateError.
437 if (state_ == kStateError) { 439 if (state_ == kStateError) {
438 // Notify the Renderer. 440 // Notify the Renderer.
439 if (!seek_info_->is_browser_seek) 441 if (!seek_info_->is_browser_seek)
440 ui_task_runner_->PostTask(FROM_HERE, 442 ui_task_runner_->PostTask(FROM_HERE,
441 base::Bind(seek_done_cb_, seek_time)); 443 base::Bind(seek_done_cb_, seek_time));
442 444
443 seek_info_.reset(); 445 seek_info_.reset();
444 return; 446 return;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 550
549 if (HasVideo() && !video_decoder_->HasVideoSurface()) { 551 if (HasVideo() && !video_decoder_->HasVideoSurface()) {
550 SetState(kStateWaitingForSurface); 552 SetState(kStateWaitingForSurface);
551 return; 553 return;
552 } 554 }
553 555
554 SetState(kStatePlaying); 556 SetState(kStatePlaying);
555 StartPlaybackOrBrowserSeek(); 557 StartPlaybackOrBrowserSeek();
556 } 558 }
557 559
560 void MediaCodecPlayer::OnPrerollDone() {
561 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
562 DVLOG(1) << __FUNCTION__;
563
564 if (!(audio_decoder_->IsPrerollDone() && video_decoder_->IsPrerollDone())) {
565 DVLOG(1) << __FUNCTION__ << " both audio and video needs to be done"
566 << " prerolling, ignoring";
567 return; // Wait until both streams are done prerolling.
568 }
569
570 if (!AudioFinished())
571 audio_decoder_->ResumeAfterPreroll();
572 if (!VideoFinished())
573 video_decoder_->ResumeAfterPreroll();
574 }
575
558 void MediaCodecPlayer::OnStopDone() { 576 void MediaCodecPlayer::OnStopDone() {
559 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); 577 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
560 DVLOG(1) << __FUNCTION__; 578 DVLOG(1) << __FUNCTION__;
561 579
562 if (!(audio_decoder_->IsStopped() && video_decoder_->IsStopped())) 580 if (!(audio_decoder_->IsStopped() && video_decoder_->IsStopped())) {
581 DVLOG(1) << __FUNCTION__ << " both audio and video has to be stopped"
582 << ", ignoring";
563 return; // Wait until other stream is stopped 583 return; // Wait until other stream is stopped
584 }
564 585
565 // At this point decoder threads should not be running 586 // At this point decoder threads should not be running
566 if (interpolator_.interpolating()) 587 if (interpolator_.interpolating())
567 interpolator_.StopInterpolating(); 588 interpolator_.StopInterpolating();
568 589
569 base::TimeDelta seek_time; 590 base::TimeDelta seek_time;
570 switch (state_) { 591 switch (state_) {
571 case kStateStopping: { 592 case kStateStopping: {
572 base::TimeDelta seek_time = GetPendingSeek(); 593 base::TimeDelta seek_time = GetPendingSeek();
573 if (seek_time != kNoTimestamp()) { 594 if (seek_time != kNoTimestamp()) {
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread()); 936 DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
916 DVLOG(1) << __FUNCTION__; 937 DVLOG(1) << __FUNCTION__;
917 938
918 internal_error_cb_ = base::Bind(&MediaCodecPlayer::OnError, media_weak_this_); 939 internal_error_cb_ = base::Bind(&MediaCodecPlayer::OnError, media_weak_this_);
919 940
920 audio_decoder_.reset(new MediaCodecAudioDecoder( 941 audio_decoder_.reset(new MediaCodecAudioDecoder(
921 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, 942 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData,
922 media_weak_this_, DemuxerStream::AUDIO), 943 media_weak_this_, DemuxerStream::AUDIO),
923 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, 944 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_,
924 DemuxerStream::AUDIO), 945 DemuxerStream::AUDIO),
946 base::Bind(&MediaCodecPlayer::OnPrerollDone, media_weak_this_),
925 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), 947 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_),
926 internal_error_cb_, 948 internal_error_cb_,
927 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, 949 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_,
928 DemuxerStream::AUDIO))); 950 DemuxerStream::AUDIO)));
929 951
930 video_decoder_.reset(new MediaCodecVideoDecoder( 952 video_decoder_.reset(new MediaCodecVideoDecoder(
931 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData, 953 GetMediaTaskRunner(), base::Bind(&MediaCodecPlayer::RequestDemuxerData,
932 media_weak_this_, DemuxerStream::VIDEO), 954 media_weak_this_, DemuxerStream::VIDEO),
933 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_, 955 base::Bind(&MediaCodecPlayer::OnStarvation, media_weak_this_,
934 DemuxerStream::VIDEO), 956 DemuxerStream::VIDEO),
957 base::Bind(&MediaCodecPlayer::OnPrerollDone, media_weak_this_),
935 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_), 958 base::Bind(&MediaCodecPlayer::OnStopDone, media_weak_this_),
936 internal_error_cb_, 959 internal_error_cb_,
937 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_, 960 base::Bind(&MediaCodecPlayer::OnTimeIntervalUpdate, media_weak_this_,
938 DemuxerStream::VIDEO), 961 DemuxerStream::VIDEO),
939 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_), 962 base::Bind(&MediaCodecPlayer::OnVideoResolutionChanged, media_weak_this_),
940 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_))); 963 base::Bind(&MediaCodecPlayer::OnVideoCodecCreated, media_weak_this_)));
941 } 964 }
942 965
943 bool MediaCodecPlayer::AudioFinished() const { 966 bool MediaCodecPlayer::AudioFinished() const {
944 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream(); 967 return audio_decoder_->IsCompleted() || !audio_decoder_->HasStream();
(...skipping 25 matching lines...) Expand all
970 RETURN_STRING(kStateWaitingForSurface); 993 RETURN_STRING(kStateWaitingForSurface);
971 RETURN_STRING(kStateWaitingForSeek); 994 RETURN_STRING(kStateWaitingForSeek);
972 RETURN_STRING(kStateError); 995 RETURN_STRING(kStateError);
973 } 996 }
974 return nullptr; // crash early 997 return nullptr; // crash early
975 } 998 }
976 999
977 #undef RETURN_STRING 1000 #undef RETURN_STRING
978 1001
979 } // namespace media 1002 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698