Blame view

trunk/src/app/srs_app_rtsp.hpp 5.6 KB
1 2 3
/*
The MIT License (MIT)
4
Copyright (c) 2013-2015 SRS(simple-rtmp-server)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#ifndef SRS_APP_RTSP_HPP
#define SRS_APP_RTSP_HPP

/*
#include <srs_app_rtsp.hpp>
*/

#include <srs_core.hpp>

#include <string>
34
#include <vector>
35
#include <map>
36 37 38

#include <srs_app_st.hpp>
#include <srs_app_thread.hpp>
39
#include <srs_app_listener.hpp>
40 41 42

#ifdef SRS_AUTO_STREAM_CASTER
43
class SrsStSocket;
44
class SrsRtspConn;
45 46
class SrsRtspStack;
class SrsRtspCaster;
47
class SrsConfDirective;
48
class SrsRtpPacket;
49 50 51 52 53
class SrsRequest;
class SrsStSocket;
class SrsRtmpClient;
class SrsRawH264Stream;
class SrsRawAacStream;
54
struct SrsRawAacStreamCodec;
55 56 57
class SrsSharedPtrMessage;
class SrsCodecSample;
class SrsSimpleBuffer;
58
class SrsPithyPrint;
59 60

/**
61
* a rtp connection which transport a stream.
62
*/
63
class SrsRtpConn: public ISrsUdpHandler
64
{
65
private:
66
    SrsPithyPrint* pprint;
67 68
    SrsUdpListener* listener;
    SrsRtspConn* rtsp;
69 70
    SrsRtpPacket* cache;
    int stream_id;
71
    int _port;
72
public:
73
    SrsRtpConn(SrsRtspConn* r, int p, int sid);
74
    virtual ~SrsRtpConn();
75
public:
76 77 78 79 80
    virtual int port();
    virtual int listen();
// interface ISrsUdpHandler
public:
    virtual int on_udp_packet(sockaddr_in* from, char* buf, int nb_buf);
81 82 83
};

/**
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
* audio is group by frames.
*/
struct SrsRtspAudioCache
{
    int64_t dts;
    SrsCodecSample* audio_samples;
    SrsSimpleBuffer* payload;

    SrsRtspAudioCache();
    virtual ~SrsRtspAudioCache();
};

/**
* the time jitter correct for rtsp.
*/
class SrsRtspJitter
{
private:
    int64_t previous_timestamp;
    int64_t pts;
    int delta;
public:
    SrsRtspJitter();
    virtual ~SrsRtspJitter();
public:
    virtual int64_t timestamp();
    virtual int correct(int64_t& ts);
};

/**
114
* the rtsp connection serve the fd.
115
*/
116
class SrsRtspConn : public ISrsOneCycleThreadHandler
117 118
{
private:
119 120 121
    std::string output_template;
    std::string rtsp_tcUrl;
    std::string rtsp_stream;
122 123
private:
    std::string session;
124
    // video stream.
125 126
    int video_id;
    std::string video_codec;
127 128
    SrsRtpConn* video_rtp;
    // audio stream.
129 130 131 132
    int audio_id;
    std::string audio_codec;
    int audio_sample_rate;
    int audio_channel;
133
    SrsRtpConn* audio_rtp;
134
private:
135 136 137 138
    st_netfd_t stfd;
    SrsStSocket* skt;
    SrsRtspStack* rtsp;
    SrsRtspCaster* caster;
139
    SrsOneCycleThread* trd;
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
private:
    SrsRequest* req;
    SrsStSocket* io;
    SrsRtmpClient* client;
    SrsRtspJitter* vjitter;
    SrsRtspJitter* ajitter;
    int stream_id;
private:
    SrsRawH264Stream* avc;
    std::string h264_sps;
    std::string h264_pps;
private:
    SrsRawAacStream* aac;
    SrsRawAacStreamCodec* acodec;
    std::string aac_specific_config;
    SrsRtspAudioCache* acache;
156
public:
157
    SrsRtspConn(SrsRtspCaster* c, st_netfd_t fd, std::string o);
158
    virtual ~SrsRtspConn();
159 160 161 162
public:
    virtual int serve();
private:
    virtual int do_cycle();
163 164
// internal methods
public:
165
    virtual int on_rtp_packet(SrsRtpPacket* pkt, int stream_id);
166
// interface ISrsOneCycleThreadHandler
167 168 169
public:
    virtual int cycle();
    virtual void on_thread_stop();
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
private:
    virtual int on_rtp_video(SrsRtpPacket* pkt, int64_t dts, int64_t pts);
    virtual int on_rtp_audio(SrsRtpPacket* pkt, int64_t dts);
    virtual int kickoff_audio_cache(SrsRtpPacket* pkt, int64_t dts);
private:
    virtual int write_sequence_header();
    virtual int write_h264_sps_pps(u_int32_t dts, u_int32_t pts);
    virtual int write_h264_ipb_frame(char* frame, int frame_size, u_int32_t dts, u_int32_t pts);
    virtual int write_audio_raw_frame(char* frame, int frame_size, SrsRawAacStreamCodec* codec, u_int32_t dts);
    virtual int rtmp_write_packet(char type, u_int32_t timestamp, char* data, int size);
private:
    // connect to rtmp output url. 
    // @remark ignore when not connected, reconnect when disconnected.
    virtual int connect();
    virtual int connect_app(std::string ep_server, std::string ep_port);
185 186 187 188 189
};

/**
* the caster for rtsp.
*/
190
class SrsRtspCaster : public ISrsTcpHandler
191 192 193
{
private:
    std::string output;
194 195
    int local_port_min;
    int local_port_max;
196 197
    // key: port, value: whether used.
    std::map<int, bool> used_ports;
198
private:
199 200 201 202 203
    std::vector<SrsRtspConn*> clients;
public:
    SrsRtspCaster(SrsConfDirective* c);
    virtual ~SrsRtspCaster();
public:
204 205 206 207 208 209 210 211 212 213 214 215
    /**
    * alloc a rtp port from local ports pool.
    * @param pport output the rtp port.
    */
    virtual int alloc_port(int* pport);
    /**
    * free the alloced rtp port.
    */
    virtual void free_port(int lpmin, int lpmax);
// interface ISrsTcpHandler
public:
    virtual int on_tcp_client(st_netfd_t stfd);
216 217 218
// internal methods.
public:
    virtual void remove(SrsRtspConn* conn);
219 220 221 222 223
};

#endif

#endif