# HG changeset patch # User iive # Date 1309099355 0 # Node ID c15dabfa23804de3ac6742468e80defac9c63187 # Parent 311468e8af655f7ede0e864e23d2cc9c0cd5e723 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. diff -r 311468e8af65 -r c15dabfa2380 configure --- a/configure Sun Jun 26 14:16:40 2011 +0000 +++ b/configure Sun Jun 26 14:42:35 2011 +0000 @@ -3997,7 +3997,7 @@ 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 diff -r 311468e8af65 -r c15dabfa2380 stream/tvi_v4l.c --- a/stream/tvi_v4l.c Sun Jun 26 14:16:40 2011 +0000 +++ b/stream/tvi_v4l.c Sun Jun 26 14:42:35 2011 +0000 @@ -760,7 +760,8 @@ 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 @@ struct sysinfo si; sysinfo(&si); - if (si.totalram<2*1024*1024) { - bufsize = 1024*1024; - } else { - bufsize = si.totalram/2; - } -#else + bufsize = (si.freeram/2)*si.mem_unit; + if (bufsize < 16*1024*1024) +#endif bufsize = 16*1024*1024; -#endif } cnt = bufsize/(priv->height*priv->bytesperline); diff -r 311468e8af65 -r c15dabfa2380 stream/tvi_v4l2.c --- a/stream/tvi_v4l2.c Sun Jun 26 14:16:40 2011 +0000 +++ b/stream/tvi_v4l2.c Sun Jun 26 14:42:35 2011 +0000 @@ -1376,7 +1376,8 @@ 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 @@ struct sysinfo si; sysinfo(&si); - if (si.totalram<2*1024*1024) { - bufsize = 1024*1024; - } else { - bufsize = si.totalram/2; - } -#else + bufsize = (si.freeram/2)*si.mem_unit; + if ( bufsize < 16*1024*1024) +#endif bufsize = 16*1024*1024; -#endif } cnt = bufsize/priv->format.fmt.pix.sizeimage;