Bug 1053186 - AudioOffloadPlayer: Avoid glitch during start of playback. r=roc

This commit is contained in:
Vasanthakumar Pandurangan 2014-08-18 05:49:51 -07:00
parent ff5f4c75b0
commit 02ce0b67cb
5 changed files with 23 additions and 7 deletions

View File

@ -119,8 +119,11 @@ public:
// required to begin playback have been acquired. Can be called on any thread.
virtual void NotifyWaitingForResourcesStatusChanged() = 0;
// Called by Reader if the current audio track can be offloaded
virtual void SetCanOffloadAudio(bool aCanOffloadAudio) {}
// Set by Reader if the current audio track can be offloaded
virtual void SetPlatformCanOffloadAudio(bool aCanOffloadAudio) {}
// Called by Decoder/State machine to check audio offload condtions are met
virtual bool CheckDecoderCanOffloadAudio() { return false; }
// Called from HTMLMediaElement when owner document activity changes
virtual void SetElementVisibility(bool aIsVisible) {}

View File

@ -1135,6 +1135,11 @@ void MediaDecoderStateMachine::StartPlayback()
NS_ASSERTION(!IsPlaying(), "Shouldn't be playing when StartPlayback() is called");
AssertCurrentThreadInMonitor();
if (mDecoder->CheckDecoderCanOffloadAudio()) {
DECODER_LOG(PR_LOG_DEBUG, "Offloading playback");
return;
}
mDecoder->NotifyPlaybackStarted();
SetPlayStartTime(TimeStamp::Now());

View File

@ -41,12 +41,19 @@ MediaOmxCommonDecoder::MediaOmxCommonDecoder()
}
void
MediaOmxCommonDecoder::SetCanOffloadAudio(bool aCanOffloadAudio)
MediaOmxCommonDecoder::SetPlatformCanOffloadAudio(bool aCanOffloadAudio)
{
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
mCanOffloadAudio = aCanOffloadAudio;
}
bool
MediaOmxCommonDecoder::CheckDecoderCanOffloadAudio()
{
return (mCanOffloadAudio && !mFallbackToStateMachine && !mOutputStreams.Length() &&
mInitialPlaybackRate == 1.0);
}
void
MediaOmxCommonDecoder::MetadataLoaded(MediaInfo* aInfo,
MetadataTags* aTags)
@ -55,8 +62,7 @@ MediaOmxCommonDecoder::MetadataLoaded(MediaInfo* aInfo,
MediaDecoder::MetadataLoaded(aInfo, aTags);
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
if (!mCanOffloadAudio || mFallbackToStateMachine || mOutputStreams.Length() ||
mInitialPlaybackRate != 1.0) {
if (!CheckDecoderCanOffloadAudio()) {
DECODER_LOG(PR_LOG_DEBUG, ("In %s Offload Audio check failed",
__PRETTY_FUNCTION__));
return;
@ -79,6 +85,7 @@ MediaOmxCommonDecoder::MetadataLoaded(MediaInfo* aInfo,
}
mAudioOffloadPlayer = nullptr;
mFallbackToStateMachine = true;
DECODER_LOG(PR_LOG_DEBUG, ("In %s Unable to start offload audio %d."
"Switching to normal mode", __PRETTY_FUNCTION__, err));
}

View File

@ -31,7 +31,8 @@ public:
virtual void PlaybackPositionChanged();
virtual void UpdateReadyStateForData();
virtual void SetElementVisibility(bool aIsVisible);
virtual void SetCanOffloadAudio(bool aCanOffloadAudio);
virtual void SetPlatformCanOffloadAudio(bool aCanOffloadAudio);
virtual bool CheckDecoderCanOffloadAudio();
virtual void AddOutputStream(ProcessedMediaStream* aStream,
bool aFinishWhenEnded);
virtual void SetPlaybackRate(double aPlaybackRate);

View File

@ -73,7 +73,7 @@ void MediaOmxCommonReader::CheckAudioOffload()
if ((meta.get()) && hasNoVideo && isNotStreaming && isTypeMusic &&
canOffloadStream(meta, false, false, AUDIO_STREAM_MUSIC)) {
DECODER_LOG(PR_LOG_DEBUG, ("Can offload this audio stream"));
mDecoder->SetCanOffloadAudio(true);
mDecoder->SetPlatformCanOffloadAudio(true);
}
}
#endif