From c9fe29634247246724ac26c6e9f4c04baa2e340a Mon Sep 17 00:00:00 2001 From: OSSRS-AI Date: Thu, 16 Oct 2025 10:30:02 -0400 Subject: [PATCH] AI: Add utest to cover 3 streams play stream. --- trunk/src/utest/srs_utest_rtc_playstream.cpp | 54 ++++++++++++++++---- trunk/src/utest/srs_utest_rtc_playstream.hpp | 5 +- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/trunk/src/utest/srs_utest_rtc_playstream.cpp b/trunk/src/utest/srs_utest_rtc_playstream.cpp index 27d4fde67..d0e6b5695 100644 --- a/trunk/src/utest/srs_utest_rtc_playstream.cpp +++ b/trunk/src/utest/srs_utest_rtc_playstream.cpp @@ -17,6 +17,7 @@ MockRtcTrackDescriptionFactory::MockRtcTrackDescriptionFactory() { audio_ssrc_ = 12345; video_ssrc_ = 67890; + screen_ssrc_ = 98765; } MockRtcTrackDescriptionFactory::~MockRtcTrackDescriptionFactory() @@ -28,17 +29,21 @@ std::map MockRtcTrackDescriptionFactory::cre std::map sub_relations; // Create audio track - SrsRtcTrackDescription *audio_desc = create_audio_track(audio_ssrc_, "audio-track-1"); + SrsRtcTrackDescription *audio_desc = create_audio_track(audio_ssrc_, "audio-track-1", "0"); sub_relations[audio_desc->ssrc_] = audio_desc; // Create video track - SrsRtcTrackDescription *video_desc = create_video_track(video_ssrc_, "video-track-1"); + SrsRtcTrackDescription *video_desc = create_video_track(video_ssrc_, "video-track-1", "1"); sub_relations[video_desc->ssrc_] = video_desc; + // Create screen share track + SrsRtcTrackDescription *screen_desc = create_video_track(screen_ssrc_, "screen-track-1", "2"); + sub_relations[screen_desc->ssrc_] = screen_desc; + return sub_relations; } -SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_audio_track(uint32_t ssrc, std::string id) +SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_audio_track(uint32_t ssrc, std::string id, std::string mid) { SrsRtcTrackDescription *audio_desc = new SrsRtcTrackDescription(); audio_desc->type_ = "audio"; @@ -46,12 +51,12 @@ SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_audio_track(uint3 audio_desc->id_ = id; audio_desc->is_active_ = true; audio_desc->direction_ = "sendrecv"; - audio_desc->mid_ = "0"; + audio_desc->mid_ = mid; audio_desc->media_ = new SrsAudioPayload(111, "opus", 48000, 2); return audio_desc; } -SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_video_track(uint32_t ssrc, std::string id) +SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_video_track(uint32_t ssrc, std::string id, std::string mid) { SrsRtcTrackDescription *video_desc = new SrsRtcTrackDescription(); video_desc->type_ = "video"; @@ -59,7 +64,7 @@ SrsRtcTrackDescription *MockRtcTrackDescriptionFactory::create_video_track(uint3 video_desc->id_ = id; video_desc->is_active_ = true; video_desc->direction_ = "sendrecv"; - video_desc->mid_ = "1"; + video_desc->mid_ = mid; video_desc->media_ = new SrsVideoPayload(96, "H264", 90000); return video_desc; } @@ -102,6 +107,11 @@ VOID TEST(RtcPlayStreamTest, ManuallyVerifyBasicWorkflow) // Initialize the play stream (it will take ownership of track descriptions) HELPER_EXPECT_SUCCESS(play_stream->initialize(&mock_request, sub_relations)); + // Check the tracks, should be two video tracks. + EXPECT_EQ(play_stream->video_tracks_.size(), 2); + // Check the tracks, should be a audio track. + EXPECT_EQ(play_stream->audio_tracks_.size(), 1); + // Test: First call to start() should succeed HELPER_EXPECT_SUCCESS(play_stream->start()); @@ -132,8 +142,6 @@ VOID TEST(RtcPlayStreamTest, ManuallyVerifyBasicWorkflow) // Check sender should have received the packet EXPECT_EQ(mock_sender.send_packet_count_, 1); - // Check the tracks, should be a video track. - EXPECT_EQ(play_stream->video_tracks_.size(), 1); // The packet should create a cached track for this ssrc. EXPECT_EQ(play_stream->cache_ssrc0_, track_factory.video_ssrc_); EXPECT_TRUE(play_stream->cache_track0_ != NULL); @@ -162,8 +170,6 @@ VOID TEST(RtcPlayStreamTest, ManuallyVerifyBasicWorkflow) // Check sender should have received the packet EXPECT_EQ(mock_sender.send_packet_count_, 2); - // Check the tracks, should be a video track. - EXPECT_EQ(play_stream->audio_tracks_.size(), 1); // The packet should create a cached track for this ssrc. EXPECT_EQ(play_stream->cache_ssrc1_, track_factory.audio_ssrc_); EXPECT_TRUE(play_stream->cache_track1_ != NULL); @@ -173,6 +179,34 @@ VOID TEST(RtcPlayStreamTest, ManuallyVerifyBasicWorkflow) EXPECT_EQ(pkt->header_.get_ssrc(), track_factory.audio_ssrc_); } + // Push a screen share packet to the source to feed the consumer. + if (true) { + SrsUniquePtr test_pkt(new SrsRtpPacket()); + test_pkt->frame_type_ = SrsFrameTypeVideo; + test_pkt->header_.set_sequence(1000); + test_pkt->header_.set_timestamp(5000); + test_pkt->header_.set_ssrc(track_factory.screen_ssrc_); + + // Push packet to source - this will feed all consumers including the play stream's consumer + HELPER_EXPECT_SUCCESS(play_stream->source_->on_rtp(test_pkt.get())); + } + + // Verify the screen share packet is sent out + if (true) { + // Wait for coroutine to process the packet + srs_usleep(1 * SRS_UTIME_MILLISECONDS); + + // Check sender should have received the packet + EXPECT_EQ(mock_sender.send_packet_count_, 3); + // The packet should create a cached track for this ssrc. + EXPECT_EQ(play_stream->cache_ssrc2_, track_factory.screen_ssrc_); + EXPECT_TRUE(play_stream->cache_track2_ != NULL); + // The packet should be in the nack ring buffer. + SrsRtpPacket *pkt = play_stream->cache_track2_->rtp_queue_->at(1000); + EXPECT_TRUE(pkt != NULL); + EXPECT_EQ(pkt->header_.get_ssrc(), track_factory.screen_ssrc_); + } + // Stop the play stream play_stream->stop(); diff --git a/trunk/src/utest/srs_utest_rtc_playstream.hpp b/trunk/src/utest/srs_utest_rtc_playstream.hpp index 280b8fc89..1a146c49d 100644 --- a/trunk/src/utest/srs_utest_rtc_playstream.hpp +++ b/trunk/src/utest/srs_utest_rtc_playstream.hpp @@ -23,16 +23,17 @@ public: // Default SSRCs for audio and video tracks uint32_t audio_ssrc_; uint32_t video_ssrc_; + uint32_t screen_ssrc_; public: // Create a map of track descriptions with audio and video tracks std::map create_audio_video_tracks(); // Create a single audio track description - SrsRtcTrackDescription *create_audio_track(uint32_t ssrc, std::string id); + SrsRtcTrackDescription *create_audio_track(uint32_t ssrc, std::string id, std::string mid); // Create a single video track description - SrsRtcTrackDescription *create_video_track(uint32_t ssrc, std::string id); + SrsRtcTrackDescription *create_video_track(uint32_t ssrc, std::string id, std::string mid); }; #endif