Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memleaks fixes #700

Merged
merged 8 commits into from
Sep 21, 2024
3 changes: 2 additions & 1 deletion debian/bluecherry.service
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
53 changes: 28 additions & 25 deletions misc/BCMK
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
\


Expand Down
1 change: 1 addition & 0 deletions server/media_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
12 changes: 10 additions & 2 deletions server/motion_processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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...
}

Expand Down Expand Up @@ -616,6 +620,7 @@ int motion_processor::detect_opencv(AVFrame *rawFrame)

if (m_motionDebug)
check_for_new_debug_event(ret);
m.release();
return ret;
}

Expand All @@ -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);
Expand Down Expand Up @@ -662,6 +669,7 @@ int motion_processor::detect_opencv_advanced(AVFrame *rawFrame)
}

m_motionTriggered = (num_md_frames >= m_minMotionFrames);
m.release();
return m_motionTriggered;
}

Expand Down
7 changes: 5 additions & 2 deletions server/streaming.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Loading