mirror of
https://github.com/opencv/opencv.git
synced 2025-06-08 01:53:19 +08:00
Merge pull request #21820 from alalek:fix_videoio_ffmpeg_memory_leak_3.4
This commit is contained in:
commit
0bd261ded4
@ -2210,17 +2210,13 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int
|
|||||||
/// close video output stream and free associated memory
|
/// close video output stream and free associated memory
|
||||||
void CvVideoWriter_FFMPEG::close()
|
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
|
/* 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
|
frames if using B frames, so we get the last frames by
|
||||||
passing the same picture again */
|
passing the same picture again */
|
||||||
// TODO -- do we need to account for latency here?
|
// TODO -- do we need to account for latency here?
|
||||||
|
|
||||||
/* write the trailer, if any */
|
/* write the trailer, if any */
|
||||||
if(ok && oc)
|
if (picture && ok && oc)
|
||||||
{
|
{
|
||||||
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(57, 0, 0)
|
#if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(57, 0, 0)
|
||||||
if (!(oc->oformat->flags & AVFMT_RAWPICTURE))
|
if (!(oc->oformat->flags & AVFMT_RAWPICTURE))
|
||||||
@ -2244,32 +2240,34 @@ void CvVideoWriter_FFMPEG::close()
|
|||||||
|
|
||||||
// free pictures
|
// free pictures
|
||||||
#if LIBAVFORMAT_BUILD > 4628
|
#if LIBAVFORMAT_BUILD > 4628
|
||||||
if( video_st->codec->pix_fmt != input_pix_fmt)
|
if (picture && video_st && video_st->codec->pix_fmt != input_pix_fmt)
|
||||||
#else
|
#else
|
||||||
if( video_st->codec.pix_fmt != input_pix_fmt)
|
if (picture && video_st && video_st->codec.pix_fmt != input_pix_fmt)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if(picture->data[0])
|
if(picture->data[0])
|
||||||
free(picture->data[0]);
|
free(picture->data[0]);
|
||||||
picture->data[0] = 0;
|
picture->data[0] = 0;
|
||||||
}
|
}
|
||||||
av_free(picture);
|
av_freep(&picture);
|
||||||
|
|
||||||
if (input_picture)
|
av_freep(&input_picture);
|
||||||
av_free(input_picture);
|
|
||||||
|
|
||||||
/* close codec */
|
if (video_st && video_st->codec)
|
||||||
|
{
|
||||||
|
/* close codec */
|
||||||
#if LIBAVFORMAT_BUILD > 4628
|
#if LIBAVFORMAT_BUILD > 4628
|
||||||
avcodec_close(video_st->codec);
|
avcodec_close(video_st->codec);
|
||||||
#else
|
#else
|
||||||
avcodec_close(&(video_st->codec));
|
avcodec_close(&(video_st->codec));
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
av_free(outbuf);
|
av_freep(&outbuf);
|
||||||
|
|
||||||
if (oc)
|
if (oc)
|
||||||
{
|
{
|
||||||
if (!(fmt->flags & AVFMT_NOFILE))
|
if (fmt && !(fmt->flags & AVFMT_NOFILE))
|
||||||
{
|
{
|
||||||
/* close the output file */
|
/* close the output file */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user