Call `OnSubscribeAccepted` when adding a listener to `MoqtRelayTrackPublisher`.
The second subscriber to a track was not receiving SUBSCRIBE_OK or objects because this was missing.
PiperOrigin-RevId: 827561493
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher.cc b/quiche/quic/moqt/moqt_relay_track_publisher.cc
index 129d9cd..ef6802e 100644
--- a/quiche/quic/moqt/moqt_relay_track_publisher.cc
+++ b/quiche/quic/moqt/moqt_relay_track_publisher.cc
@@ -50,6 +50,7 @@
next_location_ = ok_data.largest_location.has_value()
? ok_data.largest_location->Next()
: Location(0, 0);
+ got_response_ = true;
// TODO(martinduke): Handle parameters.
for (MoqtObjectListener* listener : listeners_) {
listener->OnSubscribeAccepted();
@@ -288,6 +289,9 @@
session->SubscribeCurrentObject(track_, this, VersionSpecificParameters());
}
listeners_.insert(listener);
+ if (got_response_) {
+ listener->OnSubscribeAccepted();
+ }
}
void MoqtRelayTrackPublisher::RemoveObjectListener(
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher.h b/quiche/quic/moqt/moqt_relay_track_publisher.h
index 12e74dc..0aa2c0c 100644
--- a/quiche/quic/moqt/moqt_relay_track_publisher.h
+++ b/quiche/quic/moqt/moqt_relay_track_publisher.h
@@ -138,6 +138,7 @@
};
bool is_closing_ = false;
+ bool got_response_ = false;
const quic::QuicClock* clock_;
FullTrackName track_;
quiche::QuicheWeakPtr<MoqtSessionInterface> upstream_;
diff --git a/quiche/quic/moqt/moqt_relay_track_publisher_test.cc b/quiche/quic/moqt/moqt_relay_track_publisher_test.cc
index 360175f..aaf1d88 100644
--- a/quiche/quic/moqt/moqt_relay_track_publisher_test.cc
+++ b/quiche/quic/moqt/moqt_relay_track_publisher_test.cc
@@ -332,7 +332,15 @@
.WillOnce(testing::Return(true));
publisher_.AddObjectListener(&listener_);
EXPECT_CALL(*session_, SubscribeCurrentObject).Times(0);
- publisher_.AddObjectListener(&listener_);
+ EXPECT_CALL(listener_, OnSubscribeAccepted).Times(0);
+ MockMoqtObjectListener listener2;
+ publisher_.AddObjectListener(&listener2);
+ EXPECT_CALL(listener_, OnSubscribeAccepted);
+ EXPECT_CALL(listener2, OnSubscribeAccepted);
+ publisher_.OnReply(
+ kTrackName,
+ SubscribeOkData{quic::QuicTimeDelta::Infinite(),
+ MoqtDeliveryOrder::kAscending, kLargestLocation});
}
TEST_F(MoqtRelayTrackPublisherTest, OnMalformedObject) {
@@ -369,6 +377,14 @@
publisher_.OnStreamReset(kTrackName, DataStreamIndex{2, 0});
}
+TEST_F(MoqtRelayTrackPublisherTest, SecondSubscribeAfterOk) {
+ SubscribeAndOk();
+ EXPECT_CALL(*session_, SubscribeCurrentObject).Times(0);
+ MockMoqtObjectListener listener2;
+ EXPECT_CALL(listener2, OnSubscribeAccepted);
+ publisher_.AddObjectListener(&listener2);
+}
+
} // namespace
} // namespace moqt::test