diff --git a/trunk/configure b/trunk/configure index 7349d075c..f9100c909 100755 --- a/trunk/configure +++ b/trunk/configure @@ -384,7 +384,7 @@ if [[ $SRS_UTEST == YES ]]; then "srs_utest_manual_app" "srs_utest_manual_mock") MODULE_FILES+=("srs_utest_workflow_rtc_playstream" "srs_utest_workflow_rtc_publishstream" "srs_utest_workflow_rtc_conn" "srs_utest_workflow_rtmp_conn" "srs_utest_workflow_srt_conn" "srs_utest_workflow_http_conn" - "srs_utest_workflow_forward" "srs_utest_workflow_rtc2rtmp") + "srs_utest_workflow_forward" "srs_utest_workflow_rtc2rtmp" "srs_utest_workflow_rtmp2rtc") MODULE_FILES+=("srs_utest_ai01" "srs_utest_ai02" "srs_utest_ai03" "srs_utest_ai04" "srs_utest_ai05" "srs_utest_ai06" "srs_utest_ai07" "srs_utest_ai08" "srs_utest_ai09" "srs_utest_ai10" "srs_utest_ai11" "srs_utest_ai12" "srs_utest_ai13" "srs_utest_ai14" "srs_utest_ai15" "srs_utest_ai16" "srs_utest_ai17" diff --git a/trunk/src/app/srs_app_factory.cpp b/trunk/src/app/srs_app_factory.cpp index 7322d521d..ea04c14a0 100644 --- a/trunk/src/app/srs_app_factory.cpp +++ b/trunk/src/app/srs_app_factory.cpp @@ -24,6 +24,8 @@ #include #endif #include +#include +#include #include #include #include @@ -212,6 +214,23 @@ ISrsHttpResponseWriter *SrsAppFactory::create_http_response_writer(ISrsProtocolR return new SrsHttpResponseWriter(io); } +#ifdef SRS_FFMPEG_FIT +SrsRtcFrameBuilder *SrsAppFactory::create_rtc_frame_builder(ISrsFrameTarget *target) +{ + return new SrsRtcFrameBuilder(this, target); +} + +ISrsRtcFrameBuilderAudioPacketCache *SrsAppFactory::create_rtc_frame_builder_audio_packet_cache() +{ + return new SrsRtcFrameBuilderAudioPacketCache(); +} + +ISrsAudioTranscoder *SrsAppFactory::create_audio_transcoder() +{ + return new SrsAudioTranscoder(); +} +#endif + ISrsCoroutine *SrsAppFactory::create_coroutine(const std::string &name, ISrsCoroutineHandler *handler, SrsContextId cid) { return kernel_factory_->create_coroutine(name, handler, cid); diff --git a/trunk/src/app/srs_app_factory.hpp b/trunk/src/app/srs_app_factory.hpp index 852a7c4bb..208bc6fdd 100644 --- a/trunk/src/app/srs_app_factory.hpp +++ b/trunk/src/app/srs_app_factory.hpp @@ -50,6 +50,10 @@ class ISrsRtcPlayStream; class ISrsRtcPacketSender; class ISrsHttpResponseWriter; class ISrsProtocolReadWriter; +class SrsRtcFrameBuilder; +class ISrsFrameTarget; +class ISrsRtcFrameBuilderAudioPacketCache; +class ISrsAudioTranscoder; // The factory to create app objects. class ISrsAppFactory : public ISrsKernelFactory @@ -93,6 +97,11 @@ public: virtual ISrsRtcPublishStream *create_rtc_publish_stream(ISrsExecRtcAsyncTask *exec, ISrsExpire *expire, ISrsRtcPacketReceiver *receiver, const SrsContextId &cid) = 0; virtual ISrsRtcPlayStream *create_rtc_play_stream(ISrsExecRtcAsyncTask *exec, ISrsExpire *expire, ISrsRtcPacketSender *sender, const SrsContextId &cid) = 0; virtual ISrsHttpResponseWriter *create_http_response_writer(ISrsProtocolReadWriter *io) = 0; +#ifdef SRS_FFMPEG_FIT + virtual SrsRtcFrameBuilder *create_rtc_frame_builder(ISrsFrameTarget *target) = 0; + virtual ISrsRtcFrameBuilderAudioPacketCache *create_rtc_frame_builder_audio_packet_cache() = 0; + virtual ISrsAudioTranscoder *create_audio_transcoder() = 0; +#endif }; // The factory to create app objects. @@ -141,6 +150,11 @@ public: virtual ISrsRtcPublishStream *create_rtc_publish_stream(ISrsExecRtcAsyncTask *exec, ISrsExpire *expire, ISrsRtcPacketReceiver *receiver, const SrsContextId &cid); virtual ISrsRtcPlayStream *create_rtc_play_stream(ISrsExecRtcAsyncTask *exec, ISrsExpire *expire, ISrsRtcPacketSender *sender, const SrsContextId &cid); virtual ISrsHttpResponseWriter *create_http_response_writer(ISrsProtocolReadWriter *io); +#ifdef SRS_FFMPEG_FIT + virtual SrsRtcFrameBuilder *create_rtc_frame_builder(ISrsFrameTarget *target); + virtual ISrsRtcFrameBuilderAudioPacketCache *create_rtc_frame_builder_audio_packet_cache(); + virtual ISrsAudioTranscoder *create_audio_transcoder(); +#endif public: virtual ISrsCoroutine *create_coroutine(const std::string &name, ISrsCoroutineHandler *handler, SrsContextId cid); diff --git a/trunk/src/app/srs_app_rtc_codec.cpp b/trunk/src/app/srs_app_rtc_codec.cpp index cd99181ff..c4409b03f 100644 --- a/trunk/src/app/srs_app_rtc_codec.cpp +++ b/trunk/src/app/srs_app_rtc_codec.cpp @@ -42,49 +42,57 @@ static const AVCodec *srs_find_encoder_by_id(SrsAudioCodecId id) return NULL; } -class SrsFFmpegLogHelper +SrsFFmpegLogHelper::SrsFFmpegLogHelper() { -public: - SrsFFmpegLogHelper() - { - av_log_set_callback(ffmpeg_log_callback); - av_log_set_level(AV_LOG_TRACE); + av_log_set_callback(ffmpeg_log_callback); + av_log_set_level(AV_LOG_TRACE); +} +SrsFFmpegLogHelper::~SrsFFmpegLogHelper() +{ + av_log_set_callback(NULL); +} + +bool SrsFFmpegLogHelper::disabled_ = false; + +void SrsFFmpegLogHelper::disable_ffmpeg_log() +{ + disabled_ = true; +} + +void SrsFFmpegLogHelper::ffmpeg_log_callback(void *, int level, const char *fmt, va_list vl) +{ + if (disabled_) { + return; } - static void ffmpeg_log_callback(void *, int level, const char *fmt, va_list vl) - { - static char buf[4096] = {0}; - int nbytes = vsnprintf(buf, sizeof(buf), fmt, vl); - if (nbytes > 0 && nbytes < (int)sizeof(buf)) { - // Srs log is always start with new line, replcae '\n' to '\0', make log easy to read. - if (buf[nbytes - 1] == '\n') { - buf[nbytes - 1] = '\0'; - } - switch (level) { - case AV_LOG_PANIC: - case AV_LOG_FATAL: - case AV_LOG_ERROR: - srs_error("%s", buf); - break; - case AV_LOG_WARNING: - srs_warn("%s", buf); - break; - case AV_LOG_INFO: - srs_trace("%s", buf); - break; - case AV_LOG_VERBOSE: - case AV_LOG_DEBUG: - case AV_LOG_TRACE: - default: - srs_verbose("%s", buf); - break; - } + static char buf[4096] = {0}; + int nbytes = vsnprintf(buf, sizeof(buf), fmt, vl); + if (nbytes > 0 && nbytes < (int)sizeof(buf)) { + // Srs log is always start with new line, replcae '\n' to '\0', make log easy to read. + if (buf[nbytes - 1] == '\n') { + buf[nbytes - 1] = '\0'; + } + switch (level) { + case AV_LOG_PANIC: + case AV_LOG_FATAL: + case AV_LOG_ERROR: + srs_error("%s", buf); + break; + case AV_LOG_WARNING: + srs_warn("%s", buf); + break; + case AV_LOG_INFO: + srs_trace("%s", buf); + break; + case AV_LOG_VERBOSE: + case AV_LOG_DEBUG: + case AV_LOG_TRACE: + default: + srs_verbose("%s", buf); + break; } } -}; - -// Register FFmpeg log callback funciton. -SrsFFmpegLogHelper _srs_ffmpeg_log_helper; +} ISrsAudioTranscoder::ISrsAudioTranscoder() { diff --git a/trunk/src/app/srs_app_rtc_codec.hpp b/trunk/src/app/srs_app_rtc_codec.hpp index a754dca49..6fa571385 100644 --- a/trunk/src/app/srs_app_rtc_codec.hpp +++ b/trunk/src/app/srs_app_rtc_codec.hpp @@ -31,6 +31,22 @@ extern "C" { } #endif +// Register FFmpeg log callback funciton. +class SrsFFmpegLogHelper +{ +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + static bool disabled_; + +public: + SrsFFmpegLogHelper(); + virtual ~SrsFFmpegLogHelper(); + +public: + static void disable_ffmpeg_log(); + static void ffmpeg_log_callback(void *, int level, const char *fmt, va_list vl); +}; + // The interface for audio transcoder. class ISrsAudioTranscoder { diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 216b757d5..6c1249df2 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1223,6 +1223,7 @@ SrsRtcPublishStream::SrsRtcPublishStream(ISrsExecRtcAsyncTask *exec, ISrsExpire live_sources_ = _srs_sources; srt_sources_ = _srs_srt_sources; circuit_breaker_ = _srs_circuit_breaker; + app_factory_ = _srs_app_factory; } SrsRtcPublishStream::~SrsRtcPublishStream() @@ -1268,6 +1269,7 @@ SrsRtcPublishStream::~SrsRtcPublishStream() live_sources_ = NULL; srt_sources_ = NULL; circuit_breaker_ = NULL; + app_factory_ = NULL; } srs_error_t SrsRtcPublishStream::initialize(ISrsRequest *r, SrsRtcSourceDescription *stream_desc) @@ -1367,7 +1369,7 @@ srs_error_t SrsRtcPublishStream::initialize(ISrsRequest *r, SrsRtcSourceDescript } // Create the bridge for RTC. - SrsRtcBridge *bridge = new SrsRtcBridge(); + SrsRtcBridge *bridge = new SrsRtcBridge(app_factory_); // Bridge to RTMP. // TODO: Support bridge to RTSP. diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 288481084..ccaa41c9d 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -515,13 +515,6 @@ public: // A RTC publish stream, client push and publish stream to SRS. class SrsRtcPublishStream : public ISrsRtcPublishStream { -// clang-format off -SRS_DECLARE_PRIVATE: // clang-format on - ISrsExecRtcAsyncTask *exec_; - ISrsExpire *expire_; - ISrsRtcPacketReceiver *receiver_; - ISrsCircuitBreaker *circuit_breaker_; - // clang-format off SRS_DECLARE_PRIVATE: // clang-format on ISrsStatistic *stat_; @@ -529,6 +522,14 @@ SRS_DECLARE_PRIVATE: // clang-format on ISrsRtcSourceManager *rtc_sources_; ISrsLiveSourceManager *live_sources_; ISrsSrtSourceManager *srt_sources_; + ISrsAppFactory *app_factory_; + +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsExecRtcAsyncTask *exec_; + ISrsExpire *expire_; + ISrsRtcPacketReceiver *receiver_; + ISrsCircuitBreaker *circuit_breaker_; // clang-format off SRS_DECLARE_PRIVATE: // clang-format on diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index cccd80a54..a583e477d 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -32,14 +32,13 @@ #include #include #include - #ifdef SRS_FFMPEG_FIT #include #endif - #include #include #include +#include // The NACK sent by us(SFU). SrsPps *_srs_pps_snack = NULL; @@ -401,6 +400,8 @@ SrsRtcSource::SrsRtcSource() pli_for_rtmp_ = pli_elapsed_ = 0; stream_die_at_ = 0; + + app_factory_ = _srs_app_factory; } SrsRtcSource::~SrsRtcSource() @@ -417,6 +418,8 @@ SrsRtcSource::~SrsRtcSource() if (cid.empty()) cid = _pre_source_id; srs_trace("free rtc source id=[%s]", cid.c_str()); + + app_factory_ = NULL; } // CRITICAL: This method is called AFTER the source has been added to the source pool @@ -879,14 +882,14 @@ srs_error_t SrsRtcSource::on_timer(srs_utime_t interval) #ifdef SRS_FFMPEG_FIT -SrsRtcRtpBuilder::SrsRtcRtpBuilder(ISrsRtpTarget *target, SrsSharedPtr source) +SrsRtcRtpBuilder::SrsRtcRtpBuilder(ISrsAppFactory *factory, ISrsRtpTarget *target, SrsSharedPtr source) { rtp_target_ = target; source_ = source; req_ = NULL; format_ = new SrsRtmpFormat(); - codec_ = new SrsAudioTranscoder(); + codec_ = factory->create_audio_transcoder(); latest_codec_ = SrsAudioCodecIdForbidden; keep_bframe_ = false; keep_avc_nalu_sei_ = true; @@ -902,6 +905,8 @@ SrsRtcRtpBuilder::SrsRtcRtpBuilder(ISrsRtpTarget *target, SrsSharedPtrcreate_audio_transcoder(); // Initialize the codec according to the codec in stream. int bitrate = _srs_config->get_rtc_opus_bitrate(req_->vhost_); // The output bitrate in bps. @@ -1504,7 +1511,7 @@ int32_t SrsRtcFrameBuilderVideoPacketCache::find_next_lost_sn(uint16_t current_s } } - srs_error("cache overflow. the packet count of video frame is more than %u", cache_size_); + srs_warn("cache overflow. the packet count of video frame is more than %u", cache_size_); return -2; } @@ -1776,17 +1783,19 @@ void SrsRtcFrameBuilderAudioPacketCache::clear_all() audio_buffer_.clear(); } -SrsRtcFrameBuilder::SrsRtcFrameBuilder(ISrsFrameTarget *target) +SrsRtcFrameBuilder::SrsRtcFrameBuilder(ISrsAppFactory *factory, ISrsFrameTarget *target) { frame_target_ = target; is_first_audio_ = true; audio_transcoder_ = NULL; video_codec_ = SrsVideoCodecIdAVC; - audio_cache_ = new SrsRtcFrameBuilderAudioPacketCache(); + audio_cache_ = factory->create_rtc_frame_builder_audio_packet_cache(); video_cache_ = new SrsRtcFrameBuilderVideoPacketCache(); frame_detector_ = new SrsRtcFrameBuilderVideoFrameDetector(video_cache_); sync_state_ = -1; obs_whip_vps_ = obs_whip_sps_ = obs_whip_pps_ = NULL; + + app_factory_ = factory; } SrsRtcFrameBuilder::~SrsRtcFrameBuilder() @@ -1798,6 +1807,8 @@ SrsRtcFrameBuilder::~SrsRtcFrameBuilder() srs_freep(obs_whip_vps_); srs_freep(obs_whip_sps_); srs_freep(obs_whip_pps_); + + app_factory_ = NULL; } srs_error_t SrsRtcFrameBuilder::initialize(ISrsRequest *r, SrsAudioCodecId audio_codec, SrsVideoCodecId video_codec) @@ -1805,7 +1816,7 @@ srs_error_t SrsRtcFrameBuilder::initialize(ISrsRequest *r, SrsAudioCodecId audio srs_error_t err = srs_success; srs_freep(audio_transcoder_); - audio_transcoder_ = new SrsAudioTranscoder(); + audio_transcoder_ = app_factory_->create_audio_transcoder(); SrsAudioCodecId to = SrsAudioCodecIdAAC; // The output audio codec. int channels = 2; // The output audio channels. @@ -1904,6 +1915,9 @@ srs_error_t SrsRtcFrameBuilder::transcode_audio(SrsRtpPacket *pkt) int header_len = 0; uint8_t *header = NULL; audio_transcoder_->aac_codec_header(&header, &header_len); + if (header_len <= 0) { + return srs_error_new(ERROR_RTC_RTP_MUXER, "no aac header"); + } SrsRtmpCommonMessage out_rtmp; packet_aac(&out_rtmp, (char *)header, header_len, ts, is_first_audio_); diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 9f5836d3a..89947daec 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -44,6 +44,7 @@ class SrsRtpVideoBuilder; class ISrsRtcConsumer; class ISrsCircuitBreaker; class ISrsRtcPublishStream; +class ISrsAppFactory; // Firefox defaults as 109, Chrome is 111. const int kAudioPayloadType = 111; @@ -227,11 +228,12 @@ class SrsRtcSource : public ISrsRtpTarget, public ISrsFastTimerHandler, public I { // clang-format off SRS_DECLARE_PRIVATE: // clang-format on - // The RTP bridge, convert RTP packets to other protocols. - ISrsRtcBridge *rtc_bridge_; + ISrsAppFactory *app_factory_; // clang-format off SRS_DECLARE_PRIVATE: // clang-format on + // The RTP bridge, convert RTP packets to other protocols. + ISrsRtcBridge *rtc_bridge_; // Circuit breaker for protecting server resources. ISrsCircuitBreaker *circuit_breaker_; // For publish, it's the publish client id. @@ -347,6 +349,10 @@ SRS_DECLARE_PRIVATE: // clang-format on // Convert AV frame to RTC RTP packets. class SrsRtcRtpBuilder { +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsAppFactory *app_factory_; + // clang-format off SRS_DECLARE_PRIVATE: // clang-format on ISrsRequest *req_; @@ -380,7 +386,7 @@ SRS_DECLARE_PRIVATE: // clang-format on bool video_initialized_; public: - SrsRtcRtpBuilder(ISrsRtpTarget *target, SrsSharedPtr source); + SrsRtcRtpBuilder(ISrsAppFactory *factory, ISrsRtpTarget *target, SrsSharedPtr source); virtual ~SrsRtcRtpBuilder(); // clang-format off @@ -561,6 +567,10 @@ public: // Collect and build WebRTC RTP packets to AV frames. class SrsRtcFrameBuilder { +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsAppFactory *app_factory_; + // clang-format off SRS_DECLARE_PRIVATE: // clang-format on ISrsFrameTarget *frame_target_; @@ -590,7 +600,7 @@ SRS_DECLARE_PRIVATE: // clang-format on SrsRtpPacket *obs_whip_pps_; public: - SrsRtcFrameBuilder(ISrsFrameTarget *target); + SrsRtcFrameBuilder(ISrsAppFactory *factory, ISrsFrameTarget *target); virtual ~SrsRtcFrameBuilder(); public: diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index a116b3f69..b5c9f7c36 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -16,6 +16,7 @@ using namespace std; #include #include +#include #include #include #include @@ -1064,7 +1065,7 @@ srs_error_t SrsRtmpConn::acquire_publish(SrsSharedPtr source) // Bridge to RTC streaming. // TODO: FIXME: Need to convert RTMP to SRT. - SrsRtmpBridge *bridge = new SrsRtmpBridge(); + SrsRtmpBridge *bridge = new SrsRtmpBridge(_srs_app_factory); #if defined(SRS_FFMPEG_FIT) bool rtmp_to_rtc = config_->get_rtc_from_rtmp(req->vhost_); diff --git a/trunk/src/app/srs_app_srt_conn.cpp b/trunk/src/app/srs_app_srt_conn.cpp index 1e84714ba..619726a16 100644 --- a/trunk/src/app/srs_app_srt_conn.cpp +++ b/trunk/src/app/srs_app_srt_conn.cpp @@ -9,6 +9,7 @@ using namespace std; #include +#include #include #include #include @@ -501,7 +502,7 @@ srs_error_t SrsMpegtsSrtConn::acquire_publish() } // Bridge to RTMP and RTC streaming. - SrsSrtBridge *bridge = new SrsSrtBridge(); + SrsSrtBridge *bridge = new SrsSrtBridge(_srs_app_factory); bool srt_to_rtmp = config_->get_srt_to_rtmp(req_->vhost_); if (srt_to_rtmp && edge) { @@ -620,14 +621,15 @@ srs_error_t SrsMpegtsSrtConn::do_playing() int nb_packets = 0; while (true) { - if ((err = trd_->pull()) != srs_success) { - return srs_error_wrap(err, "srt play thread"); - } - + // Check recv thread error first, so we can detect the client disconnecting event. if ((err = srt_recv_trd.get_recv_err()) != srs_success) { return srs_error_wrap(err, "srt play recv thread"); } + if ((err = trd_->pull()) != srs_success) { + return srs_error_wrap(err, "srt play thread"); + } + // Wait for amount of packets. SrsSrtPacket *pkt_raw = NULL; consumer->dump_packet(&pkt_raw); diff --git a/trunk/src/app/srs_app_stream_bridge.cpp b/trunk/src/app/srs_app_stream_bridge.cpp index 8afbd81a1..6e8921d65 100644 --- a/trunk/src/app/srs_app_stream_bridge.cpp +++ b/trunk/src/app/srs_app_stream_bridge.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -53,7 +54,7 @@ ISrsRtmpBridge::~ISrsRtmpBridge() { } -SrsRtmpBridge::SrsRtmpBridge() +SrsRtmpBridge::SrsRtmpBridge(ISrsAppFactory *factory) { #ifdef SRS_FFMPEG_FIT rtp_builder_ = NULL; @@ -63,6 +64,8 @@ SrsRtmpBridge::SrsRtmpBridge() rtsp_target_ = NULL; #endif rtc_target_ = NULL; + + app_factory_ = factory; } SrsRtmpBridge::~SrsRtmpBridge() @@ -75,6 +78,8 @@ SrsRtmpBridge::~SrsRtmpBridge() rtsp_target_ = NULL; #endif rtc_target_ = NULL; + + app_factory_ = NULL; } bool SrsRtmpBridge::empty() @@ -111,7 +116,7 @@ srs_error_t SrsRtmpBridge::initialize(ISrsRequest *r) #ifdef SRS_FFMPEG_FIT if (rtc_target_.get()) { srs_freep(rtp_builder_); - rtp_builder_ = new SrsRtcRtpBuilder(rtc_target_.get(), rtc_target_); + rtp_builder_ = new SrsRtcRtpBuilder(app_factory_, rtc_target_.get(), rtc_target_); if ((err = rtp_builder_->initialize(r)) != srs_success) { return srs_error_wrap(err, "rtp builder initialize"); } @@ -211,7 +216,7 @@ ISrsSrtBridge::~ISrsSrtBridge() { } -SrsSrtBridge::SrsSrtBridge() +SrsSrtBridge::SrsSrtBridge(ISrsAppFactory *factory) { frame_builder_ = new SrsSrtFrameBuilder(this); rtmp_target_ = NULL; @@ -220,6 +225,8 @@ SrsSrtBridge::SrsSrtBridge() rtp_builder_ = NULL; #endif rtc_target_ = NULL; + + app_factory_ = factory; } SrsSrtBridge::~SrsSrtBridge() @@ -231,6 +238,8 @@ SrsSrtBridge::~SrsSrtBridge() #ifdef SRS_FFMPEG_FIT srs_freep(rtp_builder_); #endif + + app_factory_ = NULL; } bool SrsSrtBridge::empty() @@ -259,7 +268,7 @@ srs_error_t SrsSrtBridge::initialize(ISrsRequest *r) #ifdef SRS_FFMPEG_FIT if (rtc_target_.get()) { srs_freep(rtp_builder_); - rtp_builder_ = new SrsRtcRtpBuilder(rtc_target_.get(), rtc_target_); + rtp_builder_ = new SrsRtcRtpBuilder(app_factory_, rtc_target_.get(), rtc_target_); if ((err = rtp_builder_->initialize(r)) != srs_success) { return srs_error_wrap(err, "rtp builder initialize"); } @@ -356,13 +365,15 @@ ISrsRtcBridge::~ISrsRtcBridge() { } -SrsRtcBridge::SrsRtcBridge() +SrsRtcBridge::SrsRtcBridge(ISrsAppFactory *factory) { req_ = NULL; #ifdef SRS_FFMPEG_FIT frame_builder_ = NULL; #endif rtmp_target_ = NULL; + + app_factory_ = factory; } SrsRtcBridge::~SrsRtcBridge() @@ -372,7 +383,8 @@ SrsRtcBridge::~SrsRtcBridge() srs_freep(frame_builder_); #endif rtmp_target_ = NULL; - initialized_ = false; + + app_factory_ = NULL; } void SrsRtcBridge::enable_rtc2rtmp(SrsSharedPtr rtmp_target) @@ -389,18 +401,13 @@ srs_error_t SrsRtcBridge::initialize(ISrsRequest *r) { srs_error_t err = srs_success; - if (initialized_) { - return err; - } - initialized_ = true; - srs_freep(req_); req_ = r->copy(); #ifdef SRS_FFMPEG_FIT srs_assert(rtmp_target_.get()); srs_freep(frame_builder_); - frame_builder_ = new SrsRtcFrameBuilder(rtmp_target_.get()); + frame_builder_ = app_factory_->create_rtc_frame_builder(rtmp_target_.get()); #endif return err; diff --git a/trunk/src/app/srs_app_stream_bridge.hpp b/trunk/src/app/srs_app_stream_bridge.hpp index 16a626c11..c6fddccad 100644 --- a/trunk/src/app/srs_app_stream_bridge.hpp +++ b/trunk/src/app/srs_app_stream_bridge.hpp @@ -28,6 +28,7 @@ class SrsRtcFrameBuilder; class ISrsStreamBridge; class SrsSrtFrameBuilder; class SrsSrtPacket; +class ISrsAppFactory; // A target to feed AV frame, such as a RTMP live source, or a RTMP bridge // that take frame and converts to RTC packets, or a SRT bridge that converts @@ -85,6 +86,10 @@ public: // Then, deliver the RTP packets to RTP target, which binds to a RTC/RTSP source. class SrsRtmpBridge : public ISrsRtmpBridge { +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsAppFactory *app_factory_; + // clang-format off SRS_DECLARE_PRIVATE: // clang-format on #ifdef SRS_FFMPEG_FIT @@ -100,7 +105,7 @@ SRS_DECLARE_PRIVATE: // clang-format on #endif public: - SrsRtmpBridge(); + SrsRtmpBridge(ISrsAppFactory *factory); virtual ~SrsRtmpBridge(); public: @@ -136,6 +141,10 @@ public: // Then, deliver the AV frames to frame target, which binds to a RTMP/RTC source. class SrsSrtBridge : public ISrsSrtBridge, public ISrsFrameTarget { +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsAppFactory *app_factory_; + // clang-format off SRS_DECLARE_PRIVATE: // clang-format on // Convert SRT TS packets to media frame packets. @@ -150,7 +159,7 @@ SRS_DECLARE_PRIVATE: // clang-format on SrsSharedPtr rtc_target_; public: - SrsSrtBridge(); + SrsSrtBridge(ISrsAppFactory *factory); virtual ~SrsSrtBridge(); public: @@ -186,6 +195,10 @@ public: // Then, deliver the RTMP frame packet to RTMP target, which binds to a live source. class SrsRtcBridge : public ISrsRtcBridge { +// clang-format off +SRS_DECLARE_PRIVATE: // clang-format on + ISrsAppFactory *app_factory_; + // clang-format off SRS_DECLARE_PRIVATE: // clang-format on ISrsRequest *req_; @@ -195,11 +208,9 @@ SRS_DECLARE_PRIVATE: // clang-format on #endif // The Source bridge, bridge stream to other source. SrsSharedPtr rtmp_target_; - // To avoid initialize multiple times, we use this flag. - bool initialized_; public: - SrsRtcBridge(); + SrsRtcBridge(ISrsAppFactory *factory); virtual ~SrsRtcBridge(); public: diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index b94b1323c..8dc92c593 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -35,6 +35,7 @@ using namespace std; #include #include #include +#include #include #include #include @@ -63,6 +64,9 @@ SrsConfig *_srs_config = NULL; ISrsAppFactory *_srs_app_factory = new SrsAppFactory(); ISrsKernelFactory *_srs_kernel_factory = _srs_app_factory; +// Register FFmpeg log callback funciton. +SrsFFmpegLogHelper _srs_ffmpeg_log_helper; + // @global version of srs, which can grep keyword "XCORE" extern const char *_srs_version; diff --git a/trunk/src/protocol/srs_protocol_http_stack.cpp b/trunk/src/protocol/srs_protocol_http_stack.cpp index 6afcb3398..ceedfc223 100644 --- a/trunk/src/protocol/srs_protocol_http_stack.cpp +++ b/trunk/src/protocol/srs_protocol_http_stack.cpp @@ -1165,7 +1165,7 @@ srs_error_t SrsHttpAuthMux::serve_http(ISrsHttpResponseWriter *w, ISrsHttpMessag { srs_error_t err; if ((err = do_auth(w, r)) != srs_success) { - srs_error("do_auth %s", srs_error_desc(err).c_str()); + srs_warn("do_auth %s", srs_error_desc(err).c_str()); srs_freep(err); w->write_header(SRS_CONSTS_HTTP_Unauthorized); return w->final_request(); diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index aa24ee97d..adb16da67 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -32,6 +32,7 @@ using namespace std; // For TCP test server and client #include +#include #include // Temporary disk config. @@ -53,6 +54,9 @@ bool _srs_config_by_env = false; ISrsAppFactory *_srs_app_factory = new SrsAppFactory(); ISrsKernelFactory *_srs_kernel_factory = _srs_app_factory; +// Register FFmpeg log callback funciton. +SrsFFmpegLogHelper _srs_ffmpeg_log_helper; + // The binary name of SRS. const char *_srs_binary = NULL; @@ -97,6 +101,9 @@ srs_error_t prepare_main() return srs_error_wrap(err, "srt log initialize"); } + // Disable FFmpeg detail log in utest. + _srs_ffmpeg_log_helper.disable_ffmpeg_log(); + // Prevent the output of srt logs in utest. srt_setloghandler(NULL, srs_srt_utest_null_log_handler); // Set SRT log level to FATAL to suppress ERROR and WARNING logs in unit tests. diff --git a/trunk/src/utest/srs_utest_ai08.cpp b/trunk/src/utest/srs_utest_ai08.cpp index 467d0fa96..7d5f69dca 100644 --- a/trunk/src/utest/srs_utest_ai08.cpp +++ b/trunk/src/utest/srs_utest_ai08.cpp @@ -242,7 +242,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_BasicFunctionality) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); // Test initial state - bridge should be empty EXPECT_TRUE(bridge->empty()); @@ -260,7 +260,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_WithRtcTarget) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create and enable RTC target first @@ -287,7 +287,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_WithRtspTarget) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create and enable RTSP target first @@ -313,7 +313,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_WithRtcAndRtspTargets) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create and enable both RTC and RTSP targets @@ -348,7 +348,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspTargetReplacement) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Set first RTSP target @@ -377,7 +377,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_FrameHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -407,7 +407,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_OnFrameRtpBuilder) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Test frame handling without any targets first @@ -444,7 +444,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_OnFrameRtspBuilder) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -479,7 +479,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_OnFrameBothBuilders) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Enable both RTC and RTSP targets @@ -512,7 +512,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_BasicFunctionality) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); // Test initial state - bridge should be empty EXPECT_TRUE(bridge->empty()); @@ -530,7 +530,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_WithRtmpTarget) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -558,7 +558,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_WithRtcTarget) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create and enable RTC target first @@ -584,7 +584,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_PacketHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -606,7 +606,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_FrameHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -628,7 +628,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_OnFrameRtmpTarget) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -662,7 +662,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_OnFrameRtpBuilder) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -697,7 +697,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_OnFrameBothTargets) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Enable both RTMP and RTC targets @@ -728,7 +728,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_OnFrameBothTargets) // Test SrsRtcBridge basic functionality VOID TEST(StreamBridgeTest, SrsRtcBridge_BasicFunctionality) { - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); // Test initial state - bridge should be empty EXPECT_TRUE(bridge->empty()); @@ -740,7 +740,7 @@ VOID TEST(StreamBridgeTest, SrsRtcBridge_BasicFunctionality) // Test SrsRtcBridge with RTMP target VOID TEST(StreamBridgeTest, SrsRtcBridge_WithRtmpTarget) { - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); // Create a mock RTMP target using shared pointer SrsSharedPtr rtmp_source(new SrsLiveSource()); @@ -758,7 +758,7 @@ VOID TEST(StreamBridgeTest, SrsRtcBridge_RtpPacketHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTMP target for the bridge @@ -793,7 +793,7 @@ VOID TEST(StreamBridgeTest, SrsRtcBridge_RtpPacketTypes) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTMP target for the bridge @@ -829,7 +829,7 @@ VOID TEST(StreamBridgeTest, SrsRtcBridge_RtpWithoutFrameBuilder) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Test RTP handling without proper initialization (no frame builder) @@ -844,7 +844,7 @@ VOID TEST(StreamBridgeTest, SrsRtcBridge_RtpLifecycle) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTMP target @@ -877,7 +877,7 @@ VOID TEST(StreamBridgeTest, Bridge_ErrorHandling) srs_error_t err; // Test SrsRtmpBridge with invalid frame - SrsUniquePtr rtmp_bridge(new SrsRtmpBridge()); + SrsUniquePtr rtmp_bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); HELPER_EXPECT_SUCCESS(rtmp_bridge->initialize(req.get())); @@ -886,7 +886,7 @@ VOID TEST(StreamBridgeTest, Bridge_ErrorHandling) HELPER_EXPECT_SUCCESS(rtmp_bridge->on_frame(NULL)); // Test SrsSrtBridge with invalid packet - SrsUniquePtr srt_bridge(new SrsSrtBridge()); + SrsUniquePtr srt_bridge(new SrsSrtBridge(_srs_app_factory)); HELPER_EXPECT_SUCCESS(srt_bridge->initialize(req.get())); // Note: Skip NULL packet test as it causes segmentation fault @@ -899,7 +899,7 @@ VOID TEST(StreamBridgeTest, Bridge_LifecycleManagement) srs_error_t err; // Test multiple initialize calls - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // First initialize @@ -930,7 +930,7 @@ VOID TEST(StreamBridgeTest, SrsSrtBridge_MultipleTargets) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -970,7 +970,7 @@ VOID TEST(StreamBridgeTest, Bridge_TargetReplacement) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Initialize bridge @@ -1001,7 +1001,7 @@ VOID TEST(StreamBridgeTest, Bridge_StateConsistency) { srs_error_t err; - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Test empty state consistency @@ -1029,7 +1029,7 @@ VOID TEST(StreamBridgeTest, Bridge_MemoryManagement) // Test that bridges properly manage their internal components { - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); HELPER_EXPECT_SUCCESS(bridge->initialize(req.get())); @@ -1048,7 +1048,7 @@ VOID TEST(StreamBridgeTest, Bridge_MemoryManagement) } { - SrsUniquePtr bridge(new SrsSrtBridge()); + SrsUniquePtr bridge(new SrsSrtBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); HELPER_EXPECT_SUCCESS(bridge->initialize(req.get())); @@ -1064,7 +1064,7 @@ VOID TEST(StreamBridgeTest, Bridge_MemoryManagement) } { - SrsUniquePtr bridge(new SrsRtcBridge()); + SrsUniquePtr bridge(new SrsRtcBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); SrsSharedPtr rtmp_source(new SrsLiveSource()); @@ -1086,7 +1086,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspFrameHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create and enable RTSP target @@ -1115,7 +1115,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspLifecycle) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Test lifecycle without target @@ -1143,7 +1143,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspErrorHandling) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTSP target @@ -1167,7 +1167,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspMemoryManagement) // Test multiple RTSP bridge creation and destruction for (int i = 0; i < 5; ++i) { - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); SrsSharedPtr rtsp_source(new SrsRtspSource()); @@ -1192,7 +1192,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtmpToRtspConversion) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTSP target for protocol conversion @@ -1227,7 +1227,7 @@ VOID TEST(StreamBridgeTest, SrsRtmpBridge_RtspCodecChanges) { srs_error_t err; - SrsUniquePtr bridge(new SrsRtmpBridge()); + SrsUniquePtr bridge(new SrsRtmpBridge(_srs_app_factory)); SrsUniquePtr req(new MockStreamBridgeRequest()); // Create RTSP target @@ -1265,7 +1265,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterSEIFiltering) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1344,7 +1344,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterBFrameFilteringAVC) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1425,7 +1425,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterBFrameFilteringHEVC) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1500,7 +1500,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterCombinedSEIAndBFrameFiltering HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1587,7 +1587,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterIDRDetection) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1641,7 +1641,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterErrorHandling) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1687,7 +1687,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterNonAVCCodecSkipsSEIFiltering) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1755,7 +1755,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_FilterZeroSamples) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1797,7 +1797,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoMergeNalusMultipleSamples) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1871,7 +1871,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoLargeNaluPackageFuA) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -1956,7 +1956,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoExtremelyLargeNaluPackageFuA HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2036,7 +2036,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoMergeNalusWithMultipleNalus) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2119,7 +2119,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoMultipleLargeNalusPackageFuA HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2199,7 +2199,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoMergeNalusLargePayload) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2286,7 +2286,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioRealAacFrames) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2353,7 +2353,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioAddSampleFailure) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2409,7 +2409,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioTranscodeFailure) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2463,7 +2463,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioMemoryCleanup) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2522,7 +2522,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoComprehensiveCoverage) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2587,7 +2587,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoUnsupportedCodec) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2627,7 +2627,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoNoVcodecParsed) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2666,7 +2666,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoInitializeTrackError) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2730,7 +2730,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoFilterMethod) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2815,7 +2815,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoFormatError) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2878,7 +2878,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnVideoCodecSwitching) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2956,7 +2956,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_BasicInstantiation) MockRtpTarget rtp_target; // Test basic instantiation - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -2976,7 +2976,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_InitializeAudioTrack) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder first HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3022,7 +3022,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_InitializeVideoTrack) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder first HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3068,7 +3068,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_TrackInitializationCodecs) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder first HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3166,7 +3166,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_TrackInitializationWithSourceTracks rtc_source->set_stream_desc(source_desc); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3220,7 +3220,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioFormatConsumeSuccess) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3282,7 +3282,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioFormatConsumeError) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3328,7 +3328,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioNoAcodecParsed) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3377,7 +3377,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioUnsupportedCodec) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3456,7 +3456,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioSupportedCodecs) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3543,7 +3543,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioCodecValidationFailure) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3606,7 +3606,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_OnAudioComprehensiveCoverage) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3709,7 +3709,7 @@ VOID TEST(StreamBridgeTest, SrsRtcRtpBuilder_LazyInitialization) HELPER_EXPECT_SUCCESS(rtc_source->initialize(req.get())); MockRtpTarget rtp_target; - SrsRtcRtpBuilder builder(&rtp_target, rtc_source); + SrsRtcRtpBuilder builder(_srs_app_factory, &rtp_target, rtc_source); // Initialize the builder HELPER_EXPECT_SUCCESS(builder.initialize(req.get())); @@ -3796,8 +3796,8 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_MultipleBuilders) srs_error_t err; MockRtcFrameTarget target1, target2; - SrsRtcFrameBuilder builder1(&target1); - SrsRtcFrameBuilder builder2(&target2); + SrsRtcFrameBuilder builder1(_srs_app_factory, &target1); + SrsRtcFrameBuilder builder2(_srs_app_factory, &target2); // Initialize both builders SrsUniquePtr req1(new MockRtcRequest("vhost1", "app1", "stream1")); @@ -3826,7 +3826,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_Success) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3873,7 +3873,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_TranscoderError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3918,7 +3918,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_FrameTargetError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3965,7 +3965,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_MultipleOutputPackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4011,7 +4011,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_NoOutputPackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4055,7 +4055,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_FrameTargetErrorOnTranscodedFrame) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4126,7 +4126,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_SpecificCodePath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4187,7 +4187,7 @@ VOID TEST(RtcFrameBuilderTest, TranscodeAudio_ErrorInTranscoderLoop) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4257,7 +4257,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_CompleteFrameDetectionWithPacketVideo srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4308,7 +4308,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_IsLostSnTrueErrorPath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4379,7 +4379,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_PreciseLostSequenceScenario) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4438,7 +4438,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoRtmp_RecursiveCallErrorHandling) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4506,7 +4506,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_ExactIsLostSnCodePathCoverage srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); diff --git a/trunk/src/utest/srs_utest_ai09.cpp b/trunk/src/utest/srs_utest_ai09.cpp index 5542d06a0..0769ed5c8 100644 --- a/trunk/src/utest/srs_utest_ai09.cpp +++ b/trunk/src/utest/srs_utest_ai09.cpp @@ -54,8 +54,11 @@ MockAudioTranscoderForUtest::MockAudioTranscoderForUtest() { transcode_error_ = srs_success; should_output_packets_ = false; - aac_header_data_ = NULL; - aac_header_len_ = 0; + // Set default AAC header for mock transcoder + aac_header_len_ = 2; + aac_header_data_ = new uint8_t[aac_header_len_]; + aac_header_data_[0] = 0x12; // Mock AAC header byte 1 + aac_header_data_[1] = 0x10; // Mock AAC header byte 2 } MockAudioTranscoderForUtest::~MockAudioTranscoderForUtest() @@ -362,7 +365,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_NoPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -385,7 +388,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_NoAvsyncTime_InitialState) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -407,7 +410,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_NoAvsyncTime_StateZero) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -431,7 +434,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ValidAvsyncTime_SyncStateTransition) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -457,7 +460,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ValidAvsyncTime_SyncStateAlreadyTwo) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -483,7 +486,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_AudioPacketProcessing) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -508,7 +511,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_VideoPacketProcessing) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -529,7 +532,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_MixedAudioVideoPackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -555,7 +558,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_DifferentSSRCValues) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -580,7 +583,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_DifferentSequenceNumbers) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -605,7 +608,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_DifferentTimestamps) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -630,7 +633,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_SyncStateTransitions) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -664,7 +667,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_BoundaryAvsyncTimeValues) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -696,7 +699,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_NullPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -713,7 +716,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_RapidPacketSequence) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -738,7 +741,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_AlternatingAudioVideo) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -763,7 +766,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcPayload_WithVPSS srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -786,7 +789,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcPayload_MissingV srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -829,7 +832,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcPayload_MissingS srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -872,7 +875,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcPayload_MissingP srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -915,7 +918,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipVPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -955,7 +958,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -995,7 +998,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1035,7 +1038,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipMissingVPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1074,7 +1077,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipMissingSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1113,7 +1116,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_OBSWhipMissingPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1152,7 +1155,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcWithOBSWhipVPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1204,7 +1207,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcWithOBSWhipSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1256,7 +1259,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_STAPHevcWithOBSWhipPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1308,7 +1311,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_NonHEVCCodec) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec (not HEVC) SrsUniquePtr req(new MockRtcRequest()); @@ -1331,7 +1334,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_NonVPSSPSPPSRawPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1354,7 +1357,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_NullPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1385,7 +1388,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_CacheResetAfterUse) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1432,7 +1435,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderHevc_ComprehensiveCoverage) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1479,7 +1482,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_SameTimestampDifferentSequence) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1504,7 +1507,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_FrameTargetError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1529,7 +1532,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_FrameTargetError) VOID TEST(RtcFrameBuilderTest, OnRtp_UninitializedBuilder) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Do NOT initialize the builder @@ -1553,7 +1556,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_LargePayloadPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1584,7 +1587,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ZeroLengthPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1615,7 +1618,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_MaxSequenceNumber) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1639,7 +1642,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_MaxTimestamp) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1663,7 +1666,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ComprehensiveCoverage) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1705,7 +1708,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_TraceLogScenarios) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1739,7 +1742,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ComprehensiveCodePathCoverage) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -1848,7 +1851,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_STAPAPayload_WithSPSAndPP srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1871,7 +1874,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_STAPAPayload_MissingSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1909,7 +1912,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_STAPAPayload_MissingPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1947,7 +1950,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_OBSWhipSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -1979,7 +1982,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_OBSWhipPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2011,7 +2014,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_OBSWhipMissingSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2042,7 +2045,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_OBSWhipMissingPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2073,7 +2076,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_STAPAWithOBSWhipSPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2120,7 +2123,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_STAPAWithOBSWhipPPS) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2167,7 +2170,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_NonSPSPPSRawPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2190,7 +2193,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_EmptySTAPAPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2224,7 +2227,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_FrameTargetError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2249,7 +2252,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_CacheCleanup) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2284,7 +2287,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_NoSTAPANoRawPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2320,7 +2323,7 @@ VOID TEST(RtcFrameBuilderTest, PacketSequenceHeaderAvc_ComprehensiveCoverage) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2359,7 +2362,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ExactSyncStateTransitions) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -2394,7 +2397,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_AvsyncTimeBoundaryConditions) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -2427,7 +2430,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_AudioPacketProcessingPath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -2466,7 +2469,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_VideoPacketProcessingPath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -2501,7 +2504,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_MixedAudioVideoWithPayloads) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -2565,7 +2568,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_ErrorHandlingPacketVideoRtmpFails) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2618,7 +2621,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_FrameTargetFailureInPacketVideoRtmp) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2661,7 +2664,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_LostPacketRecoveryErrorPath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2703,7 +2706,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_MultipleFrameCompletionErrorHandling) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2752,7 +2755,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_HEVCCodecErrorHandling) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2845,7 +2848,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_BoundarySequenceNumbersErrorHandling) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2891,7 +2894,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_ErrorHandlingPacketVideoRtmpF srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -2934,7 +2937,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_HEVCErrorHandling) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3001,7 +3004,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_LostSequenceNumberErrorPath) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3045,7 +3048,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_SequenceHeaderAndFrameErrors) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3084,7 +3087,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_BoundarySequenceNumbers) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3128,7 +3131,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_ComprehensiveErrorPathCoverag srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3187,7 +3190,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ErrorPropagationFromPacketAudio) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3212,7 +3215,7 @@ VOID TEST(RtcFrameBuilderTest, OnRtp_ErrorPropagationFromPacketVideo) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3237,7 +3240,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_SinglePacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3279,7 +3282,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_MultipleSequentialPackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3319,7 +3322,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_OutOfOrderPackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3380,7 +3383,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_DuplicatePackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3433,7 +3436,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_LatePackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3488,7 +3491,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_LatePackets) VOID TEST(RtcFrameBuilderTest, PacketAudio_NullPacket) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3515,7 +3518,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_NoPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3548,7 +3551,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_ZeroLengthPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3583,7 +3586,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_LargePayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3620,7 +3623,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_FrameTargetError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3661,7 +3664,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_SequenceWrapAround) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3717,7 +3720,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_TimestampWrapAround) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3773,7 +3776,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_DifferentSSRC) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3824,7 +3827,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_RapidSequence) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -3867,7 +3870,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_VPSPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3905,7 +3908,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_STAPAPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3953,7 +3956,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_FUAPayloadIDR) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -3993,7 +3996,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_FUAPayloadNonIDR) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4033,7 +4036,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_AudioPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4068,7 +4071,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_AudioPacket) VOID TEST(RtcFrameBuilderTest, PacketVideo_NullPacket) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4094,7 +4097,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_NoPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4124,7 +4127,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_ZeroLengthPayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4159,7 +4162,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_LargePayload) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4196,7 +4199,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_SequenceWrapAround) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4245,7 +4248,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_TimestampWrapAround) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4294,7 +4297,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_DifferentSSRC) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4340,7 +4343,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_FrameTargetError) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4382,7 +4385,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_RapidSequence) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4425,7 +4428,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_MixedKeyframeSequence) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4474,7 +4477,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_KeyframeAVC) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4512,7 +4515,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_KeyframeHEVC) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with HEVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4550,7 +4553,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_NonKeyframe) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4588,7 +4591,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_SPSPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4626,7 +4629,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideo_PPSPacket) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); @@ -4664,7 +4667,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_MixedPayloadSizes) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4706,7 +4709,7 @@ VOID TEST(RtcFrameBuilderTest, PacketAudio_ComprehensiveScenario) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder SrsUniquePtr req(new MockRtcRequest()); @@ -4783,7 +4786,7 @@ VOID TEST(RtcFrameBuilderTest, PacketVideoKeyFrame_OutOfOrderKeyframePackets) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtcRequest()); diff --git a/trunk/src/utest/srs_utest_ai10.cpp b/trunk/src/utest/srs_utest_ai10.cpp index a95ffbbcd..46ac8e394 100644 --- a/trunk/src/utest/srs_utest_ai10.cpp +++ b/trunk/src/utest/srs_utest_ai10.cpp @@ -63,7 +63,7 @@ SrsCodecPayload *create_test_codec_payload(uint8_t pt, std::string name, int sam VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeBasic) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test with NULL packet int null_size = builder.calculate_packet_payload_size(NULL); @@ -84,7 +84,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeBasic) VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeFUA) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.264 FU-A payload (SrsRtpFUAPayload2) - start fragment SrsUniquePtr fua_start_pkt(new SrsRtpPacket()); @@ -149,7 +149,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeFUA) VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeSTAP) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.264 STAP-A payload (SrsRtpSTAPPayload) with multiple NALUs SrsUniquePtr stap_pkt(new SrsRtpPacket()); @@ -221,7 +221,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeSTAP) VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeFUAHevc) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.265 FU-A payload (SrsRtpFUAPayloadHevc2) - start fragment SrsUniquePtr fua_hevc_start_pkt(new SrsRtpPacket()); @@ -286,7 +286,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeFUAHevc) VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeSTAPHevc) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.265 STAP payload (SrsRtpSTAPPayloadHevc) with multiple NALUs SrsUniquePtr stap_hevc_pkt(new SrsRtpPacket()); @@ -366,7 +366,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeSTAPHevc) VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeEdgeCases) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test with unknown payload type (should fall through to default case) SrsUniquePtr unknown_pkt(new SrsRtpPacket()); @@ -394,7 +394,7 @@ VOID TEST(SrsRtcFrameBuilderTest, CalculatePacketPayloadSizeEdgeCases) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferRaw) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with raw payload SrsUniquePtr pkt(new SrsRtpPacket()); @@ -435,7 +435,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferRaw) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAStart) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.264 FU-A start fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -482,7 +482,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAStart) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAMiddle) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.264 FU-A middle fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -523,7 +523,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAMiddle) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAEnd) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.264 FU-A end fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -579,7 +579,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAEnd) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevc) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.265 FU-A start fragment SrsUniquePtr hevc_pkt(new SrsRtpPacket()); @@ -623,7 +623,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevc) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAEdgeCases) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Test H.264 FU-A with zero-size payload SrsUniquePtr zero_pkt(new SrsRtpPacket()); @@ -694,7 +694,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAEdgeCases) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUASequence) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); char buffer_data[1024]; SrsBuffer buffer(buffer_data, sizeof(buffer_data)); @@ -782,7 +782,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUASequence) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAP) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.264 STAP payload SrsUniquePtr pkt(new SrsRtpPacket()); @@ -857,7 +857,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAP) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAPWithEmptyNALUs) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.264 STAP payload SrsUniquePtr pkt(new SrsRtpPacket()); @@ -930,7 +930,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAPWithEmptyNALUs) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcStart) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.265 FU-A start fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -978,7 +978,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcStart) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcMiddle) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.265 FU-A middle fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -1018,7 +1018,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcMiddle) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcEnd) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.265 FU-A end fragment SrsUniquePtr pkt(new SrsRtpPacket()); @@ -1073,7 +1073,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferFUAHevcEnd) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAPHevc) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.265 STAP payload SrsUniquePtr pkt(new SrsRtpPacket()); @@ -1148,7 +1148,7 @@ VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAPHevc) VOID TEST(SrsRtcFrameBuilderTest, WritePacketPayloadToBufferSTAPHevcWithEmptyNALUs) { MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Create test RTP packet with H.265 STAP payload SrsUniquePtr pkt(new SrsRtpPacket()); @@ -1229,7 +1229,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluBasic) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1280,7 +1280,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluNoNextFrame) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1323,7 +1323,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluRecursiveCall) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1377,7 +1377,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluMultipleEmptyFrames) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1438,7 +1438,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluZeroSizePayloads) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1497,7 +1497,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluHevc) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.265 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1548,7 +1548,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluSequenceWrapAround) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); @@ -1597,7 +1597,7 @@ VOID TEST(SrsRtcFrameBuilderTest, PacketVideoRtmpEmptyNaluFrameProcessing) srs_error_t err; MockRtcFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize builder with H.264 codec SrsUniquePtr req(new MockRtcRequest()); diff --git a/trunk/src/utest/srs_utest_manual_app_rtc2rtmp.cpp b/trunk/src/utest/srs_utest_manual_app_rtc2rtmp.cpp index f996b5586..1fa3caf90 100644 --- a/trunk/src/utest/srs_utest_manual_app_rtc2rtmp.cpp +++ b/trunk/src/utest/srs_utest_manual_app_rtc2rtmp.cpp @@ -334,7 +334,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_SameKeyframeTimestampVideoSequence) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -404,7 +404,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_SameStapForIdrVideoSequence) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -456,7 +456,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_DifferentKeyframeTimestampVideoSequen srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -524,7 +524,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_TypicalVideoSequence) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -595,7 +595,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_SingleVideoSequence) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -652,7 +652,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_SingleVideoSequence_LargePFrame) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -728,7 +728,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_AcceptableVideoSequence) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -792,7 +792,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_EmptyIDRBeforeNormalFrames) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -855,7 +855,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_EmptyIDRBeforeNormalFrames_FUA) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -917,7 +917,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_BaselinePackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -985,7 +985,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_NoSpsPpsPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1044,7 +1044,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_ReorderingIdrPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1113,7 +1113,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_PframeBeforeIdrPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1188,7 +1188,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_PframeReorderingPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1262,7 +1262,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_IdrPframeReorderingPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1341,7 +1341,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketVideo_PframeLostPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with AVC codec SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1402,7 +1402,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketAudio_ThreeAudioPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with Opus codec (typical for WebRTC) SrsUniquePtr req(new MockRtc2RtmpRequest()); @@ -1452,7 +1452,7 @@ VOID TEST(Rtc2RtmpConvertTest, PacketAudio_ReorderingAudioPackets) srs_error_t err; MockRtc2RtmpFrameTarget target; - SrsRtcFrameBuilder builder(&target); + SrsRtcFrameBuilder builder(_srs_app_factory, &target); // Initialize the builder with Opus codec (typical for WebRTC) SrsUniquePtr req(new MockRtc2RtmpRequest()); diff --git a/trunk/src/utest/srs_utest_manual_mock.cpp b/trunk/src/utest/srs_utest_manual_mock.cpp index fb3f4a9e4..6e22c9192 100644 --- a/trunk/src/utest/srs_utest_manual_mock.cpp +++ b/trunk/src/utest/srs_utest_manual_mock.cpp @@ -557,6 +557,8 @@ MockAppConfig::MockAppConfig() rtc_from_rtmp_ = false; forwards_directive_ = NULL; backend_directive_ = NULL; + rtc_server_enabled_ = false; + rtc_enabled_ = false; } MockAppConfig::~MockAppConfig() @@ -1379,6 +1381,19 @@ MockRtmpServer::~MockRtmpServer() recv_msgs_.clear(); } +void MockRtmpServer::set_request(SrsRtmpConnType type, std::string ip, std::string vhost, std::string app, std::string stream, std::string tcUrl, std::string schema, int port, std::string host) +{ + type_ = type; + ip_ = ip; + vhost_ = vhost; + app_ = app; + stream_ = stream; + tcUrl_ = tcUrl; + schema_ = schema; + port_ = port; + host_ = host; +} + void MockRtmpServer::set_recv_timeout(srs_utime_t tm) { } @@ -2673,6 +2688,8 @@ void MockRtmpClient::set_url(std::string url) MockAudioTranscoder::MockAudioTranscoder() { transcode_count_ = 0; + // Set default AAC header for mock transcoder + aac_header_ = std::string("\xAF\x00\x12\x10", 4); } MockAudioTranscoder::~MockAudioTranscoder() @@ -2706,6 +2723,10 @@ void MockAudioTranscoder::free_frames(std::vector &frame void MockAudioTranscoder::aac_codec_header(uint8_t **data, int *len) { int size = aac_header_.size(); + if (size <= 0) { + return; + } + uint8_t *copy = new uint8_t[size]; memcpy(copy, aac_header_.data(), size); *data = copy; diff --git a/trunk/src/utest/srs_utest_manual_mock.hpp b/trunk/src/utest/srs_utest_manual_mock.hpp index 20a9736a2..b02536f5d 100644 --- a/trunk/src/utest/srs_utest_manual_mock.hpp +++ b/trunk/src/utest/srs_utest_manual_mock.hpp @@ -275,6 +275,8 @@ public: bool rtc_from_rtmp_; SrsConfDirective *forwards_directive_; SrsConfDirective *backend_directive_; + bool rtc_server_enabled_; + bool rtc_enabled_; public: MockAppConfig(); @@ -328,7 +330,7 @@ public: virtual std::string get_https_stream_ssl_cert() { return ""; } virtual std::string get_http_stream_dir() { return ""; } virtual bool get_http_stream_crossdomain() { return false; } - virtual bool get_rtc_server_enabled() { return false; } + virtual bool get_rtc_server_enabled() { return rtc_server_enabled_; } virtual bool get_rtc_server_tcp_enabled() { return false; } virtual std::vector get_rtc_server_tcp_listens() { @@ -408,7 +410,7 @@ public: virtual SrsConfDirective *get_vhost_on_close(std::string vhost) { return NULL; } virtual SrsConfDirective *get_vhost_on_publish(std::string vhost) { return NULL; } virtual SrsConfDirective *get_vhost_on_play(std::string vhost) { return NULL; } - virtual bool get_rtc_enabled(std::string vhost) { return false; } + virtual bool get_rtc_enabled(std::string vhost) { return rtc_enabled_; } virtual bool get_rtsp_enabled(std::string vhost) { return false; } virtual bool get_rtc_from_rtmp(std::string vhost) { return rtc_from_rtmp_; } virtual bool get_rtsp_from_rtmp(std::string vhost) { return false; } @@ -751,6 +753,9 @@ public: MockRtmpServer(); virtual ~MockRtmpServer(); +public: + void set_request(SrsRtmpConnType type, std::string ip, std::string vhost, std::string app, std::string stream, std::string tcUrl, std::string schema, int port, std::string host); + public: virtual void set_recv_timeout(srs_utime_t tm); virtual void set_send_timeout(srs_utime_t tm); diff --git a/trunk/src/utest/srs_utest_manual_st.cpp b/trunk/src/utest/srs_utest_manual_st.cpp index ddd19c26b..c9715075b 100644 --- a/trunk/src/utest/srs_utest_manual_st.cpp +++ b/trunk/src/utest/srs_utest_manual_st.cpp @@ -43,9 +43,9 @@ VOID TEST(StTest, StUtimeInMicroseconds) EXPECT_GT(st_time_1, 0); EXPECT_GT(st_time_2, 0); EXPECT_GE(st_time_2, st_time_1); - // st_time_2 - st_time_1 should be in range of [1, 1000] microseconds + // st_time_2 - st_time_1 should be in range of [1, 3000] microseconds EXPECT_GE(st_time_2 - st_time_1, 0); - EXPECT_LE(st_time_2 - st_time_1, 1000); + EXPECT_LE(st_time_2 - st_time_1, 3000); } static inline st_utime_t time_gettimeofday() diff --git a/trunk/src/utest/srs_utest_workflow_rtc2rtmp.cpp b/trunk/src/utest/srs_utest_workflow_rtc2rtmp.cpp index 1e0629cec..4ee58c495 100644 --- a/trunk/src/utest/srs_utest_workflow_rtc2rtmp.cpp +++ b/trunk/src/utest/srs_utest_workflow_rtc2rtmp.cpp @@ -36,6 +36,45 @@ #include #include +// Mock app factory for RTC to RTMP workflow testing +class MockAppFactoryForRtc2Rtmp : public SrsAppFactory +{ +public: + MockAudioCache *last_created_audio_cache_; + MockAudioTranscoder *last_created_audio_transcoder_; + +public: + MockAppFactoryForRtc2Rtmp() + { + last_created_audio_cache_ = NULL; + last_created_audio_transcoder_ = NULL; + } + + virtual ~MockAppFactoryForRtc2Rtmp() + { + // Don't delete last_created_audio_cache_ or last_created_audio_transcoder_ here, + // they are managed by frame builder + } + +#ifdef SRS_FFMPEG_FIT + virtual ISrsRtcFrameBuilderAudioPacketCache *create_rtc_frame_builder_audio_packet_cache() + { + // Create a new mock audio cache each time + MockAudioCache *cache = new MockAudioCache(); + last_created_audio_cache_ = cache; + return cache; + } + + virtual ISrsAudioTranscoder *create_audio_transcoder() + { + // Create a new mock audio transcoder each time + MockAudioTranscoder *transcoder = new MockAudioTranscoder(); + last_created_audio_transcoder_ = transcoder; + return transcoder; + } +#endif +}; + // This test is used to verify the basic workflow of the RTC connection. // It's finished with the help of AI, but each step is manually designed // and verified. So this is not dominated by AI, but by humanbeing. @@ -53,10 +92,8 @@ VOID TEST(BasicWorkflowRtc2RtmpTest, ManuallyVerifyTypicalScenario) SrsUniquePtr mock_receiver(new MockRtcPacketReceiver()); SrsUniquePtr track_factory(new MockRtcTrackDescriptionFactory()); SrsUniquePtr mock_sources(new MockLiveSourceManager()); - MockAudioCache *mock_audio_cache = new MockAudioCache(); - MockAudioTranscoder *mock_audio_transcoder = new MockAudioTranscoder(); + SrsUniquePtr mock_factory(new MockAppFactoryForRtc2Rtmp()); - mock_audio_transcoder->aac_header_ = std::string("\xAF\x00\x12\x10", 4); // AAC sequence header. mock_config->rtc_to_rtmp_ = true; // Create RTC publish stream - use real pli_worker_ @@ -71,12 +108,12 @@ VOID TEST(BasicWorkflowRtc2RtmpTest, ManuallyVerifyTypicalScenario) publish_stream->rtc_sources_ = mock_rtc_sources.get(); publish_stream->live_sources_ = mock_sources.get(); publish_stream->stat_ = mock_stat.get(); + publish_stream->app_factory_ = mock_factory.get(); } // Initialize publish stream, rtc2rtmp bridge should be created SrsRtcBridge *bridge = NULL; SrsLiveSource *live_source = NULL; - SrsRtcFrameBuilder *frame_builder = NULL; if (true) { SrsUniquePtr stream_desc(track_factory->create_stream_description()); @@ -94,33 +131,31 @@ VOID TEST(BasicWorkflowRtc2RtmpTest, ManuallyVerifyTypicalScenario) live_source = bridge->rtmp_target_.get(); EXPECT_TRUE(live_source != NULL); - - frame_builder = bridge->frame_builder_; - EXPECT_TRUE(frame_builder != NULL); - - // Mock the frame builder object - srs_freep(frame_builder->audio_cache_); - frame_builder->audio_cache_ = mock_audio_cache; } // Start the publish stream. + SrsRtcFrameBuilder *frame_builder = NULL; if (true) { // Test: First call to start() should succeed HELPER_EXPECT_SUCCESS(publish_stream->start()); - // Wait for coroutine to start. + // Wait for coroutine to start. srs_usleep(1 * SRS_UTIME_MILLISECONDS); // Verify is_sender_started_ flag is set EXPECT_TRUE(publish_stream->is_sender_started_); - // When starting the publish stream, the frame builder should not be recreated - EXPECT_TRUE(frame_builder == bridge->frame_builder_); + // When starting the publish stream, the frame builder should be recreated + frame_builder = bridge->frame_builder_; EXPECT_TRUE(frame_builder != NULL); - // Mock the frame builder object. When publish, the transcoder will be recreated. - srs_freep(frame_builder->audio_transcoder_); - frame_builder->audio_transcoder_ = mock_audio_transcoder; + // Verify the audio cache was created by the factory + EXPECT_TRUE(mock_factory->last_created_audio_cache_ != NULL); + EXPECT_EQ(frame_builder->audio_cache_, mock_factory->last_created_audio_cache_); + + // Verify the audio transcoder was created by the factory + EXPECT_TRUE(mock_factory->last_created_audio_transcoder_ != NULL); + EXPECT_EQ(frame_builder->audio_transcoder_, mock_factory->last_created_audio_transcoder_); } // Got a RTP audio packet. diff --git a/trunk/src/utest/srs_utest_workflow_rtmp2rtc.cpp b/trunk/src/utest/srs_utest_workflow_rtmp2rtc.cpp new file mode 100644 index 000000000..f982bac79 --- /dev/null +++ b/trunk/src/utest/srs_utest_workflow_rtmp2rtc.cpp @@ -0,0 +1,176 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2013-2025 Winlin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// This test is used to verify the basic workflow of the RTMP connection. +// It's finished with the help of AI, but each step is manually designed +// and verified. So this is not dominated by AI, but by humanbeing. +VOID TEST(BasicWorkflowRtmp2RtcTest, ManuallyVerifyTypicalScenario) +{ + srs_error_t err; + + // Mock all interface dependencies + SrsUniquePtr mock_config(new MockAppConfig()); + SrsUniquePtr mock_manager(new MockConnectionManager()); + SrsUniquePtr mock_sources(new MockLiveSourceManager()); + SrsUniquePtr mock_tokens(new MockStreamPublishTokenManager()); + SrsUniquePtr mock_stat(new MockAppStatistic()); + SrsUniquePtr mock_hooks(new MockHttpHooks()); + SrsUniquePtr mock_rtc_sources(new MockRtcSourceManager()); + SrsUniquePtr mock_srt_sources(new MockSrtSourceManager()); +#ifdef SRS_RTSP + SrsUniquePtr mock_rtsp_sources(new MockRtspSourceManager()); +#endif + MockRtmpServer *mock_rtmp_server = new MockRtmpServer(); + MockSecurity *mock_security = new MockSecurity(); + + mock_config->default_vhost_ = new SrsConfDirective(); + mock_config->default_vhost_->name_ = "vhost"; + mock_config->default_vhost_->args_.push_back("__defaultVhost__"); + + mock_config->mw_msgs_ = 0; // Handle each RTMP message, no merging write. + mock_config->mw_sleep_ = 0; // Handle each RTMP message, no merging write. + + mock_config->rtc_server_enabled_ = true; + mock_config->rtc_enabled_ = true; + mock_config->rtc_from_rtmp_ = true; + + mock_rtmp_server->set_request(SrsRtmpConnFMLEPublish, "192.168.1.100", "utest.ossrs.io", "utest", "livestream", "rtmp://127.0.0.1/utest", "rtmp", 1935, "127.0.0.1"); + + // Create SrsRtmpConn - it takes ownership of transport + ISrsRtmpTransport *transport = new MockRtmpTransport(); + SrsUniquePtr conn(new SrsRtmpConn(transport, "192.168.1.100", 1935)); + + conn->config_ = mock_config.get(); + conn->manager_ = mock_manager.get(); + conn->live_sources_ = mock_sources.get(); + conn->stream_publish_tokens_ = mock_tokens.get(); + conn->stat_ = mock_stat.get(); + conn->hooks_ = mock_hooks.get(); + conn->rtc_sources_ = mock_rtc_sources.get(); + conn->srt_sources_ = mock_srt_sources.get(); +#ifdef SRS_RTSP + conn->rtsp_sources_ = mock_rtsp_sources.get(); +#endif + srs_freep(conn->rtmp_); + conn->rtmp_ = mock_rtmp_server; + srs_freep(conn->security_); + conn->security_ = mock_security; + + // Start the RTMP connection. + MockLiveSource *mock_source = dynamic_cast(mock_sources->mock_source_.get()); + SrsRtmpBridge *bridge = NULL; + SrsRtcRtpBuilder *builder = NULL; + if (true) { + // Mock the client type to be a player + HELPER_EXPECT_SUCCESS(conn->start()); + + // Wait for coroutine to start. + srs_usleep(1 * SRS_UTIME_MILLISECONDS); + + // Verify the req should be parsed. + ISrsRequest *req = conn->info_->req_; + EXPECT_STREQ("192.168.1.100", req->ip_.c_str()); + EXPECT_STREQ("rtmp://127.0.0.1/utest", req->tcUrl_.c_str()); + EXPECT_STREQ("rtmp", req->schema_.c_str()); + EXPECT_STREQ("__defaultVhost__", req->vhost_.c_str()); + EXPECT_STREQ("127.0.0.1", req->host_.c_str()); + EXPECT_EQ(1935, req->port_); + EXPECT_STREQ("utest", req->app_.c_str()); + EXPECT_STREQ("livestream", req->stream_.c_str()); + EXPECT_EQ(0, req->duration_); + EXPECT_TRUE(NULL == req->args_); + EXPECT_STREQ("rtmp", req->protocol_.c_str()); + EXPECT_FALSE(conn->info_->edge_); + + // Bridge must be created. + bridge = dynamic_cast(mock_source->rtmp_bridge_); + EXPECT_TRUE(bridge != NULL); + builder = bridge->rtp_builder_; + EXPECT_TRUE(builder != NULL); + } + + // Create an RTMP audio message to feed consumer. + if (true) { + // Create a real AAC audio message with proper format. + // AAC audio format in RTMP/FLV: + // Byte 0: (SoundFormat << 4) | (SoundRate << 2) | (SoundSize << 1) | SoundType + // SoundFormat=10 (AAC), SoundRate=3 (44kHz), SoundSize=1 (16-bit), SoundType=1 (stereo) + // = 0xAF + // Byte 1: AACPacketType (0=sequence header, 1=raw data) + // Remaining bytes: AAC data + int payload_size = 10; + SrsRtmpCommonMessage *msg = new SrsRtmpCommonMessage(); + msg->header_.initialize_audio(payload_size, 0, 1); + msg->create_payload(payload_size); + + // Fill in AAC audio data + SrsBuffer stream(msg->payload(), payload_size); + // Audio format byte: AAC(10), 44kHz(3), 16-bit(1), stereo(1) = 0xAF + stream.write_1bytes(0xAF); + // AAC packet type: 1 = AAC raw data + stream.write_1bytes(0x01); + // AAC raw data (8 bytes of dummy audio data) + for (int i = 0; i < 8; i++) { + stream.write_1bytes(0x00); + } + + // Feed audio to rtmp server. + mock_rtmp_server->recv_msgs_.push_back(msg); + mock_rtmp_server->cond_->signal(); + + // Wait for consumer to process the message. + srs_usleep(1 * SRS_UTIME_MILLISECONDS); + + // Verify that the message is sent to the client. + EXPECT_EQ(1, mock_source->on_audio_count_); + } + + // Simulate client quit event, the receive thread will get this error. + if (true) { + mock_rtmp_server->recv_err_ = srs_error_new(ERROR_SOCKET_READ, "mock client quit"); + mock_rtmp_server->cond_->signal(); + + // Wait for coroutine to stop. + srs_usleep(1 * SRS_UTIME_MILLISECONDS); + } + + // Stop the RTMP connection. + conn->stop(); +} diff --git a/trunk/src/utest/srs_utest_workflow_rtmp2rtc.hpp b/trunk/src/utest/srs_utest_workflow_rtmp2rtc.hpp new file mode 100644 index 000000000..ded38cc05 --- /dev/null +++ b/trunk/src/utest/srs_utest_workflow_rtmp2rtc.hpp @@ -0,0 +1,32 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2013-2025 Winlin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SRS_UTEST_WORKFLOW_RTMP2RTC_HPP +#define SRS_UTEST_WORKFLOW_RTMP2RTC_HPP + +/* +#include +*/ +#include + +#endif diff --git a/trunk/src/utest/srs_utest_workflow_rtmp_conn.cpp b/trunk/src/utest/srs_utest_workflow_rtmp_conn.cpp index 0b64ef910..002c4f3d1 100644 --- a/trunk/src/utest/srs_utest_workflow_rtmp_conn.cpp +++ b/trunk/src/utest/srs_utest_workflow_rtmp_conn.cpp @@ -67,16 +67,7 @@ VOID TEST(BasicWorkflowRtmpConnTest, ManuallyVerifyForPublisher) mock_config->mw_msgs_ = 0; // Handle each RTMP message, no merging write. mock_config->mw_sleep_ = 0; // Handle each RTMP message, no merging write. - mock_rtmp_server->type_ = SrsRtmpConnFMLEPublish; - mock_rtmp_server->stream_ = "livestream"; - mock_rtmp_server->ip_ = "192.168.1.100"; - mock_rtmp_server->vhost_ = "utest.ossrs.io"; - mock_rtmp_server->app_ = "utest"; - mock_rtmp_server->stream_ = "livestream"; - mock_rtmp_server->tcUrl_ = "rtmp://127.0.0.1/utest"; - mock_rtmp_server->schema_ = "rtmp"; - mock_rtmp_server->port_ = 1935; - mock_rtmp_server->host_ = "127.0.0.1"; + mock_rtmp_server->set_request(SrsRtmpConnFMLEPublish, "192.168.1.100", "utest.ossrs.io", "utest", "livestream", "rtmp://127.0.0.1/utest", "rtmp", 1935, "127.0.0.1"); // Create SrsRtmpConn - it takes ownership of transport ISrsRtmpTransport *transport = new MockRtmpTransport(); diff --git a/trunk/src/utest/srs_utest_workflow_srt_conn.cpp b/trunk/src/utest/srs_utest_workflow_srt_conn.cpp index 75e919e3c..f6176cb7b 100644 --- a/trunk/src/utest/srs_utest_workflow_srt_conn.cpp +++ b/trunk/src/utest/srs_utest_workflow_srt_conn.cpp @@ -239,6 +239,7 @@ VOID TEST(BasicWorkflowSrtConnTest, ManuallyVerifyForPlayer) // Simulate client quit event, the receive thread will get this error. if (true) { mock_srt_conn->read_error_ = srs_error_new(ERROR_SOCKET_READ, "mock client quit"); + mock_srt_conn->cond_->signal(); // Wait for coroutine to stop. srs_usleep(1 * SRS_UTIME_MILLISECONDS);