2015-01-24 08:27:30 +00:00
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
|
|
|
Copyright (c) 2013-2015 winlin
|
|
|
|
|
|
|
|
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_MPEGTS_UDP_HPP
|
|
|
|
#define SRS_APP_MPEGTS_UDP_HPP
|
|
|
|
|
|
|
|
/*
|
|
|
|
#include <srs_app_mpegts_udp.hpp>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <srs_core.hpp>
|
|
|
|
|
2015-01-31 11:46:55 +00:00
|
|
|
#ifdef SRS_AUTO_STREAM_CASTER
|
|
|
|
|
2015-03-13 04:53:01 +00:00
|
|
|
struct sockaddr_in;
|
2015-01-24 08:59:36 +00:00
|
|
|
#include <string>
|
2015-01-31 13:16:42 +00:00
|
|
|
#include <map>
|
2015-01-24 08:27:30 +00:00
|
|
|
|
2015-01-27 06:28:59 +00:00
|
|
|
class SrsStream;
|
2015-01-27 08:25:46 +00:00
|
|
|
class SrsTsContext;
|
2015-01-24 08:27:30 +00:00
|
|
|
class SrsConfDirective;
|
2015-01-29 15:54:04 +00:00
|
|
|
class SrsSimpleBuffer;
|
2015-01-31 11:46:55 +00:00
|
|
|
class SrsRtmpClient;
|
|
|
|
class SrsStSocket;
|
|
|
|
class SrsRequest;
|
|
|
|
class SrsRawH264Stream;
|
2015-01-31 13:16:42 +00:00
|
|
|
class SrsSharedPtrMessage;
|
2015-01-31 15:20:00 +00:00
|
|
|
class SrsRawAacStream;
|
2015-03-13 04:53:01 +00:00
|
|
|
struct SrsRawAacStreamCodec;
|
2015-02-19 10:56:21 +00:00
|
|
|
class SrsPithyPrint;
|
2015-01-24 08:27:30 +00:00
|
|
|
|
2015-01-31 11:46:55 +00:00
|
|
|
#include <srs_app_st.hpp>
|
2015-01-29 14:58:02 +00:00
|
|
|
#include <srs_kernel_ts.hpp>
|
2015-02-17 08:28:28 +00:00
|
|
|
#include <srs_app_listener.hpp>
|
2015-01-29 16:04:20 +00:00
|
|
|
|
2015-01-31 13:16:42 +00:00
|
|
|
/**
|
|
|
|
* the queue for mpegts over udp to send packets.
|
|
|
|
* for the aac in mpegts contains many flv packets in a pes packet,
|
|
|
|
* we must recalc the timestamp.
|
|
|
|
*/
|
|
|
|
class SrsMpegtsQueue
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
// key: dts, value: msg.
|
|
|
|
std::map<int64_t, SrsSharedPtrMessage*> msgs;
|
|
|
|
int nb_audios;
|
|
|
|
int nb_videos;
|
|
|
|
public:
|
|
|
|
SrsMpegtsQueue();
|
|
|
|
virtual ~SrsMpegtsQueue();
|
|
|
|
public:
|
|
|
|
virtual int push(SrsSharedPtrMessage* msg);
|
|
|
|
virtual SrsSharedPtrMessage* dequeue();
|
|
|
|
};
|
|
|
|
|
2015-01-29 16:04:20 +00:00
|
|
|
/**
|
|
|
|
* the mpegts over udp stream caster.
|
|
|
|
*/
|
|
|
|
class SrsMpegtsOverUdp : virtual public ISrsTsHandler
|
|
|
|
, virtual public ISrsUdpHandler
|
|
|
|
{
|
2015-01-25 02:54:25 +00:00
|
|
|
private:
|
2015-01-29 16:04:20 +00:00
|
|
|
SrsStream* stream;
|
|
|
|
SrsTsContext* context;
|
|
|
|
SrsSimpleBuffer* buffer;
|
|
|
|
std::string output;
|
2015-01-31 11:46:55 +00:00
|
|
|
private:
|
|
|
|
SrsRequest* req;
|
|
|
|
st_netfd_t stfd;
|
|
|
|
SrsStSocket* io;
|
|
|
|
SrsRtmpClient* client;
|
|
|
|
int stream_id;
|
|
|
|
private:
|
|
|
|
SrsRawH264Stream* avc;
|
|
|
|
std::string h264_sps;
|
|
|
|
bool h264_sps_changed;
|
|
|
|
std::string h264_pps;
|
|
|
|
bool h264_pps_changed;
|
|
|
|
bool h264_sps_pps_sent;
|
2015-01-31 15:20:00 +00:00
|
|
|
private:
|
|
|
|
SrsRawAacStream* aac;
|
|
|
|
std::string aac_specific_config;
|
|
|
|
private:
|
2015-01-31 13:16:42 +00:00
|
|
|
SrsMpegtsQueue* queue;
|
2015-02-19 10:56:21 +00:00
|
|
|
SrsPithyPrint* pprint;
|
2015-01-29 16:04:20 +00:00
|
|
|
public:
|
|
|
|
SrsMpegtsOverUdp(SrsConfDirective* c);
|
|
|
|
virtual ~SrsMpegtsOverUdp();
|
|
|
|
// interface ISrsUdpHandler
|
|
|
|
public:
|
|
|
|
virtual int on_udp_packet(sockaddr_in* from, char* buf, int nb_buf);
|
2015-03-10 10:07:43 +00:00
|
|
|
private:
|
|
|
|
virtual int on_udp_bytes(std::string host, int port, char* buf, int nb_buf);
|
2015-01-29 14:58:02 +00:00
|
|
|
// interface ISrsTsHandler
|
|
|
|
public:
|
|
|
|
virtual int on_ts_message(SrsTsMessage* msg);
|
2015-01-31 11:46:55 +00:00
|
|
|
private:
|
|
|
|
virtual int on_ts_video(SrsTsMessage* msg, SrsStream* avs);
|
|
|
|
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);
|
2015-01-31 15:20:00 +00:00
|
|
|
virtual int on_ts_audio(SrsTsMessage* msg, SrsStream* avs);
|
|
|
|
virtual int write_audio_raw_frame(char* frame, int frame_size, SrsRawAacStreamCodec* codec, u_int32_t dts);
|
|
|
|
private:
|
2015-01-31 11:46:55 +00:00
|
|
|
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);
|
|
|
|
// close the connected io and rtmp to ready to be re-connect.
|
|
|
|
virtual void close();
|
2015-01-24 08:27:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|