@@ -3119,6 +3119,8 @@ int main() {
31193119
31203120 MoqtSession object_live_session (
31213121 object_live_transport, std::string (kTestTrackNamespace ), false , false , false , std::chrono::seconds (1 ));
3122+ // Preannounce is opt-in; this case exists to exercise it.
3123+ object_live_session.set_preannounce_tracks (true );
31223124 status = object_live_session.connect (endpoint, tls);
31233125 ok &= expect (status.ok , " expected arbitrary live-object session connect to succeed" );
31243126 status = object_live_session.publish_live_objects (source, DraftVersion::kDraft14 );
@@ -3134,6 +3136,52 @@ int main() {
31343136 " expected arbitrary live-object publish to finish with PUBLISH_NAMESPACE_DONE" );
31353137 }
31363138
3139+ {
3140+ // Default (preannounce off): no PUBLISH is emitted before a subscriber
3141+ // exists. The same flow as above with the opt-in left at its default, so a
3142+ // regression in the gate shows up as a count change rather than silently.
3143+ MockTransport default_no_preannounce_transport;
3144+ default_no_preannounce_transport.reads [0 ].push_back (encode_server_setup_message ({
3145+ .draft = DraftVersion::kDraft14 ,
3146+ .max_request_id = 8 ,
3147+ }));
3148+ default_no_preannounce_transport.reads [0 ].push_back (
3149+ encode_publish_namespace_ok_message (DraftVersion::kDraft14 , 0 ));
3150+ default_no_preannounce_transport.reads [0 ].push_back ({});
3151+
3152+ std::vector<LiveObject> objects = {
3153+ LiveObject{
3154+ .track_name = " events" ,
3155+ .group_id = 7 ,
3156+ .subgroup_id = 0 ,
3157+ .object_id = 3 ,
3158+ .payload = {' O' , ' K' },
3159+ },
3160+ };
3161+ std::size_t object_index = 0 ;
3162+ LiveObjectSource source{
3163+ .tracks = {LiveTrack{.track_name = " events" }},
3164+ .next_object = [&objects, &object_index]() -> std::optional<LiveObject> {
3165+ if (object_index >= objects.size ()) {
3166+ return std::nullopt ;
3167+ }
3168+ return objects[object_index++];
3169+ },
3170+ };
3171+
3172+ MoqtSession default_no_preannounce_session (default_no_preannounce_transport,
3173+ std::string (kTestTrackNamespace ),
3174+ false ,
3175+ false ,
3176+ false ,
3177+ std::chrono::seconds (1 ));
3178+ status = default_no_preannounce_session.connect (endpoint, tls);
3179+ ok &= expect (status.ok , " expected default live-object session connect to succeed" );
3180+ status = default_no_preannounce_session.publish_live_objects (source, DraftVersion::kDraft14 );
3181+ ok &= expect (control_message_count (default_no_preannounce_transport, 0x1d ) == 0 ,
3182+ " expected no PUBLISH preannounce when preannounce_tracks is left at its default" );
3183+ }
3184+
31373185 {
31383186 // Regression: draft-18 assigns a track alias in PUBLISH, so an
31393187 // auto-forward live-object publisher must establish every track on a
@@ -3840,6 +3888,8 @@ int main() {
38403888 true ,
38413889 false ,
38423890 std::chrono::seconds (1 ));
3891+ // Preannounce is opt-in; this case asserts the PUBLISH count it produces.
3892+ dash_live_session.set_preannounce_tracks (true );
38433893 status = dash_live_session.connect (endpoint, tls);
38443894 ok &= expect (status.ok , " expected FFmpeg-style DASH session connect to succeed" );
38453895 status = dash_live_session.publish_live_objects (source, DraftVersion::kDraft16 );
0 commit comments