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")); } }
void ChannelMediaDecoder::ResourceCallback::NotifyDataEnded(nsresult aStatus) { RefPtr<ResourceCallback> self = this; nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction( "ChannelMediaDecoder::ResourceCallback::NotifyDataEnded", [=]() { if (!self->mDecoder) { return; } self->mDecoder->NotifyDownloadEnded(aStatus); if (NS_SUCCEEDED(aStatus)) { MediaDecoderOwner* owner = self->GetMediaOwner(); MOZ_ASSERT(owner); 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. self->mDecoder->NotifySuspendedStatusChanged(); } }); mAbstractMainThread->Dispatch(r.forget()); }