diff --git a/FFmpegSource2/ffaudiosource.cpp b/FFmpegSource2/ffaudiosource.cpp
index 9df353c232a0dfbc075e4e84bcdb0ff3b5c54230..6a86deb14dabe9b0d99209a033281098fe1f99cb 100644
--- a/FFmpegSource2/ffaudiosource.cpp
+++ b/FFmpegSource2/ffaudiosource.cpp
@@ -19,6 +19,8 @@
 //  THE SOFTWARE.
 
 #include "ffaudiosource.h"
+#include <errno.h>
+
 
 
 AudioBase::AudioBase() {
diff --git a/FFmpegSource2/ffavsfilters.cpp b/FFmpegSource2/ffavsfilters.cpp
index d059d0a3b998e387f9a3d484af6f61b669a1f317..bbc0c25fbdd7b8b81b6548a988815f06b501371e 100644
--- a/FFmpegSource2/ffavsfilters.cpp
+++ b/FFmpegSource2/ffavsfilters.cpp
@@ -62,7 +62,7 @@ AVSValue __cdecl CreateFFIndex(AVSValue Args, void* UserData, IScriptEnvironment
 
 	FrameIndex *Index;
 	if (OverWrite || !(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) {
-		if (!(Index = FFMS_MakeIndex(Source, IndexMask, DumpMask, AudioFile, NULL, NULL, ErrorMsg, MsgSize)))
+		if (!(Index = FFMS_MakeIndex(Source, IndexMask, DumpMask, AudioFile, true, NULL, NULL, ErrorMsg, MsgSize)))
 			Env->ThrowError("FFIndex: %s", ErrorMsg);
 		if (FFMS_WriteIndex(CacheFile, Index, ErrorMsg, MsgSize)) {
 			FFMS_DestroyFrameIndex(Index);
@@ -119,7 +119,7 @@ AVSValue __cdecl CreateFFVideoSource(AVSValue Args, void* UserData, IScriptEnvir
 	FrameIndex *Index;
 	if (Cache) {
 		if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) {
-			if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, NULL, NULL, ErrorMsg, MsgSize)))
+			if (!(Index = FFMS_MakeIndex(Source, 0, 0, NULL, true, NULL, NULL, ErrorMsg, MsgSize)))
 				Env->ThrowError("FFVideoSource: %s", ErrorMsg);
 
 			if (Cache)
@@ -176,7 +176,7 @@ AVSValue __cdecl CreateFFAudioSource(AVSValue Args, void* UserData, IScriptEnvir
 	FrameIndex *Index;
 	if (Cache) {
 		if (!(Index = FFMS_ReadIndex(CacheFile, ErrorMsg, MsgSize))) {
-			if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, NULL, NULL, ErrorMsg, MsgSize)))
+			if (!(Index = FFMS_MakeIndex(Source, -1, 0, CacheFile, true, NULL, NULL, ErrorMsg, MsgSize)))
 				Env->ThrowError("FFAudioSource: %s", ErrorMsg);
 
 			if (Cache)
diff --git a/FFmpegSource2/ffms.cpp b/FFmpegSource2/ffms.cpp
index 6454020220a675c7909d837ffa49d18589142327..2305ff4cfa165112aee744297e39a3faafc97e85 100644
--- a/FFmpegSource2/ffms.cpp
+++ b/FFmpegSource2/ffms.cpp
@@ -163,8 +163,8 @@ FFMS_API(int) FFMS_WriteTimecodes(FrameInfoVector *FIV, const char *TimecodeFile
 	return FIV->WriteTimecodes(TimecodeFile, ErrorMsg, MsgSize);
 }
 
-FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
-	return MakeIndex(SourceFile, IndexMask, DumpMask, AudioFile, IP, Private, ErrorMsg, MsgSize);
+FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
+	return MakeIndex(SourceFile, IndexMask, DumpMask, AudioFile, IgnoreDecodeErrors, IP, Private, ErrorMsg, MsgSize);
 }
 
 FFMS_API(FrameIndex *) FFMS_ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize) {
diff --git a/FFmpegSource2/ffms.h b/FFmpegSource2/ffms.h
index bf544f64d979b97a49d2ddd9e6962134d598b6d3..da7d670488a476d6b98fd5d1efd4283589b49964 100644
--- a/FFmpegSource2/ffms.h
+++ b/FFmpegSource2/ffms.h
@@ -182,7 +182,7 @@ FFMS_API(int) FFMS_FrameFromDTS(FrameInfoVector *FIV, int64_t DTS, char *ErrorMs
 FFMS_API(int) FFMS_ClosestFrameFromDTS(FrameInfoVector *FIV, int64_t DTS, char *ErrorMsg, unsigned MsgSize);
 FFMS_API(const TrackTimeBase *) FFMS_GetTimeBase(FrameInfoVector *FIV, char *ErrorMsg, unsigned MsgSize);
 FFMS_API(int) FFMS_WriteTimecodes(FrameInfoVector *FIV, const char *TimecodeFile, char *ErrorMsg, unsigned MsgSize);
-FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize);
+FFMS_API(FrameIndex *) FFMS_MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize);
 FFMS_API(FrameIndex *) FFMS_ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize);
 FFMS_API(int) FFMS_WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize);
 
