Index: libs/libmythtv/mpeg/pespacket.cpp
===================================================================
--- libs/libmythtv/mpeg/pespacket.cpp	(revision 9237)
+++ libs/libmythtv/mpeg/pespacket.cpp	(revision 9337)
@@ -135,15 +145,16 @@
 static vector<unsigned char*> free4096;
 static map<unsigned char*, bool> alloc4096;
 
-#define BLOCKS188 1000
+#define BLOCKS188 512
 static unsigned char* get_188_block()
 {
-    if (!free188.size())
+    if (free188.empty())
     {
         mem188.push_back((unsigned char*) malloc(188 * BLOCKS188));
         free188.reserve(BLOCKS188);
+        unsigned char* block_start = mem188.back();
         for (uint i = 0; i < BLOCKS188; ++i)
-            free188.push_back(i*188 + mem188.back());
+            free188.push_back(i*188 + block_start);
     }
 
     unsigned char *ptr = free188.back();
@@ -161,9 +172,9 @@
 static void return_188_block(unsigned char* ptr)
 {
     alloc188.erase(ptr);
-    if (alloc188.size())
-        free188.push_back(ptr);
-    else
+    free188.push_back(ptr);
+    // free the allocator only if more than 1 block was used
+    if (alloc188.empty() && mem188.size() > 1)
     {
         vector<unsigned char*>::iterator it;
         for (it = mem188.begin(); it != mem188.end(); ++it)
@@ -174,15 +185,16 @@
     }
 }
 
-#define BLOCKS4096 256
+#define BLOCKS4096 128
 static unsigned char* get_4096_block()
 {
-    if (!free4096.size())
+    if (free4096.empty())
     {
         mem4096.push_back((unsigned char*) malloc(4096 * BLOCKS4096));
         free4096.reserve(BLOCKS4096);
+        unsigned char* block_start = mem4096.back();
         for (uint i = 0; i < BLOCKS4096; ++i)
-            free4096.push_back(i*4096 + mem4096.back());
+            free4096.push_back(i*4096 + block_start);
     }
 
     unsigned char *ptr = free4096.back();
@@ -200,9 +212,7 @@
 static void return_4096_block(unsigned char* ptr)
 {
     alloc4096.erase(ptr);
-    if (alloc4096.size())
-    {
-        free4096.push_back(ptr);
+    free4096.push_back(ptr);
 
 #if 0 // enable this to debug memory leaks
         cerr<<alloc4096.size()<<" 4096 blocks remain"<<endl;
@@ -220,8 +230,9 @@
             cerr<<endl;
         }
 #endif 
-    }
-    else
+
+    // free the allocator only if more than 1 block was used
+    if (alloc4096.empty() && mem4096.size() > 1)
     {
         vector<unsigned char*>::iterator it;
         for (it = mem4096.begin(); it != mem4096.end(); ++it)
