[MPlayer-cvslog] r33732 - in trunk: configure stream/tvi_v4l.c stream/tvi_v4l2.c

iive subversion at mplayerhq.hu
Sun Jun 26 16:42:36 CEST 2011


Author: iive
Date: Sun Jun 26 16:42:35 2011
New Revision: 33732

Log:
Do a proper calculation of free RAM to be used as V4L buffers.

The code uses sysinfo to query the available RAM, however it used 
ancient form available is some early development 2.3.x kernels.
Newer form reports the size in memory units (usually same as page size),
as result the code would fallback to 2 buffers even on multi GB system.

The commit does: Improve the check in configure to ensure that we 
do use sysinfo struct with present mem_unit. Use free ram instead of
total ram (to avoid swapping). Tweak memory constants and simplify code.

Modified:
   trunk/configure
   trunk/stream/tvi_v4l.c
   trunk/stream/tvi_v4l2.c

Modified: trunk/configure
==============================================================================
--- trunk/configure	Sun Jun 26 16:16:40 2011	(r33731)
+++ trunk/configure	Sun Jun 26 16:42:35 2011	(r33732)
@@ -3997,7 +3997,7 @@ fi #if sunos
 
 echocheck "sys/sysinfo.h"
 _sys_sysinfo=no
-statement_check sys/sysinfo.h 'struct sysinfo s_info; sysinfo(&s_info)' && _sys_sysinfo=yes
+statement_check sys/sysinfo.h 'struct sysinfo s_info; s_info.mem_unit=0; sysinfo(&s_info)' && _sys_sysinfo=yes
 if test "$_sys_sysinfo" = yes ; then
   def_sys_sysinfo_h='#define HAVE_SYS_SYSINFO_H 1'
 else

Modified: trunk/stream/tvi_v4l.c
==============================================================================
--- trunk/stream/tvi_v4l.c	Sun Jun 26 16:16:40 2011	(r33731)
+++ trunk/stream/tvi_v4l.c	Sun Jun 26 16:42:35 2011	(r33732)
@@ -760,7 +760,8 @@ static int uninit(priv_t *priv)
 
 static int get_capture_buffer_size(priv_t *priv)
 {
-    int bufsize, cnt;
+    uint64_t bufsize;
+    int cnt;
 
     if (priv->tv_param->buffer_size >= 0) {
         bufsize = priv->tv_param->buffer_size*1024*1024;
@@ -769,14 +770,10 @@ static int get_capture_buffer_size(priv_
         struct sysinfo si;
 
         sysinfo(&si);
-        if (si.totalram<2*1024*1024) {
-            bufsize = 1024*1024;
-        } else {
-            bufsize = si.totalram/2;
-        }
-#else
-        bufsize = 16*1024*1024;
+        bufsize = (si.freeram/2)*si.mem_unit;
+        if (bufsize < 16*1024*1024)
 #endif
+        bufsize = 16*1024*1024;
     }
 
     cnt = bufsize/(priv->height*priv->bytesperline);

Modified: trunk/stream/tvi_v4l2.c
==============================================================================
--- trunk/stream/tvi_v4l2.c	Sun Jun 26 16:16:40 2011	(r33731)
+++ trunk/stream/tvi_v4l2.c	Sun Jun 26 16:42:35 2011	(r33732)
@@ -1376,7 +1376,8 @@ static int init(priv_t *priv)
 
 static int get_capture_buffer_size(priv_t *priv)
 {
-    int bufsize, cnt;
+    uint64_t bufsize;
+    int cnt;
 
     if (priv->tv_param->buffer_size >= 0) {
         bufsize = priv->tv_param->buffer_size*1024*1024;
@@ -1385,14 +1386,10 @@ static int get_capture_buffer_size(priv_
         struct sysinfo si;
 
         sysinfo(&si);
-        if (si.totalram<2*1024*1024) {
-            bufsize = 1024*1024;
-        } else {
-            bufsize = si.totalram/2;
-        }
-#else
-        bufsize = 16*1024*1024;
+        bufsize = (si.freeram/2)*si.mem_unit;
+        if ( bufsize < 16*1024*1024)
 #endif
+        bufsize = 16*1024*1024;
     }
 
     cnt = bufsize/priv->format.fmt.pix.sizeimage;


More information about the MPlayer-cvslog mailing list