Index: /libmpc/branches/r2d/include/mpc/mpc_types.h
===================================================================
--- /libmpc/branches/r2d/include/mpc/mpc_types.h	(revision 203)
+++ /libmpc/branches/r2d/include/mpc/mpc_types.h	(revision 204)
@@ -45,5 +45,5 @@
 #endif
 
-#ifdef WIN32
+#ifdef _MSC_VER
 typedef __int8           mpc_int8_t;
 typedef unsigned __int8  mpc_uint8_t;
Index: /libmpc/branches/r2d/libmpcenc/bitstream.c
===================================================================
--- /libmpc/branches/r2d/libmpcenc/bitstream.c	(revision 203)
+++ /libmpc/branches/r2d/libmpcenc/bitstream.c	(revision 204)
@@ -194,5 +194,5 @@
 }
 
-void writeBlock ( mpc_encoder_t * e, const char * key, const mpc_bool_t addCRC)
+mpc_uint32_t writeBlock ( mpc_encoder_t * e, const char * key, const mpc_bool_t addCRC, mpc_uint32_t min_size)
 {
 	FILE * fp = e->outputFile;
@@ -200,5 +200,5 @@
 	mpc_uint8_t * datas = e->buffer;
 	char blockSize[10];
-	mpc_uint_t len;
+	mpc_uint32_t len;
 
 	writeBits(e, 0, (8 - e->bitsCount) % 8);
@@ -206,9 +206,16 @@
 
 	// write block header (key / length)
-	len = encodeSize(e->pos + 2 + (addCRC ? 4 : 0), blockSize, MPC_TRUE);
+	len = e->pos + 2 + (addCRC > 0) * 4;
+	if (min_size <= len)
+		min_size = len;
+	else {
+		mpc_uint32_t pad = min_size - len, i;
+		for(i = 0; i < pad; i++)
+			writeBits(e, 0, 8);
+	}
+	len = encodeSize(min_size, blockSize, MPC_TRUE);
 	fwrite(key, sizeof(char), 2, fp);
 	fwrite(blockSize, sizeof(char), len, fp);
 	e->outputBits += (len + 2) * 8;
-
 
 	if (addCRC) {
@@ -236,4 +243,6 @@
 	}
 	e->framesInBlock = 0;
+
+	return min_size;
 }
 
Index: /libmpc/branches/r2d/libmpcenc/encode_sv7.c
===================================================================
--- /libmpc/branches/r2d/libmpcenc/encode_sv7.c	(revision 203)
+++ /libmpc/branches/r2d/libmpcenc/encode_sv7.c	(revision 204)
@@ -24,16 +24,6 @@
 #include <mpc/minimax.h>
 
-// bitstream.c
-void writeBits (mpc_encoder_t * e, mpc_uint32_t input, unsigned int bits );
-unsigned int encodeSize(mpc_uint64_t, char *, mpc_bool_t);
-void encodeEnum(mpc_encoder_t * e, const mpc_uint32_t bits, const mpc_uint_t N);
-void encodeLog(mpc_encoder_t * e, mpc_uint32_t value, mpc_uint32_t max);
-void writeBlock ( mpc_encoder_t * e, const char * key, const mpc_bool_t addCRC);
-
-void       Init_Huffman_Encoder_SV7   ( void );
-
-void   Klemm ( void );
-
-void   Init_Skalenfaktoren             ( void );
+void Klemm ( void );
+void Init_Skalenfaktoren ( void );
 
 // huffsv7.c
@@ -358,5 +348,5 @@
 		}
 		e->block_cnt++;
-		writeBlock(e, "AD", MPC_FALSE);
+		writeBlock(e, "AD", MPC_FALSE, 0);
 	}
 }
Index: /libmpc/branches/r2d/libmpcenc/libmpcenc.h
===================================================================
--- /libmpc/branches/r2d/libmpcenc/libmpcenc.h	(revision 203)
+++ /libmpc/branches/r2d/libmpcenc/libmpcenc.h	(revision 204)
@@ -88,5 +88,5 @@
 						 const int version_implement,
 						 const int version_build );
- void writeBlock ( mpc_encoder_t * e, const char * key, const mpc_bool_t addCRC);
+ mpc_uint32_t writeBlock ( mpc_encoder_t *, const char *, const mpc_bool_t, mpc_uint32_t);
  void writeMagic (mpc_encoder_t * e);
  void writeBits (mpc_encoder_t * e, mpc_uint32_t input, unsigned int bits );
@@ -94,2 +94,7 @@
  void writeBitstream_SV8 ( mpc_encoder_t*, int);
 
+ unsigned int encodeSize(mpc_uint64_t, char *, mpc_bool_t);
+ void encodeEnum(mpc_encoder_t * e, const mpc_uint32_t bits, const mpc_uint_t N);
+ void encodeLog(mpc_encoder_t * e, mpc_uint32_t value, mpc_uint32_t max);
+
+
Index: /libmpc/branches/r2d/libwavformat/libwaveformat.h
===================================================================
--- /libmpc/branches/r2d/libwavformat/libwaveformat.h	(revision 203)
+++ /libmpc/branches/r2d/libwavformat/libwaveformat.h	(revision 204)
@@ -11,5 +11,5 @@
 //general declarations
 
