From 1a96abc880dd1ef588cbff9d33242d0c5e4894be Mon Sep 17 00:00:00 2001 From: OSSRS-AI Date: Fri, 7 Nov 2025 22:32:26 -0500 Subject: [PATCH] AI: API: Add audio_frames and video_frames to HTTP API. v7.0.122 (#4559) (#4564) This PR adds separate audio and video frame counting to the HTTP API (`/api/v1/streams/`) for better stream observability. The API now reports three frame fields: - `frames` - Total frames (video + audio) - `video_frames` - Video frames/packets only - `audio_frames` - Audio frames/packets only This enhancement provides better visibility into stream composition and helps detect issues with CBR/VBR streams, audio/video sync problems, and codec-specific behavior. **Before:** ```json { "streams": [ { "frames": 0, // video frames. } ] } ``` **After:** ```json { "streams": [ { "frames": 6912, // video frames. "audio_frames": 5678, // audio frames. "video_frames": 1234, // video frames. } ] } ``` Frame Counting Strategy - All protocols report frames every N frames to balance accuracy and performance - Frames are counted at the protocol-specific message/packet level: - RTMP: Counts RTMP messages (video/audio) - WebRTC: Counts RTP packets (video/audio) - SRT: Counts MPEG-TS messages (H.264/HEVC/AAC) --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_recv_thread.cpp | 8 ++++ trunk/src/app/srs_app_recv_thread.hpp | 3 ++ trunk/src/app/srs_app_rtc_conn.cpp | 24 ++++++++---- trunk/src/app/srs_app_rtc_conn.hpp | 4 +- trunk/src/app/srs_app_rtmp_conn.cpp | 7 ++++ trunk/src/app/srs_app_srt_conn.cpp | 10 ----- trunk/src/app/srs_app_srt_source.cpp | 38 +++++++++++++++++++ trunk/src/app/srs_app_srt_source.hpp | 4 ++ trunk/src/app/srs_app_statistic.cpp | 27 +++++++++++--- trunk/src/app/srs_app_statistic.hpp | 10 ++++- trunk/src/core/srs_core_version7.hpp | 2 +- trunk/src/utest/srs_utest_ai14.cpp | 5 +++ trunk/src/utest/srs_utest_ai14.hpp | 1 + trunk/src/utest/srs_utest_ai15.cpp | 5 +++ trunk/src/utest/srs_utest_ai15.hpp | 1 + trunk/src/utest/srs_utest_ai16.cpp | 5 +++ trunk/src/utest/srs_utest_ai16.hpp | 1 + trunk/src/utest/srs_utest_ai17.cpp | 12 +++++- trunk/src/utest/srs_utest_ai17.hpp | 2 + trunk/src/utest/srs_utest_ai19.cpp | 45 +++++++++++++++++++++++ trunk/src/utest/srs_utest_ai19.hpp | 9 +++++ trunk/src/utest/srs_utest_ai21.cpp | 5 +++ trunk/src/utest/srs_utest_ai21.hpp | 1 + trunk/src/utest/srs_utest_ai22.cpp | 5 +++ trunk/src/utest/srs_utest_ai22.hpp | 1 + trunk/src/utest/srs_utest_manual_mock.cpp | 5 +++ trunk/src/utest/srs_utest_manual_mock.hpp | 1 + 28 files changed, 214 insertions(+), 28 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 1eaf3645d..4d32a25a5 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 7.0 Changelog +* v7.0, 2025-11-08, AI: API: Add audio_frames and video_frames to HTTP API. v7.0.122 (#4559) * v7.0, 2025-11-07, AI: WHIP: Return detailed HTTP error responses with proper status codes. v7.0.121 (#4502) * v7.0, 2025-11-07, AI: HLS: Support query string in hls_key_url for JWT tokens. v7.0.120 (#4426) * v7.0, 2025-11-07, AI: RTC: Support keep_original_ssrc to preserve SSRC and timestamps. v7.0.119 (#3850) diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index b874af664..8a11cc76c 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -299,6 +299,7 @@ SrsPublishRecvThread::SrsPublishRecvThread(ISrsRtmpServer *rtmp_sdk, ISrsRequest recv_error_ = srs_success; nb_msgs_ = 0; video_frames_ = 0; + audio_frames_ = 0; error_ = srs_cond_new(); req_ = _req; @@ -349,6 +350,11 @@ uint64_t SrsPublishRecvThread::nb_video_frames() return video_frames_; } +uint64_t SrsPublishRecvThread::nb_audio_frames() +{ + return audio_frames_; +} + srs_error_t SrsPublishRecvThread::error_code() { return srs_error_copy(recv_error_); @@ -396,6 +402,8 @@ srs_error_t SrsPublishRecvThread::consume(SrsRtmpCommonMessage *msg) if (msg->header_.is_video()) { video_frames_++; + } else if (msg->header_.is_audio()) { + audio_frames_++; } // log to show the time of recv thread. diff --git a/trunk/src/app/srs_app_recv_thread.hpp b/trunk/src/app/srs_app_recv_thread.hpp index 17b2ae061..5c7efd354 100644 --- a/trunk/src/app/srs_app_recv_thread.hpp +++ b/trunk/src/app/srs_app_recv_thread.hpp @@ -190,6 +190,8 @@ SRS_DECLARE_PRIVATE: // clang-format on int64_t nb_msgs_; // The video frames we got. uint64_t video_frames_; + // The audio frames we got. + uint64_t audio_frames_; // For mr(merged read), bool mr_; int mr_fd_; @@ -219,6 +221,7 @@ public: virtual srs_error_t wait(srs_utime_t tm); virtual int64_t nb_msgs(); virtual uint64_t nb_video_frames(); + virtual uint64_t nb_audio_frames(); virtual srs_error_t error_code(); virtual void set_cid(SrsContextId v); virtual SrsContextId get_cid(); diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 2f1854844..e68c373b7 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1211,7 +1211,7 @@ SrsRtcPublishStream::SrsRtcPublishStream(ISrsExecRtcAsyncTask *exec, ISrsExpire pt_to_drop_ = 0; nn_audio_frames_ = 0; - nn_rtp_pkts_ = 0; + nn_video_frames_ = 0; format_ = new SrsRtcFormat(); twcc_enabled_ = false; twcc_id_ = 0; @@ -1714,18 +1714,28 @@ void SrsRtcPublishStream::update_rtp_packet_stats(bool is_audio) srs_error_t err = srs_success; // Count RTP packets for statistics. - ++nn_rtp_pkts_; if (is_audio) { ++nn_audio_frames_; + } else { + ++nn_video_frames_; } - // Update the stat for frames, counting RTP packets as frames. - if (nn_rtp_pkts_ > 288) { - if ((err = stat_->on_video_frames(req_, (int)nn_rtp_pkts_)) != srs_success) { - srs_warn("RTC: stat frames err %s", srs_error_desc(err).c_str()); + // Update the stat for video frames, counting RTP packets as frames. + if (nn_video_frames_ > 288) { + if ((err = stat_->on_video_frames(req_, nn_video_frames_)) != srs_success) { + srs_warn("RTC: stat video frames err %s", srs_error_desc(err).c_str()); srs_freep(err); } - nn_rtp_pkts_ = 0; + nn_video_frames_ = 0; + } + + // Update the stat for audio frames periodically. + if (nn_audio_frames_ > 288) { + if ((err = stat_->on_audio_frames(req_, nn_audio_frames_)) != srs_success) { + srs_warn("RTC: stat audio frames err %s", srs_error_desc(err).c_str()); + srs_freep(err); + } + nn_audio_frames_ = 0; } } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 101abd8e3..31509ba22 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -542,8 +542,8 @@ SRS_DECLARE_PRIVATE: // clang-format on // clang-format off SRS_DECLARE_PRIVATE: // clang-format on SrsContextId cid_; - uint64_t nn_audio_frames_; - int nn_rtp_pkts_; + int nn_audio_frames_; + int nn_video_frames_; ISrsRtcFormat *format_; ISrsRtcPliWorker *pli_worker_; SrsErrorPithyPrint *twcc_epp_; diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index a221eeac1..807b81dec 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -988,6 +988,7 @@ srs_error_t SrsRtmpConn::do_publishing(SrsSharedPtr source, SrsPu int64_t nb_msgs = 0; uint64_t nb_frames = 0; + uint64_t nb_audio_frames = 0; while (true) { if ((err = trd_->pull()) != srs_success) { return srs_error_wrap(err, "rtmp: thread quit"); @@ -1029,6 +1030,12 @@ srs_error_t SrsRtmpConn::do_publishing(SrsSharedPtr source, SrsPu } nb_frames = rtrd->nb_video_frames(); + // Update the stat for audio frames. + if ((err = stat_->on_audio_frames(req, (int)(rtrd->nb_audio_frames() - nb_audio_frames))) != srs_success) { + return srs_error_wrap(err, "rtmp: stat audio frames"); + } + nb_audio_frames = rtrd->nb_audio_frames(); + // reportable if (pprint->can_print()) { kbps_->sample(); diff --git a/trunk/src/app/srs_app_srt_conn.cpp b/trunk/src/app/srs_app_srt_conn.cpp index 3888bd116..a2a958291 100644 --- a/trunk/src/app/srs_app_srt_conn.cpp +++ b/trunk/src/app/srs_app_srt_conn.cpp @@ -554,7 +554,6 @@ srs_error_t SrsMpegtsSrtConn::do_publishing() SrsUniquePtr pprint(SrsPithyPrint::create_srt_publish()); int nb_packets = 0; - int nb_frames = 0; // Max udp packet size equal to 1500. char buf[1500]; @@ -586,15 +585,6 @@ srs_error_t SrsMpegtsSrtConn::do_publishing() } ++nb_packets; - ++nb_frames; - - // Update the stat for frames every 100 packets, counting SRT packets as frames. - if (nb_frames > 288) { - if ((err = stat_->on_video_frames(req_, nb_frames)) != srs_success) { - return srs_error_wrap(err, "srt: stat frames"); - } - nb_frames = 0; - } if ((err = on_srt_packet(buf, nb)) != srs_success) { return srs_error_wrap(err, "srt: process packet"); diff --git a/trunk/src/app/srs_app_srt_source.cpp b/trunk/src/app/srs_app_srt_source.cpp index f34d9471a..752fd6076 100644 --- a/trunk/src/app/srs_app_srt_source.cpp +++ b/trunk/src/app/srs_app_srt_source.cpp @@ -941,6 +941,8 @@ SrsSrtFormat::SrsSrtFormat() format_ = new SrsRtmpFormat(); video_codec_reported_ = false; audio_codec_reported_ = false; + nn_video_frames_ = 0; + nn_audio_frames_ = 0; stat_ = _srs_stat; } @@ -988,12 +990,45 @@ srs_error_t SrsSrtFormat::on_srt_packet(SrsSrtPacket *pkt) return err; } +void SrsSrtFormat::update_ts_message_stats(bool is_audio) +{ + srs_error_t err = srs_success; + + // Count TS messages for statistics. + if (is_audio) { + ++nn_audio_frames_; + } else { + ++nn_video_frames_; + } + + // Update the stat for video frames, counting TS messages as frames. + if (nn_video_frames_ > 288) { + if ((err = stat_->on_video_frames(req_, nn_video_frames_)) != srs_success) { + srs_warn("SRT: stat video frames err %s", srs_error_desc(err).c_str()); + srs_freep(err); + } + nn_video_frames_ = 0; + } + + // Update the stat for audio frames periodically. + if (nn_audio_frames_ > 288) { + if ((err = stat_->on_audio_frames(req_, nn_audio_frames_)) != srs_success) { + srs_warn("SRT: stat audio frames err %s", srs_error_desc(err).c_str()); + srs_freep(err); + } + nn_audio_frames_ = 0; + } +} + srs_error_t SrsSrtFormat::on_ts_message(SrsTsMessage *msg) { srs_error_t err = srs_success; // Only parse video and audio messages if (msg->channel_->stream_ == SrsTsStreamVideoH264 || msg->channel_->stream_ == SrsTsStreamVideoHEVC) { + // Update statistics for video frames + update_ts_message_stats(false); + if (video_codec_reported_) { return err; } @@ -1016,6 +1051,9 @@ srs_error_t SrsSrtFormat::on_ts_message(SrsTsMessage *msg) c->width_, c->height_); } } else if (msg->channel_->stream_ == SrsTsStreamAudioAAC) { + // Update statistics for audio frames + update_ts_message_stats(true); + if (audio_codec_reported_) { return err; } diff --git a/trunk/src/app/srs_app_srt_source.hpp b/trunk/src/app/srs_app_srt_source.hpp index 48a33c916..76e2e3559 100644 --- a/trunk/src/app/srs_app_srt_source.hpp +++ b/trunk/src/app/srs_app_srt_source.hpp @@ -179,6 +179,7 @@ public: // clang-format off SRS_DECLARE_PRIVATE: // clang-format on + void update_ts_message_stats(bool is_audio); srs_error_t parse_video_codec(SrsTsMessage *msg); srs_error_t parse_audio_codec(SrsTsMessage *msg); @@ -191,6 +192,9 @@ SRS_DECLARE_PRIVATE: // clang-format on // Track whether we've already reported codec info to avoid duplicate updates bool video_codec_reported_; bool audio_codec_reported_; + // Frame counters for statistics reporting + int nn_video_frames_; + int nn_audio_frames_; }; // Collect and build SRT TS packet to AV frames. diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index 7873a1d61..1bbaae113 100644 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -97,13 +97,15 @@ SrsStatisticStream::SrsStatisticStream() kbps_ = new SrsKbps(); nb_clients_ = 0; - frames_ = new SrsPps(); + video_frames_ = new SrsPps(); + audio_frames_ = new SrsPps(); } SrsStatisticStream::~SrsStatisticStream() { srs_freep(kbps_); - srs_freep(frames_); + srs_freep(video_frames_); + srs_freep(audio_frames_); } srs_error_t SrsStatisticStream::dumps(SrsJsonObject *obj) @@ -118,7 +120,9 @@ srs_error_t SrsStatisticStream::dumps(SrsJsonObject *obj) obj->set("url", SrsJsonAny::str(url_.c_str())); obj->set("live_ms", SrsJsonAny::integer(srsu2ms(srs_time_now_cached()))); obj->set("clients", SrsJsonAny::integer(nb_clients_)); - obj->set("frames", SrsJsonAny::integer(frames_->sugar_)); + obj->set("frames", SrsJsonAny::integer(video_frames_->sugar_ + audio_frames_->sugar_)); + obj->set("audio_frames", SrsJsonAny::integer(audio_frames_->sugar_)); + obj->set("video_frames", SrsJsonAny::integer(video_frames_->sugar_)); obj->set("send_bytes", SrsJsonAny::integer(kbps_->get_send_bytes())); obj->set("recv_bytes", SrsJsonAny::integer(kbps_->get_recv_bytes())); @@ -395,7 +399,19 @@ srs_error_t SrsStatistic::on_video_frames(ISrsRequest *req, int nb_frames) SrsStatisticVhost *vhost = create_vhost(req); SrsStatisticStream *stream = create_stream(vhost, req); - stream->frames_->sugar_ += nb_frames; + stream->video_frames_->sugar_ += nb_frames; + + return err; +} + +srs_error_t SrsStatistic::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + srs_error_t err = srs_success; + + SrsStatisticVhost *vhost = create_vhost(req); + SrsStatisticStream *stream = create_stream(vhost, req); + + stream->audio_frames_->sugar_ += nb_frames; return err; } @@ -542,7 +558,8 @@ void SrsStatistic::kbps_sample() for (it = streams_.begin(); it != streams_.end(); it++) { SrsStatisticStream *stream = it->second; stream->kbps_->sample(); - stream->frames_->update(); + stream->video_frames_->update(); + stream->audio_frames_->update(); } } if (true) { diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp index 113c3bc32..a37df6af1 100644 --- a/trunk/src/app/srs_app_statistic.hpp +++ b/trunk/src/app/srs_app_statistic.hpp @@ -63,8 +63,10 @@ public: public: // The stream total kbps. SrsKbps *kbps_; - // The fps of stream. - SrsPps *frames_; + // The fps of stream (video frames/packets). + SrsPps *video_frames_; + // The fps of audio (audio frames/packets). + SrsPps *audio_frames_; public: bool has_video_; @@ -148,6 +150,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta) = 0; virtual void kbps_sample() = 0; virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames) = 0; + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames) = 0; public: // Get the server id, used to identify the server. @@ -240,6 +243,9 @@ public: // When got videos, update the frames. // We only stat the total number of video frames. virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + // When got audios, update the audio frames. + // We only stat the total number of audio frames. + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); // When publish stream. // @param req the request object of publish connection. // @param publisher_id The id of publish connection. diff --git a/trunk/src/core/srs_core_version7.hpp b/trunk/src/core/srs_core_version7.hpp index c9a8684cc..4685600de 100644 --- a/trunk/src/core/srs_core_version7.hpp +++ b/trunk/src/core/srs_core_version7.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 0 -#define VERSION_REVISION 121 +#define VERSION_REVISION 122 #endif \ No newline at end of file diff --git a/trunk/src/utest/srs_utest_ai14.cpp b/trunk/src/utest/srs_utest_ai14.cpp index d65690de3..969cf46df 100644 --- a/trunk/src/utest/srs_utest_ai14.cpp +++ b/trunk/src/utest/srs_utest_ai14.cpp @@ -1963,6 +1963,11 @@ srs_error_t MockStatisticForOriginHub::on_video_frames(ISrsRequest *req, int nb_ return srs_success; } +srs_error_t MockStatisticForOriginHub::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForOriginHub::server_id() { return "mock_server_id"; diff --git a/trunk/src/utest/srs_utest_ai14.hpp b/trunk/src/utest/srs_utest_ai14.hpp index 73fd5c685..53fb30d96 100644 --- a/trunk/src/utest/srs_utest_ai14.hpp +++ b/trunk/src/utest/srs_utest_ai14.hpp @@ -211,6 +211,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_ai15.cpp b/trunk/src/utest/srs_utest_ai15.cpp index d463f24f3..f7c6926f2 100644 --- a/trunk/src/utest/srs_utest_ai15.cpp +++ b/trunk/src/utest/srs_utest_ai15.cpp @@ -809,6 +809,11 @@ srs_error_t MockStatisticForResampleKbps::on_video_frames(ISrsRequest *req, int return srs_success; } +srs_error_t MockStatisticForResampleKbps::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForResampleKbps::server_id() { return "mock_server_id"; diff --git a/trunk/src/utest/srs_utest_ai15.hpp b/trunk/src/utest/srs_utest_ai15.hpp index 191aa6659..926722616 100644 --- a/trunk/src/utest/srs_utest_ai15.hpp +++ b/trunk/src/utest/srs_utest_ai15.hpp @@ -260,6 +260,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_ai16.cpp b/trunk/src/utest/srs_utest_ai16.cpp index 97ff408b9..18dce5e3c 100644 --- a/trunk/src/utest/srs_utest_ai16.cpp +++ b/trunk/src/utest/srs_utest_ai16.cpp @@ -827,6 +827,11 @@ srs_error_t MockStatisticForLiveStream::on_video_frames(ISrsRequest *req, int nb return srs_success; } +srs_error_t MockStatisticForLiveStream::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForLiveStream::server_id() { return "mock_server_id"; diff --git a/trunk/src/utest/srs_utest_ai16.hpp b/trunk/src/utest/srs_utest_ai16.hpp index 8a682b1ee..81189fedd 100644 --- a/trunk/src/utest/srs_utest_ai16.hpp +++ b/trunk/src/utest/srs_utest_ai16.hpp @@ -168,6 +168,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_ai17.cpp b/trunk/src/utest/srs_utest_ai17.cpp index 5937bf5bd..fd0f96112 100644 --- a/trunk/src/utest/srs_utest_ai17.cpp +++ b/trunk/src/utest/srs_utest_ai17.cpp @@ -1707,6 +1707,11 @@ srs_error_t MockStatisticForRtcApi::on_video_frames(ISrsRequest *req, int nb_fra return srs_success; } +srs_error_t MockStatisticForRtcApi::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForRtcApi::server_id() { return server_id_; @@ -3189,7 +3194,7 @@ VOID TEST(StatisticTest, StreamMediaInfo) // Verify frame count was accumulated correctly stream = stat->find_stream_by_url(req->get_stream_url()); EXPECT_TRUE(stream != NULL); - EXPECT_EQ(55, stream->frames_->sugar_); + EXPECT_EQ(55, stream->video_frames_->sugar_); } // Test SrsStatistic audio sample rate handling for AAC 48000 Hz @@ -3806,6 +3811,11 @@ srs_error_t MockStatisticForHooks::on_video_frames(ISrsRequest *req, int nb_fram return srs_success; } +srs_error_t MockStatisticForHooks::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForHooks::server_id() { return server_id_; diff --git a/trunk/src/utest/srs_utest_ai17.hpp b/trunk/src/utest/srs_utest_ai17.hpp index 0964bdab4..034ca36ce 100644 --- a/trunk/src/utest/srs_utest_ai17.hpp +++ b/trunk/src/utest/srs_utest_ai17.hpp @@ -317,6 +317,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); @@ -566,6 +567,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_ai19.cpp b/trunk/src/utest/srs_utest_ai19.cpp index a3d348224..50ebd1b15 100644 --- a/trunk/src/utest/srs_utest_ai19.cpp +++ b/trunk/src/utest/srs_utest_ai19.cpp @@ -2234,6 +2234,16 @@ void MockStatisticForHttpxConn::kbps_sample() { } +srs_error_t MockStatisticForHttpxConn::on_video_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + +srs_error_t MockStatisticForHttpxConn::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + srs_error_t MockStatisticForHttpxConn::dumps_vhosts(SrsJsonArray *arr) { return srs_success; @@ -2254,6 +2264,41 @@ srs_error_t MockStatisticForHttpxConn::dumps_metrics(int64_t &send_bytes, int64_ return srs_success; } +std::string MockStatisticForHttpxConn::server_id() +{ + return "mock_server_id"; +} + +std::string MockStatisticForHttpxConn::service_id() +{ + return "mock_service_id"; +} + +std::string MockStatisticForHttpxConn::service_pid() +{ + return "mock_pid"; +} + +SrsStatisticVhost *MockStatisticForHttpxConn::find_vhost_by_id(std::string vid) +{ + return NULL; +} + +SrsStatisticStream *MockStatisticForHttpxConn::find_stream(std::string sid) +{ + return NULL; +} + +SrsStatisticStream *MockStatisticForHttpxConn::find_stream_by_url(std::string url) +{ + return NULL; +} + +SrsStatisticClient *MockStatisticForHttpxConn::find_client(std::string client_id) +{ + return NULL; +} + void MockStatisticForHttpxConn::reset() { on_disconnect_called_ = false; diff --git a/trunk/src/utest/srs_utest_ai19.hpp b/trunk/src/utest/srs_utest_ai19.hpp index a4fbc736c..ee01f67e1 100644 --- a/trunk/src/utest/srs_utest_ai19.hpp +++ b/trunk/src/utest/srs_utest_ai19.hpp @@ -502,10 +502,19 @@ public: virtual void on_stream_close(ISrsRequest *req); virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); + virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual srs_error_t dumps_vhosts(SrsJsonArray *arr); virtual srs_error_t dumps_streams(SrsJsonArray *arr, int start, int count); virtual srs_error_t dumps_clients(SrsJsonArray *arr, int start, int count); virtual srs_error_t dumps_metrics(int64_t &send_bytes, int64_t &recv_bytes, int64_t &nstreams, int64_t &nclients, int64_t &total_nclients, int64_t &nerrs); + virtual std::string server_id(); + virtual std::string service_id(); + virtual std::string service_pid(); + virtual SrsStatisticVhost *find_vhost_by_id(std::string vid); + virtual SrsStatisticStream *find_stream(std::string sid); + virtual SrsStatisticStream *find_stream_by_url(std::string url); + virtual SrsStatisticClient *find_client(std::string client_id); void reset(); }; diff --git a/trunk/src/utest/srs_utest_ai21.cpp b/trunk/src/utest/srs_utest_ai21.cpp index e05e45bbb..8e4c8b538 100644 --- a/trunk/src/utest/srs_utest_ai21.cpp +++ b/trunk/src/utest/srs_utest_ai21.cpp @@ -1257,6 +1257,11 @@ srs_error_t MockSrtStatistic::on_video_frames(ISrsRequest *req, int nb_frames) return srs_success; } +srs_error_t MockSrtStatistic::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockSrtStatistic::server_id() { return "mock_server_id"; diff --git a/trunk/src/utest/srs_utest_ai21.hpp b/trunk/src/utest/srs_utest_ai21.hpp index 1ba6eace0..017d3b202 100644 --- a/trunk/src/utest/srs_utest_ai21.hpp +++ b/trunk/src/utest/srs_utest_ai21.hpp @@ -57,6 +57,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_ai22.cpp b/trunk/src/utest/srs_utest_ai22.cpp index cf7f8f07a..6e2563795 100644 --- a/trunk/src/utest/srs_utest_ai22.cpp +++ b/trunk/src/utest/srs_utest_ai22.cpp @@ -1482,6 +1482,11 @@ srs_error_t MockStatisticForRtspPlayStream::on_video_frames(ISrsRequest *req, in return srs_success; } +srs_error_t MockStatisticForRtspPlayStream::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockStatisticForRtspPlayStream::server_id() { return "mock_server_id"; diff --git a/trunk/src/utest/srs_utest_ai22.hpp b/trunk/src/utest/srs_utest_ai22.hpp index ef9fdc948..1bd2bd38b 100644 --- a/trunk/src/utest/srs_utest_ai22.hpp +++ b/trunk/src/utest/srs_utest_ai22.hpp @@ -340,6 +340,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid(); diff --git a/trunk/src/utest/srs_utest_manual_mock.cpp b/trunk/src/utest/srs_utest_manual_mock.cpp index 2d3a077d4..664794879 100644 --- a/trunk/src/utest/srs_utest_manual_mock.cpp +++ b/trunk/src/utest/srs_utest_manual_mock.cpp @@ -438,6 +438,11 @@ srs_error_t MockAppStatistic::on_video_frames(ISrsRequest *req, int nb_frames) return srs_success; } +srs_error_t MockAppStatistic::on_audio_frames(ISrsRequest *req, int nb_frames) +{ + return srs_success; +} + std::string MockAppStatistic::server_id() { return ""; diff --git a/trunk/src/utest/srs_utest_manual_mock.hpp b/trunk/src/utest/srs_utest_manual_mock.hpp index bd8b34107..ea53599da 100644 --- a/trunk/src/utest/srs_utest_manual_mock.hpp +++ b/trunk/src/utest/srs_utest_manual_mock.hpp @@ -215,6 +215,7 @@ public: virtual void kbps_add_delta(std::string id, ISrsKbpsDelta *delta); virtual void kbps_sample(); virtual srs_error_t on_video_frames(ISrsRequest *req, int nb_frames); + virtual srs_error_t on_audio_frames(ISrsRequest *req, int nb_frames); virtual std::string server_id(); virtual std::string service_id(); virtual std::string service_pid();