stream/tvi_v4l[2]: fix calculation of free RAM for buffers

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 in 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 fall back on 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.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33732 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
iive 2011-06-26 14:42:35 +00:00 committed by Uoti Urpala
parent 01e441dddc
commit 860e66818b
3 changed files with 11 additions and 17 deletions

2
configure vendored
View File

@ -3551,7 +3551,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

View File

@ -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_t *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);

View File

@ -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_t *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;