-#ifdef WIN32
+#ifdef _MSC_VER
 typedef __int8 t_wav_int8;
 typedef unsigned __int8 t_wav_uint8;
Index: /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c
===================================================================
--- /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c	(revision 203)
+++ /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c	(revision 204)
@@ -80,4 +80,5 @@
 	mpc_status err;
 	mpc_encoder_t e;
+	mpc_uint_t si_size;
 
     printf("mpc2sv8 - musepack (mpc) sv7 to sv8 converter\n");
@@ -105,11 +106,11 @@
 	writeStreamInfo( &e, si.max_band, si.ms > 0, si.samples, si.sample_freq,
 					  si.channels); // FIXME : convert replay gain info
-	writeBlock(&e, "SI", MPC_TRUE);
+	si_size = writeBlock(&e, "SI", MPC_TRUE, 0);
 	writeEncoderInfo(&e, si.profile, si.pns, 0, 0, 0, 0); // FIXME : convert encoder information
-	writeBlock(&e, "EI", MPC_FALSE);
+	writeBlock(&e, "EI", MPC_FALSE, 0);
 	e.seek_ptr = ftell(e.outputFile);
 	writeBits (&e, 0, 8);
 	writeBits (&e, 0, 32); // jump 40 bits for seek table pointer
-	writeBlock(&e, "SP", MPC_FALSE); // reserve space for seek pointer
+	writeBlock(&e, "SP", MPC_FALSE, 0); // reserve space for seek pointer
 	while(MPC_TRUE)
 	{
@@ -130,9 +131,15 @@
 		e.seek_pos++;
 	}
-	writeBlock(&e, "AD", MPC_FALSE);
+	writeBlock(&e, "AD", MPC_FALSE, 0);
 	writeSeekTable(&e);
-	writeBlock(&e, "ST", MPC_FALSE); // write seek table block
-	writeBlock(&e, "SE", MPC_FALSE); // write end of stream block
-	// FIXME : put correct stream length in SI block
+	writeBlock(&e, "ST", MPC_FALSE, 0); // write seek table block
+	writeBlock(&e, "SE", MPC_FALSE, 0); // write end of stream block
+	if (demux->d->samples != si.samples) {
+		fseek(e.outputFile, e.seek_ref + 4, SEEK_SET);
+		writeStreamInfo( &e, si.max_band, si.ms > 0, demux->d->samples,
+						  si.sample_freq, si.channels);
+		writeBlock(&e, "SI", MPC_TRUE, si_size);
+		fseek(e.outputFile, 0, SEEK_END);
+	}
 
 	// copie fin fichier
Index: /libmpc/branches/r2d/mpcenc/mpcenc.c
===================================================================
--- /libmpc/branches/r2d/mpcenc/mpcenc.c	(revision 203)
+++ /libmpc/branches/r2d/mpcenc/mpcenc.c	(revision 204)
@@ -1611,12 +1611,12 @@
 	writeStreamInfo ( &e, m.Max_Band, m.MS_Channelmode > 0, SamplesInWAVE,
 					   m.SampleFreq, Wave.Channels > 2 ? 2 : Wave.Channels);
-	writeBlock(&e, "SI", MPC_TRUE);
+	writeBlock(&e, "SI", MPC_TRUE, 0);
 	writeEncoderInfo(&e, m.FullQual, m.PNS > 0, MPPENC_MAJOR, MPPENC_MINOR,
 					  MPPENC_IMPLEMENT, MPPENC_BUILD);
-	writeBlock(&e, "EI", MPC_FALSE);
+	writeBlock(&e, "EI", MPC_FALSE, 0);
 	e.seek_ptr = ftell(e.outputFile);
 	writeBits (&e, 0, 8);
 	writeBits (&e, 0, 32); // jump 40 bits for seek table pointer
-	writeBlock(&e, "SP", MPC_FALSE); // reserve space for seek pointer
+	writeBlock(&e, "SP", MPC_FALSE, 0); // reserve space for seek pointer
 
 
@@ -1723,8 +1723,8 @@
 		e.seek_pos++;
 	}
-	writeBlock(&e, "AD", MPC_FALSE);
+	writeBlock(&e, "AD", MPC_FALSE, 0);
 	writeSeekTable(&e);
-	writeBlock(&e, "ST", MPC_FALSE); // write seek table block
-	writeBlock(&e, "SE", MPC_FALSE); // write end of stream block
+	writeBlock(&e, "ST", MPC_FALSE, 0); // write seek table block
+	writeBlock(&e, "SE", MPC_FALSE, 0); // write end of stream block
     ShowProgress (&m, SamplesInWAVE, SamplesInWAVE, e.outputBits );
 
