Index: /libmpc/branches/r2d/libmpc.kdevelop
===================================================================
--- /libmpc/branches/r2d/libmpc.kdevelop	(revision 149)
+++ /libmpc/branches/r2d/libmpc.kdevelop	(revision 150)
@@ -3,5 +3,5 @@
   <general>
     <author>Nicolas Botti</author>
-    <email></email>
+    <email/>
     <version>0.1</version>
     <projectmanagement>KDevAutoProject</projectmanagement>
@@ -14,5 +14,5 @@
     <projectdirectory>.</projectdirectory>
     <absoluteprojectpath>false</absoluteprojectpath>
-    <description></description>
+    <description/>
   </general>
   <kdevautoproject>
@@ -26,8 +26,8 @@
       <directoryradio>custom</directoryradio>
       <runarguments>
-        <mppenc></mppenc>
+        <mppenc/>
       </runarguments>
       <customdirectory>/</customdirectory>
-      <programargs></programargs>
+      <programargs/>
       <autocompile>true</autocompile>
       <envvars/>
@@ -184,5 +184,5 @@
     </codecompletion>
     <creategettersetter>
-      <prefixGet></prefixGet>
+      <prefixGet/>
       <prefixSet>set</prefixSet>
       <prefixVariable>m_,_</prefixVariable>
@@ -200,10 +200,10 @@
   <kdevdebugger>
     <general>
-      <programargs>~/mdv-startup.mpc</programargs>
-      <gdbpath></gdbpath>
+      <programargs>~/08\ -\ Jimmy\ Jimmy.mpc</programargs>
+      <gdbpath/>
       <dbgshell>libtool</dbgshell>
-      <configGdbScript></configGdbScript>
-      <runShellScript></runShellScript>
-      <runGdbScript></runGdbScript>
+      <configGdbScript/>
+      <runShellScript/>
+      <runGdbScript/>
       <breakonloadinglibs>true</breakonloadinglibs>
       <separatetty>false</separatetty>
Index: /libmpc/branches/r2d/libmpcdec/mpc_bits_reader.c
===================================================================
--- /libmpc/branches/r2d/libmpcdec/mpc_bits_reader.c	(revision 149)
+++ /libmpc/branches/r2d/libmpcdec/mpc_bits_reader.c	(revision 150)
@@ -68,4 +68,33 @@
 }
 
+mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k)
+{
+	unsigned int l = 0;
+	unsigned int code = r->buff[0] & ((1 << r->count) - 1);
+
+	while( code == 0 ) {
+		l += r->count;
+		r->buff++;
+		code = r->buff[0];
+		r->count = 8;
+	}
+
+	while( ((1 << (r->count - 1)) & code) == 0 ) {
+		l++;
+		r->count--;
+	}
+	r->count--;
+
+	while( r->count < k ) {
+		r->buff++;
+		r->count += 8;
+		code = (code << 8) | r->buff[0];
+	}
+
+	r->count -= k;
+
+	return (l << k) | ((code >> r->count) & ((1 << k) - 1));
+}
+
 unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size)
 {
Index: /libmpc/branches/r2d/libmpcdec/mpc_demux.c
===================================================================
--- /libmpc/branches/r2d/libmpcdec/mpc_demux.c	(revision 149)
+++ /libmpc/branches/r2d/libmpcdec/mpc_demux.c	(revision 150)
@@ -41,4 +41,6 @@
 mpc_uint32_t mpc_bits_read(mpc_bits_reader * r, const unsigned int nb_bits);
 int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block);
+mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k);
+unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size);
 
 // streaminfo.c
@@ -143,4 +145,72 @@
 {
 	return ((d->r->tell(d->r) - d->bytes_total + d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count;
+}
+
+mpc_status mpc_demux_seek_init(mpc_demux * d)
+{
+	if (d->seek_table != 0)
+		return MPC_STATUS_OK;
+
+	d->seek_pwr = 6;
+	if (d->si.block_pwr > d->seek_pwr)
+		d->seek_pwr = d->si.block_pwr;
+	d->seek_table = malloc((1 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)) * sizeof(mpc_uint32_t));
+	if (d->seek_table == 0)
+		return MPC_STATUS_FILE;
+	d->seek_table[0] = mpc_demux_pos(d);
+	d->seek_table_size = 1;
+
+	return MPC_STATUS_OK;
+}
+
+static void mpc_demux_ST(mpc_demux * d)
+{
+	mpc_uint64_t tmp;
+	mpc_uint32_t * table;
+	mpc_bits_reader r = d->bits_reader;
+	mpc_uint_t i;
+
+	if (d->seek_table != 0)
+		return;
+
+	mpc_bits_get_size(&r, &tmp);
+	d->seek_table_size = tmp;
+	d->seek_pwr = d->si.block_pwr + mpc_bits_read(&r, 4);
+	d->seek_table = malloc((1 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)) * sizeof(mpc_uint32_t));
+
+	table = d->seek_table;
+	mpc_bits_get_size(&r, &tmp);
+	table[0] = (tmp + d->si.header_position) * 8;
+
+	if (d->seek_table_size == 1)
+		return;
+
+	mpc_bits_get_size(&r, &tmp);
+	table[1] = (tmp + d->si.header_position) * 8;
+
+	for (i = 2; i < d->seek_table_size; i++) {
+		int code = mpc_bits_golomb_dec(&r, 12);
+		if (code & 1)
+			code = -(code & (-1u << 1));
+		code <<= 2;
+		table[i] = code + 2 * table[i-1] - table[i-2];
+	}
+}
+
+static void mpc_demux_SP(mpc_demux * d, int size, int block_size)
+{
+	mpc_size_t cur;
+	mpc_uint64_t ptr;
+	mpc_block b;
+
+	cur = mpc_demux_pos(d);
+	mpc_bits_get_size(&d->bits_reader, &ptr);
+	mpc_demux_seek(d, (ptr - size) * 8 + cur, 11);
+	mpc_bits_get_block(&d->bits_reader, &b);
+	if (memcmp(b.key, "ST", 2) == 0) {
+		mpc_demux_fill(d, b.size, 0);
+		mpc_demux_ST(d);
+	}
+	mpc_demux_seek(d, cur, 11 + block_size);
 }
 
