apps/astreamer/streamer.cpp

Go to the documentation of this file.
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 //#undef RTSP_DEBUG
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 //              video->Start(session->rtp_out.ip, 20020);
00079 //              audio->Start(session->rtp_out.ip, 20020 + 2);
00080 /*
00081                 video->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()));
00082                 audio->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()) + 2);
00083 */
00084 //              video->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()) - 2);
00085 //              audio->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()) + 0);
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         // make session parameters from session description...
00125         session->rtp_out.ip = def_mcast;
00126 //      session->rtp_out.port = def_port;
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 //                      string mcast = args["a"];
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 //                              session->rtp_out.port = m_port;
00148                         }
00149                 }
00150         } else
00151                 session->rtp_out.multicast = false;
00152 
00153 /*
00154         if(opt_present("a")) {
00155                 string mcast = args["a"];
00156                 in_addr_t a = inet_addr(mcast.c_str());
00157                 if(a >= a_min && a <= a_max)
00158                         session->rtp_out.ip = mcast;
00159         }
00160         if(opt_present("p")) {
00161                 int p = atoi(args["p"].c_str());
00162                 if(p >= port_min)
00163                         session->rtp_out.port = args["p"];
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 //              video->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()));
00189 //              audio->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()) + 2);
00190 //              audio->Start(session->rtp_out.ip, atol(session->rtp_out.port.c_str()) + 2);
00191         }
00192         // start RTSP server
00193 cout << "start server" << endl;
00194         rtsp_server = new RTSP_Server(Streamer::f_handler, (void *)this, session);
00195         rtsp_server->main();
00196 }

Generated on Thu Aug 7 16:18:58 2008 for elphel by  doxygen 1.5.1