void ChannelMediaDecoder::ResourceCallback::NotifySuspendedStatusChanged( bool aSuspendedByCache) { MOZ_ASSERT(NS_IsMainThread()); DDLOGEX2("ChannelMediaDecoder::ResourceCallback", this, DDLogCategory::Log, "suspended_status_changed", aSuspendedByCache); MediaDecoderOwner* owner = GetMediaOwner(); if (owner) { AbstractThread::AutoEnter context(owner->AbstractMainThread()); owner->NotifySuspendedByCache(aSuspendedByCache); } }
void ChannelMediaDecoder::NotifyDownloadEnded(nsresult aStatus) { MOZ_ASSERT(NS_IsMainThread()); MOZ_DIAGNOSTIC_ASSERT(!IsShutdown()); AbstractThread::AutoEnter context(AbstractMainThread()); LOG("NotifyDownloadEnded, status=%" PRIx32, static_cast<uint32_t>(aStatus)); if (NS_SUCCEEDED(aStatus)) { // Download ends successfully. This is a stream with a finite length. GetStateMachine()->DispatchIsLiveStream(false); } MediaDecoderOwner* owner = GetOwner(); if (NS_SUCCEEDED(aStatus) || aStatus == NS_BASE_STREAM_CLOSED) { nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction("ChannelMediaDecoder::UpdatePlaybackRate", [ stats = mPlaybackStatistics, res = RefPtr<BaseMediaResource>(mResource), duration = mDuration ]() { auto rate = ComputePlaybackRate(stats, res, duration); UpdatePlaybackRate(rate, res); }); nsresult rv = GetStateMachine()->OwnerThread()->Dispatch(r.forget()); MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv)); Unused << rv; owner->DownloadSuspended(); // NotifySuspendedStatusChanged will tell the element that download // has been suspended "by the cache", which is true since we never // download anything. The element can then transition to HAVE_ENOUGH_DATA. owner->NotifySuspendedByCache(true); } else if (aStatus == NS_BINDING_ABORTED) { // Download has been cancelled by user. owner->LoadAborted(); } else { NetworkError(MediaResult(aStatus, "Download aborted")); } }