From 443d57e5c29470d62d81bf994384862b87496d2e Mon Sep 17 00:00:00 2001
From: Fredrik Mellbin <fredrik.mellbin@gmail.com>
Date: Thu, 2 Oct 2008 18:04:22 +0000
Subject: [PATCH] FFmpegSource2: fix indexing memory leak

Originally committed to SVN as r2409.
---
 FFmpegSource2/indexing.cpp | 42 ++++++++++++++------------------------
 1 file changed, 15 insertions(+), 27 deletions(-)

diff --git a/FFmpegSource2/indexing.cpp b/FFmpegSource2/indexing.cpp
index 0570c090c..fa48734d3 100644
--- a/FFmpegSource2/indexing.cpp
+++ b/FFmpegSource2/indexing.cpp
@@ -66,9 +66,8 @@ public:
 
 	~FFAudioContext() {
 		delete W64W;
-//		FIXME, why is there an access violation here?
-//		if (CTX)
-//			avcodec_close(CTX);
+		if (CTX)
+			avcodec_close(CTX);
 	}
 };
 
@@ -76,17 +75,23 @@ class MatroskaIndexMemory {
 private:
 	int16_t *DecodingBuffer;
 	MatroskaAudioContext *AudioContexts;
+	MatroskaFile *MF;
+	MatroskaReaderContext *MC;
 public:
-	MatroskaIndexMemory(int Tracks, int16_t *&DecodingBuffer, MatroskaAudioContext *&AudioContexts) {
+	MatroskaIndexMemory(int Tracks, int16_t *&DecodingBuffer, MatroskaAudioContext *&AudioContexts, MatroskaFile *MF, MatroskaReaderContext *MC) {
 		DecodingBuffer = new int16_t[AVCODEC_MAX_AUDIO_FRAME_SIZE*10];
 		AudioContexts = new MatroskaAudioContext[Tracks];
 		this->DecodingBuffer = DecodingBuffer;
 		this->AudioContexts = AudioContexts;
+		this->MF = MF;
+		this->MC = MC;
 	}
 
 	~MatroskaIndexMemory() {
 		delete [] DecodingBuffer;
 		delete [] AudioContexts;
+		mkv_Close(MF);
+		fclose(MC->ST.fp);
 	}
 };
 
@@ -94,33 +99,20 @@ class FFIndexMemory {
 private:
 	int16_t *DecodingBuffer;
 	FFAudioContext *AudioContexts;
+	AVFormatContext *FormatContext;
 public:
-	FFIndexMemory(int Tracks, int16_t *&DecodingBuffer, FFAudioContext *&AudioContexts) {
+	FFIndexMemory(int Tracks, int16_t *&DecodingBuffer, FFAudioContext *&AudioContexts, AVFormatContext *&FormatContext) {
 		DecodingBuffer = new int16_t[AVCODEC_MAX_AUDIO_FRAME_SIZE*10];
 		AudioContexts = new FFAudioContext[Tracks];
 		this->DecodingBuffer = DecodingBuffer;
 		this->AudioContexts = AudioContexts;
+		this->FormatContext = FormatContext;
 	}
 
 	~FFIndexMemory() {
 		delete [] DecodingBuffer;
 		delete [] AudioContexts;
-	}
-};
-
-class MatroskaMemory {
-private:
-	MatroskaFile *MF;
-	MatroskaReaderContext *MC;
-public:
-	MatroskaMemory(MatroskaFile *MF, MatroskaReaderContext *MC) {
-		this->MF = MF;
-		this->MC = MC;
-	}
-
-	~MatroskaMemory() {
-		mkv_Close(MF);
-		fclose(MC->ST.fp);
+		av_close_input_file(FormatContext);
 	}
 };
 
@@ -189,13 +181,11 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
 		return NULL;
 	}
 
-	MatroskaMemory MM = MatroskaMemory(MF, &MC);
-
 	// Audio stuff
 
 	int16_t *db;
 	MatroskaAudioContext *AudioContexts;
-	MatroskaIndexMemory IM = MatroskaIndexMemory(mkv_GetNumTracks(MF), db, AudioContexts);
+	MatroskaIndexMemory IM = MatroskaIndexMemory(mkv_GetNumTracks(MF), db, AudioContexts, MF, &MC);
 
 	for (unsigned int i = 0; i < mkv_GetNumTracks(MF); i++) {
 		if (IndexMask & (1 << i) && mkv_GetTrackInfo(MF, i)->Type == TT_AUDIO) {
@@ -341,7 +331,7 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
 
 	int16_t *db;
 	FFAudioContext *AudioContexts;
-	FFIndexMemory IM = FFIndexMemory(FormatContext->nb_streams, db, AudioContexts);
+	FFIndexMemory IM = FFIndexMemory(FormatContext->nb_streams, db, AudioContexts, FormatContext);
 
 	for (unsigned int i = 0; i < FormatContext->nb_streams; i++) {
 		if (IndexMask & (1 << i) && FormatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) {
@@ -439,8 +429,6 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
 		av_free_packet(&Packet);
 	}
 
-	av_close_input_file(FormatContext);
-
 	SortTrackIndices(TrackIndices);
 	return TrackIndices;
 }
-- 
GitLab