fix: memory leaks
This commit is contained in:
parent
db0b57e122
commit
532162e2da
@ -5,14 +5,13 @@ use std::fmt::{Display, Formatter};
|
|||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
use ffmpeg_sys_the_third::AVPictureType::AV_PICTURE_TYPE_NONE;
|
|
||||||
use ffmpeg_sys_the_third::{
|
use ffmpeg_sys_the_third::{
|
||||||
av_buffer_ref, av_frame_alloc, av_hwdevice_ctx_create, av_hwdevice_get_type_name,
|
av_buffer_ref, av_frame_alloc, av_frame_free, av_hwdevice_ctx_create,
|
||||||
av_hwdevice_iterate_types, avcodec_alloc_context3, avcodec_find_decoder, avcodec_free_context,
|
av_hwdevice_get_type_name, av_hwdevice_iterate_types, avcodec_alloc_context3,
|
||||||
avcodec_get_hw_config, avcodec_get_name, avcodec_open2, avcodec_parameters_to_context,
|
avcodec_find_decoder, avcodec_free_context, avcodec_get_hw_config, avcodec_get_name,
|
||||||
avcodec_receive_frame, avcodec_send_packet, AVCodec, AVCodecContext, AVCodecHWConfig, AVFrame,
|
avcodec_open2, avcodec_parameters_to_context, avcodec_receive_frame, avcodec_send_packet,
|
||||||
AVHWDeviceType, AVPacket, AVStream, AVERROR, AVERROR_EOF,
|
AVCodec, AVCodecContext, AVCodecHWConfig, AVFrame, AVHWDeviceType, AVPacket, AVStream, AVERROR,
|
||||||
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX,
|
AVERROR_EOF, AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX,
|
||||||
};
|
};
|
||||||
use log::trace;
|
use log::trace;
|
||||||
|
|
||||||
@ -255,16 +254,15 @@ impl Decoder {
|
|||||||
|
|
||||||
let mut pkgs = Vec::new();
|
let mut pkgs = Vec::new();
|
||||||
while ret >= 0 {
|
while ret >= 0 {
|
||||||
let frame = av_frame_alloc();
|
let mut frame = av_frame_alloc();
|
||||||
ret = avcodec_receive_frame(ctx, frame);
|
ret = avcodec_receive_frame(ctx, frame);
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
|
av_frame_free(&mut frame);
|
||||||
if ret == AVERROR_EOF || ret == AVERROR(libc::EAGAIN) {
|
if ret == AVERROR_EOF || ret == AVERROR(libc::EAGAIN) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return Err(Error::msg(format!("Failed to decode {}", ret)));
|
return Err(Error::msg(format!("Failed to decode {}", ret)));
|
||||||
}
|
}
|
||||||
|
|
||||||
(*frame).pict_type = AV_PICTURE_TYPE_NONE; // encoder prints warnings
|
|
||||||
pkgs.push(frame);
|
pkgs.push(frame);
|
||||||
}
|
}
|
||||||
Ok(pkgs)
|
Ok(pkgs)
|
||||||
|
@ -222,9 +222,10 @@ impl Demuxer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn get_packet(&mut self) -> Result<(*mut AVPacket, *mut AVStream), Error> {
|
pub unsafe fn get_packet(&mut self) -> Result<(*mut AVPacket, *mut AVStream), Error> {
|
||||||
let pkt: *mut AVPacket = av_packet_alloc();
|
let mut pkt = av_packet_alloc();
|
||||||
let ret = av_read_frame(self.ctx, pkt);
|
let ret = av_read_frame(self.ctx, pkt);
|
||||||
if ret == AVERROR_EOF {
|
if ret == AVERROR_EOF {
|
||||||
|
av_packet_free(&mut pkt);
|
||||||
return Ok((ptr::null_mut(), ptr::null_mut()));
|
return Ok((ptr::null_mut(), ptr::null_mut()));
|
||||||
}
|
}
|
||||||
bail_ffmpeg!(ret);
|
bail_ffmpeg!(ret);
|
||||||
|
@ -3,7 +3,13 @@ use std::{ptr, slice};
|
|||||||
|
|
||||||
use crate::{bail_ffmpeg, cstr, get_ffmpeg_error_msg, options_to_dict};
|
use crate::{bail_ffmpeg, cstr, get_ffmpeg_error_msg, options_to_dict};
|
||||||
use anyhow::{bail, Error, Result};
|
use anyhow::{bail, Error, Result};
|
||||||
use ffmpeg_sys_the_third::{av_channel_layout_default, av_d2q, av_inv_q, av_packet_alloc, av_packet_free, avcodec_alloc_context3, avcodec_find_encoder, avcodec_find_encoder_by_name, avcodec_free_context, avcodec_get_supported_config, avcodec_open2, avcodec_receive_packet, avcodec_send_frame, AVChannelLayout, AVCodec, AVCodecConfig, AVCodecContext, AVCodecID, AVFrame, AVPacket, AVPixelFormat, AVRational, AVSampleFormat, AVERROR, AVERROR_EOF};
|
use ffmpeg_sys_the_third::{
|
||||||
|
av_channel_layout_default, av_d2q, av_inv_q, av_packet_alloc, av_packet_free,
|
||||||
|
avcodec_alloc_context3, avcodec_find_encoder, avcodec_find_encoder_by_name,
|
||||||
|
avcodec_free_context, avcodec_get_supported_config, avcodec_open2, avcodec_receive_packet,
|
||||||
|
avcodec_send_frame, AVChannelLayout, AVCodec, AVCodecConfig, AVCodecContext, AVCodecID,
|
||||||
|
AVFrame, AVPacket, AVPixelFormat, AVRational, AVSampleFormat, AVERROR, AVERROR_EOF,
|
||||||
|
};
|
||||||
use libc::EAGAIN;
|
use libc::EAGAIN;
|
||||||
|
|
||||||
pub struct Encoder {
|
pub struct Encoder {
|
||||||
|
@ -240,9 +240,8 @@ impl MuxerBuilder {
|
|||||||
|
|
||||||
// setup other stream params
|
// setup other stream params
|
||||||
let encoder_ctx = encoder.codec_context();
|
let encoder_ctx = encoder.codec_context();
|
||||||
|
(*stream).sample_aspect_ratio = (*encoder_ctx).sample_aspect_ratio;
|
||||||
(*stream).time_base = (*encoder_ctx).time_base;
|
(*stream).time_base = (*encoder_ctx).time_base;
|
||||||
(*stream).avg_frame_rate = (*encoder_ctx).framerate;
|
|
||||||
(*stream).r_frame_rate = (*encoder_ctx).framerate;
|
|
||||||
|
|
||||||
Ok(stream)
|
Ok(stream)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user