already_AddRefed<MediaElementAudioSourceNode> AudioContext::CreateMediaElementSource(HTMLMediaElement& aMediaElement, ErrorResult& aRv) { if (mIsOffline) { aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return nullptr; } #ifdef MOZ_EME if (aMediaElement.ContainsRestrictedContent()) { aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return nullptr; } #endif if (CheckClosed(aRv)) { return nullptr; } RefPtr<DOMMediaStream> stream = aMediaElement.MozCaptureStream(aRv, mDestination->Stream()->Graph()); if (aRv.Failed()) { return nullptr; } return MediaElementAudioSourceNode::Create(this, stream, aRv); }
already_AddRefed<MediaElementAudioSourceNode> AudioContext::CreateMediaElementSource(HTMLMediaElement& aMediaElement, ErrorResult& aRv) { if (mIsOffline) { aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return nullptr; } nsRefPtr<DOMMediaStream> stream = aMediaElement.MozCaptureStream(aRv); if (aRv.Failed()) { return nullptr; } nsRefPtr<MediaElementAudioSourceNode> mediaElementAudioSourceNode = new MediaElementAudioSourceNode(this, stream); return mediaElementAudioSourceNode.forget(); }
already_AddRefed<DOMMediaStream> TVTuner::CreateSimulatedMediaStream() { nsCOMPtr<nsPIDOMWindowInner> domWin = GetOwner(); if (NS_WARN_IF(!domWin)) { return nullptr; } nsIDocument* doc = domWin->GetExtantDoc(); if (NS_WARN_IF(!doc)) { return nullptr; } ErrorResult error; ElementCreationOptionsOrString options; options.SetAsString(); RefPtr<Element> element = doc->CreateElement(VIDEO_TAG, options, error); if (NS_WARN_IF(error.Failed())) { error.SuppressException(); return nullptr; } nsCOMPtr<nsIContent> content(do_QueryInterface(element)); if (NS_WARN_IF(!content)) { return nullptr; } HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(content.get()); if (NS_WARN_IF(!mediaElement)) { return nullptr; } mediaElement->SetAutoplay(true, error); if (NS_WARN_IF(error.Failed())) { error.SuppressException(); return nullptr; } mediaElement->SetLoop(true, error); if (NS_WARN_IF(error.Failed())) { error.SuppressException(); return nullptr; } nsCOMPtr<nsITVSimulatorService> simService(do_QueryInterface(mTVService)); if (NS_WARN_IF(!simService)) { return nullptr; } if (NS_WARN_IF(!mCurrentSource)) { return nullptr; } RefPtr<TVChannel> currentChannel = mCurrentSource->GetCurrentChannel(); if (NS_WARN_IF(!currentChannel)) { return nullptr; } nsString currentChannelNumber; currentChannel->GetNumber(currentChannelNumber); if (currentChannelNumber.IsEmpty()) { return nullptr; } nsString currentVideoBlobUrl; nsresult rv = simService->GetSimulatorVideoBlobURL(mId, ToTVSourceTypeStr(mCurrentSource->Type()), currentChannelNumber, domWin, currentVideoBlobUrl); if (NS_WARN_IF(NS_FAILED(rv) || currentVideoBlobUrl.IsEmpty())) { return nullptr; } mediaElement->SetSrc(currentVideoBlobUrl, error); if (NS_WARN_IF(error.Failed())) { error.SuppressException(); return nullptr; } // See Media Capture from DOM Elements spec. // http://www.w3.org/TR/mediacapture-fromelement/ RefPtr<DOMMediaStream> stream = mediaElement->MozCaptureStream(error); if (NS_WARN_IF(error.Failed())) { error.SuppressException(); return nullptr; } return stream.forget(); }