From 2231b6be7b3e2bee2f7b9ddbb0b009788af628c8 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 22 Jan 2016 10:26:03 +0200 Subject: [PATCH] Revert "Improve CSeq calculation" --- libwds/common/message_handler.cpp | 2 ++ libwds/common/message_handler.h | 2 ++ libwds/public/peer.h | 9 --------- libwds/sink/init_state.cpp | 24 +++++++----------------- libwds/sink/init_state.h | 3 --- libwds/sink/session_state.cpp | 4 ++-- libwds/sink/sink.cpp | 6 +++--- libwds/sink/streaming_state.cpp | 6 +++--- libwds/source/cap_negotiation_state.cpp | 4 ++-- libwds/source/init_state.cpp | 2 +- libwds/source/session_state.cpp | 2 +- libwds/source/source.cpp | 10 ++++++---- mirac_network/mirac-broker.cpp | 9 --------- mirac_network/mirac-broker.hpp | 1 - 14 files changed, 29 insertions(+), 55 deletions(-) diff --git a/libwds/common/message_handler.cpp b/libwds/common/message_handler.cpp index 8a9d04a..e2498a4 100644 --- a/libwds/common/message_handler.cpp +++ b/libwds/common/message_handler.cpp @@ -30,6 +30,8 @@ using rtsp::Message; using rtsp::Request; using rtsp::Reply; +int MessageHandler::send_cseq_ = 1; + bool MessageHandler::HandleTimeoutEvent(uint timer_id) const { return false; } diff --git a/libwds/common/message_handler.h b/libwds/common/message_handler.h index bcb9dbe..3675e7c 100644 --- a/libwds/common/message_handler.h +++ b/libwds/common/message_handler.h @@ -98,6 +98,8 @@ class MessageHandler : public std::enable_shared_from_this { Peer::Delegate* sender_; MediaManager* manager_; Observer* observer_; + // States should be handled within one thread. It's OK to have this static. + static int send_cseq_; }; class MessageSequenceHandler : public MessageHandler, diff --git a/libwds/public/peer.h b/libwds/public/peer.h index 7018b03..d9c3e8f 100644 --- a/libwds/public/peer.h +++ b/libwds/public/peer.h @@ -73,15 +73,6 @@ class Peer { */ virtual void ReleaseTimer(uint timer_id) = 0; - /** - * Returns the sequence number for the following RTSP request-response pair - * @param initial_peer_cseq is provided for the WFD sink implementation at - * the first method's call during the WFD session and it contains the - * initial request sequence number obtained from the WFD source (the initial - * sequence numbers of connected peers may not be identical). - */ - virtual int GetNextCSeq(int* initial_peer_cseq = nullptr) const = 0; - protected: virtual ~Delegate() {} }; diff --git a/libwds/sink/init_state.cpp b/libwds/sink/init_state.cpp index a7c263e..8fd692b 100644 --- a/libwds/sink/init_state.cpp +++ b/libwds/sink/init_state.cpp @@ -32,12 +32,10 @@ using rtsp::Reply; class M1Handler final : public MessageReceiver { public: - M1Handler(const InitParams& init_params, int& source_init_cseq) - : MessageReceiver(init_params), - source_init_cseq_(source_init_cseq) { + M1Handler(const InitParams& init_params) + : MessageReceiver(init_params) { } virtual std::unique_ptr HandleMessage(Message* message) override { - source_init_cseq_ = message->cseq(); auto reply = std::unique_ptr(new Reply(rtsp::STATUS_OK)); std::vector supported_methods; supported_methods.push_back(rtsp::ORG_WFA_WFD_1_0); @@ -46,21 +44,15 @@ class M1Handler final : public MessageReceiver { reply->header().set_supported_methods(supported_methods); return std::move(reply); } - - private: - int& source_init_cseq_; }; class M2Handler final : public SequencedMessageSender { public: - M2Handler(const InitParams& init_params, int& source_init_cseq) - : SequencedMessageSender(init_params), - source_init_cseq_(source_init_cseq) { - } + using SequencedMessageSender::SequencedMessageSender; private: virtual std::unique_ptr CreateMessage() override { auto options = new rtsp::Options("*"); - options->header().set_cseq(sender_->GetNextCSeq(&source_init_cseq_)); + options->header().set_cseq(send_cseq_++); options->header().set_require_wfd_support(true); return std::unique_ptr(options); } @@ -81,14 +73,12 @@ class M2Handler final : public SequencedMessageSender { return false; } - int& source_init_cseq_; }; InitState::InitState(const InitParams& init_params) - : MessageSequenceHandler(init_params), - source_init_cseq_(0) { - AddSequencedHandler(make_ptr(new M1Handler(init_params, source_init_cseq_))); - AddSequencedHandler(make_ptr(new M2Handler(init_params, source_init_cseq_))); + : MessageSequenceHandler(init_params) { + AddSequencedHandler(make_ptr(new M1Handler(init_params))); + AddSequencedHandler(make_ptr(new M2Handler(init_params))); } } // sink diff --git a/libwds/sink/init_state.h b/libwds/sink/init_state.h index 52e4be1..e818149 100644 --- a/libwds/sink/init_state.h +++ b/libwds/sink/init_state.h @@ -32,9 +32,6 @@ namespace sink { class InitState : public MessageSequenceHandler { public: InitState(const InitParams& init_params); - - private: - int source_init_cseq_; }; } // sink diff --git a/libwds/sink/session_state.cpp b/libwds/sink/session_state.cpp index dd70a14..247d25d 100644 --- a/libwds/sink/session_state.cpp +++ b/libwds/sink/session_state.cpp @@ -63,7 +63,7 @@ std::unique_ptr M6Handler::CreateMessage() { // we assume here that there is no coupled secondary sink transport->set_client_port(ToSinkMediaManager(manager_)->GetLocalRtpPorts().first); setup->header().set_transport(transport); - setup->header().set_cseq(sender_->GetNextCSeq()); + setup->header().set_cseq(send_cseq_++); setup->header().set_require_wfd_support(true); return std::unique_ptr(setup); @@ -88,7 +88,7 @@ class M7Handler final : public SequencedMessageSender { std::unique_ptr CreateMessage() override { rtsp::Play* play = new rtsp::Play(ToSinkMediaManager(manager_)->GetPresentationUrl()); play->header().set_session(manager_->GetSessionId()); - play->header().set_cseq(sender_->GetNextCSeq()); + play->header().set_cseq(send_cseq_++); play->header().set_require_wfd_support(true); return std::unique_ptr(play); diff --git a/libwds/sink/sink.cpp b/libwds/sink/sink.cpp index e7ad00b..5b02e1d 100644 --- a/libwds/sink/sink.cpp +++ b/libwds/sink/sink.cpp @@ -93,6 +93,8 @@ class SinkStateMachine : public MessageSequenceHandler { SinkStateMachine(Peer::Delegate* sender, SinkMediaManager* mng) : SinkStateMachine({sender, mng, this}) {} + int GetNextCSeq() { return send_cseq_++; } + private: uint keep_alive_timer_; }; @@ -126,13 +128,11 @@ class SinkImpl final : public Sink, public RTSPInputHandler, public MessageHandl void ResetAndTeardownMedia(); std::shared_ptr state_machine_; - Delegate* delegate_; SinkMediaManager* manager_; }; SinkImpl::SinkImpl(Delegate* delegate, SinkMediaManager* mng) : state_machine_(new SinkStateMachine({delegate, mng, this})), - delegate_(delegate), manager_(mng) { } @@ -152,7 +152,7 @@ template std::unique_ptr SinkImpl::CreateCommand() { auto message = new WfdMessage(manager_->GetPresentationUrl()); message->header().set_session(manager_->GetSessionId()); - message->header().set_cseq(delegate_->GetNextCSeq()); + message->header().set_cseq(state_machine_->GetNextCSeq()); message->set_id(id); return std::unique_ptr(message); } diff --git a/libwds/sink/streaming_state.cpp b/libwds/sink/streaming_state.cpp index 9f124e0..4047414 100644 --- a/libwds/sink/streaming_state.cpp +++ b/libwds/sink/streaming_state.cpp @@ -72,7 +72,7 @@ class M7Sender final : public SequencedMessageSender { std::unique_ptr CreateMessage() override { rtsp::Play* play = new rtsp::Play(ToSinkMediaManager(manager_)->GetPresentationUrl()); play->header().set_session(manager_->GetSessionId()); - play->header().set_cseq (sender_->GetNextCSeq()); + play->header().set_cseq (send_cseq_++); return std::unique_ptr(play); } @@ -101,7 +101,7 @@ class M8Sender final : public SequencedMessageSender { std::unique_ptr CreateMessage() override { rtsp::Teardown* teardown = new rtsp::Teardown(ToSinkMediaManager(manager_)->GetPresentationUrl()); teardown->header().set_session(manager_->GetSessionId()); - teardown->header().set_cseq(sender_->GetNextCSeq()); + teardown->header().set_cseq(send_cseq_++); return std::unique_ptr(teardown); } @@ -128,7 +128,7 @@ class M9Sender final : public SequencedMessageSender { std::unique_ptr CreateMessage() override { rtsp::Pause* pause = new rtsp::Pause(ToSinkMediaManager(manager_)->GetPresentationUrl()); pause->header().set_session(manager_->GetSessionId()); - pause->header().set_cseq(sender_->GetNextCSeq()); + pause->header().set_cseq(send_cseq_++); return std::unique_ptr(pause); } diff --git a/libwds/source/cap_negotiation_state.cpp b/libwds/source/cap_negotiation_state.cpp index cf8ac73..df4b1fc 100644 --- a/libwds/source/cap_negotiation_state.cpp +++ b/libwds/source/cap_negotiation_state.cpp @@ -66,7 +66,7 @@ class M4Handler final : public SequencedMessageSender { std::unique_ptr M3Handler::CreateMessage() { GetParameter* get_param = new GetParameter("rtsp://localhost/wfd1.0"); - get_param->header().set_cseq(sender_->GetNextCSeq()); + get_param->header().set_cseq(send_cseq_++); std::vector props; SessionType media_type = ToSourceMediaManager(manager_)->GetSessionType(); @@ -133,7 +133,7 @@ bool M3Handler::HandleReply(Reply* reply) { std::unique_ptr M4Handler::CreateMessage() { SetParameter* set_param = new SetParameter("rtsp://localhost/wfd1.0"); - set_param->header().set_cseq(sender_->GetNextCSeq()); + set_param->header().set_cseq(send_cseq_++); SourceMediaManager* source_manager = ToSourceMediaManager(manager_); const auto& ports = source_manager->GetSinkRtpPorts(); auto payload = new rtsp::PropertyMapPayload(); diff --git a/libwds/source/init_state.cpp b/libwds/source/init_state.cpp index b5bb287..6a51122 100644 --- a/libwds/source/init_state.cpp +++ b/libwds/source/init_state.cpp @@ -38,7 +38,7 @@ class M1Handler final : public SequencedMessageSender { private: std::unique_ptr CreateMessage() override { rtsp::Options* options = new rtsp::Options("*"); - options->header().set_cseq(sender_->GetNextCSeq()); + options->header().set_cseq(send_cseq_++); options->header().set_require_wfd_support(true); return std::unique_ptr(options); } diff --git a/libwds/source/session_state.cpp b/libwds/source/session_state.cpp index 0cdb722..fe5da64 100644 --- a/libwds/source/session_state.cpp +++ b/libwds/source/session_state.cpp @@ -43,7 +43,7 @@ class M5Handler final : public SequencedMessageSender { private: std::unique_ptr CreateMessage() override { rtsp::SetParameter* set_param = new rtsp::SetParameter("rtsp://localhost/wfd1.0"); - set_param->header().set_cseq(sender_->GetNextCSeq()); + set_param->header().set_cseq(send_cseq_++); auto payload = new rtsp::PropertyMapPayload(); payload->AddProperty( std::shared_ptr(new rtsp::TriggerMethod(rtsp::TriggerMethod::SETUP))); diff --git a/libwds/source/source.cpp b/libwds/source/source.cpp index de9254f..593d7a3 100644 --- a/libwds/source/source.cpp +++ b/libwds/source/source.cpp @@ -96,6 +96,8 @@ class SourceStateMachine : public MessageSequenceHandler { AddSequencedHandler(make_ptr(new source::SessionState(init_params, timer_id, m16_sender))); AddSequencedHandler(make_ptr(new source::StreamingState(init_params, m16_sender))); } + + int GetNextCSeq() { return send_cseq_++; } }; class SourceImpl final : public Source, public RTSPInputHandler, public MessageHandler::Observer { @@ -164,7 +166,7 @@ void SourceImpl::SendKeepAlive() { delegate_->ReleaseTimer(keep_alive_timer_); auto get_param = std::unique_ptr( new rtsp::GetParameter("rtsp://localhost/wfd1.0")); - get_param->header().set_cseq(delegate_->GetNextCSeq()); + get_param->header().set_cseq(state_machine_->GetNextCSeq()); get_param->set_id(Request::M16); assert(state_machine_->CanSend(get_param.get())); @@ -191,7 +193,7 @@ std::unique_ptr CreateM5(int send_cseq, rtsp::TriggerMethod::Method met } bool SourceImpl::Teardown() { - auto m5 = CreateM5(delegate_->GetNextCSeq(), + auto m5 = CreateM5(state_machine_->GetNextCSeq(), rtsp::TriggerMethod::TEARDOWN); if (!state_machine_->CanSend(m5.get())) @@ -201,7 +203,7 @@ bool SourceImpl::Teardown() { } bool SourceImpl::Play() { - auto m5 = CreateM5(delegate_->GetNextCSeq(), + auto m5 = CreateM5(state_machine_->GetNextCSeq(), rtsp::TriggerMethod::PLAY); if (!state_machine_->CanSend(m5.get())) @@ -211,7 +213,7 @@ bool SourceImpl::Play() { } bool SourceImpl::Pause() { - auto m5 = CreateM5(delegate_->GetNextCSeq(), + auto m5 = CreateM5(state_machine_->GetNextCSeq(), rtsp::TriggerMethod::PAUSE); if (!state_machine_->CanSend(m5.get())) diff --git a/mirac_network/mirac-broker.cpp b/mirac_network/mirac-broker.cpp index 382494e..7fa91f2 100644 --- a/mirac_network/mirac-broker.cpp +++ b/mirac_network/mirac-broker.cpp @@ -276,12 +276,3 @@ void MiracBroker::ReleaseTimer(uint timer_id) { } } -int MiracBroker::GetNextCSeq(int* initial_peer_cseq) const { - static int send_cseq_; - ++send_cseq_; - if (initial_peer_cseq && send_cseq_ == *initial_peer_cseq) - send_cseq_ *= 2; - - return send_cseq_; -} - diff --git a/mirac_network/mirac-broker.hpp b/mirac_network/mirac-broker.hpp index b0f3294..50dc1a9 100644 --- a/mirac_network/mirac-broker.hpp +++ b/mirac_network/mirac-broker.hpp @@ -53,7 +53,6 @@ class MiracBroker : public wds::Peer::Delegate std::string GetLocalIPAddress() const override; uint CreateTimer(int seconds) override; void ReleaseTimer(uint timer_id) override; - int GetNextCSeq(int* initial_peer_cseq = nullptr) const override; virtual void got_message(const std::string& data) {} virtual void on_connected() {};