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

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

Issue 53413004: Clear any pending surface change prior to checking media crypto in MSP::ConfigureVideoDecoderJob() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <limits> 7 #include <limits>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 720
721 void MediaSourcePlayer::ConfigureVideoDecoderJob() { 721 void MediaSourcePlayer::ConfigureVideoDecoderJob() {
722 if (!HasVideo() || surface_.IsEmpty()) { 722 if (!HasVideo() || surface_.IsEmpty()) {
723 video_decoder_job_.reset(); 723 video_decoder_job_.reset();
724 if (IsEventPending(SURFACE_CHANGE_EVENT_PENDING)) 724 if (IsEventPending(SURFACE_CHANGE_EVENT_PENDING))
725 ClearPendingEvent(SURFACE_CHANGE_EVENT_PENDING); 725 ClearPendingEvent(SURFACE_CHANGE_EVENT_PENDING);
726 return; 726 return;
727 } 727 }
728 728
729 // Create video decoder job only if config changes or we don't have a job. 729 // Create video decoder job only if config changes or we don't have a job.
730 if (video_decoder_job_ && !reconfig_video_decoder_) 730 if (video_decoder_job_ && !reconfig_video_decoder_) {
731 DCHECK(!IsEventPending(SURFACE_CHANGE_EVENT_PENDING));
731 return; 732 return;
733 }
732 734
733 if (reconfig_video_decoder_) { 735 if (reconfig_video_decoder_) {
734 // No hack browser seek should be required. I-Frame must be next. 736 // No hack browser seek should be required. I-Frame must be next.
735 DCHECK(next_video_data_is_iframe_) << "Received video data between " 737 DCHECK(next_video_data_is_iframe_) << "Received video data between "
736 << "detecting video config change and reconfiguring video decoder"; 738 << "detecting video config change and reconfiguring video decoder";
737 } 739 }
738 740
741 DCHECK(!video_decoder_job_ || !video_decoder_job_->is_decoding());
742
743 // Release the old VideoDecoderJob first so the surface can get released.
744 // Android does not allow 2 MediaCodec instances use the same surface.
745 video_decoder_job_.reset();
wolenetz 2013/10/31 03:03:09 Note, if is_video_encrypted but there is no valid
qinmin 2013/10/31 16:35:52 Should be ok. If there is no media_crypto, the job
acolwell GONE FROM CHROMIUM 2013/10/31 18:11:28 ISTM that we should create a helper function for r
wolenetz 2013/10/31 18:12:07 Could there be a regression here, too: Could we pr
qinmin 2013/10/31 18:32:37 we always need to reset the vide_decoder_job if me
wolenetz 2013/10/31 20:34:24 Done, added helper MSP::ResetVideoDecoderJob().
746
747 if (IsEventPending(SURFACE_CHANGE_EVENT_PENDING))
qinmin 2013/10/31 16:35:52 i think all this should happen after the next if s
wolenetz 2013/10/31 18:12:07 Done. In combination with eventual landing of http
748 ClearPendingEvent(SURFACE_CHANGE_EVENT_PENDING);
749
739 // If uncertain that video I-frame data is next and there is no seek already 750 // If uncertain that video I-frame data is next and there is no seek already
740 // in process, request browser demuxer seek so the new decoder will decode 751 // in process, request browser demuxer seek so the new decoder will decode
741 // an I-frame first. Otherwise, the new MediaCodec might crash. See b/8950387. 752 // an I-frame first. Otherwise, the new MediaCodec might crash. See b/8950387.
742 // TODO(wolenetz): Instead of doing hack browser seek, replay cached data 753 // TODO(wolenetz): Instead of doing hack browser seek, replay cached data
743 // since last keyframe. See http://crbug.com/304234. 754 // since last keyframe. See http://crbug.com/304234.
744 if (!next_video_data_is_iframe_ && !IsEventPending(SEEK_EVENT_PENDING)) { 755 if (!next_video_data_is_iframe_ && !IsEventPending(SEEK_EVENT_PENDING)) {
745 BrowserSeekToCurrentTime(); 756 BrowserSeekToCurrentTime();
746 return; 757 return;
747 } 758 }
748 759
749 base::android::ScopedJavaLocalRef<jobject> media_crypto = GetMediaCrypto(); 760 base::android::ScopedJavaLocalRef<jobject> media_crypto = GetMediaCrypto();
750 if (is_video_encrypted_ && media_crypto.is_null()) 761 if (is_video_encrypted_ && media_crypto.is_null())
751 return; 762 return;
752 763
753 DCHECK(!video_decoder_job_ || !video_decoder_job_->is_decoding());
754
755 DVLOG(1) << __FUNCTION__ << " : creating new video decoder job"; 764 DVLOG(1) << __FUNCTION__ << " : creating new video decoder job";
756 765
757 // Release the old VideoDecoderJob first so the surface can get released.
758 // Android does not allow 2 MediaCodec instances use the same surface.
759 video_decoder_job_.reset();
760 // Create the new VideoDecoderJob. 766 // Create the new VideoDecoderJob.
761 bool is_secure = IsProtectedSurfaceRequired(); 767 bool is_secure = IsProtectedSurfaceRequired();
762 video_decoder_job_.reset( 768 video_decoder_job_.reset(
763 VideoDecoderJob::Create(video_codec_, 769 VideoDecoderJob::Create(video_codec_,
764 is_secure, 770 is_secure,
765 gfx::Size(width_, height_), 771 gfx::Size(width_, height_),
766 surface_.j_surface().obj(), 772 surface_.j_surface().obj(),
767 media_crypto.obj(), 773 media_crypto.obj(),
768 base::Bind(&DemuxerAndroid::RequestDemuxerData, 774 base::Bind(&DemuxerAndroid::RequestDemuxerData,
769 base::Unretained(demuxer_.get()), 775 base::Unretained(demuxer_.get()),
770 DemuxerStream::VIDEO))); 776 DemuxerStream::VIDEO)));
771 if (video_decoder_job_) { 777 if (video_decoder_job_) {
772 video_decoder_job_->BeginPrerolling(preroll_timestamp_); 778 video_decoder_job_->BeginPrerolling(preroll_timestamp_);
773 reconfig_video_decoder_ = false; 779 reconfig_video_decoder_ = false;
774 } 780 }
775 781
776 if (IsEventPending(SURFACE_CHANGE_EVENT_PENDING))
777 ClearPendingEvent(SURFACE_CHANGE_EVENT_PENDING);
778
779 // Inform the fullscreen view the player is ready. 782 // Inform the fullscreen view the player is ready.
780 // TODO(qinmin): refactor MediaPlayerBridge so that we have a better way 783 // TODO(qinmin): refactor MediaPlayerBridge so that we have a better way
781 // to inform ContentVideoView. 784 // to inform ContentVideoView.
782 manager()->OnMediaMetadataChanged( 785 manager()->OnMediaMetadataChanged(
acolwell GONE FROM CHROMIUM 2013/10/31 18:11:28 Why do we blindly notify the manager even when the
qinmin 2013/10/31 18:32:37 If the decoder job is created, this is to let the
wolenetz 2013/10/31 20:34:24 Done.
783 player_id(), duration_, width_, height_, true); 786 player_id(), duration_, width_, height_, true);
784 } 787 }
785 788
786 void MediaSourcePlayer::OnDecoderStarved() { 789 void MediaSourcePlayer::OnDecoderStarved() {
787 DVLOG(1) << __FUNCTION__; 790 DVLOG(1) << __FUNCTION__;
788 SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING); 791 SetPendingEvent(PREFETCH_REQUEST_EVENT_PENDING);
789 ProcessPendingEvents(); 792 ProcessPendingEvents();
790 } 793 }
791 794
792 void MediaSourcePlayer::StartStarvationCallback( 795 void MediaSourcePlayer::StartStarvationCallback(
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 890
888 void MediaSourcePlayer::ClearPendingEvent(PendingEventFlags event) { 891 void MediaSourcePlayer::ClearPendingEvent(PendingEventFlags event) {
889 DVLOG(1) << __FUNCTION__ << "(" << GetEventName(event) << ")"; 892 DVLOG(1) << __FUNCTION__ << "(" << GetEventName(event) << ")";
890 DCHECK_NE(event, NO_EVENT_PENDING); 893 DCHECK_NE(event, NO_EVENT_PENDING);
891 DCHECK(IsEventPending(event)) << GetEventName(event); 894 DCHECK(IsEventPending(event)) << GetEventName(event);
892 895
893 pending_event_ &= ~event; 896 pending_event_ &= ~event;
894 } 897 }
895 898
896 } // namespace media 899 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698