Bug 1299451 - Fix mozCaptureStream() happening after setting src but before having metadata. r?jesup
MozReview-Commit-ID: CKC3n3Nt5IE
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -2570,26 +2570,31 @@ HTMLMediaElement::CaptureStreamInternal(
}
// mAudioCaptured tells the user that the audio played by this media element
// is being routed to the captureStreams *instead* of being played to
// speakers.
mAudioCaptured = true;
}
+ if (mDecoder) {
+ out->mCapturingDecoder = true;
+ mDecoder->AddOutputStream(out->mStream->GetInputStream()->AsProcessedStream(),
+ aFinishWhenEnded);
+ } else if (mSrcStream) {
+ out->mCapturingMediaStream = true;
+ }
+
if (mReadyState == HAVE_NOTHING) {
- // Do not expose the tracks directly before we have metadata.
+ // Do not expose the tracks until we have metadata.
RefPtr<DOMMediaStream> result = out->mStream;
return result.forget();
}
if (mDecoder) {
- out->mCapturingDecoder = true;
- mDecoder->AddOutputStream(out->mStream->GetInputStream()->AsProcessedStream(),
- aFinishWhenEnded);
if (HasAudio()) {
TrackID audioTrackId = mMediaInfo.mAudio.mTrackId;
RefPtr<MediaStreamTrackSource> trackSource =
getter->GetMediaStreamTrackSource(audioTrackId);
RefPtr<MediaStreamTrack> track =
out->mStream->CreateDOMTrack(audioTrackId, MediaSegment::AUDIO,
trackSource);
out->mStream->AddTrackInternal(track);
@@ -2605,32 +2610,16 @@ HTMLMediaElement::CaptureStreamInternal(
trackSource);
out->mStream->AddTrackInternal(track);
LOG(LogLevel::Debug,
("Created video track %d for captured decoder", videoTrackId));
}
}
if (mSrcStream) {
- out->mCapturingMediaStream = true;
- MediaStream* inputStream = out->mStream->GetInputStream();
- if (!inputStream) {
- NS_ERROR("No input stream");
- RefPtr<DOMMediaStream> result = out->mStream;
- return result.forget();
- }
-
- ProcessedMediaStream* processedInputStream =
- inputStream->AsProcessedStream();
- if (!processedInputStream) {
- NS_ERROR("Input stream not a ProcessedMediaStream");
- RefPtr<DOMMediaStream> result = out->mStream;
- return result.forget();
- }
-
for (size_t i = 0; i < AudioTracks()->Length(); ++i) {
AudioTrack* t = (*AudioTracks())[i];
if (t->Enabled()) {
AddCaptureMediaTrackToOutputStream(t, *out, false);
}
}
if (IsVideo() && !out->mCapturingAudioOnly) {
// Only add video tracks if we're a video element and the output stream