aes67-daemon/daemon/rtsp_client.hpp
Andrea Bondavalli e05253d444 Additional set of changes to complete support for mDNS sources update via RTSP ANNOUNCE method as described by Ravenna.
The following changes enable support for RTCP client persistent connections used to receive RTSP server ANNOUNCE messages. These in turn update the remote sources in the Browser.
- added new process static method to RtspClient class to receive and update source SDP files via DESCRIBE and ANNOUNCE methods. This method can handle persistent connections with the RTSP server and triggers an observer callback when a source SDP file is received or updated. A map is used to track all active RTSP clients.
- added new stop and stop_all static methods to RtspClient class respectively to stop a specific RTCP client and to stop all clients.
- modified MDNSClient class to call RtspClient::process method when a new Ravenna service is added and the RtspClient::stop method when a service is removed. The RtspClient::stop_all method is called when the daemon terminates.
- modified Browser class to receive and handle remote RTSP sources SDP file add and change notifications. This class receives the updates via the RtspClient observer callback
- updated documentation
2020-06-02 10:56:44 -07:00

69 lines
2.2 KiB
C++

//
// rtsp_include.hpp
//
// Copyright (c) 2019 2020 Andrea Bondavalli. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#ifndef _RTSP_CLIENT_HPP_
#define _RTSP_CLIENT_HPP_
#include <mutex>
#include <boost/asio/ip/tcp.hpp>
struct RtspSource {
std::string id;
std::string source;
std::string address;
std::string sdp;
};
class RtspClient {
public:
constexpr static uint16_t max_body_length = 4096; // byte
constexpr static uint16_t client_timeout = 10; // sec
constexpr static const char dft_port[] = "554";
using Observer = std::function<void(
const std::string& name,
const std::string& domain,
const RtspSource& source)>;
static std::pair<bool, RtspSource> process(
Observer callback,
const std::string& name,
const std::string& domain,
const std::string& path,
const std::string& address,
const std::string& port = dft_port,
bool wait_for_updates = true);
static void stop(const std::string& name, const std::string& domain);
static void stop_all();
static std::pair<bool, RtspSource> describe(
const std::string& path,
const std::string& address,
const std::string& port = dft_port);
inline static std::atomic<uint16_t> g_seq_number{0};
inline static std::map<std::pair<std::string /*name*/, std::string /*domain*/>,
boost::asio::ip::tcp::iostream* /*stream*/> g_active_clients;
inline static std::mutex g_mutex;
};
#endif