Bug 1371719 - Don't create a MediaStreamGraph without doing anything with it. r=jesup
The MediaStreamGraph relies on having at least one message sent to its message queue on creation, or it will just sit there and do nothing, and block shutdown because its not running its rendering loop, so it's not progressing in the MediaStreamGraph life cycle state machine. This patch makes sure the `captureStream` will succeed before creating an MSG. MozReview-Commit-ID: CN1arWydmxC
This commit is contained in:
@@ -3399,24 +3399,34 @@ HTMLMediaElement::AddCaptureMediaTrackToOutputStream(MediaTrack* aTrack,
|
||||
track.get(), destinationTrackID, inputTrack, port.get()));
|
||||
}
|
||||
|
||||
bool
|
||||
HTMLMediaElement::CanBeCaptured(bool aCaptureAudio)
|
||||
{
|
||||
// Don't bother capturing when the document has gone away
|
||||
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
|
||||
if (!window) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Prevent capturing restricted video
|
||||
if (!aCaptureAudio && ContainsRestrictedContent()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
already_AddRefed<DOMMediaStream>
|
||||
HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
|
||||
bool aCaptureAudio,
|
||||
MediaStreamGraph* aGraph)
|
||||
{
|
||||
MOZ_RELEASE_ASSERT(aGraph);
|
||||
MOZ_ASSERT(CanBeCaptured(aCaptureAudio));
|
||||
|
||||
MarkAsContentSource(CallerAPI::CAPTURE_STREAM);
|
||||
MarkAsTainted();
|
||||
|
||||
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
|
||||
if (!window) {
|
||||
return nullptr;
|
||||
}
|
||||
if (!aCaptureAudio && ContainsRestrictedContent()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// We don't support routing to a different graph.
|
||||
if (!mOutputStreams.IsEmpty() &&
|
||||
aGraph != mOutputStreams[0].mStream->GetInputStream()->Graph()) {
|
||||
return nullptr;
|
||||
@@ -3424,6 +3434,7 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
|
||||
|
||||
OutputMediaStream* out = mOutputStreams.AppendElement();
|
||||
MediaStreamTrackSourceGetter* getter = new CaptureStreamTrackSourceGetter(this);
|
||||
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
|
||||
out->mStream = DOMMediaStream::CreateTrackUnionStreamAsInput(window, aGraph, getter);
|
||||
out->mStream->SetInactiveOnFinish();
|
||||
out->mFinishWhenEnded = aFinishWhenEnded;
|
||||
@@ -3530,6 +3541,19 @@ HTMLMediaElement::MozCaptureStream(ErrorResult& aRv)
|
||||
MediaStreamGraph::GraphDriverType graphDriverType =
|
||||
HasAudio() ? MediaStreamGraph::AUDIO_THREAD_DRIVER
|
||||
: MediaStreamGraph::SYSTEM_THREAD_DRIVER;
|
||||
|
||||
|
||||
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
|
||||
if (!window) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!CanBeCaptured(false)) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MediaStreamGraph* graph =
|
||||
MediaStreamGraph::GetInstance(graphDriverType, mAudioChannel);
|
||||
|
||||
@@ -3549,6 +3573,18 @@ HTMLMediaElement::MozCaptureStreamUntilEnded(ErrorResult& aRv)
|
||||
MediaStreamGraph::GraphDriverType graphDriverType =
|
||||
HasAudio() ? MediaStreamGraph::AUDIO_THREAD_DRIVER
|
||||
: MediaStreamGraph::SYSTEM_THREAD_DRIVER;
|
||||
|
||||
nsPIDOMWindowInner* window = OwnerDoc()->GetInnerWindow();
|
||||
if (!window) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!CanBeCaptured(false)) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
MediaStreamGraph* graph =
|
||||
MediaStreamGraph::GetInstance(graphDriverType, mAudioChannel);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user