generated from zhangwei/Matrixai
115 lines
3.0 KiB
C++
115 lines
3.0 KiB
C++
// PHZ
|
|
// 2018-6-8
|
|
|
|
#ifndef XOP_RTP_CONNECTION_H
|
|
#define XOP_RTP_CONNECTION_H
|
|
|
|
#include <cstdint>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <memory>
|
|
#include <random>
|
|
#include "rtp.h"
|
|
#include "media.h"
|
|
#include "Socket.h"
|
|
#include "TcpConnection.h"
|
|
|
|
namespace xop
|
|
{
|
|
|
|
class RtspConnection;
|
|
|
|
class RtpConnection
|
|
{
|
|
public:
|
|
RtpConnection(std::weak_ptr<TcpConnection> rtsp_connection);
|
|
virtual ~RtpConnection();
|
|
|
|
void SetClockRate(MediaChannelId channel_id, uint32_t clock_rate)
|
|
{ media_channel_info_[channel_id].clock_rate = clock_rate; }
|
|
|
|
void SetPayloadType(MediaChannelId channel_id, uint32_t payload)
|
|
{ media_channel_info_[channel_id].rtp_header.payload = payload; }
|
|
|
|
bool SetupRtpOverTcp(MediaChannelId channel_id, uint16_t rtp_channel, uint16_t rtcp_channel);
|
|
bool SetupRtpOverUdp(MediaChannelId channel_id, uint16_t rtp_port, uint16_t rtcp_port);
|
|
bool SetupRtpOverMulticast(MediaChannelId channel_id, std::string ip, uint16_t port);
|
|
|
|
uint32_t GetRtpSessionId() const
|
|
{ return (uint32_t)((size_t)(this)); }
|
|
|
|
uint16_t GetRtpPort(MediaChannelId channel_id) const
|
|
{ return local_rtp_port_[channel_id]; }
|
|
|
|
uint16_t GetRtcpPort(MediaChannelId channel_id) const
|
|
{ return local_rtcp_port_[channel_id]; }
|
|
|
|
SOCKET GetRtpSocket(MediaChannelId channel_id) const
|
|
{ return rtpfd_[channel_id]; }
|
|
|
|
SOCKET GetRtcpSocket(MediaChannelId channel_id) const
|
|
{ return rtcpfd_[channel_id]; }
|
|
|
|
std::string GetIp()
|
|
{ return rtsp_ip_; }
|
|
|
|
uint16_t GetPort()
|
|
{ return rtsp_port_; }
|
|
|
|
bool IsMulticast() const
|
|
{ return is_multicast_; }
|
|
|
|
bool IsSetup(MediaChannelId channel_id) const
|
|
{ return media_channel_info_[channel_id].is_setup; }
|
|
|
|
std::string GetMulticastIp(MediaChannelId channel_id) const;
|
|
|
|
void Play();
|
|
void Record();
|
|
void Teardown();
|
|
|
|
std::string GetRtpInfo(const std::string& rtsp_url);
|
|
int SendRtpPacket(MediaChannelId channel_id, RtpPacket pkt);
|
|
|
|
bool IsClosed() const
|
|
{ return is_closed_; }
|
|
|
|
int GetId() const;
|
|
|
|
bool HasKeyFrame() const
|
|
{ return has_key_frame_; }
|
|
|
|
private:
|
|
friend class RtspConnection;
|
|
friend class MediaSession;
|
|
void SetFrameType(uint8_t frameType = 0);
|
|
void SetRtpHeader(MediaChannelId channel_id, RtpPacket pkt);
|
|
int SendRtpOverTcp(MediaChannelId channel_id, RtpPacket pkt);
|
|
int SendRtpOverUdp(MediaChannelId channel_id, RtpPacket pkt);
|
|
|
|
std::weak_ptr<TcpConnection> rtsp_connection_;
|
|
std::string rtsp_ip_;
|
|
uint16_t rtsp_port_;
|
|
|
|
TransportMode transport_mode_;
|
|
bool is_multicast_ = false;
|
|
|
|
bool is_closed_ = false;
|
|
bool has_key_frame_ = false;
|
|
|
|
uint8_t frame_type_ = 0;
|
|
uint16_t local_rtp_port_[MAX_MEDIA_CHANNEL];
|
|
uint16_t local_rtcp_port_[MAX_MEDIA_CHANNEL];
|
|
SOCKET rtpfd_[MAX_MEDIA_CHANNEL];
|
|
SOCKET rtcpfd_[MAX_MEDIA_CHANNEL];
|
|
|
|
struct sockaddr_in peer_addr_;
|
|
struct sockaddr_in peer_rtp_addr_[MAX_MEDIA_CHANNEL];
|
|
struct sockaddr_in peer_rtcp_sddr_[MAX_MEDIA_CHANNEL];
|
|
MediaChannelInfo media_channel_info_[MAX_MEDIA_CHANNEL];
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|