Index: /dsfilters/dec_mpc/src/mpc_filter.cpp
===================================================================
--- /dsfilters/dec_mpc/src/mpc_filter.cpp	(revision 371)
+++ /dsfilters/dec_mpc/src/mpc_filter.cpp	(revision 372)
@@ -404,5 +404,5 @@
 
 		// something went wrong. stop decoding.
-		if (FAILED(hr)) break;
+		if (FAILED(hr)) return hr;
 	}
 
Index: /dsfilters/demux_mpc/src/mpc_file.cpp
===================================================================
--- /dsfilters/demux_mpc/src/mpc_file.cpp	(revision 371)
+++ /dsfilters/demux_mpc/src/mpc_file.cpp	(revision 372)
@@ -271,5 +271,7 @@
 	do {
 		ret = packet->Load(reader);
-		if (ret < 0) return ret;
+		if (ret < 0) {
+			return ret;
+		}
 
 		switch (packet->key) {
@@ -282,5 +284,9 @@
 				return 0;			// we got one
 			}
-		case MPC_KEY('S','E'):	return -1;			// end of stream
+		case MPC_KEY('S','E'):
+			{
+				return -2;
+			}
+			break;
 		}
 
@@ -375,10 +381,21 @@
 
 	// end of stream
-	if (file_position >= avail) return -1;
-
-	ret = reader->GetKey(key_val);					if (ret < 0) return ret;
-	ret = reader->GetSizeElm(size_val, size_len);	if (ret < 0) return ret;
+	if (file_position >= avail) {
+		return -2;
+	}
+
+	ret = reader->GetKey(key_val);					
+	if (ret < 0) {
+		return ret;
+	}
+	ret = reader->GetSizeElm(size_val, size_len);	
+	if (ret < 0) {
+		return ret;
+	}
+
 	// if the key is not valid, quit
-	if (!reader->KeyValid(key_val)) return -1;
+	if (!reader->KeyValid(key_val)) {
+		return -1;
+	}
 	key = key_val;
 
@@ -391,8 +408,11 @@
 	// roll back the bytes
 	reader->Seek(file_position);
-	ret = reader->Read(packet, packet_size);		if (ret < 0) return ret;
-
-	return 0;
-}
-
-
+	ret = reader->Read(packet, packet_size);		
+	if (ret < 0) {
+		return ret;
+	}
+
+	return 0;
+}
+
+
Index: /dsfilters/demux_mpc/src/mpc_filter.cpp
===================================================================
--- /dsfilters/demux_mpc/src/mpc_filter.cpp	(revision 371)
+++ /dsfilters/demux_mpc/src/mpc_filter.cpp	(revision 372)
@@ -338,16 +338,22 @@
 				if (output.GetCount() <= 0) break;
 				if (output[0]->IsConnected() == FALSE) break;
+				int	delivered = 0;
 
 				do {
 
 					// are we supposed to abort ?
-					if (ev_abort.Check()) { 
-						ret = 0; 
+					if (ev_abort.Check()) {
 						break; 
 					}
 
 					ret = file->ReadAudioPacket(&packet, &current_sample);
+					if (ret == -2) {
+						// end of stream
+						if (!ev_abort.Check()) {
+							output[0]->DoEndOfStream();
+						}
+						break;
+					} else
 					if (ret < 0) {
-						// end of stream
 						break;
 					} else {
@@ -359,14 +365,11 @@
 
 						// deliver packet
-						output[0]->DeliverPacket(packet);
+						hr = output[0]->DeliverPacket(packet);
+						if (FAILED(hr)) break;
+
+						delivered++;
 					}
 
 				} while (!CheckRequest(&cmd2));
-
-				// end of stream
-				if (ret == -1) {
-					output[0]->DoEndOfStream();
-				}
-
 			}
 			break;
@@ -484,30 +487,30 @@
 	if (reader) reader->BeginFlush();
 
