00001 #include <sys/socket.h>
00002 #include <netinet/in.h>
00003 #include <arpa/inet.h>
00004
00005 #include "streamer.h"
00006 #include "helpers.h"
00007
00008 #include <iostream>
00009
00010 using namespace std;
00011
00012
00013 #define RTSP_DEBUG
00014
00015 #ifdef RTSP_DEBUG
00016 #define D(a) a
00017 #else
00018 #define D(a)
00019 #endif
00020
00021 Streamer *Streamer::_streamer = NULL;
00022
00023 Streamer::Streamer(const map<string, string> &_args) {
00024 if(_streamer != NULL)
00025 throw("can't make an another instance of streamer");
00026 else
00027 _streamer = this;
00028 session = new Session();
00029 args = _args;
00030 session->process_audio = false;
00031 if(opt_present("a")) {
00032 session->process_audio = true;
00033 int channels = 0;
00034 int sample_rate = 0;
00035 string _sample_rate, _channels;
00036 String::split(args["a"], '/', _sample_rate, _channels);
00037 if(_sample_rate != "")
00038 sample_rate = atol(_sample_rate.c_str());
00039 if(_channels != "")
00040 channels = atol(_channels.c_str());
00041 audio = new Audio(true, sample_rate, channels);
00042 } else {
00043 audio = new Audio(false);
00044 }
00045 video = new Video();
00046 float fps = 0;
00047 if(opt_present("f")) {
00048 fps = atof(args["f"].c_str());
00049 if(fps < 0.1)
00050 fps = 0;
00051 }
00052 D(cout << "use fps: " << fps << endl;)
00053 video->fps(fps);
00054 }
00055
00056 Streamer::~Streamer(void) {
00057 delete video;
00058 delete audio;
00059 }
00060
00061 void Streamer::f_handler(void *ptr, RTSP_Server *rtsp_server, RTSP_Server::event event) {
00062 Streamer *__this = (Streamer *)ptr;
00063 __this->handler(rtsp_server, event);
00064 }
00065
00066 void Streamer::handler(RTSP_Server *rtsp_server, RTSP_Server::event event) {
00067 static bool _play = false;
00068 if(session->rtp_out.multicast)
00069 return;
00070 D( cerr << "event: ";)
00071 switch(event) {
00072 case RTSP_Server::PLAY:
00073 if(_play) {
00074 D(cerr << ".......................... already play....." << endl;)
00075 break;
00076 }
00077 D( cerr << "PLAY";)
00078
00079
00080
00081
00082
00083
00084
00085
00086 video->Start(session->rtp_out.ip, session->rtp_out.port_video);
00087 audio->Start(session->rtp_out.ip, session->rtp_out.port_audio);
00088
00089 _play = true;
00090 break;
00091 case RTSP_Server::PAUSE:
00092 D( cerr << "PAUSE";)
00093 video->Stop();
00094 audio->Stop();
00095 _play = false;
00096 break;
00097 case RTSP_Server::TEARDOWN:
00098 D( cerr << "TEARDOWN";)
00099 video->Stop();
00100 audio->Stop();
00101 _play = false;
00102 break;
00103 default:
00104 D( cerr << "unknown == " << event;)
00105 break;
00106 }
00107 D( cerr << endl;)
00108 }
00109
00110 void Streamer::Main(void) {
00111 string def_mcast = "232.1.1.1";
00112 int def_port = 20020;
00113 string def_ttl = "2";
00114
00115 in_addr_t a_min = inet_addr("224.0.0.0");
00116 in_addr_t a_max = inet_addr("239.255.255.255");
00117 if(a_min > a_max) {
00118 in_addr_t a = a_min;
00119 a_min = a_max;
00120 a_max = a;
00121 }
00122 int port_min = 256;
00123
00124
00125 session->rtp_out.ip = def_mcast;
00126
00127 session->rtp_out.port_video = def_port;
00128 session->rtp_out.port_audio = def_port + 2;
00129 session->rtp_out.ttl = def_ttl;
00130
00131 if(opt_present("m")) {
00132 session->rtp_out.multicast = true;
00133 string m_addr, m_port;
00134 String::split(args["m"], ':', m_addr, m_port);
00135 if(m_addr != "") {
00136
00137 string mcast = m_addr;
00138 in_addr_t a = inet_addr(mcast.c_str());
00139 if(a >= a_min && a <= a_max)
00140 session->rtp_out.ip = mcast;
00141 }
00142 if(m_port != "") {
00143 int p = atoi(m_port.c_str());
00144 if(p >= port_min) {
00145 session->rtp_out.port_video = p;
00146 session->rtp_out.port_audio = p + 2;
00147
00148 }
00149 }
00150 } else
00151 session->rtp_out.multicast = false;
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 if(opt_present("t")) {
00167 int t = atoi(args["t"].c_str());
00168 if(t < 1)
00169 session->rtp_out.ttl = "1";
00170 else
00171 session->rtp_out.ttl = args["t"];
00172 }
00173
00174 session->video.width = video->width();
00175 session->video.height = video->height();
00176 session->video.type = video->ptype();
00177 session->video.fps = video->fps();
00178 cout << "audio: " << audio->present() << endl;
00179 if(audio->present()) {
00180 session->audio.sample_rate = audio->sample_rate();
00181 session->audio.channels = audio->channels();
00182 session->audio.type = audio->ptype();
00183 } else
00184 session->audio.type = -1;
00185 if(session->rtp_out.multicast) {
00186 video->Start(session->rtp_out.ip, session->rtp_out.port_video);
00187 audio->Start(session->rtp_out.ip, session->rtp_out.port_audio);
00188
00189
00190
00191 }
00192
00193 cout << "start server" << endl;
00194 rtsp_server = new RTSP_Server(Streamer::f_handler, (void *)this, session);
00195 rtsp_server->main();
00196 }