Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 61 additions & 6 deletions trunk/3rdparty/srs-docs/pages/product-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,17 @@ For detail features of SRS, please see [FEATURES](https://github.com/ossrs/srs/b

Let's briefly introduce the history of SRS in reverse order.

In January 2023, Star exceeded 20K and launched the Paid Star Planet. Oryx supported Virtual Live Broadcasting,
From June to December 2025, AI became a major contributor to SRS development. AI was used extensively to cleanup
issues, review pull requests, and improve unit test coverage from 40% to 88%. AI also helped implement new features
and enhancements. While AI is now a major contributor, the human maintainer still reviews each line of code generated
by AI and makes all final decisions, ensuring code quality and project direction remain under human oversight.

In January 2025, the paid star planet was closed and all paid support services were discontinued. The decision was
made to build a purely volunteer-driven community without any monetization. While donations, sponsors, and backers
are still needed and welcomed to support the project, no special paid services will be provided to anyone. With AI
now working very well as a question answerer and problem solver, anyone who needs help should use AI first.

In January 2023, Star exceeded 20K and launched the Paid Star Planet. Oryx supported Virtual Live Broadcasting,
confirmed the development codename for version 6.0 as Hang, and introduced new TOC rules.

In November 2022, the SRS TOC and developer community were established, with the number of active developers reaching 47.
Expand Down Expand Up @@ -91,14 +101,59 @@ For a detailed interpretation, please see Welcome to SRS: Mission, Vision, and V

## Release 7.0

Code name: Kai. Named by TOC member [Haibo Chen](https://github.com/duiniuluantanqin). Planned for release by the end of 2026.
Code name: Kai. Named by TOC member [Haibo Chen](https://github.com/duiniuluantanqin). Development started August 2024, planned for release by the end of 2026.

> Code Name Story: I am Haibo Chen, a core maintainer of SRS and a TOC member. The code name Kai is inspired by my son Chen Kaiqi's name. As a father, I aim to set a good example by doing meaningful and interesting work. I appreciate the support and collaboration from everyone in the community, making it more vibrant and warm. This upgrade aims to provide users with more powerful features and a smoother experience, laying a strong foundation for SRS's future.

- [x] Proxy Cluster - Support for more stream paths. [#4158](https://github.com/ossrs/srs/pull/4158)
- [ ] WebRTC HEVC - WebRTC support for HEVC, recording HEVC to MP4 files, completing full HEVC support. [#4289](https://github.com/ossrs/srs/pull/4289), [#4349](https://github.com/ossrs/srs/pull/4349), [#4296](https://github.com/ossrs/srs/pull/4296)
- [ ] HLS fMP4 - HLS protocol support for fMP4. [#4159](https://github.com/ossrs/srs/pull/4159)
- [ ] RTSP Playback - Support for RTSP protocol playback. [#4333](https://github.com/ossrs/srs/pull/4333)
**New Protocols & Major Features**

- [x] RTSP Playback - Support for viewing streams over RTSP protocol. [#4333](https://github.com/ossrs/srs/pull/4333)
- [x] RTMPS Server - Support for RTMP over SSL server. [#4443](https://github.com/ossrs/srs/pull/4443)
- [x] Proxy Cluster - Support for proxy server functionality with more stream paths. [#4158](https://github.com/ossrs/srs/pull/4158)
- [x] IPv6 Support - Full IPv6 support for all protocols: RTMP, HTTP/HTTPS, WebRTC, SRT, RTSP. [#4457](https://github.com/ossrs/srs/pull/4457)

**WebRTC Enhancements**

- [x] VP9 Codec - Support for VP9 codec in WebRTC-to-WebRTC streaming. [#4548](https://github.com/ossrs/srs/pull/4548)
- [x] G.711 Audio - Support for G.711 (PCMU/PCMA) audio codec for WebRTC. [#4075](https://github.com/ossrs/srs/pull/4075)
- [x] HEVC Support - RTMP-to-WebRTC and WebRTC-to-RTMP conversion with HEVC. [#4289](https://github.com/ossrs/srs/pull/4289), [#4349](https://github.com/ossrs/srs/pull/4349)
- [x] Audio Jitter Buffer - RTC audio packet jitter buffer for improved quality. [#4295](https://github.com/ossrs/srs/pull/4295)
- [x] Dual Video Track - Support for dual video track with multiple codecs (AVC and HEVC) in RTMP2RTC bridge. [#4413](https://github.com/ossrs/srs/pull/4413)
- [x] WHEP Support - WebRTC HTTP Egress Protocol for playback. [#3404](https://github.com/ossrs/srs/pull/3404)

**HLS Improvements**

- [x] HLS fMP4 - HLS protocol support for fMP4 segments for HEVC/LLHLS. [#4159](https://github.com/ossrs/srs/pull/4159)
- [x] Query String Support - Support query string in hls_key_url for JWT tokens. [#4426](https://github.com/ossrs/srs/pull/4426)
- [x] Master M3U8 Path - Support hls_master_m3u8_path_relative for reverse proxy. [#4338](https://github.com/ossrs/srs/pull/4338)

**Architecture Changes**

- [x] Single-Thread Architecture - Removed multi-threading support, changed to single-thread architecture for simplicity. [#4445](https://github.com/ossrs/srs/pull/4445)
- [x] Always Enable WebRTC - WebRTC is now always enabled and enforces C++98 compatibility. [#4447](https://github.com/ossrs/srs/pull/4447)
- [x] Always Enable SRT - SRT protocol is now always enabled. [#4460](https://github.com/ossrs/srs/pull/4460)
- [x] Unified Server - Merged SRT and RTC servers into unified SrsServer. [#4459](https://github.com/ossrs/srs/pull/4459)
- [x] HTTP Parser Upgrade - Upgraded from http-parser to llhttp. [#4469](https://github.com/ossrs/srs/pull/4469)
- [x] Stream Publish Token - Implemented stream publish token system to prevent race conditions across all protocols. [#4452](https://github.com/ossrs/srs/pull/4452)

**DVR & Recording**

- [x] HEVC DVR to FLV - Support H.265 FLV fragments for DVR. [#4296](https://github.com/ossrs/srs/pull/4296)
- [x] MP4 DVR Sync - Fix audio/video synchronization issues in WebRTC recordings. [#4230](https://github.com/ossrs/srs/pull/4230)

**Code Quality & Build**

- [x] Clang Format - Use clang-format to unify coding style. [#4366](https://github.com/ossrs/srs/pull/4366), [#4433](https://github.com/ossrs/srs/pull/4433)
- [x] Memory Management - Multiple memory leak fixes and improved error handling throughout the codebase.
- [x] Build Improvements - Better dependency detection and reporting. [#4293](https://github.com/ossrs/srs/pull/4293)

**Other Improvements**

- [x] GB28181 Changes - Removed embedded SIP server, enforce external SIP usage. [#4466](https://github.com/ossrs/srs/pull/4466)
- [x] RTMP Config Section - Moved RTMP configs to rtmp{} section. [#4454](https://github.com/ossrs/srs/pull/4454)
- [x] Cloud Features Removed - Removed cloud CLS and APM. [#4456](https://github.com/ossrs/srs/pull/4456)

SRS 7.0 development started at 2024.08.

## Release 6.0

Expand Down
1 change: 1 addition & 0 deletions trunk/doc/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ The changelog for SRS.
<a name="v7-changes"></a>

## SRS 7.0 Changelog
* v7.0, 2025-12-06, SRT: Fix peer_idle_timeout not applied to publishers and players. v7.0.134 (#4600)
* v7.0, 2025-12-04, SRT: Enable tlpktdrop by default to prevent 100% CPU usage. v7.0.133 (#4587)
* v7.0, 2025-12-03, AI: WebRTC: Fix audio-only WHIP publish without SSRC. v7.0.132 (#4570)
* v7.0, 2025-11-30, SRT: Support default_mode config for short streamid format. v7.0.131
Expand Down
13 changes: 12 additions & 1 deletion trunk/src/app/srs_app_srt_conn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,12 @@ srs_error_t SrsMpegtsSrtConn::do_publishing()

srs_trace("SRT: start publish url=%s", req_->get_stream_url().c_str());

// Set socket timeout to peer_idle_timeout for publishers.
// @see https://github.com/ossrs/srs/issues/4600
srs_utime_t timeout = config_->get_srto_peeridletimeout();
srt_conn_->set_recv_timeout(timeout);
srt_conn_->set_send_timeout(timeout);

SrsUniquePtr<SrsPithyPrint> pprint(SrsPithyPrint::create_srt_publish());

int nb_packets = 0;
Expand Down Expand Up @@ -598,6 +604,12 @@ srs_error_t SrsMpegtsSrtConn::do_playing()
{
srs_error_t err = srs_success;

// Set socket timeout to peer_idle_timeout for players.
// @see https://github.com/ossrs/srs/issues/4600
srs_utime_t timeout = config_->get_srto_peeridletimeout();
srt_conn_->set_recv_timeout(timeout);
srt_conn_->set_send_timeout(timeout);

ISrsSrtConsumer *consumer_raw = NULL;
if ((err = srt_source_->create_consumer(consumer_raw)) != srs_success) {
return srs_error_wrap(err, "create consumer, ts source=%s", req_->get_stream_url().c_str());
Expand All @@ -619,7 +631,6 @@ srs_error_t SrsMpegtsSrtConn::do_playing()
}

int nb_packets = 0;
srs_utime_t timeout = config_->get_srto_peeridletimeout();

while (true) {
// Check recv thread error first, so we can detect the client disconnecting event.
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core_version7.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

#define VERSION_MAJOR 7
#define VERSION_MINOR 0
#define VERSION_REVISION 133
#define VERSION_REVISION 134

#endif
22 changes: 11 additions & 11 deletions trunk/src/kernel/srs_kernel_error.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -386,17 +386,17 @@

/**************************************************/
/* SRT protocol error. */
#define SRS_ERRNO_MAP_SRT(XX) \
XX(ERROR_SRT_EPOLL, 6000, "SrtEpoll", "SRT epoll operation failed") \
XX(ERROR_SRT_IO, 6001, "SrtIo", "SRT read or write failed") \
XX(ERROR_SRT_TIMEOUT, 6002, "SrtTimeout", "SRT connection is timeout") \
XX(ERROR_SRT_INTERRUPT, 6003, "SrtInterrupt", "SRT connection is interrupted") \
XX(ERROR_SRT_LISTEN, 6004, "SrtListen", "SRT listen failed") \
XX(ERROR_SRT_SOCKOPT, 6005, "SrtSetSocket", "SRT set socket option failed") \
XX(ERROR_SRT_CONN, 6006, "SrtConnection", "SRT connectin level error") \
XX(ERROR_SRT_SOURCE_BUSY, 6007, "SrtStreamBusy", "SRT stream already exists or busy") \
XX(ERROR_RTMP_TO_SRT, 6008, "SrtFromRtmp", "Covert RTMP to SRT failed") \
XX(ERROR_SRT_STATS, 6009, "SrtStats", "SRT get statistic data failed") \
#define SRS_ERRNO_MAP_SRT(XX) \
XX(ERROR_SRT_EPOLL, 6000, "SrtEpoll", "SRT epoll operation failed") \
XX(ERROR_SRT_IO, 6001, "SrtIo", "SRT read or write failed") \
XX(ERROR_SRT_TIMEOUT, 6002, "SrtTimeout", "SRT connection is timeout") \
XX(ERROR_SRT_INTERRUPT, 6003, "SrtInterrupt", "SRT connection is interrupted") \
XX(ERROR_SRT_LISTEN, 6004, "SrtListen", "SRT listen failed") \
XX(ERROR_SRT_SOCKOPT, 6005, "SrtSetSocket", "SRT set socket option failed") \
XX(ERROR_SRT_CONN, 6006, "SrtConnection", "SRT connectin level error") \
XX(ERROR_SRT_SOURCE_BUSY, 6007, "SrtStreamBusy", "SRT stream already exists or busy") \
XX(ERROR_RTMP_TO_SRT, 6008, "SrtFromRtmp", "Covert RTMP to SRT failed") \
XX(ERROR_SRT_STATS, 6009, "SrtStats", "SRT get statistic data failed") \
XX(ERROR_SRT_TO_RTMP_EMPTY_SPS_PPS, 6010, "SrtToRtmpEmptySpsPps", "SRT to rtmp have empty sps or pps") \
XX(ERROR_SRT_SOURCE_DISCONNECTED, 6011, "SrtSourceDisconnected", "SRT source publisher disconnected")

Expand Down
54 changes: 54 additions & 0 deletions trunk/src/utest/srs_utest_ai18.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3612,3 +3612,57 @@ VOID TEST(ProcessTest, InitializeWithRedirections)
// Verify cli_ contains full original command with redirections
EXPECT_EQ(process->cli_, "/usr/bin/ffmpeg -i input.flv -c copy 1>stdout.log 2>stderr.log output.flv");
}

// Test SrsSrtSocket::set_recv_timeout and set_send_timeout
// @see https://github.com/ossrs/srs/issues/4600
VOID TEST(SrtSocketTest, SetRecvSendTimeout)
{
// Test MockSrtSocket set_recv_timeout and set_send_timeout
if (true) {
MockSrtSocket mock_socket;

// Initial values should be 1 second as set in constructor
EXPECT_EQ(mock_socket.get_recv_timeout(), 1 * SRS_UTIME_SECONDS);
EXPECT_EQ(mock_socket.get_send_timeout(), 1 * SRS_UTIME_SECONDS);

// Set recv timeout to 10 seconds
srs_utime_t timeout = 10 * SRS_UTIME_SECONDS;
mock_socket.set_recv_timeout(timeout);
EXPECT_EQ(mock_socket.get_recv_timeout(), timeout);
EXPECT_EQ(mock_socket.get_send_timeout(), 1 * SRS_UTIME_SECONDS);

// Set send timeout to 10 seconds
mock_socket.set_send_timeout(timeout);
EXPECT_EQ(mock_socket.get_recv_timeout(), timeout);
EXPECT_EQ(mock_socket.get_send_timeout(), timeout);

// Set to a different value (60 seconds, like peer_idle_timeout)
timeout = 60 * SRS_UTIME_SECONDS;
mock_socket.set_recv_timeout(timeout);
mock_socket.set_send_timeout(timeout);
EXPECT_EQ(mock_socket.get_recv_timeout(), timeout);
EXPECT_EQ(mock_socket.get_send_timeout(), timeout);
}

// Test individual set methods work independently
if (true) {
MockSrtSocket mock_socket;

// Set recv timeout only
mock_socket.set_recv_timeout(5 * SRS_UTIME_SECONDS);
EXPECT_EQ(mock_socket.get_recv_timeout(), 5 * SRS_UTIME_SECONDS);
EXPECT_EQ(mock_socket.get_send_timeout(), 1 * SRS_UTIME_SECONDS);

// Set send timeout only
mock_socket.set_send_timeout(15 * SRS_UTIME_SECONDS);
EXPECT_EQ(mock_socket.get_recv_timeout(), 5 * SRS_UTIME_SECONDS);
EXPECT_EQ(mock_socket.get_send_timeout(), 15 * SRS_UTIME_SECONDS);

// Set both to same value (simulating peer_idle_timeout usage)
srs_utime_t peer_idle_timeout = 30 * SRS_UTIME_SECONDS;
mock_socket.set_recv_timeout(peer_idle_timeout);
mock_socket.set_send_timeout(peer_idle_timeout);
EXPECT_EQ(mock_socket.get_recv_timeout(), peer_idle_timeout);
EXPECT_EQ(mock_socket.get_send_timeout(), peer_idle_timeout);
}
}
Loading