-	for (int i=0; i<output.GetCount(); i++) {
-		CMPCOutputPin	*pin = output[i];
-		if (pin->IsConnected()) {
-			// abort
-			if (m_State != State_Stopped) {
-				if (pin->ThreadExists()) {
-					pin->ev_abort.Set();
-					pin->DeliverBeginFlush();
-					pin->CallWorker(CMD_STOP);
-					pin->FlushQueue();
-				}
+	CMPCOutputPin	*pin = output[0];
+	FILTER_STATE	state = m_State;
+
+	if (pin->IsConnected()) {
+		// abort
+		if (state != State_Stopped) {
+			if (pin->ThreadExists()) {
+				pin->ev_abort.Set();
+				pin->DeliverBeginFlush();
+
+				pin->CallWorker(CMD_STOP);
+				pin->FlushQueue();
 			}
 		}
 	}
 
-	for (int i=0; i<output.GetCount(); i++) {
-		CMPCOutputPin	*pin = output[i];
-		if (pin->IsConnected()) {
-			if (m_State != State_Stopped) {
-				if (pin->ThreadExists()) {
-					pin->ev_abort.Reset();
-					pin->DeliverEndFlush();
-				}
+	if (reader) reader->EndFlush();
+
+	if (pin->IsConnected()) {
+		if (state != State_Stopped) {
+			if (pin->ThreadExists()) {
+				pin->ev_abort.Reset();
+				pin->DeliverEndFlush();
 			}
-			pin->DoNewSegment(rtCurrent, rtStop, rate);
-		}
+		}
+		pin->DoNewSegment(rtCurrent, rtStop, rate);
 	}
 
@@ -515,5 +518,4 @@
 		CallWorker(CMD_STOP);
 	}
-	if (reader) reader->EndFlush();
 
 	// seek the file
@@ -528,14 +530,10 @@
 	}
 
-	for (int i=0; i<output.GetCount(); i++) {
-		CMPCOutputPin	*pin = output[i];
-
-		// we only care about connected pins
-		if (pin->IsConnected()) {
-			if (m_State != State_Stopped) {
-				// spustime aj jeho thread
-				if (pin->ThreadExists()) {
-					pin->CallWorker(CMD_RUN);
-				}
+	if (pin->IsConnected()) {
+		if (state != State_Stopped) {
+			// spustime aj jeho thread
+			if (pin->ThreadExists()) {
+				pin->FlushQueue();
+				pin->CallWorker(CMD_RUN);
 			}
 		}
@@ -594,4 +592,5 @@
 
 		if (reader) reader->EndFlush();
+		ev_abort.Reset();
 	}
 
Index: /dsfilters/demux_mpc/src/mpc_pin.cpp
===================================================================
--- /dsfilters/demux_mpc/src/mpc_pin.cpp	(revision 371)
+++ /dsfilters/demux_mpc/src/mpc_pin.cpp	(revision 372)
@@ -248,4 +248,13 @@
 	ev_abort.Reset();
 
+	HRESULT hr = CBaseOutputPin::Active();
+	if (FAILED(hr)) {
+		active = FALSE;
+		return hr;
+	}
+
+	// new segment
+	DoNewSegment(rtStart, rtStop, rate);
+
 	// vytvorime novu queue
 	if (!ThreadExists()) {
@@ -254,12 +263,4 @@
 	}
 
-	HRESULT hr = CBaseOutputPin::Active();
-	if (FAILED(hr)) {
-		active = FALSE;
-		return hr;
-	}
-
-	// new segment
-	DoNewSegment(rtStart, rtStop, rate);
 	active = TRUE;
 	return hr;
@@ -343,4 +344,7 @@
 HRESULT CMPCOutputPin::DeliverPacket(CMPCPacket &packet)
 {
+	// we don't accept packets while aborting...
+	if (ev_abort.Check()) return E_FAIL;
+
 	// ziskame novy packet na vystup
 	DataPacket	*outp = NULL;
@@ -388,7 +392,5 @@
 HRESULT CMPCOutputPin::DoEndOfStream()
 {
-	DataPacket	*packet;
-	int ret = GetDataPacket(&packet);
-	if (ret < 0 || !packet) return E_FAIL;
+	DataPacket	*packet = new DataPacket();
 
 	// naqueueujeme EOS
@@ -413,12 +415,4 @@
 	ev_can_read.Reset();
 	ev_can_write.Set();
-
-	// we return buffer level only for the first pin
-	/*
-	if (stream_index == demux->buf_index) {
-		//MonoBase::AutoLock	lck2(&demux->lock_info);
-		demux->buf_size_ms = GetBufferTime_MS();
-	}
-	*/
 }
 
@@ -538,31 +532,4 @@
 						if (packet->type == DataPacket::PACKET_TYPE_DATA) {
 							hr = DeliverDataPacket(*packet);
-							if (SUCCEEDED(hr)) {
-
-								/*
-								if (stream_index == demux->buf_index) {
-									int	size = GetBufferTime_MS();
-									{
-										MonoBase::AutoLock	lck2(&demux->lock_info);
-										demux->buf_size_ms = size;
-										demux->NotifyEvent(EC_BUFFER_STATE, size, demux->internal_buffer_size);		// v milisekundach
-									}
-									demux->UpdatePage(1);
-
-									// posleme notifikaciu, ze data boli dorucene
-									if (is_first) {
-										is_first = false;
-										demux->NotifyEvent(EC_FRAME_READY, 0, 0);
-									}
-
-									// starvation
-									if (size < 0.05*demux->internal_buffer_size && !eos_delivered &&
-										demux->ev_ready.Check() == TRUE
-										) {
-										demux->NotifyStarvation();
-									}
-								}
-								*/
-							}
 						}					
 
@@ -596,5 +563,5 @@
 	reader = rd;
 	reader->AddRef();
-	pos = 0;
+	position = 0;
 }
 
@@ -623,5 +590,5 @@
 
 	// aktualna pozicia
-	if (pos) *pos = this->pos;
+	if (pos) *pos = position;
 	return 0;
 }
@@ -634,5 +601,5 @@
 
 	// seekneme
-	this->pos = pos;
+	position = pos;
 	return 0;
 }
@@ -642,13 +609,17 @@
 	__int64	avail, total;
 	GetSize(&avail, &total);
-	if (pos + size > avail) return -1;
+	if (position + size > avail) {
+		return -1;
+	}
 
 	// TODO: Caching here !!!!
 
-	HRESULT hr = reader->SyncRead(pos, size, (BYTE*)buf);
-	if (FAILED(hr)) return -2;
+	HRESULT hr = reader->SyncRead(position, size, (BYTE*)buf);
+	if (FAILED(hr)) {
+		return -1;
+	}
 
 	// update position
-	pos += size;
+	position += size;
 	return 0;
 }
Index: /dsfilters/demux_mpc/src/mpc_pin.h
===================================================================
--- /dsfilters/demux_mpc/src/mpc_pin.h	(revision 371)
+++ /dsfilters/demux_mpc/src/mpc_pin.h	(revision 372)
@@ -191,5 +191,5 @@
 protected:
 	IAsyncReader	*reader;
-	__int64			pos;
+	__int64			position;
 
 public:
Index: /dsfilters/demux_mpc/src/mpc_reg.cpp
===================================================================
--- /dsfilters/demux_mpc/src/mpc_reg.cpp	(revision 371)
+++ /dsfilters/demux_mpc/src/mpc_reg.cpp	(revision 372)
@@ -95,6 +95,36 @@
 //-----------------------------------------------------------------------------
 
+
+HRESULT Register_MPC_Types()
+{
+	CRegKey	r;
+	if (r.Create(HKEY_CLASSES_ROOT, _T("Media Type\\{E436EB83-524F-11CE-9F53-0020AF0BA770}\\{229F9AD7-2F4D-4b45-B858-A3F434E7179A}")) != ERROR_SUCCESS) {
+		return E_FAIL;
+	}
+
+	// write the string
+	r.SetStringValue(_T("0"), _T("0,4,,4D50434B"));											// MPCK
+	r.SetStringValue(_T("Source Filter"), _T("{E436EBB5-524F-11CE-9F53-0020AF0BA770}"));	// file source async
+	r.Close();
+
+	return NOERROR;
+}
+
+HRESULT Unregister_MPC_Types()
+{
+	CRegKey	r;
+	if (r.Create(HKEY_CLASSES_ROOT, _T("Media Type\\{E436EB83-524F-11CE-9F53-0020AF0BA770}")) == ERROR_SUCCESS) {
+		r.DeleteSubKey(_T("{229F9AD7-2F4D-4b45-B858-A3F434E7179A}"));
+		r.Close();
+	}
+
+	return NOERROR;
+}
+
 STDAPI DllRegisterServer() 
 {
+	HRESULT hr = Register_MPC_Types();
+	if (FAILED(hr)) return hr;
+
 	return AMovieDllRegisterServer2(TRUE);
 }
@@ -102,4 +132,5 @@
 STDAPI DllUnregisterServer()
 {
+	Unregister_MPC_Types();
 	return AMovieDllRegisterServer2(FALSE);
 }
