diff --git a/debian/bluecherry.service b/debian/bluecherry.service index 7c7049b1..ff71bbc1 100644 --- a/debian/bluecherry.service +++ b/debian/bluecherry.service @@ -6,7 +6,8 @@ After=syslog.target network.target mysql.service Type=simple User=bluecherry Group=bluecherry -#ExecStart=/usr/sbin/bc-server -s -u bluecherry -g bluecherry +#ExecStart=/usr/bin/valgrind --tool=memcheck --leak-check=yes --leak-check=full --show-leak-kinds=all --log-file=/tmp/bluecherry-valgrind.log /usr/sbin/bc-server -s +#ExecStart=/usr/bin/rr record -o /tmp/bluecherry.rr /usr/sbin/bc-server -s ExecStart=/usr/sbin/bc-server -s Restart=on-failure diff --git a/misc/BCMK b/misc/BCMK index 89066380..95530c42 100644 --- a/misc/BCMK +++ b/misc/BCMK @@ -54,70 +54,73 @@ libav/config.mak: \ --disable-everything \ \ - --enable-indev=v4l2 \ - --enable-vaapi \ --enable-hwaccel=h264_vaapi \ --enable-hwaccel=hevc_vaapi \ + --enable-indev=v4l2 \ + --enable-vaapi \ \ --enable-protocol=file \ - --enable-protocol=pipe \ --enable-protocol=http \ --enable-protocol=https \ + --enable-protocol=pipe \ --enable-protocol=tls \ \ + --enable-muxer=hls \ + --enable-muxer=image2 \ --enable-muxer=matroska \ --enable-muxer=mjpeg \ - --enable-muxer=rtp \ --enable-muxer=mp4 \ - --enable-muxer=image2 \ + --enable-muxer=mpegts \ --enable-muxer=rawvideo \ + --enable-muxer=rtp \ + --enable-muxer=rtsp \ \ - --enable-demuxer=rtsp \ + --enable-demuxer=concat \ --enable-demuxer=matroska \ --enable-demuxer=mjpeg \ --enable-demuxer=rawvideo \ - --enable-demuxer=concat \ + --enable-demuxer=rtsp \ \ --enable-bsf=aac_adtstoasc \ - --enable-bsf=h264_mp4toannexb \ --enable-bsf=extract_extradata \ + --enable-bsf=h264_mp4toannexb \ \ + --enable-decoder=aac \ + --enable-decoder=ac3 \ --enable-decoder=h264 \ --enable-decoder=hevc \ - --enable-decoder=mpeg4 \ --enable-decoder=mjpeg \ - --enable-decoder=rawvideo \ - --enable-decoder=aac \ - --enable-decoder=ac3 \ --enable-decoder=mp2 \ --enable-decoder=mp3 \ + --enable-decoder=mpeg4 \ + --enable-decoder=pcm_alaw \ --enable-decoder=pcm_f32le \ --enable-decoder=pcm_f64le \ - --enable-decoder=pcm_s16le \ - --enable-decoder=pcm_alaw \ --enable-decoder=pcm_mulaw \ + --enable-decoder=pcm_s16le \ + --enable-decoder=rawvideo \ \ --enable-parser=h264 \ --enable-parser=hevc \ - --enable-parser=mpeg4video \ --enable-parser=mjpeg \ + --enable-parser=mpeg4video \ \ - --enable-encoder=mjpeg \ - --enable-encoder=mpeg4 \ - --enable-encoder=rawvideo \ --enable-encoder=aac \ --enable-encoder=h264_vaapi \ - --enable-encoder=mjpeg_vaapi \ --enable-encoder=hevc_vaapi \ + --enable-encoder=mjpeg \ + --enable-encoder=mjpeg_vaapi \ + --enable-encoder=mpeg4 \ + --enable-encoder=rawvideo \ \ - --enable-filter=scale \ - --enable-filter=fps \ - --enable-filter=scale_vaapi \ + --enable-filter=aevalsrc \ --enable-filter=aresample \ - --enable-filter=hwupload \ + --enable-filter=fps \ --enable-filter=hwdownload \ - --enable-muxer=hls \ - --enable-muxer=mpegts \ + --enable-filter=hwupload \ + --enable-filter=scale \ + --enable-filter=scale_vaapi \ + --enable-filter=testsrc \ \ diff --git a/server/media_writer.cpp b/server/media_writer.cpp index b88d6a6b..fe664e23 100644 --- a/server/media_writer.cpp +++ b/server/media_writer.cpp @@ -663,6 +663,7 @@ int snapshot_writer::write_frame(AVFrame *rawFrame) if (ret < 0) { bc_avlog(ret, "avcodec_send_frame: snapshot encoding failed"); + if (allocated) av_freep(&frame->data[0]); av_frame_free(&frame); return -1; } diff --git a/server/motion_processor.cpp b/server/motion_processor.cpp index 05581678..fa6fb7d3 100644 --- a/server/motion_processor.cpp +++ b/server/motion_processor.cpp @@ -55,6 +55,9 @@ motion_processor::~motion_processor() } #endif + for (int i = 0; i < sizeof(m_refFrames); i++) { + m_refFrames[i].release(); + } delete output_source; } @@ -143,7 +146,7 @@ void motion_processor::run() bc_log(Warning, "motion processor: avcodec_send_packet failed: %s", error); } - while (ret >= 0) { + while (true) { ret = avcodec_receive_frame(decode_ctx, frame); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) break; @@ -576,6 +579,7 @@ int motion_processor::detect_opencv(AVFrame *rawFrame) // first things first... get the original frame from the AVFrame and convert it to an OpenCV Grayscale Mat, and the "downscale" size. cv::Mat m = cv::Mat(dst_h, dst_w, CV_8UC1); if (convert_AVFrame_to_grayMat(rawFrame, m) == 0) { + m.release(); return 0; // error converting frame... } @@ -616,6 +620,7 @@ int motion_processor::detect_opencv(AVFrame *rawFrame) if (m_motionDebug) check_for_new_debug_event(ret); + m.release(); return ret; } @@ -627,8 +632,10 @@ int motion_processor::detect_opencv_advanced(AVFrame *rawFrame) // first things first... get the original frame from the AVFrame and convert it to an OpenCV Grayscale Mat, and the "downscale" size. cv::Mat m = cv::Mat(dst_h, dst_w, CV_8UC1); - if (convert_AVFrame_to_grayMat(rawFrame, m) == 0) + if (convert_AVFrame_to_grayMat(rawFrame, m) == 0) { + m.release(); return 0; // error converting frame... + } // do a quick(-ish) blur to reduce noise... cv::GaussianBlur(m, m, cv::Size(21, 21), 0); @@ -662,6 +669,7 @@ int motion_processor::detect_opencv_advanced(AVFrame *rawFrame) } m_motionTriggered = (num_md_frames >= m_minMotionFrames); + m.release(); return m_motionTriggered; } diff --git a/server/streaming.cpp b/server/streaming.cpp index b0d73c31..2bf1a652 100644 --- a/server/streaming.cpp +++ b/server/streaming.cpp @@ -360,11 +360,14 @@ int bc_streaming_hls_packet_write(struct bc_record *bc_rec, const stream_packet if (bc_rec->hls_stream_ctx[ctx_index]->streams[0]->codecpar->codec_id == AV_CODEC_ID_MPEG4) { // Write header for every MP4 fragment to be used as independent segments in HLS playlist av_dict_set(&muxer_opts, "movflags", "frag_keyframe+empty_moov+default_base_moof", 0); - if (avformat_write_header(bc_rec->hls_stream_ctx[ctx_index], &muxer_opts) < 0) { + int ret; + ret = avformat_write_header(bc_rec->hls_stream_ctx[ctx_index], &muxer_opts); + av_dict_free(&muxer_opts); + if (ret < 0) { bc_rec->log.log(Error, "Failed to write header in fragmented MP4 payload"); return -1; } } return 1; -} \ No newline at end of file +}