diff --git a/src/audio/types.cpp b/src/audio/types.cpp index 85279653c..6731c05ce 100644 --- a/src/audio/types.cpp +++ b/src/audio/types.cpp @@ -83,10 +83,12 @@ audio_frame2::audio_frame2(const struct audio_frame *old) : channels(old ? old->ch_count : 0), codec(old ? AC_PCM : AC_NONE), duration(0.0) { - for (int i = 0; i < old->ch_count; i++) { - resize(i, old->data_len / old->ch_count); - char *data = channels[i].data.get(); - demux_channel(data, old->data, old->bps, old->data_len, old->ch_count, i); + if (old) { + for (int i = 0; i < old->ch_count; i++) { + resize(i, old->data_len / old->ch_count); + char *data = channels[i].data.get(); + demux_channel(data, old->data, old->bps, old->data_len, old->ch_count, i); + } } } diff --git a/src/compat/platform_pipe.cpp b/src/compat/platform_pipe.cpp index 47c1d5c05..17177bb97 100644 --- a/src/compat/platform_pipe.cpp +++ b/src/compat/platform_pipe.cpp @@ -77,6 +77,7 @@ static fd_t open_socket(int *port) } socklen_t len = sizeof(s_in); if (getsockname(sock, (struct sockaddr *) &s_in, &len) != 0) { + CLOSESOCKET(sock); return INVALID_SOCKET; } *port = ntohs(s_in.sin_port); @@ -98,6 +99,7 @@ static fd_t connect_to_socket(int local_port) ret = connect(fd, (struct sockaddr *) &s_in, sizeof(s_in)); if (ret != 0) { + CLOSESOCKET(fd); return INVALID_SOCKET; } @@ -127,11 +129,13 @@ int platform_pipe_init(fd_t p[2]) p[0] = accept(sock, NULL, NULL); if (p[0] == INVALID_SOCKET) { + CLOSESOCKET(sock); return -1; } thr.join(); p[1] = par.sock; if (p[1] == INVALID_SOCKET) { + CLOSESOCKET(sock); return -1; } CLOSESOCKET(sock); diff --git a/src/control_socket.cpp b/src/control_socket.cpp index e4efad38b..14294e689 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -309,7 +309,10 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s new_msg[strlen(message) + 2] = '\0'; } - write_all(cur->fd, new_msg, strlen(new_msg)); + int ret = write_all(cur->fd, new_msg, strlen(new_msg)); + if (ret != (int) strlen(new_msg)) { + fprintf(stderr, "Cannot write stats!\n"); + } cur = cur->next; } free(new_msg); diff --git a/src/gl_context.c b/src/gl_context.c index 527606e45..29c0f92dd 100644 --- a/src/gl_context.c +++ b/src/gl_context.c @@ -88,12 +88,14 @@ bool init_gl_context(struct gl_context *context, int which) { char *item = strtok_r(tmp, ".", &save_ptr); if (!item) { fprintf(stderr, "Unable to determine OpenGL version!\n"); + free(tmp); return false; } context->gl_major = atoi(item); item = strtok_r(NULL, ".", &save_ptr); if (!item) { fprintf(stderr, "Unable to determine OpenGL version!\n"); + free(tmp); return false; } context->gl_minor = atoi(item); diff --git a/src/hd-rum-translator/hd-rum-decompress.cpp b/src/hd-rum-translator/hd-rum-decompress.cpp index 58a1dad37..8c40a0c11 100644 --- a/src/hd-rum-translator/hd-rum-decompress.cpp +++ b/src/hd-rum-translator/hd-rum-decompress.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -229,14 +230,20 @@ void *hd_rum_decompress_init(struct module *parent, bool blend, const char *capt s->video_rxtx = dynamic_cast(video_rxtx::create(ULTRAGRID_RTP, params)); assert (s->video_rxtx); - s->video_rxtx->start(); - s->worker_thread = thread(&state_transcoder_decompress::worker, s); - s->receiver_thread = thread(&video_rxtx::receiver_thread, s->video_rxtx); - s->display_thread = thread(display_run, s->display); + try { + s->video_rxtx->start(); - if (capture_filter_init(parent, capture_filter, &s->capture_filter_state) != 0) { - log_msg(LOG_LEVEL_ERROR, "Unable to initialize capture filter!\n"); + s->worker_thread = thread(&state_transcoder_decompress::worker, s); + s->receiver_thread = thread(&video_rxtx::receiver_thread, s->video_rxtx); + s->display_thread = thread(display_run, s->display); + + if (capture_filter_init(parent, capture_filter, &s->capture_filter_state) != 0) { + log_msg(LOG_LEVEL_ERROR, "Unable to initialize capture filter!\n"); + return nullptr; + } + } catch (string const &s) { + cerr << s << endl; return nullptr; } diff --git a/src/hd-rum-translator/hd-rum-translator.cpp b/src/hd-rum-translator/hd-rum-translator.cpp index 557ce6e4b..efdc0e29e 100644 --- a/src/hd-rum-translator/hd-rum-translator.cpp +++ b/src/hd-rum-translator/hd-rum-translator.cpp @@ -48,6 +48,8 @@ struct replica { mod.cls = MODULE_CLASS_PORT; mod.priv_data = this; module_register(&mod, parent); + type = replica::type_t::NONE; + recompress = nullptr; } ~replica() { diff --git a/src/host.cpp b/src/host.cpp index ff3628d38..633a79dd3 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -59,6 +59,7 @@ void print_capabilities(int mask, struct module *root, bool use_vidcap) const char *text = response_get_text(r); istringstream iss(text); iss >> desc; + free_response(r); break; } free_response(r); diff --git a/src/keyboard_control.cpp b/src/keyboard_control.cpp index 4962f0088..c46c5d173 100644 --- a/src/keyboard_control.cpp +++ b/src/keyboard_control.cpp @@ -68,6 +68,18 @@ static void catch_signal(int) } #endif +keyboard_control::keyboard_control() : + m_root(nullptr), +#ifdef HAVE_TERMIOS_H + m_old_tio(), + m_should_exit_pipe{0, 0}, +#else + m_should_exit(false), +#endif + m_started(false) +{ +} + void keyboard_control::start(struct module *root) { m_root = root; @@ -116,7 +128,7 @@ void keyboard_control::stop() return; } #ifdef HAVE_TERMIOS_H - char c; + char c = 0; assert(write(m_should_exit_pipe[1], &c, 1) == 1); close(m_should_exit_pipe[1]); #else @@ -150,11 +162,11 @@ void keyboard_control::run() FD_SET(m_should_exit_pipe[0], &set); select(m_should_exit_pipe[0] + 1, &set, NULL, NULL, NULL); if (FD_ISSET(0, &set)) { - char c = getchar(); + int c = getchar(); #else usleep(200000); while (kbhit()) { - char c = getch(); + int c = getch(); #endif debug_msg("Key %c pressed\n", c); switch (c) { diff --git a/src/keyboard_control.h b/src/keyboard_control.h index 6ed64eaee..6758ca031 100644 --- a/src/keyboard_control.h +++ b/src/keyboard_control.h @@ -48,6 +48,7 @@ struct module; class keyboard_control { public: + keyboard_control(); void start(struct module *root); void stop(); void run(); diff --git a/src/module.c b/src/module.c index 3e87fa7c5..e750899bd 100644 --- a/src/module.c +++ b/src/module.c @@ -274,6 +274,8 @@ struct module *get_matching_child(struct module *node, const char *const_path) return receiver; } + free(tmp); + return NULL; } diff --git a/src/rtp/net_udp.cpp b/src/rtp/net_udp.cpp index 9b32b21ba..5facf11ad 100644 --- a/src/rtp/net_udp.cpp +++ b/src/rtp/net_udp.cpp @@ -515,6 +515,7 @@ static char *udp_host_addr6(socket_udp * s) newsock = socket(AF_INET6, SOCK_DGRAM, 0); if (newsock == -1) { perror("socket"); + free(hname); return NULL; } memset((char *)&addr6, 0, len); @@ -1399,11 +1400,14 @@ bool udp_port_pair_is_free(const char *addr, bool use_ipv6, int even_port) s_in6->sin6_addr = in6addr_any; len = sizeof(struct sockaddr_in6); fd = socket(AF_INET6, SOCK_DGRAM, 0); - if (SETSOCKOPT - (fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&ipv6only, - sizeof(ipv6only)) != 0) { - socket_error("setsockopt IPV6_V6ONLY"); - return false; + if (fd != INVALID_SOCKET) { + if (SETSOCKOPT + (fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&ipv6only, + sizeof(ipv6only)) != 0) { + socket_error("setsockopt IPV6_V6ONLY"); + CLOSESOCKET(fd); + return false; + } } } else { struct sockaddr_in *s_in = (struct sockaddr_in *) &s_st; diff --git a/src/rtp/rtp.c b/src/rtp/rtp.c index fad7e1ef5..daa4e3f94 100644 --- a/src/rtp/rtp.c +++ b/src/rtp/rtp.c @@ -1083,11 +1083,7 @@ struct rtp *rtp_init_if(const char *addr, const char *iface, session->magic = 0xfeedface; session->opt = (options *) malloc(sizeof(options)); session->userdata = userdata; - if (addr != NULL) { - session->addr = strdup(addr); - } else { - session->addr = NULL; - } + session->addr = strdup(addr); session->rx_port = rx_port; session->tx_port = tx_port; session->ttl = min(ttl, 127); diff --git a/src/rtp/video_decoders.cpp b/src/rtp/video_decoders.cpp index 600ac8434..f866e7ca0 100644 --- a/src/rtp/video_decoders.cpp +++ b/src/rtp/video_decoders.cpp @@ -176,7 +176,9 @@ struct main_msg; // message definitions struct frame_msg { inline frame_msg(struct control_state *c, atomic &rbt) : control(c), frame(nullptr), decompressed_frame(nullptr), - received_bytes_total(rbt), displayed(false), corrupted(false) + received_pkts_cum(0), expected_pkts_cum(0), + received_bytes_total(rbt), + displayed(false), corrupted(false) {} inline ~frame_msg() { if (control && frame) { @@ -1371,6 +1373,7 @@ int decode_video_frame(struct coded_data *cdata, void *decoder_data, struct pbuf // We have no framebuffer assigned, exitting if(!decoder->display) { + vf_free(frame); return FALSE; } diff --git a/src/utils/worker.cpp b/src/utils/worker.cpp index db0848865..d1f6a90f6 100644 --- a/src/utils/worker.cpp +++ b/src/utils/worker.cpp @@ -87,11 +87,16 @@ struct wp_worker { wp_worker(worker_state_observer &observer) : m_state_observer(observer) { - pthread_mutex_init(&m_lock, NULL); - pthread_cond_init(&m_task_ready_cv, NULL); - pthread_cond_init(&m_task_completed_cv, NULL); + int ret; + ret = pthread_mutex_init(&m_lock, NULL); + assert(ret == 0); + ret = pthread_cond_init(&m_task_ready_cv, NULL); + assert(ret == 0); + ret = pthread_cond_init(&m_task_completed_cv, NULL); + assert(ret == 0); - pthread_create(&m_thread_id, NULL, wp_worker::enter_loop, this); + ret = pthread_create(&m_thread_id, NULL, wp_worker::enter_loop, this); + assert(ret == 0); } ~wp_worker() { wp_task_data *poisoned = new wp_task_data(NULL, NULL, this, false); diff --git a/src/video_capture/import.cpp b/src/video_capture/import.cpp index 267e650b9..71f19681e 100644 --- a/src/video_capture/import.cpp +++ b/src/video_capture/import.cpp @@ -797,6 +797,7 @@ static void * control_thread(void *args) clients->next = NULL; } else { perror("Video import: unable to create communication pipe"); + close(fd); return NULL; } diff --git a/src/video_capture/testcard.cpp b/src/video_capture/testcard.cpp index 25d68db76..31565546d 100644 --- a/src/video_capture/testcard.cpp +++ b/src/video_capture/testcard.cpp @@ -473,7 +473,7 @@ static int vidcap_testcard_init(const struct vidcap_params *params, void **state } else if (s->pattern == image_pattern::NOISE) { uint8_t *sample = (uint8_t *) s->pixmap.data; for (int i = 0; i < pixmap_len; ++i) { - *sample++ = lrand48() % 0xff; + *sample++ = random() % 0xff; } } else { assert (s->pattern == image_pattern::BARS); diff --git a/src/video_compress/libavcodec.cpp b/src/video_compress/libavcodec.cpp index ba0e56179..0c436a471 100644 --- a/src/video_compress/libavcodec.cpp +++ b/src/video_compress/libavcodec.cpp @@ -994,7 +994,9 @@ static void configure_nvenc(AVCodecContext *codec_ctx, struct setparam_param *pa { int ret; if (!param->have_preset) { - av_opt_set(codec_ctx->priv_data, "preset", DEFAULT_NVENC_PRESET, 0); + if (av_opt_set(codec_ctx->priv_data, "preset", DEFAULT_NVENC_PRESET, 0) != 0) { + log_msg(LOG_LEVEL_WARNING, "[lavc] Cannot set preset.\n"); + } } ret = av_opt_set(codec_ctx->priv_data, "cbr", "1", 0); if (ret != 0) { @@ -1168,7 +1170,10 @@ static void setparam_vp8(AVCodecContext *codec_ctx, struct setparam_param *param codec_ctx->slices = 4; codec_ctx->rc_buffer_size = codec_ctx->bit_rate / param->fps; //codec_ctx->rc_buffer_aggressivity = 0.5; - av_opt_set(codec_ctx->priv_data, "deadline", "realtime", 0); + if (av_opt_set(codec_ctx->priv_data, "deadline", "realtime", 0) != 0) { + log_msg(LOG_LEVEL_WARNING, "[lavc] Unable to set deadline.\n"); + + } } static void libavcodec_check_messages(struct state_video_compress_libav *s) diff --git a/src/video_display/aggregate.c b/src/video_display/aggregate.c index 9a79265da..a5285c7f2 100644 --- a/src/video_display/aggregate.c +++ b/src/video_display/aggregate.c @@ -185,11 +185,8 @@ static void display_aggregate_done(void *state) assert(s != NULL); assert(s->magic == MAGIC_AGGREGATE); - if (s != NULL) { - unsigned int i; - for (i = 0; i < s->devices_cnt; ++i) { - display_done(s->devices[i]); - } + for (unsigned int i = 0; i < s->devices_cnt; ++i) { + display_done(s->devices[i]); } vf_free(s->frame); diff --git a/src/video_display/decklink.cpp b/src/video_display/decklink.cpp index a471656ee..90ed7c330 100644 --- a/src/video_display/decklink.cpp +++ b/src/video_display/decklink.cpp @@ -781,6 +781,7 @@ static void *display_decklink_init(struct module *parent, const char *fmt, unsig char *saveptr1 = 0ul, *saveptr2 = 0ul; ptr = strtok_r(tmp, ":", &saveptr1); + assert(ptr); char *devices = strdup(ptr); s->devices_cnt = 0; ptr = strtok_r(devices, ",", &saveptr2); diff --git a/src/video_display/proxy.cpp b/src/video_display/proxy.cpp index 0c929d621..2d9be3ee4 100644 --- a/src/video_display/proxy.cpp +++ b/src/video_display/proxy.cpp @@ -143,8 +143,9 @@ static void *display_proxy_init(struct module *parent, const char *fmt, unsigned assert (initialize_video_display(parent, requested_display, cfg, flags, &s->common->real_display) == 0); free(fmt_copy); - pthread_create(&s->common->thread_id, NULL, (void *(*)(void *)) display_run, + int ret = pthread_create(&s->common->thread_id, NULL, (void *(*)(void *)) display_run, s->common->real_display); + assert (ret == 0); s->common->parent = parent; diff --git a/src/video_display/sdl.cpp b/src/video_display/sdl.cpp index 9bc7d6fa0..ed262cee9 100644 --- a/src/video_display/sdl.cpp +++ b/src/video_display/sdl.cpp @@ -120,12 +120,13 @@ struct state_sdl { state_sdl(struct module *parent) : magic(MAGIC_SDL), frames(0), yuv_image(nullptr), sdl_screen(nullptr), dst_rect(), deinterlace(false), fs(false), nodecorate(false), fixed_size(false), + fixed_w(0), fixed_h(0), screen_w(0), screen_h(0), audio_buffer(nullptr), audio_frame(), play_audio(false), current_desc(), current_display_desc(), #ifdef HAVE_MACOSX autorelease_pool(nullptr), #endif - should_exit(false) + should_exit(false), sdl_flags_win(0), sdl_flags_fs(0) { gettimeofday(&tv, NULL); module_init_default(&mod); diff --git a/src/video_rxtx.cpp b/src/video_rxtx.cpp index 00a013c87..fef67098e 100644 --- a/src/video_rxtx.cpp +++ b/src/video_rxtx.cpp @@ -116,7 +116,7 @@ video_rxtx::video_rxtx(map const ¶ms): m_port_id(-1), m_pau m_parent(static_cast(params.at("parent").ptr)), m_compression(nullptr), m_video_exporter(static_cast(params.at("exporter").ptr)), - m_poisoned(false), m_joined(true) { + m_thread_id(), m_poisoned(false), m_joined(true) { module_init_default(&m_sender_mod); m_sender_mod.cls = MODULE_CLASS_SENDER; diff --git a/src/video_rxtx/sage.cpp b/src/video_rxtx/sage.cpp index b00aef6e1..bcddf2eee 100644 --- a/src/video_rxtx/sage.cpp +++ b/src/video_rxtx/sage.cpp @@ -68,8 +68,9 @@ sage_video_rxtx::sage_video_rxtx(map const ¶ms) : if(ret != 0) { throw string("Unable to initialize SAGE TX."); } - pthread_create(&m_thread_id, NULL, (void * (*)(void *)) display_run, + ret = pthread_create(&m_thread_id, NULL, (void * (*)(void *)) display_run, &m_sage_tx_device); + assert(ret == 0); memset(&m_saved_video_desc, 0, sizeof(m_saved_video_desc)); }