From b1b6d4bf685cca2be6428ce90c89df4452262ef4 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Tue, 22 Jul 2014 16:16:43 +0200 Subject: [PATCH] Changed constructor call convention of video_rxtx --- src/main.cpp | 86 +++++++++++++++++++++----------- src/video_rxtx.cpp | 12 ++--- src/video_rxtx.h | 28 +++++------ src/video_rxtx/h264_rtp.cpp | 17 +++---- src/video_rxtx/h264_rtp.h | 6 +-- src/video_rxtx/ihdtv.cpp | 34 ++++--------- src/video_rxtx/ihdtv.h | 5 +- src/video_rxtx/rtp.cpp | 33 ++++++------ src/video_rxtx/rtp.h | 6 +-- src/video_rxtx/sage.cpp | 12 ++--- src/video_rxtx/sage.h | 4 +- src/video_rxtx/ultragrid_rtp.cpp | 25 ++++------ src/video_rxtx/ultragrid_rtp.h | 9 ++-- 13 files changed, 130 insertions(+), 147 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 443a1b44a..50889a307 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -963,39 +963,65 @@ int main(int argc, char *argv[]) } try { - if (video_protocol == IHDTV) { - struct vidcap *capture_device = NULL; - struct display *display_device = NULL; - if (rxtx_mode & MODE_SENDER) - capture_device = uv->capture_device; - if (rxtx_mode & MODE_RECEIVER) - display_device = uv->display_device; - uv->state_video_rxtx = new ihdtv_video_rxtx(&root_mod, video_exporter, - requested_compression, capture_device, - display_device, requested_mtu, - argc, argv); - }else if (video_protocol == H264_STD) { - rtps_types_t avType; - if(strcmp("none", vidcap_params_get_driver(vidcap_params_head)) != 0 && (strcmp("none",audio_send) != 0)) avType = av; //AVStream - else if((strcmp("none",audio_send) != 0)) avType = audio; //AStream - else if(strcmp("none", vidcap_params_get_driver(vidcap_params_head))) avType = video; //VStream - else printf("[RTSP SERVER CHECK] no stream type... check capture devices input...\n"); + map params; + + // common + params["parent"].ptr = &root_mod; + params["exporter"].ptr = video_exporter; + params["compression"].ptr = (void *) requested_compression; + + // RTSP + params["rtsp_port"].i = rtsp_port; + params["audio_codec"].l = get_audio_codec(audio_codec); + params["audio_sammple_rate"].i = compressed_audio_sample_rate; + params["audio_bps"].i = 2; + + // iHDTV + params["argc"].i = argc; + params["argv"].ptr = argv; + params["capture_device"].ptr = NULL; + params["display_device"].ptr = NULL; + if (rxtx_mode & MODE_SENDER) + params["capture_device"].ptr = uv->capture_device; + if (rxtx_mode & MODE_RECEIVER) + params["display_device"].ptr = uv->display_device; + + //RTP + params["mtu"].i = requested_mtu; + params["receiver"].ptr = (void *) requested_receiver; + params["rx_port"].i = recv_port_number; + params["tx_port"].i = send_port_number; + params["use_ipv6"].b = ipv6; + params["mcast_if"].ptr = (void *) requested_mcast_if; + params["mtu"].i = requested_mtu; + params["fec"].ptr = (void *) requested_video_fec; + params["encryption"].ptr = (void *) requested_encryption; + params["packet_rate"].i = packet_rate; + + // UltraGrid RTP + params["postprocess"].ptr = (void *) postprocess; + params["decoder_mode"].l = decoder_mode; + params["display_device"].ptr = uv->display_device; + + // SAGE + params["sage_opts"].ptr = sage_opts; + + if (video_protocol == IHDTV) { + uv->state_video_rxtx = new ihdtv_video_rxtx(params); + }else if (video_protocol == H264_STD) { + rtps_types_t avType; + if(strcmp("none", vidcap_params_get_driver(vidcap_params_head)) != 0 && (strcmp("none",audio_send) != 0)) avType = av; //AVStream + else if((strcmp("none",audio_send) != 0)) avType = audio; //AStream + else if(strcmp("none", vidcap_params_get_driver(vidcap_params_head))) avType = video; //VStream + else printf("[RTSP SERVER CHECK] no stream type... check capture devices input...\n"); + + params["avType"].l = avType; + uv->state_video_rxtx = new h264_rtp_video_rxtx(params); - uv->state_video_rxtx = new h264_rtp_video_rxtx(&root_mod, video_exporter, - requested_compression, requested_encryption, - requested_receiver, recv_port_number, send_port_number, audio_rx_port, audio_tx_port, - ipv6, requested_mcast_if, requested_video_fec, requested_mtu, - packet_rate, avType, get_audio_codec(audio_codec), compressed_audio_sample_rate, audio_capture_channels, 2 /*bps*/, rtsp_port); } else if (video_protocol == ULTRAGRID_RTP) { - uv->state_video_rxtx = new ultragrid_rtp_video_rxtx(&root_mod, video_exporter, - requested_compression, requested_encryption, - requested_receiver, recv_port_number, - send_port_number, ipv6, - requested_mcast_if, requested_video_fec, requested_mtu, - packet_rate, decoder_mode, postprocess, uv->display_device); + uv->state_video_rxtx = new ultragrid_rtp_video_rxtx(params); } else { // SAGE - uv->state_video_rxtx = new sage_video_rxtx(&root_mod, video_exporter, - requested_compression, requested_receiver, sage_opts); + uv->state_video_rxtx = new sage_video_rxtx(params); } if(rxtx_mode & MODE_RECEIVER) { diff --git a/src/video_rxtx.cpp b/src/video_rxtx.cpp index 017102a18..c00cd1487 100644 --- a/src/video_rxtx.cpp +++ b/src/video_rxtx.cpp @@ -73,22 +73,22 @@ using namespace std; -video_rxtx::video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression): m_paused(false), m_compression(NULL), - m_video_exporter(video_exporter) { +video_rxtx::video_rxtx(map const ¶ms): m_paused(false), m_compression(NULL), + m_video_exporter(static_cast(params.at("exporter").ptr)) { module_init_default(&m_sender_mod); m_sender_mod.cls = MODULE_CLASS_SENDER; - module_register(&m_sender_mod, parent); + module_register(&m_sender_mod, static_cast(params.at("parent").ptr)); module_init_default(&m_receiver_mod); m_receiver_mod.cls = MODULE_CLASS_RECEIVER; - module_register(&m_receiver_mod, parent); + module_register(&m_receiver_mod, static_cast(params.at("parent").ptr)); m_compression = nullptr; try { - int ret = compress_init(&m_sender_mod, requested_compression, &m_compression); + int ret = compress_init(&m_sender_mod, static_cast(params.at("compression").ptr), + &m_compression); if(ret != 0) { if(ret < 0) { throw string("Error initializing compression."); diff --git a/src/video_rxtx.h b/src/video_rxtx.h index ea163862b..f470fda09 100644 --- a/src/video_rxtx.h +++ b/src/video_rxtx.h @@ -38,6 +38,9 @@ #ifndef VIDEO_RXTX_H_ #define VIDEO_RXTX_H_ +#include +#include + #include "module.h" struct display; @@ -53,26 +56,23 @@ enum rxtx_protocol { H264_STD }; -struct rx_tx { - enum rxtx_protocol protocol; - const char *name; - void (*send)(void *, struct video_frame *); - void (*done)(void *); - void *(*receiver_thread)(void *); +class video_rxtx; + +union param_u { + void * ptr; + int i; + long l; + bool b; }; -extern struct rx_tx h264_rtp; - -struct h264_rtp_state { - int connections_count; - struct rtp **network_devices; - struct tx *tx; +struct video_rxtx_info { + const char *name; + class video_rxtx *(*create)(std::map const ¶ms); }; class video_rxtx { public: - video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression); + video_rxtx(std::map const &); virtual ~video_rxtx(); void send(struct video_frame *); static const char *get_name(enum rxtx_protocol); diff --git a/src/video_rxtx/h264_rtp.cpp b/src/video_rxtx/h264_rtp.cpp index 6e4201d56..1f20eea59 100644 --- a/src/video_rxtx/h264_rtp.cpp +++ b/src/video_rxtx/h264_rtp.cpp @@ -50,17 +50,16 @@ #include "video_rxtx/h264_rtp.h" #include "video.h" -h264_rtp_video_rxtx::h264_rtp_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, int a_rx_port, int a_tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, int mtu, - long packet_rate, rtps_types_t avType, audio_codec_t audio_codec, int audio_sample_rate, int audio_channels, int audio_bps, int rtsp_port) : - rtp_video_rxtx(parent, video_exporter, requested_compression, requested_encryption, - receiver, rx_port, tx_port, - use_ipv6, mcast_if, requested_video_fec, mtu, packet_rate) +h264_rtp_video_rxtx::h264_rtp_video_rxtx(std::map const ¶ms) : + rtp_video_rxtx(params) { #ifdef HAVE_RTSP_SERVER - m_rtsp_server = init_rtsp_server(rtsp_port, parent, avType, audio_codec, audio_sample_rate, audio_channels, audio_bps, rx_port, a_rx_port); + m_rtsp_server = init_rtsp_server(params.at("rtsp_port").i, + static_cast(params.at("parent").ptr), + static_cast(params.at("avType").l), + static_cast(params.at("audio_codec").l), + params.at("audio_sample_rate").i, params.at("audio_channels").i, + params.at("audio_bps").i, params.at("rx_port").i, params.at("a_rx_port").i); c_start_server(m_rtsp_server); #endif } diff --git a/src/video_rxtx/h264_rtp.h b/src/video_rxtx/h264_rtp.h index 6cb14d3db..5871bf416 100644 --- a/src/video_rxtx/h264_rtp.h +++ b/src/video_rxtx/h264_rtp.h @@ -48,11 +48,7 @@ class h264_rtp_video_rxtx : public rtp_video_rxtx { public: - h264_rtp_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, int a_rx_port, int a_tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, int mtu, - long packet_rate, rtps_types_t avType, audio_codec_t audio_codec, int audio_sample_rate, int audio_channels, int audio_bps, int rtsp_port); + h264_rtp_video_rxtx(std::map const &); virtual ~h264_rtp_video_rxtx(); private: virtual void send_frame(struct video_frame *); diff --git a/src/video_rxtx/ihdtv.cpp b/src/video_rxtx/ihdtv.cpp index 1ad0d0ab4..7c67121ec 100644 --- a/src/video_rxtx/ihdtv.cpp +++ b/src/video_rxtx/ihdtv.cpp @@ -120,13 +120,12 @@ static void *ihdtv_sender_thread(void *arg) } #endif -ihdtv_video_rxtx::ihdtv_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, - struct vidcap *capture_device, struct display *display_device, - int requested_mtu, int argc, char **argv) : - video_rxtx(parent, video_exporter, requested_compression) +ihdtv_video_rxtx::ihdtv_video_rxtx(map const ¶ms) : + video_rxtx(params) { #ifdef HAVE_IHDTV + int argc = params.at("argc").i; + char **argv = (char **) params.at("argv").ptr; if ((argc != 0) && (argc != 1) && (argc != 2)) { throw string("Wrong number of parameters"); } @@ -134,29 +133,24 @@ ihdtv_video_rxtx::ihdtv_video_rxtx(struct module *parent, struct video_export *v printf("Initializing ihdtv protocol\n"); // we cannot act as both together, because parameter parsing would have to be revamped - if (capture_device && display_device) { + if (params.at("capture_device").ptr && params.at("display_device").ptr) { throw string ("Error: cannot act as both sender and receiver together in ihdtv mode"); } - m_display_device = display_device; + m_display_device = static_cast(params.at("display_device").ptr); - if (requested_mtu == 0) // mtu not specified on command line - { - requested_mtu = 8112; // not really a mtu, but a video-data payload per packet - } - - if (display_device) { + if (m_display_device) { if (ihdtv_init_rx_session (&m_rx_connection, (argc == 0) ? NULL : argv[0], (argc == 0) ? NULL : ((argc == 1) ? argv[0] : argv[1]), - 3000, 3001, requested_mtu) != 0) { + 3000, 3001, params.at("mtu").i) != 0) { throw string("Error initializing receiver session"); } } - if (capture_device != 0) { + if (static_cast(params.at("capture_device").ptr) != 0) { if (argc == 0) { throw string("Error: specify the destination address"); } @@ -164,19 +158,11 @@ ihdtv_video_rxtx::ihdtv_video_rxtx(struct module *parent, struct video_export *v if (ihdtv_init_tx_session (&m_tx_connection, argv[0], (argc == 2) ? argv[1] : argv[0], - requested_mtu) != 0) { + params.at("mtu").i) != 0) throw string("Error initializing sender session"); } } #else - UNUSED(parent); - UNUSED(video_exporter); - UNUSED(requested_compression); - UNUSED(capture_device); - UNUSED(display_device); - UNUSED(requested_mtu); - UNUSED(argc); - UNUSED(argv); throw string("Support for iHDTV not compiled in"); #endif // HAVE_IHDTV } diff --git a/src/video_rxtx/ihdtv.h b/src/video_rxtx/ihdtv.h index 82244e0e2..8d67a07ff 100644 --- a/src/video_rxtx/ihdtv.h +++ b/src/video_rxtx/ihdtv.h @@ -67,10 +67,7 @@ struct display; class ihdtv_video_rxtx: public video_rxtx { public: - ihdtv_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, - struct vidcap *capture_device, struct display *display_device, - int requested_mtu, int argc, char **argv); + ihdtv_video_rxtx(std::map const &); ~ihdtv_video_rxtx(); private: void send_frame(struct video_frame *); diff --git a/src/video_rxtx/rtp.cpp b/src/video_rxtx/rtp.cpp index 5d73ca044..39f85e09a 100644 --- a/src/video_rxtx/rtp.cpp +++ b/src/video_rxtx/rtp.cpp @@ -116,16 +116,10 @@ void rtp_video_rxtx::process_message(struct msg_sender *msg) } } -rtp_video_rxtx::rtp_video_rxtx(struct module *parent, - struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, - int requested_mtu, long packet_rate) : - video_rxtx(parent, video_exporter, requested_compression), - m_fec_state(NULL) +rtp_video_rxtx::rtp_video_rxtx(map const ¶ms) : + video_rxtx(params), m_fec_state(NULL) { - if(requested_mtu > RTP_MAX_MTU) { + if (params.at("mtu").i > RTP_MAX_MTU) { ostringstream oss; oss << "Requested MTU exceeds maximal value allowed by RTP library (" << RTP_MAX_PACKET_LEN << ")."; @@ -133,14 +127,14 @@ rtp_video_rxtx::rtp_video_rxtx(struct module *parent, } m_participants = pdb_init(); - m_requested_receiver = receiver; - m_recv_port_number = rx_port; - m_send_port_number = tx_port; - m_ipv6 = use_ipv6; - m_requested_mcast_if = mcast_if; + m_requested_receiver = (const char *) params.at("receiver").ptr; + m_recv_port_number = params.at("rx_port").i; + m_send_port_number = params.at("tx_port").i; + m_ipv6 = params.at("use_ipv6").b; + m_requested_mcast_if = (const char *) params.at("mcast_if").ptr; - if ((m_network_devices = initialize_network(receiver, rx_port, tx_port, - m_participants, use_ipv6, mcast_if)) + if ((m_network_devices = initialize_network(m_requested_receiver, m_recv_port_number, m_send_port_number, + m_participants, m_ipv6, m_requested_mcast_if)) == NULL) { throw string("Unable to open network"); } else { @@ -152,9 +146,10 @@ rtp_video_rxtx::rtp_video_rxtx(struct module *parent, } if ((m_tx = tx_init(&m_sender_mod, - requested_mtu, TX_MEDIA_VIDEO, - requested_video_fec, - requested_encryption, packet_rate)) == NULL) { + params.at("mtu").i, TX_MEDIA_VIDEO, + static_cast(params.at("fec").ptr), + static_cast(params.at("encryption").ptr), + params.at("packet_rate").i)) == NULL) { throw string("Unable to initialize transmitter"); } diff --git a/src/video_rxtx/rtp.h b/src/video_rxtx/rtp.h index 8f46eec17..524cd7ad5 100644 --- a/src/video_rxtx/rtp.h +++ b/src/video_rxtx/rtp.h @@ -56,11 +56,7 @@ struct fec; class rtp_video_rxtx : public video_rxtx { friend class video_rxtx; public: - rtp_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, int mtu, - long packet_rate); + rtp_video_rxtx(std::map const ¶ms); virtual ~rtp_video_rxtx(); static struct rtp **initialize_network(const char *addrs, int recv_port_base, diff --git a/src/video_rxtx/sage.cpp b/src/video_rxtx/sage.cpp index f34568cc9..ee47e962d 100644 --- a/src/video_rxtx/sage.cpp +++ b/src/video_rxtx/sage.cpp @@ -52,18 +52,16 @@ using namespace std; -sage_video_rxtx::sage_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, - const char *requested_receiver, const char *sage_opts) : - video_rxtx(parent, video_exporter, requested_compression) +sage_video_rxtx::sage_video_rxtx(map const ¶ms) : + video_rxtx(params) { ostringstream oss; - if (sage_opts) { - oss << sage_opts << ":"; + if (params.at("sage_opts").ptr) { + oss << static_cast(params.at("sage_opts").ptr) << ":"; } - oss << "fs=" << requested_receiver; + oss << "fs=" << static_cast(params.at("receiver").ptr); oss << ":tx"; // indicates that we are in tx mode int ret = initialize_video_display("sage", oss.str().c_str(), 0, &m_sage_tx_device); diff --git a/src/video_rxtx/sage.h b/src/video_rxtx/sage.h index 9b0cf34b1..4af73644f 100644 --- a/src/video_rxtx/sage.h +++ b/src/video_rxtx/sage.h @@ -64,9 +64,7 @@ struct display; class sage_video_rxtx: public video_rxtx { public: - sage_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, - const char *requested_receiver, const char *sage_opts); + sage_video_rxtx(std::map const &); ~sage_video_rxtx(); private: void send_frame(struct video_frame *); diff --git a/src/video_rxtx/ultragrid_rtp.cpp b/src/video_rxtx/ultragrid_rtp.cpp index f8fe492a3..fe91053be 100644 --- a/src/video_rxtx/ultragrid_rtp.cpp +++ b/src/video_rxtx/ultragrid_rtp.cpp @@ -76,27 +76,22 @@ using namespace std; -ultragrid_rtp_video_rxtx::ultragrid_rtp_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, int mtu, - long packet_rate, enum video_mode decoder_mode, const char *postprocess, - struct display *display_device) : - rtp_video_rxtx(parent, video_exporter, requested_compression, requested_encryption, - receiver, rx_port, tx_port, - use_ipv6, mcast_if, requested_video_fec, mtu, packet_rate) +ultragrid_rtp_video_rxtx::ultragrid_rtp_video_rxtx(const map ¶ms) : + rtp_video_rxtx(params) { - if((postprocess && strstr(postprocess, "help") != NULL)) { - struct state_video_decoder *dec = video_decoder_init(NULL, VIDEO_NORMAL, postprocess, NULL, NULL); + if ((params.at("postprocess").ptr != NULL && + strstr((const char *) params.at("postprocess").ptr, "help") != NULL)) { + struct state_video_decoder *dec = video_decoder_init(NULL, VIDEO_NORMAL, + (const char *) params.at("postprocess").ptr, NULL, NULL); video_decoder_destroy(dec); throw EXIT_SUCCESS; } gettimeofday(&m_start_time, NULL); - m_decoder_mode = decoder_mode; - m_postprocess = postprocess; - m_display_device = display_device; - m_requested_encryption = requested_encryption; + m_decoder_mode = (enum video_mode) params.at("decoder_mode").l; + m_postprocess = (const char *) params.at("postprocess").ptr; + m_display_device = (struct display *) params.at("display_device").ptr; + m_requested_encryption = (const char *) params.at("encryption").ptr; m_async_sending = false; } diff --git a/src/video_rxtx/ultragrid_rtp.h b/src/video_rxtx/ultragrid_rtp.h index a521e4e1c..1538de1af 100644 --- a/src/video_rxtx/ultragrid_rtp.h +++ b/src/video_rxtx/ultragrid_rtp.h @@ -42,16 +42,13 @@ #include "video_rxtx/rtp.h" #include +#include #include +#include class ultragrid_rtp_video_rxtx : public rtp_video_rxtx { public: - ultragrid_rtp_video_rxtx(struct module *parent, struct video_export *video_exporter, - const char *requested_compression, const char *requested_encryption, - const char *receiver, int rx_port, int tx_port, - bool use_ipv6, const char *mcast_if, const char *requested_video_fec, int mtu, - long packet_rate, enum video_mode decoder_mode, const char *postprocess, - struct display *display_device); + ultragrid_rtp_video_rxtx(std::map const &); virtual ~ultragrid_rtp_video_rxtx(); virtual void join(); private: