Bug 1453127 - Ensure TrackID uniqueness for captured MediaDecoder. r=jya
This commit is contained in:
@@ -1726,6 +1726,14 @@ HTMLMediaElement::ShutdownDecoder()
|
||||
if (mMediaSource) {
|
||||
mMediaSource->CompletePendingTransactions();
|
||||
}
|
||||
for (OutputMediaStream& out : mOutputStreams) {
|
||||
if (!out.mCapturingDecoder) {
|
||||
continue;
|
||||
}
|
||||
out.mNextAvailableTrackID = std::max<TrackID>(
|
||||
mDecoder->NextAvailableTrackIDFor(out.mStream->GetInputStream()),
|
||||
out.mNextAvailableTrackID);
|
||||
}
|
||||
mDecoder->Shutdown();
|
||||
DDUNLINKCHILD(mDecoder.get());
|
||||
mDecoder = nullptr;
|
||||
@@ -3539,6 +3547,7 @@ HTMLMediaElement::CaptureStreamInternal(StreamCaptureBehavior aFinishBehavior,
|
||||
out->mCapturingDecoder = true;
|
||||
mDecoder->AddOutputStream(
|
||||
out->mStream->GetInputStream()->AsProcessedStream(),
|
||||
out->mNextAvailableTrackID,
|
||||
aFinishBehavior == StreamCaptureBehavior::FINISH_WHEN_ENDED);
|
||||
} else if (mSrcStream) {
|
||||
out->mCapturingMediaStream = true;
|
||||
@@ -3552,7 +3561,7 @@ HTMLMediaElement::CaptureStreamInternal(StreamCaptureBehavior aFinishBehavior,
|
||||
|
||||
if (mDecoder) {
|
||||
if (HasAudio()) {
|
||||
TrackID audioTrackId = mMediaInfo.mAudio.mTrackId;
|
||||
TrackID audioTrackId = out->mNextAvailableTrackID++;
|
||||
RefPtr<MediaStreamTrackSource> trackSource =
|
||||
getter->GetMediaStreamTrackSource(audioTrackId);
|
||||
RefPtr<MediaStreamTrack> track = out->mStream->CreateDOMTrack(
|
||||
@@ -3563,7 +3572,7 @@ HTMLMediaElement::CaptureStreamInternal(StreamCaptureBehavior aFinishBehavior,
|
||||
("Created audio track %d for captured decoder", audioTrackId));
|
||||
}
|
||||
if (IsVideo() && HasVideo() && !out->mCapturingAudioOnly) {
|
||||
TrackID videoTrackId = mMediaInfo.mVideo.mTrackId;
|
||||
TrackID videoTrackId = out->mNextAvailableTrackID++;
|
||||
RefPtr<MediaStreamTrackSource> trackSource =
|
||||
getter->GetMediaStreamTrackSource(videoTrackId);
|
||||
RefPtr<MediaStreamTrack> track = out->mStream->CreateDOMTrack(
|
||||
@@ -4241,11 +4250,11 @@ HTMLMediaElement::WakeLockRelease()
|
||||
}
|
||||
|
||||
HTMLMediaElement::OutputMediaStream::OutputMediaStream()
|
||||
: mFinishWhenEnded(false)
|
||||
: mNextAvailableTrackID(1)
|
||||
, mFinishWhenEnded(false)
|
||||
, mCapturingAudioOnly(false)
|
||||
, mCapturingDecoder(false)
|
||||
, mCapturingMediaStream(false)
|
||||
, mNextAvailableTrackID(1)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -4971,6 +4980,7 @@ HTMLMediaElement::FinishDecoderSetup(MediaDecoder* aDecoder)
|
||||
|
||||
ms.mCapturingDecoder = true;
|
||||
aDecoder->AddOutputStream(ms.mStream->GetInputStream()->AsProcessedStream(),
|
||||
ms.mNextAvailableTrackID,
|
||||
ms.mFinishWhenEnded);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user