Skip to content
Snippets Groups Projects
Verified Commit b103ef2a authored by Andreas Pehrson's avatar Andreas Pehrson Committed by ma1
Browse files

Bug 1851803 - Introduce SourceMediaTrack::mDirectDisabledMode. r=karlt

Similar to MediaTrack::mDisabledMode, but this is for uses on the
SourceMediaTrack producer thread. It is still signaled via a control message
from the control thread to maintain order of operations, and is protected by the
SourceMediaTrack mutex.

Differential Revision: https://phabricator.services.mozilla.com/D187554
parent 8c2fa737
Branches
Tags
1 merge request!957Bug 42474: Rebase stable browser on 115.9.1
......@@ -145,6 +145,27 @@ class GraphKey final {
nsTHashMap<nsGenericHashKey<GraphKey>, MediaTrackGraphImpl*> gGraphs;
} // anonymous namespace
static void ApplyTrackDisabling(DisabledTrackMode aDisabledMode,
MediaSegment* aSegment,
MediaSegment* aRawSegment) {
if (aDisabledMode == DisabledTrackMode::ENABLED) {
return;
}
if (aDisabledMode == DisabledTrackMode::SILENCE_BLACK) {
aSegment->ReplaceWithDisabled();
if (aRawSegment) {
aRawSegment->ReplaceWithDisabled();
}
} else if (aDisabledMode == DisabledTrackMode::SILENCE_FREEZE) {
aSegment->ReplaceWithNull();
if (aRawSegment) {
aRawSegment->ReplaceWithNull();
}
} else {
MOZ_CRASH("Unsupported mode");
}
}
MediaTrackGraphImpl::~MediaTrackGraphImpl() {
MOZ_ASSERT(mTracks.IsEmpty() && mSuspendedTracks.IsEmpty(),
"All tracks should have been destroyed by messages from the main "
......@@ -2421,6 +2442,7 @@ RefPtr<GenericPromise> MediaTrack::RemoveListener(
void MediaTrack::AddDirectListenerImpl(
already_AddRefed<DirectMediaTrackListener> aListener) {
MOZ_ASSERT(mGraph->OnGraphThread());
// Base implementation, for tracks that don't support direct track listeners.
RefPtr<DirectMediaTrackListener> listener = aListener;
listener->NotifyDirectListenerInstalled(
......@@ -2503,6 +2525,7 @@ void MediaTrack::RunAfterPendingUpdates(
}
void MediaTrack::SetDisabledTrackModeImpl(DisabledTrackMode aMode) {
MOZ_ASSERT(mGraph->OnGraphThread());
MOZ_DIAGNOSTIC_ASSERT(
aMode == DisabledTrackMode::ENABLED ||
mDisabledMode == DisabledTrackMode::ENABLED,
......@@ -2531,22 +2554,8 @@ void MediaTrack::SetDisabledTrackMode(DisabledTrackMode aMode) {
void MediaTrack::ApplyTrackDisabling(MediaSegment* aSegment,
MediaSegment* aRawSegment) {
if (mDisabledMode == DisabledTrackMode::ENABLED) {
return;
}
if (mDisabledMode == DisabledTrackMode::SILENCE_BLACK) {
aSegment->ReplaceWithDisabled();
if (aRawSegment) {
aRawSegment->ReplaceWithDisabled();
}
} else if (mDisabledMode == DisabledTrackMode::SILENCE_FREEZE) {
aSegment->ReplaceWithNull();
if (aRawSegment) {
aRawSegment->ReplaceWithNull();
}
} else {
MOZ_CRASH("Unsupported mode");
}
MOZ_ASSERT(mGraph->OnGraphThread());
mozilla::ApplyTrackDisabling(mDisabledMode, aSegment, aRawSegment);
}
void MediaTrack::AddMainThreadListener(
......@@ -2866,7 +2875,7 @@ TrackTime SourceMediaTrack::AppendData(MediaSegment* aSegment,
// Apply track disabling before notifying any consumers directly
// or inserting into the graph
ApplyTrackDisabling(aSegment, aRawSegment);
mozilla::ApplyTrackDisabling(mDirectDisabledMode, aSegment, aRawSegment);
ResampleAudioToGraphSampleRate(aSegment);
......@@ -2910,6 +2919,7 @@ void SourceMediaTrack::NotifyDirectConsumers(MediaSegment* aSegment) {
void SourceMediaTrack::AddDirectListenerImpl(
already_AddRefed<DirectMediaTrackListener> aListener) {
MOZ_ASSERT(mGraph->OnGraphThread());
MutexAutoLock lock(mMutex);
RefPtr<DirectMediaTrackListener> listener = aListener;
......@@ -2979,6 +2989,7 @@ void SourceMediaTrack::AddDirectListenerImpl(
void SourceMediaTrack::RemoveDirectListenerImpl(
DirectMediaTrackListener* aListener) {
mGraph->AssertOnGraphThreadOrNotRunning();
MutexAutoLock lock(mMutex);
for (int32_t i = mDirectTrackListeners.Length() - 1; i >= 0; --i) {
const RefPtr<DirectMediaTrackListener>& l = mDirectTrackListeners[i];
......@@ -3008,17 +3019,20 @@ void SourceMediaTrack::End() {
}
void SourceMediaTrack::SetDisabledTrackModeImpl(DisabledTrackMode aMode) {
MOZ_ASSERT(mGraph->OnGraphThread());
{
MutexAutoLock lock(mMutex);
const DisabledTrackMode oldMode = mDirectDisabledMode;
const bool oldEnabled = oldMode == DisabledTrackMode::ENABLED;
const bool enabled = aMode == DisabledTrackMode::ENABLED;
mDirectDisabledMode = aMode;
for (const auto& l : mDirectTrackListeners) {
DisabledTrackMode oldMode = mDisabledMode;
bool oldEnabled = oldMode == DisabledTrackMode::ENABLED;
if (!oldEnabled && aMode == DisabledTrackMode::ENABLED) {
if (!oldEnabled && enabled) {
LOG(LogLevel::Debug, ("%p: SourceMediaTrack %p setting "
"direct listener enabled",
GraphImpl(), this));
l->DecreaseDisabled(oldMode);
} else if (oldEnabled && aMode != DisabledTrackMode::ENABLED) {
} else if (oldEnabled && !enabled) {
LOG(LogLevel::Debug, ("%p: SourceMediaTrack %p setting "
"direct listener disabled",
GraphImpl(), this));
......
......@@ -652,18 +652,8 @@ class SourceMediaTrack : public MediaTrack {
*/
void End();
// Overriding allows us to hold the mMutex lock while changing the track
// enable status
void SetDisabledTrackModeImpl(DisabledTrackMode aMode) override;
// Overriding allows us to ensure mMutex is locked while changing the track
// enable status
void ApplyTrackDisabling(MediaSegment* aSegment,
MediaSegment* aRawSegment = nullptr) override {
mMutex.AssertCurrentThreadOwns();
MediaTrack::ApplyTrackDisabling(aSegment, aRawSegment);
}
uint32_t NumberOfChannels() const override;
void RemoveAllDirectListenersImpl() override;
......@@ -742,6 +732,11 @@ class SourceMediaTrack : public MediaTrack {
// protected by mMutex
float mVolume MOZ_GUARDED_BY(mMutex) = 1.0;
UniquePtr<TrackData> mUpdateTrack MOZ_GUARDED_BY(mMutex);
// This track's associated disabled mode for uses on the producing thread.
// It can either by disabled by frames being replaced by black, or by
// retaining the previous frame.
DisabledTrackMode mDirectDisabledMode MOZ_GUARDED_BY(mMutex) =
DisabledTrackMode::ENABLED;
nsTArray<RefPtr<DirectMediaTrackListener>> mDirectTrackListeners
MOZ_GUARDED_BY(mMutex);
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment