Skip to content

Commit

Permalink
Merge pull request #700 from andrey-utkin/memleaks-on-3.1.3
Browse files Browse the repository at this point in the history
Memleaks fixes
  • Loading branch information
andrey-utkin authored Sep 21, 2024
2 parents 46c04e5 + 25f0d28 commit 5aaa011
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 30 deletions.
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;
}
}

0 comments on commit 5aaa011

Please sign in to comment.