@@ -189,4 +259,8 @@
 			} else if (memcmp(b.key, "EI", 2) == 0)
 				streaminfo_encoder_info(&d->si, &d->bits_reader);
+			else if (memcmp(b.key, "SP", 2) == 0)
+				mpc_demux_SP(d, size, b.size);
+			else if (memcmp(b.key, "ST", 2) == 0)
+				mpc_demux_ST(d);
 			d->bits_reader.buff += b.size;
 			size = mpc_bits_get_block(&d->bits_reader, &b);
@@ -206,11 +280,7 @@
 		p_tmp->r = p_reader;
 		mpc_demux_clear_buff(p_tmp);
+		p_tmp->seek_table = 0;
 		if (mpc_demux_header(p_tmp) == MPC_STATUS_OK) {
-			p_tmp->seek_pwr = 6;
-			if (p_tmp->si.block_pwr > p_tmp->seek_pwr)
-				p_tmp->seek_pwr = p_tmp->si.block_pwr;
-			p_tmp->seek_table = malloc((1 + p_tmp->si.samples / (MPC_FRAME_LENGTH << p_tmp->seek_pwr)) * sizeof(mpc_uint32_t));
-			p_tmp->seek_table[0] = mpc_demux_pos(p_tmp);
-			p_tmp->seek_table_size = 1;
+			mpc_demux_seek_init(p_tmp);
 			p_tmp->d = mpc_decoder_init(&p_tmp->si);
 		} else {
Index: /libmpc/branches/r2d/libmpcdec/streaminfo.c
===================================================================
--- /libmpc/branches/r2d/libmpcdec/streaminfo.c	(revision 149)
+++ /libmpc/branches/r2d/libmpcdec/streaminfo.c	(revision 150)
@@ -173,9 +173,9 @@
 	mpc_bits_get_size(&r, &si->samples);
 	si->is_true_gapless = 1;
-	si->sample_freq = samplefreqs[mpc_bits_read(&r, 4)];
+	si->sample_freq = samplefreqs[mpc_bits_read(&r, 3)];
 	si->channels = mpc_bits_read(&r, 4) + 1;
 	si->max_band = mpc_bits_read(&r, 5) + 1;
 	si->ms = mpc_bits_read(&r, 1);
-	si->block_pwr = mpc_bits_read(&r, 4);
+	si->block_pwr = mpc_bits_read(&r, 3) * 2;
 
 	si->bitrate = 0;
Index: /libmpc/branches/r2d/libmpcenc/encode_sv7.c
===================================================================
--- /libmpc/branches/r2d/libmpcenc/encode_sv7.c	(revision 149)
+++ /libmpc/branches/r2d/libmpcenc/encode_sv7.c	(revision 150)
@@ -105,5 +105,5 @@
 	writeBits ( e, tmp[0]  , 8 );
 
-    writeBits ( e, 0x08,  8 );    // StreamVersion
+    writeBits ( e, 8,  8 );    // StreamVersion
 
 	len = encodeSize(SamplesCount, (char *)tmp, MPC_FALSE);
@@ -112,8 +112,8 @@
 
 	switch ( SampleFreq ) {
-		case 44100: writeBits ( e, 0, 4 ); break;
-		case 48000: writeBits ( e, 1, 4 ); break;
-		case 37800: writeBits ( e, 2, 4 ); break;
-		case 32000: writeBits ( e, 3, 4 ); break;
+		case 44100: writeBits ( e, 0, 3 ); break;
+		case 48000: writeBits ( e, 1, 3 ); break;
+		case 37800: writeBits ( e, 2, 3 ); break;
+		case 32000: writeBits ( e, 3, 3 ); break;
 		default   : fprintf(stderr, "Internal error\n");// FIXME : stderr_printf ( "Internal error\n");
 		exit (1);
@@ -123,6 +123,5 @@
 	writeBits ( e, MaxBand - 1  ,  5 );    // Bandwidth
 	writeBits ( e, MS_on        ,  1 );    // MS-Coding Flag
-	writeBits ( e, FRAMES_PER_BLOCK_PWR,  4 );    // frames per block (log2 unit)
-	writeBits ( e, 0, 6 );    // unused
+	writeBits ( e, FRAMES_PER_BLOCK_PWR >> 1,  3 );    // frames per block (log4 unit)
 
 	writeGainInfo(e);
Index: /libmpc/branches/r2d/libmpcenc/libmpcenc.h
===================================================================
--- /libmpc/branches/r2d/libmpcenc/libmpcenc.h	(revision 149)
+++ /libmpc/branches/r2d/libmpcenc/libmpcenc.h	(revision 150)
@@ -28,5 +28,5 @@
 
 // bitstream.c
-#define FRAMES_PER_BLOCK_PWR 6
+#define FRAMES_PER_BLOCK_PWR 6 // MUST be even
 #define FRAMES_PER_BLOCK (1 << FRAMES_PER_BLOCK_PWR)
 #define BUFFER_FULL         (4352 * FRAMES_PER_BLOCK)         // 34490 bit/frame  1320.3 kbps
