diff --git a/mythtv/libs/libmythtv/avformatwriter.cpp b/mythtv/libs/libmythtv/avformatwriter.cpp index 57da79f3ab5..282c5879226 100644 --- a/mythtv/libs/libmythtv/avformatwriter.cpp +++ b/mythtv/libs/libmythtv/avformatwriter.cpp @@ -60,8 +60,8 @@ AVFormatWriter::~AVFormatWriter() if (m_ctx) { - av_write_trailer(m_ctx); - avio_close(m_ctx->pb); + (void)av_write_trailer(m_ctx); + avio_closep(&m_ctx->pb); for(unsigned int i = 0; i < m_ctx->nb_streams; i++) { av_freep(&m_ctx->streams[i]); } @@ -76,6 +76,8 @@ AVFormatWriter::~AVFormatWriter() if (m_audPicture) avcodec_free_frame(&m_audPicture); + + Cleanup(); } bool AVFormatWriter::Init(void) @@ -171,6 +173,7 @@ bool AVFormatWriter::OpenFile(void) if (!m_ringBuffer) { + Cleanup(); LOG(VB_RECORD, LOG_ERR, LOC + "OpenFile(): RingBuffer::Create() failed"); return false; @@ -181,23 +184,38 @@ bool AVFormatWriter::OpenFile(void) uc->prot = AVFRingBuffer::GetRingBufferURLProtocol(); uc->priv_data = (void *)m_avfRingBuffer; - avformat_write_header(m_ctx, NULL); + if (avformat_write_header(m_ctx, NULL) < 0) + { + Cleanup(); + return false; + } return true; } +void AVFormatWriter::Cleanup(void) +{ + if (m_ctx && m_ctx->pb) + { + avio_closep(&m_ctx->pb); + } + delete m_avfRingBuffer; + m_avfRingBuffer = NULL; + delete m_ringBuffer; + m_ringBuffer = NULL; +} + bool AVFormatWriter::CloseFile(void) { if (m_ctx) { - av_write_trailer(m_ctx); + (void)av_write_trailer(m_ctx); avio_close(m_ctx->pb); for(unsigned int i = 0; i < m_ctx->nb_streams; i++) { av_freep(&m_ctx->streams[i]); } - av_free(m_ctx); - m_ctx = NULL; + av_freep(&m_ctx); } return true; diff --git a/mythtv/libs/libmythtv/avformatwriter.h b/mythtv/libs/libmythtv/avformatwriter.h index 81666e7ec9c..6f0be09a7c7 100644 --- a/mythtv/libs/libmythtv/avformatwriter.h +++ b/mythtv/libs/libmythtv/avformatwriter.h @@ -37,6 +37,7 @@ class MTV_PUBLIC AVFormatWriter : public FileWriterBase AVStream *AddAudioStream(void); bool OpenAudio(void); AVFrame *AllocPicture(enum PixelFormat pix_fmt); + void Cleanup(void); AVRational GetCodecTimeBase(void); bool FindAudioFormat(AVCodecContext *ctx, AVCodec *c, AVSampleFormat format);