зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
c29df328b7
Коммит
21d234b564
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче