From 30d8b2209f0718ddaaae8a9921e5eac7f073eb23 Mon Sep 17 00:00:00 2001 From: xiaozhihong Date: Mon, 2 Mar 2020 22:47:40 +0800 Subject: [PATCH] parse sdp --- trunk/src/app/srs_app_http_api.cpp | 31 +++++++++++++- trunk/src/app/srs_app_rtc_conn.cpp | 69 +++++++++++++++++++++++++++++- trunk/src/app/srs_app_rtc_conn.hpp | 30 ++++++++++--- 3 files changed, 122 insertions(+), 8 deletions(-) diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index fc54303b4..9273f4bd4 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -47,6 +47,7 @@ using namespace std; #include #include #include +#include string test_sdp = "v=0\\r\\n" @@ -871,7 +872,35 @@ srs_error_t SrsGoApiSdp::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* if (sid >= 0 && (stream = stat->find_stream(sid)) == NULL) { return srs_api_response_code(w, r, ERROR_RTMP_STREAM_NOT_FOUND); } - + + string req_json; + r->body_read_all(req_json); + srs_trace("req_json=%s", req_json.c_str()); + + SrsJsonAny* json = SrsJsonAny::loads(req_json); + SrsJsonObject* req_obj = json->to_object(); + + SrsJsonAny* remote_sdp_obj = req_obj->get_property("sdp"); + SrsJsonAny* app_obj = req_obj->get_property("app"); + SrsJsonAny* stream_name_obj = req_obj->get_property("stream"); + + if (remote_sdp_obj == NULL || app_obj == NULL || stream_name_obj == NULL) { + return srs_api_response_code(w, r, SRS_CONSTS_HTTP_BadRequest); + } + + string remote_sdp = remote_sdp_obj->to_str(); + string app = app_obj->to_str(); + string stream_name = stream_name_obj->to_str(); + + srs_trace("remote_sdp=%s", remote_sdp.c_str()); + srs_trace("app=%s, stream=%s", app.c_str(), stream_name.c_str()); + + SrsSdp srs_sdp; + err = srs_sdp.parse(remote_sdp); + if (err != srs_success) { + return srs_api_response_code(w, r, SRS_CONSTS_HTTP_BadRequest); + } + SrsJsonObject* obj = SrsJsonAny::object(); SrsAutoFree(SrsJsonObject, obj); diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 4f858da0a..93fca7f8c 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -25,6 +25,8 @@ using namespace std; +#include + #include #include #include @@ -41,12 +43,75 @@ static bool is_dtls(const char* data, const int size) { return data != NULL && size > 0 && (data[0] >= 20 && data[0] <= 64); } -SrsSDP::SrsSDP() +SrsSdpMediaInfo::SrsSdpMediaInfo() +{ +} + +SrsSdpMediaInfo::~SrsSdpMediaInfo() +{ +} + +SrsSdp::SrsSdp() +{ +} + +SrsSdp::~SrsSdp() { } -SrsSDP::~SrsSDP() +srs_error_t SrsSdp::parse(const string& sdp) { + srs_error_t err = srs_success; + + if (sdp.size() < 2 || sdp[0] != 'v' || sdp[1] != '=') { + return srs_error_wrap(err, "invalid sdp"); + } + + string line; + istringstream is(sdp); + while (getline(is, line)) { + srs_trace("line=%s", line.c_str()); + + if (line.size() < 2 || line[1] != '=') { + return srs_error_wrap(err, "invalid sdp line=%s", line.c_str()); + } + + switch (line[1]) { + case 'v' :{ + break; + } + case 'o' :{ + break; + } + case 's' :{ + break; + } + case 't' :{ + break; + } + case 'c' :{ + break; + } + case 'a' :{ + if (parse_attr(line) != srs_success) { + return srs_error_wrap(err, "parse sdp line=%s failed", line.c_str()); + } + break; + } + case 'm' :{ + break; + } + } + } + + return err; +} + +srs_error_t SrsSdp::parse_attr(const string& line) +{ + srs_error_t err = srs_success; + + return err; } SrsRtcSession::SrsRtcSession() diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index b5ba40235..df370d585 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -28,16 +28,36 @@ #include #include +#include class SrsServer; class SrsStunPacket; -class SrsSDP +class SrsSdpMediaInfo { private: public: - SrsSDP(); - virtual ~SrsSDP(); + SrsSdpMediaInfo(); + virtual ~SrsSdpMediaInfo(); +}; + +class SrsSdp +{ +private: + std::string sdp; + int version; + std::string ice_ufrag; + std::string ice_pwd; + std::string fingerprint; + std::string setup; + std::vector media_infos; +public: + SrsSdp(); + virtual ~SrsSdp(); + + srs_error_t parse(const std::string& sdp); +private: + srs_error_t parse_attr(const std::string& line); }; enum SrsRtcSessionStateType @@ -53,8 +73,8 @@ class SrsRtcSession { public: private: - SrsSDP peer_sdp; - SrsSDP offer_sdp; + SrsSdp peer_sdp; + SrsSdp offer_sdp; SrsRtcSessionStateType session_state; public: SrsRtcSession();