@@ -817,6 +817,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLMediaElement, nsGenericHTM
817
817
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mErrorSink ->mError )
818
818
for (uint32_t i = 0 ; i < tmp->mOutputStreams .Length(); ++i) {
819
819
NS_IMPL_CYCLE_COLLECTION_TRAVERSE (mOutputStreams [i].mStream );
820
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE (mOutputStreams [i].mPreCreatedTracks );
820
821
}
821
822
NS_IMPL_CYCLE_COLLECTION_TRAVERSE (mPlayed );
822
823
NS_IMPL_CYCLE_COLLECTION_TRAVERSE (mTextTrackManager )
@@ -1020,6 +1021,17 @@ void HTMLMediaElement::ShutdownDecoder()
1020
1021
RemoveMediaElementFromURITable ();
1021
1022
NS_ASSERTION (mDecoder , " Must have decoder to shut down" );
1022
1023
mWaitingForKeyListener .DisconnectIfExists ();
1024
+ for (OutputMediaStream& out : mOutputStreams ) {
1025
+ if (!out.mCapturingDecoder ) {
1026
+ continue ;
1027
+ }
1028
+ if (!out.mStream ) {
1029
+ continue ;
1030
+ }
1031
+ out.mNextAvailableTrackID = std::max<TrackID>(
1032
+ mDecoder ->NextAvailableTrackIDFor (out.mStream ->GetInputStream ()),
1033
+ out.mNextAvailableTrackID );
1034
+ }
1023
1035
mDecoder ->Shutdown ();
1024
1036
mDecoder = nullptr ;
1025
1037
}
@@ -2730,6 +2742,7 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
2730
2742
if (mDecoder ) {
2731
2743
out->mCapturingDecoder = true ;
2732
2744
mDecoder ->AddOutputStream (out->mStream ->GetInputStream ()->AsProcessedStream (),
2745
+ out->mNextAvailableTrackID ,
2733
2746
aFinishWhenEnded);
2734
2747
} else if (mSrcStream ) {
2735
2748
out->mCapturingMediaStream = true ;
@@ -2743,23 +2756,26 @@ HTMLMediaElement::CaptureStreamInternal(bool aFinishWhenEnded,
2743
2756
2744
2757
if (mDecoder ) {
2745
2758
if (HasAudio ()) {
2746
- TrackID audioTrackId = mMediaInfo . mAudio . mTrackId ;
2759
+ TrackID audioTrackId = out-> mNextAvailableTrackID ++ ;
2747
2760
RefPtr<MediaStreamTrackSource> trackSource =
2748
2761
getter->GetMediaStreamTrackSource (audioTrackId);
2749
2762
RefPtr<MediaStreamTrack> track =
2750
- out->mStream ->CreateDOMTrack (audioTrackId, MediaSegment::AUDIO,
2763
+ out->mStream ->CreateDOMTrack (audioTrackId,
2764
+ MediaSegment::AUDIO,
2751
2765
trackSource);
2766
+ out->mPreCreatedTracks .AppendElement (track);
2752
2767
out->mStream ->AddTrackInternal (track);
2753
2768
LOG (LogLevel::Debug,
2754
2769
(" Created audio track %d for captured decoder" , audioTrackId));
2755
2770
}
2756
2771
if (IsVideo () && HasVideo () && !out->mCapturingAudioOnly ) {
2757
- TrackID videoTrackId = mMediaInfo . mVideo . mTrackId ;
2772
+ TrackID videoTrackId = out-> mNextAvailableTrackID ++ ;
2758
2773
RefPtr<MediaStreamTrackSource> trackSource =
2759
2774
getter->GetMediaStreamTrackSource (videoTrackId);
2760
2775
RefPtr<MediaStreamTrack> track =
2761
2776
out->mStream ->CreateDOMTrack (videoTrackId, MediaSegment::VIDEO,
2762
2777
trackSource);
2778
+ out->mPreCreatedTracks .AppendElement (track);
2763
2779
out->mStream ->AddTrackInternal (track);
2764
2780
LOG (LogLevel::Debug,
2765
2781
(" Created video track %d for captured decoder" , videoTrackId));
@@ -2848,6 +2864,25 @@ NS_IMETHODIMP HTMLMediaElement::GetMozAudioCaptured(bool* aCaptured)
2848
2864
return NS_OK;
2849
2865
}
2850
2866
2867
+ void
2868
+ HTMLMediaElement::EndPreCreatedCapturedDecoderTracks ()
2869
+ {
2870
+ MOZ_ASSERT (NS_IsMainThread());
2871
+ for (OutputMediaStream& ms : mOutputStreams ) {
2872
+ if (!ms.mCapturingDecoder ) {
2873
+ continue ;
2874
+ }
2875
+ for (RefPtr<MediaStreamTrack>& t : ms.mPreCreatedTracks ) {
2876
+ if (t->Ended ()) {
2877
+ continue ;
2878
+ }
2879
+ NS_DispatchToMainThread (NewRunnableMethod(
2880
+ t, &MediaStreamTrack::OverrideEnded));
2881
+ }
2882
+ ms.mPreCreatedTracks .Clear ();
2883
+ }
2884
+ }
2885
+
2851
2886
class MediaElementSetForURI : public nsURIHashKey {
2852
2887
public:
2853
2888
explicit MediaElementSetForURI (const nsIURI* aKey) : nsURIHashKey(aKey) {}
@@ -3380,11 +3415,12 @@ HTMLMediaElement::WakeLockRelease()
3380
3415
}
3381
3416
3382
3417
HTMLMediaElement::OutputMediaStream::OutputMediaStream ()
3383
- : mFinishWhenEnded (false )
3418
+ : mNextAvailableTrackID (1 )
3419
+ , mFinishWhenEnded (false )
3384
3420
, mCapturingAudioOnly (false )
3385
3421
, mCapturingDecoder (false )
3386
3422
, mCapturingMediaStream (false )
3387
- , mNextAvailableTrackID ( 1 ) {}
3423
+ {}
3388
3424
3389
3425
HTMLMediaElement::OutputMediaStream::~OutputMediaStream ()
3390
3426
{
@@ -4008,6 +4044,7 @@ nsresult HTMLMediaElement::FinishDecoderSetup(MediaDecoder* aDecoder,
4008
4044
4009
4045
ms.mCapturingDecoder = true ;
4010
4046
aDecoder->AddOutputStream (ms.mStream ->GetInputStream ()->AsProcessedStream (),
4047
+ ms.mNextAvailableTrackID ,
4011
4048
ms.mFinishWhenEnded );
4012
4049
}
4013
4050
0 commit comments