Index: /libmpc/branches/r2d/include/mpc/mpcdec.h
===================================================================
--- /libmpc/branches/r2d/include/mpc/mpcdec.h	(revision 204)
+++ /libmpc/branches/r2d/include/mpc/mpcdec.h	(revision 205)
@@ -109,4 +109,5 @@
 mpc_status mpc_demux_seek_sample(mpc_demux * d, mpc_uint64_t destsample);
 mpc_status mpc_demux_seek_second(mpc_demux * d, double seconds);
+mpc_size_t mpc_demux_pos(mpc_demux * d);
 
 
Index: /libmpc/branches/r2d/libmpcdec/mpc_demux.c
===================================================================
--- /libmpc/branches/r2d/libmpcdec/mpc_demux.c	(revision 204)
+++ /libmpc/branches/r2d/libmpcdec/mpc_demux.c	(revision 205)
@@ -143,5 +143,5 @@
  * @return current stream position in bits
  */
-static mpc_size_t mpc_demux_pos(mpc_demux * d)
+mpc_size_t mpc_demux_pos(mpc_demux * d)
 {
 	return ((d->r->tell(d->r) - d->bytes_total + d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count;
Index: /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c
===================================================================
--- /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c	(revision 204)
+++ /libmpc/branches/r2d/mpc2sv8/mpc2sv8.c	(revision 205)
@@ -34,8 +34,11 @@
 #include <stdio.h>
 #include <mpc/mpcdec.h>
+#include <mpc/minimax.h>
 
 #include "../libmpcdec/decoder.h"
 #include "../libmpcdec/internal.h"
 #include "../libmpcenc/libmpcenc.h"
+
+#define TMP_BUF_SIZE 128
 
 static void datacpy(mpc_decoder * d, mpc_encoder_t * e)
@@ -81,4 +84,8 @@
 	mpc_encoder_t e;
 	mpc_uint_t si_size;
+	mpc_size_t stream_size;
+	size_t r_size;
+	FILE * in_file;
+	char buf[TMP_BUF_SIZE];
 
     printf("mpc2sv8 - musepack (mpc) sv7 to sv8 converter\n");
@@ -99,7 +106,18 @@
 	e.MS_Channelmode = si.ms;
 
-	// copie dÃ©but fichier
+	// copy begining of file
+	in_file = fopen(argv[1], "rb");
+	if(in_file == 0) return !MPC_STATUS_OK;
+	r_size = si.header_position;
+	while(r_size) {
+		size_t tmp_size = fread(buf, 1, mini(TMP_BUF_SIZE, r_size), in_file);
+		if (fwrite(buf, 1, tmp_size, e.outputFile) != tmp_size) {
+			fprintf(stderr, "Error writing to target file");
+			exit(!MPC_STATUS_OK);
+		}
+		r_size -= tmp_size;
+	}
 
-	// conversion stream
+	// stream conversion
 	e.seek_ref = ftell(e.outputFile);
 	writeMagic(&e);
@@ -107,5 +125,6 @@
 					  si.channels); // FIXME : convert replay gain info
 	si_size = writeBlock(&e, "SI", MPC_TRUE, 0);
-	writeEncoderInfo(&e, si.profile, si.pns, 0, 0, 0, 0); // FIXME : convert encoder information
+	writeEncoderInfo(&e, si.profile, si.pns, si.encoder_version / 100,
+					  si.encoder_version % 100, 0, 0);
 	writeBlock(&e, "EI", MPC_FALSE, 0);
 	e.seek_ptr = ftell(e.outputFile);
@@ -127,9 +146,12 @@
 	}
     // write the last incomplete block
-	if ((e.block_cnt & ((1 << e.seek_pwr) - 1)) == 0) {
-		e.seek_table[e.seek_pos] = ftell(e.outputFile);
-		e.seek_pos++;
+	if (e.framesInBlock != 0) {
+		if ((e.block_cnt & ((1 << e.seek_pwr) - 1)) == 0) {
+			e.seek_table[e.seek_pos] = ftell(e.outputFile);
+			e.seek_pos++;
+		}
+		e.block_cnt++;
+		writeBlock(&e, "AD", MPC_FALSE, 0);
 	}
-	writeBlock(&e, "AD", MPC_FALSE, 0);
 	writeSeekTable(&e);
 	writeBlock(&e, "ST", MPC_FALSE, 0); // write seek table block
@@ -143,11 +165,19 @@
 	}
 
-	// copie fin fichier
-
+	// copy end of file
+	stream_size = (((mpc_demux_pos(demux) + 7) >> 3) - si.header_position + 3) & ~3;
+	fseek(in_file, si.header_position + stream_size, SEEK_SET);
+	while((r_size = fread(buf, 1, TMP_BUF_SIZE, in_file))) {
+		if (fwrite(buf, 1, r_size, e.outputFile) != r_size) {
+			fprintf(stderr, "Error writing to target file");
+			break;
+		}
+	}
 
 	fclose ( e.outputFile );
-    mpc_demux_exit(demux);
-    mpc_reader_exit_stdio(&reader);
+	fclose ( in_file );
+	mpc_demux_exit(demux);
+	mpc_reader_exit_stdio(&reader);
 
-    return 0;
+	return MPC_STATUS_OK;
 }
Index: /libmpc/branches/r2d/mpcenc/mpcenc.c
===================================================================
--- /libmpc/branches/r2d/mpcenc/mpcenc.c	(revision 204)
+++ /libmpc/branches/r2d/mpcenc/mpcenc.c	(revision 205)
@@ -1719,9 +1719,12 @@
 
     // write the last incomplete block
-	if ((e.block_cnt & ((1 << e.seek_pwr) - 1)) == 0) {
-		e.seek_table[e.seek_pos] = ftell(e.outputFile);
-		e.seek_pos++;
+	if (e.framesInBlock != 0) {
+		if ((e.block_cnt & ((1 << e.seek_pwr) - 1)) == 0) {
+			e.seek_table[e.seek_pos] = ftell(e.outputFile);
+			e.seek_pos++;
+		}
+		e.block_cnt++;
+		writeBlock(&e, "AD", MPC_FALSE, 0);
 	}
-	writeBlock(&e, "AD", MPC_FALSE, 0);
 	writeSeekTable(&e);
 	writeBlock(&e, "ST", MPC_FALSE, 0); // write seek table block
