Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-20 Thread Artur Skawina
VDR User wrote:
 I've recorded/watched a lot of tv in the last couple days and so far I
 haven't noticed any problems with this patch.  I am currently using v3
 (the patch I attached to my previous post) with vdr-1.5.2.

Do you know how large the buffers usually grow?
If you haven't reduced vdrs log level (-l) this info should be
somewhere in /var/log/ and you can take a look at the buffer
usage w/ eg:

$ grep vdr /var/log/* | grep 'ring buffer' | less

Did any overflows happen (you can search for 'overflow' in the output
of above commands to find them)?


I've now checked my vdr logs here (starting ~ a week ago) and not a single
buffer overflowed. I would have expected a few problems, but it looks like
the tuning worked. (However that vdr has all data moving threads running
at real time priority and this may have helped too.)

Thanks,

artur

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-20 Thread VDR User

On 5/20/07, Artur Skawina [EMAIL PROTECTED] wrote:

VDR User wrote:
 I've recorded/watched a lot of tv in the last couple days and so far I
 haven't noticed any problems with this patch.  I am currently using v3
 (the patch I attached to my previous post) with vdr-1.5.2.

Do you know how large the buffers usually grow?
If you haven't reduced vdrs log level (-l) this info should be
somewhere in /var/log/ and you can take a look at the buffer
usage w/ eg:


I use level 3 logging for vdr.  I emailed you a copy of my logs so you
should see that by the time you read this.

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-20 Thread Artur Skawina
VDR User wrote:
 On 5/20/07, Artur Skawina [EMAIL PROTECTED] wrote:
 VDR User wrote:
  I've recorded/watched a lot of tv in the last couple days and so far I
  haven't noticed any problems with this patch.  I am currently using v3
  (the patch I attached to my previous post) with vdr-1.5.2.

 Do you know how large the buffers usually grow?
 If you haven't reduced vdrs log level (-l) this info should be
 somewhere in /var/log/ and you can take a look at the buffer
 usage w/ eg:
 
 I use level 3 logging for vdr.  I emailed you a copy of my logs so you
 should see that by the time you read this.

Thanks. It seems that 648k was the largest size ever used for a buffer,
which is less than 1/3 of the full size (2M for Result,Transfer and TS).
The Recorder buffer was typically at 5% of its max size, ie 300k instead
of 5M. No overflows w/ v3 of the patch (two with the previous version,
which was starting out with just 128k).

I get a lot worse results here (buffers grow to a few M), but that's
probably because the vdr box is not a dedicated one, but also handles
quite a few other services; IO stalls are not uncommon and several
simultaneous recordings are sometimes done while streaming via streamdev
to another vdr. Still, no overflows.

artur

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-20 Thread VDR User

On 5/20/07, Artur Skawina [EMAIL PROTECTED] wrote:

Thanks. It seems that 648k was the largest size ever used for a buffer,
which is less than 1/3 of the full size (2M for Result,Transfer and TS).
The Recorder buffer was typically at 5% of its max size, ie 300k instead
of 5M. No overflows w/ v3 of the patch (two with the previous version,
which was starting out with just 128k).

I get a lot worse results here (buffers grow to a few M), but that's
probably because the vdr box is not a dedicated one, but also handles
quite a few other services; IO stalls are not uncommon and several
simultaneous recordings are sometimes done while streaming via streamdev
to another vdr. Still, no overflows.


My vdr box is dedicated with the only other software running being an
ftpd for my lan.  No streaming video or anything like that.  One
dedicated vdr box connected to one tv in my living room, thats it.  :)

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-17 Thread derblubber
I just wanted to give some feedback on this, im using the patch on my 
vdr 1.4.7 and it workes without problems for now. Good work, thanks.


Dortje


In case anyone is having trouble, here's an attached patch of v3 for 
vdr-1.5.2.





___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr



___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-17 Thread VDR User

I've recorded/watched a lot of tv in the last couple days and so far I
haven't noticed any problems with this patch.  I am currently using v3
(the patch I attached to my previous post) with vdr-1.5.2.

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-15 Thread Jaroslaw Swierczynski

2007/5/15, VDR User [EMAIL PROTECTED]:

In case anyone is having trouble, here's an attached patch of v3 for vdr-1.5.2.


You mean 1.4 :) Thanks.

--
Jaroslaw Swierczynski [EMAIL PROTECTED]
www.archlinux.org | www.juvepoland.com

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-15 Thread Artur Skawina
Jaroslaw Swierczynski wrote:
 It seems your patch is against VDR 1.5.x. Could you please backport it
 to VDR 1.4.x?

actually it's vs 1.4.6, but applies to 1.5.2 too.

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-15 Thread Jaroslaw Swierczynski

2007/5/15, VDR User [EMAIL PROTECTED]:


No, I mean vdr-1.5.2.  Artur said he had attached a patch to his post
but there was no attachment and since copy  paste the patch from his
post was causing problems for some reason, I patched a vanilla
vdr-1.5.2 (which is what I use) by hand.  If it applies to any 1.4.x
then I guess that's just a bonus.


Sorry, I was confused by the fact that the patch didn't apply to 1.4.7
so I assumed it was against 1.5.x as I didn't think differences
between 1.4.x releases were so significant. Artur has cleared up the
issue stating he had made the patch with 1.4.6. However now when I'm
thinking about it perhaps copypaste was the problem.

--
Jaroslaw Swierczynski [EMAIL PROTECTED]
www.archlinux.org | www.juvepoland.com

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-14 Thread Jaroslaw Swierczynski

It seems your patch is against VDR 1.5.x. Could you please backport it
to VDR 1.4.x?

--
Jaroslaw Swierczynski [EMAIL PROTECTED]
www.archlinux.org | www.juvepoland.com

___
vdr mailing list
vdr@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr


Re: [vdr] [PATCH] Auto sized ringbuffers v3

2007-05-14 Thread VDR User

In case anyone is having trouble, here's an attached patch of v3 for vdr-1.5.2.
diff -ruN vdr-1.5.2-orig/dvbdevice.c vdr-1.5.2/dvbdevice.c
--- vdr-1.5.2-orig/dvbdevice.c	2007-05-14 14:58:29.0 -0700
+++ vdr-1.5.2/dvbdevice.c	2007-05-14 15:22:50.0 -0700
@@ -1172,7 +1172,7 @@
   CloseDvr();
   fd_dvr = DvbOpen(DEV_DVB_DVR, CardIndex(), O_RDONLY | O_NONBLOCK, true);
   if (fd_dvr = 0)
- tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
+ tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(8), CardIndex() + 1);
   return fd_dvr = 0;
 }
 
diff -ruN vdr-1.5.2-orig/recorder.c vdr-1.5.2/recorder.c
--- vdr-1.5.2-orig/recorder.c	2007-05-14 14:58:29.0 -0700
+++ vdr-1.5.2/recorder.c	2007-05-14 15:27:12.0 -0700
@@ -176,8 +176,22 @@
int Count = remux-Put(b, r);
if (Count)
   ringBuffer-Del(Count);
-   else
-  cCondWait::SleepMs(100); // avoid busy loop when resultBuffer is full in cRemux::Put()
-   }
+	   else { // avoid busy loop when resultBuffer is full in cRemux::Put()
+	  int ms;
+	  for (ms=5; Running()  ms100; ms+=ms) {
+		 cCondWait::SleepMs(ms);
+		 if (!Running())
+		return;
+		 Count = remux-Put(b, r);
+		 if (Count) {
+		ringBuffer-Del(Count);
+		dsyslog(cRecorder::Action() ring buffer consumer slept %d ms, ms);
+		break;
+		}
+		 }
+	  if (ms=100)
+		 dsyslog(cRecorder::Action() ring buffer consumer slept 100 ms);
+	  }
+	   }
 }
 }
diff -ruN vdr-1.5.2-orig/remux.c vdr-1.5.2/remux.c
--- vdr-1.5.2-orig/remux.c	2007-05-14 14:58:29.0 -0700
+++ vdr-1.5.2/remux.c	2007-05-14 15:27:45.0 -0700
@@ -1851,7 +1851,7 @@
 
 // --- cRemux 
 
-#define RESULTBUFFERSIZE KILOBYTE(256)
+#define RESULTBUFFERSIZE MEGABYTE(2)
 
 cRemux::cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure)
 {
diff -ruN vdr-1.5.2-orig/ringbuffer.c vdr-1.5.2/ringbuffer.c
--- vdr-1.5.2-orig/ringbuffer.c	2007-05-14 14:58:29.0 -0700
+++ vdr-1.5.2/ringbuffer.c	2007-05-14 15:33:18.0 -0700
@@ -151,13 +151,31 @@
   }
 #endif
 
+// cRingBufferLinear are dynamically sized, or at least we can pretend they are ;)
+// We treat 'Size' as the maximum size, but start with a small buffer, which can
+// grow later as it fills up. Memory is always allocated for the full buffer, but
+// the unused RAM portion remains untouched until (if at all) it is actually needed.
+// Note that we can not start with a larger than requested buffer because there are
+// ring buffer users that cause crashes then (eg softdevice mpegdecoder absolutely
+// needs 32/64k).
+
+// Startup size. 64k still causes overflows before buffer starts to grow, 128k doesn't.
+// The buffers grow to 200..500k anyway, so maybe increasing this a bit more would
+// make sense, but let's first see if it's really needed.
+// In fact 128k is on the low side, but let's try not going for 256k yet.
+#define DEFRBSIZE KILOBYTE(192)
+
 cRingBufferLinear::cRingBufferLinear(int Size, int Margin, bool Statistics, const char *Description)
-:cRingBuffer(Size, Statistics)
+:cRingBuffer(min(Size,DEFRBSIZE), Statistics)
 {
   description = Description ? strdup(Description) : NULL;
   tail = head = margin = Margin;
   gotten = 0;
   buffer = NULL;
+  maxsize = Size;
+  growthresh = sizemaxsize ? size/3 : maxsize+1;
+  growbuf = 0;
+  dsyslog(New ring buffer \%s\ size: %d margin: %d, description, Size, Margin );
   if (Size  1) { // 'Size - 1' must not be 0!
  if (Margin = Size / 2) {
 buffer = MALLOC(uchar, Size);
@@ -183,6 +201,7 @@
 #ifdef DEBUGRINGBUFFERS
   DelDebugRBL(this);
 #endif
+  dsyslog(Deleting ring buffer \%s\ size: %d / %d (used %g%% of requested size), description, size, maxsize, size/(double)maxsize*100.0 );
   free(buffer);
   free(description);
 }
@@ -205,8 +224,20 @@
   EnablePut();
 }
 
+// Must only be called by the producer (ie Read()/Put()), not the consumer (Get()).
+void cRingBufferLinear::GrowBuffer(void)
+{
+  size = min(size+size/2, maxsize);
+  growthresh = sizemaxsize ? size/3 : maxsize+1;
+  dsyslog(Enlarging ring buffer \%s\: %d bytes (trigger %d, thresh %d),
+  description, size, growbuf, growthresh);
+  growbuf = 0;
+}
+
 int cRingBufferLinear::Read(int FileHandle, int Max)
 {
+  if (growbuf  head=tail  sizemaxsize)
+ GrowBuffer();
   int Tail = tail;
   int diff = Tail - head;
   int free = (diff  0) ? diff - 1 : Size() - head;
@@ -219,6 +250,10 @@
  Count = safe_read(FileHandle, buffer + head, free);
  if (Count  0) {
 int Head = head + Count;
+if (Available()+Count = growthresh)
+   growbuf = 2;
+if (growbuf  head=tail  sizemaxsize)
+   GrowBuffer();
 if (Head = Size())
Head = margin;
 head = Head;
@@ -245,6 +280,10 @@
 int cRingBufferLinear::Put(const uchar *Data, int Count)
 {