From 3eca4d8203f7169764918c4b5fc9be8972d574a5 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Wed, 24 Feb 2016 15:42:44 +0100 Subject: [PATCH] Fixed postprocess on-fly change --- src/control_socket.cpp | 6 ++++++ src/messaging.h | 2 ++ src/rtp/video_decoders.cpp | 1 + src/video_rxtx/ultragrid_rtp.cpp | 29 +++++++++++++++++++++++++++-- src/video_rxtx/ultragrid_rtp.h | 2 +- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/control_socket.cpp b/src/control_socket.cpp index d96a49e7d..4731dc5c3 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -462,6 +462,12 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s struct msg_receiver *msg = (struct msg_receiver *) new_message(sizeof(struct msg_receiver)); msg->type = RECEIVER_MSG_MUTE; resp = send_message(s->root_module, path, (struct message *) msg); + } else if (prefix_matches(message, "postprocess ")) { + strncpy(path, "receiver", sizeof path); + struct msg_receiver *msg = (struct msg_receiver *) new_message(sizeof(struct msg_receiver)); + msg->type = RECEIVER_MSG_POSTPROCESS; + strncpy(msg->postprocess_cfg, suffix(message, "postprocess "), sizeof msg->postprocess_cfg); + resp = send_message(s->root_module, path, (struct message *) msg); } else if(strcasecmp(message, "bye") == 0) { ret = CONTROL_CLOSE_HANDLE; resp = new_response(RESPONSE_OK, NULL); diff --git a/src/messaging.h b/src/messaging.h index 806b48378..db5d0df88 100644 --- a/src/messaging.h +++ b/src/messaging.h @@ -67,6 +67,7 @@ enum msg_receiver_type { RECEIVER_MSG_INCREASE_VOLUME, RECEIVER_MSG_DECREASE_VOLUME, RECEIVER_MSG_MUTE, + RECEIVER_MSG_POSTPROCESS, }; struct msg_receiver { struct message m; @@ -74,6 +75,7 @@ struct msg_receiver { union { uint16_t new_rx_port; struct video_desc new_desc; + char postprocess_cfg[1024]; }; }; diff --git a/src/rtp/video_decoders.cpp b/src/rtp/video_decoders.cpp index dc26c20a5..0aa64cc0a 100644 --- a/src/rtp/video_decoders.cpp +++ b/src/rtp/video_decoders.cpp @@ -636,6 +636,7 @@ struct state_video_decoder *video_decoder_init(struct module *parent, module_init_default(&s->mod); s->mod.cls = MODULE_CLASS_DECODER; module_register(&s->mod, parent); + dump_tree(get_root_module(parent), 0); s->control = (struct control_state *) get_module(get_root_module(parent), "control"); s->disp_supported_il = NULL; diff --git a/src/video_rxtx/ultragrid_rtp.cpp b/src/video_rxtx/ultragrid_rtp.cpp index 091339b80..a5b88272a 100644 --- a/src/video_rxtx/ultragrid_rtp.cpp +++ b/src/video_rxtx/ultragrid_rtp.cpp @@ -90,7 +90,8 @@ ultragrid_rtp_video_rxtx::ultragrid_rtp_video_rxtx(const map &p } m_decoder_mode = (enum video_mode) params.at("decoder_mode").l; - m_postprocess = (const char *) params.at("postprocess").ptr; + auto postprocess_c = (const char *) params.at("postprocess").ptr; + m_postprocess = postprocess_c ? postprocess_c : string(); m_display_device = (struct display *) params.at("display_device").ptr; m_requested_encryption = (const char *) params.at("encryption").ptr; m_async_sending = false; @@ -256,6 +257,30 @@ void ultragrid_rtp_video_rxtx::receiver_process_messages() cp = pdb_iter_next(&it); } } + break; + case RECEIVER_MSG_POSTPROCESS: + if (strcmp("flush", msg->postprocess_cfg) == 0) { + m_postprocess = {}; + } else { + m_postprocess = msg->postprocess_cfg; + } + { + pdb_iter_t it; + struct pdb_e *cp = pdb_iter_init(m_participants, &it); + while (cp != NULL) { + if (cp->decoder_state) { + video_decoder_remove_display( + ((struct vcodec_state*) cp->decoder_state)->decoder); + video_decoder_destroy( + ((struct vcodec_state*) cp->decoder_state)->decoder); + cp->decoder_state = NULL; + } + cp = pdb_iter_next(&it); + } + pdb_iter_done(&it); + + } + break; case RECEIVER_MSG_INCREASE_VOLUME: case RECEIVER_MSG_DECREASE_VOLUME: @@ -302,7 +327,7 @@ struct vcodec_state *ultragrid_rtp_video_rxtx::new_video_decoder(struct display if(state) { state->decoder = video_decoder_init(&m_receiver_mod, m_decoder_mode, - m_postprocess, d, + m_postprocess.c_str(), d, m_requested_encryption); if(!state->decoder) { diff --git a/src/video_rxtx/ultragrid_rtp.h b/src/video_rxtx/ultragrid_rtp.h index a2584041b..554f6ced4 100644 --- a/src/video_rxtx/ultragrid_rtp.h +++ b/src/video_rxtx/ultragrid_rtp.h @@ -72,7 +72,7 @@ private: static void destroy_video_decoder(void *state); enum video_mode m_decoder_mode; - const char *m_postprocess; + std::string m_postprocess; struct display *m_display_device; std::list m_display_copies; ///< some displays can be "forked" ///< and used simultaneously from