Bug 1764186 - Make sure MediaInputPort::Get{Source, Destination} are graph-thread only r=bwc,padenot

`MediaInputPort::Get{Source, Destination}` should be graph-thread only since the `MediaInputPort`'s `mSource` and `mDest` will be cleaned up on the graph thread [1], in case of causing some potential racing issues.

[1] https://searchfox.org/mozilla-central/rev/10edce3685369a4c73955cc8d5fcbc5a9d7598af/dom/media/MediaTrackGraph.cpp#2944-2945

Differential Revision: https://phabricator.services.mozilla.com/D143780
This commit is contained in:
Chun-Min Chang 2022-06-01 16:52:07 +00:00
Родитель c29df328b7
Коммит 21d234b564
4 изменённых файлов: 19 добавлений и 6 удалений

Просмотреть файл

@ -3092,6 +3092,16 @@ void MediaInputPort::Disconnect() {
mGraph->SetTrackOrderDirty();
}
MediaTrack* MediaInputPort::GetSource() const {
mGraph->AssertOnGraphThreadOrNotRunning();
return mSource;
}
ProcessedMediaTrack* MediaInputPort::GetDestination() const {
mGraph->AssertOnGraphThreadOrNotRunning();
return mDest;
}
MediaInputPort::InputInterval MediaInputPort::GetNextInputInterval(
MediaInputPort const* aPort, GraphTime aTime) {
InputInterval result = {GRAPH_TIME_MAX, GRAPH_TIME_MAX, false};
@ -3169,7 +3179,7 @@ already_AddRefed<MediaInputPort> ProcessedMediaTrack::AllocateInputPort(
class Message : public ControlMessage {
public:
explicit Message(MediaInputPort* aPort)
: ControlMessage(aPort->GetDestination()), mPort(aPort) {}
: ControlMessage(aPort->mDest), mPort(aPort) {}
void Run() override {
TRACE("ProcessedMediaTrack::AllocateInputPort ControlMessage");
mPort->Init();

Просмотреть файл

@ -816,8 +816,8 @@ class MediaInputPort final {
// and destination tracks.
void Disconnect();
MediaTrack* GetSource() const { return mSource; }
ProcessedMediaTrack* GetDestination() const { return mDest; }
MediaTrack* GetSource() const;
ProcessedMediaTrack* GetDestination() const;
uint16_t InputNumber() const { return mInputNumber; }
uint16_t OutputNumber() const { return mOutputNumber; }

Просмотреть файл

@ -879,8 +879,7 @@ void MediaPipelineTransmit::UpdateSendState() {
mSendTrackOverride.Ref() && !mSendTrackOverride.Ref()->IsDestroyed();
const bool mustRemoveSendTrack =
haveLiveSendTrack && !mSendTrackOverride.Ref() &&
(!haveLiveDomTrack ||
mDomTrack.Ref()->GetTrack() != mSendPort->GetSource());
(!haveLiveDomTrack || mDomTrack.Ref()->GetTrack() != mSendPortSource);
mTransmitting = mActive && (haveLiveDomTrack || haveLiveOverrideTrack) &&
!mustRemoveSendTrack;
@ -917,7 +916,8 @@ void MediaPipelineTransmit::UpdateSendState() {
} else {
mSendTrack = mDomTrack.Ref()->Graph()->CreateForwardedInputTrack(
mDomTrack.Ref()->GetTrack()->mType);
mSendPort = mSendTrack->AllocateInputPort(mDomTrack.Ref()->GetTrack());
mSendPortSource = mDomTrack.Ref()->GetTrack();
mSendPort = mSendTrack->AllocateInputPort(mSendPortSource.get());
}
mSendTrack->QueueSetAutoend(false);
if (mIsVideo) {
@ -948,6 +948,7 @@ void MediaPipelineTransmit::UpdateSendState() {
mSendTrack->Destroy();
mSendPort->Destroy();
mSendPort = nullptr;
mSendPortSource = nullptr;
}
}
}

Просмотреть файл

@ -318,6 +318,8 @@ class MediaPipelineTransmit
Watchable<RefPtr<dom::MediaStreamTrack>> mDomTrack;
// Input port connecting mDomTrack's MediaTrack to mSendTrack.
RefPtr<MediaInputPort> mSendPort;
// The source track of the mSendTrack. Main thread only.
RefPtr<ProcessedMediaTrack> mSendPortSource;
// True if a parameter affecting mDescription has changed. To avoid updating
// the description unnecessarily. Main thread only.
bool mDescriptionInvalidated = true;