diff --git a/FFmpegSource2/indexing.cpp b/FFmpegSource2/indexing.cpp
index 57c07eb432139c157c1e0de2411a4ceeb9650ce9..6c6331e1980c40606e2983f8be2eb2c3075be109 100644
--- a/FFmpegSource2/indexing.cpp
+++ b/FFmpegSource2/indexing.cpp
@@ -129,7 +129,7 @@ int WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg,
 	return 0;
 }
 
-static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
+static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
 	MatroskaFile *MF;
 	char ErrorMessage[256];
 	MatroskaReaderContext MC;
@@ -187,7 +187,6 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
 			}
 		} else {
 			IndexMask &= ~(1 << i);
-			DumpMask &= ~(1 << i);
 		}
 	}
 
@@ -233,9 +232,15 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
 				int dbsize = AVCODEC_MAX_AUDIO_FRAME_SIZE*10;
 				int Ret = avcodec_decode_audio2(AudioCodecContext, db, &dbsize, Data, Size);
 				if (Ret < 0) {
-					_snprintf(ErrorMsg, MsgSize, "Audio decoding error");
-					delete TrackIndices;
-					return NULL;
+					if (IgnoreDecodeErrors) {
+						(*TrackIndices)[Track].clear();
+						IndexMask &= ~(1 << Track);					
+						break;
+					} else {
+						_snprintf(ErrorMsg, MsgSize, "Audio decoding error");
+						delete TrackIndices;
+						return NULL;
+					}
 				}
 
 				if (Ret > 0) {
@@ -269,7 +274,7 @@ static FrameIndex *MakeMatroskaIndex(const char *SourceFile, int IndexMask, int
 	return TrackIndices;
 }
 
-FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
+FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize) {
 	AVFormatContext *FormatContext = NULL;
 	IndexMask |= DumpMask;
 
@@ -281,7 +286,7 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
 	// Do matroska indexing instead?
 	if (!strcmp(FormatContext->iformat->name, "matroska")) {
 		av_close_input_file(FormatContext);
-		return MakeMatroskaIndex(SourceFile, IndexMask, DumpMask, AudioFile, IP, Private, ErrorMsg, MsgSize);
+		return MakeMatroskaIndex(SourceFile, IndexMask, DumpMask, AudioFile, IgnoreDecodeErrors, IP, Private, ErrorMsg, MsgSize);
 	}
 	
 	if (av_find_stream_info(FormatContext) < 0) {
@@ -312,7 +317,6 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
 			}
 		} else {
 			IndexMask &= ~(1 << i);
-			DumpMask &= ~(1 << i);
 		}
 	}
 
@@ -350,9 +354,15 @@ FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const
 					int dbsize = AVCODEC_MAX_AUDIO_FRAME_SIZE*10;
 					int Ret = avcodec_decode_audio2(AudioCodecContext, db, &dbsize, Data, Size);
 					if (Ret < 0) {
-						_snprintf(ErrorMsg, MsgSize, "Audio decoding error");
-						delete TrackIndices;
-						return NULL;
+						if (IgnoreDecodeErrors) {
+							(*TrackIndices)[Packet.stream_index].clear();
+							IndexMask &= ~(1 << Packet.stream_index);					
+							break;
+						} else {
+							_snprintf(ErrorMsg, MsgSize, "Audio decoding error");
+							delete TrackIndices;
+							return NULL;
+						}
 					}
 
 					if (Ret > 0) {
diff --git a/FFmpegSource2/indexing.h b/FFmpegSource2/indexing.h
index 241d441aae6331293370be7f1cbd9c4639f4495d..886599361dd43f943f1af9b37613451070c86858 100644
--- a/FFmpegSource2/indexing.h
+++ b/FFmpegSource2/indexing.h
@@ -62,7 +62,7 @@ public:
 	int Decoder;
 };
 
-FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize);
+FrameIndex *MakeIndex(const char *SourceFile, int IndexMask, int DumpMask, const char *AudioFile, bool IgnoreDecodeErrors, IndexCallback IP, void *Private, char *ErrorMsg, unsigned MsgSize);
 FrameIndex *ReadIndex(const char *IndexFile, char *ErrorMsg, unsigned MsgSize);
 int WriteIndex(const char *IndexFile, FrameIndex *TrackIndices, char *ErrorMsg, unsigned MsgSize);