Merge pull request #21819 from alalek:fix_videoio_ffmpeg_memory_leak_4.x

pull/21827/head
Alexander Alekhin 3 years ago
commit 092030c1ca
  1. 21
      modules/videoio/src/cap_ffmpeg_impl.hpp

@ -2496,17 +2496,13 @@ double CvVideoWriter_FFMPEG::getProperty(int propId) const
/// close video output stream and free associated memory
void CvVideoWriter_FFMPEG::close()
{
// nothing to do if already released
if ( !picture )
return;
/* no more frame to compress. The codec has a latency of a few
frames if using B frames, so we get the last frames by
passing the same picture again */
// TODO -- do we need to account for latency here?
/* write the trailer, if any */
if(ok && oc)
if (picture && ok && oc)
{
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(57, 0, 0)
if (!(oc->oformat->flags & AVFMT_RAWPICTURE))
@ -2529,7 +2525,7 @@ void CvVideoWriter_FFMPEG::close()
}
// free pictures
if( context->pix_fmt != input_pix_fmt)
if (picture && context && context->pix_fmt != input_pix_fmt)
{
if(picture->data[0])
free(picture->data[0]);
@ -2540,8 +2536,14 @@ void CvVideoWriter_FFMPEG::close()
if (input_picture)
av_free(input_picture);
#ifdef CV_FFMPEG_CODECPAR
avcodec_free_context(&context);
#else
/* close codec */
avcodec_close(context);
if (context) // fixed after https://github.com/FFmpeg/FFmpeg/commit/3e1f507f3e8f16b716aa115552d243b48ae809bd
avcodec_close(context);
context = NULL;
#endif
av_free(outbuf);
@ -2935,10 +2937,7 @@ bool CvVideoWriter_FFMPEG::open( const char * filename, int fourcc,
#endif
#ifdef CV_FFMPEG_CODECPAR
if (context)
{
avcodec_free_context(&context);
}
avcodec_free_context(&context);
#endif
context = icv_configure_video_stream_FFMPEG(oc, video_st, codec,
width, height, (int) (bitrate + 0.5),

Loading…
Cancel
Save