mirror of https://github.com/mpv-player/mpv
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:
parent
01e441dddc
commit
860e66818b
|
@ -3551,7 +3551,7 @@ fi #if sunos
|
||||||
|
|
||||||
echocheck "sys/sysinfo.h"
|
echocheck "sys/sysinfo.h"
|
||||||
_sys_sysinfo=no
|
_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
|
if test "$_sys_sysinfo" = yes ; then
|
||||||
def_sys_sysinfo_h='#define HAVE_SYS_SYSINFO_H 1'
|
def_sys_sysinfo_h='#define HAVE_SYS_SYSINFO_H 1'
|
||||||
else
|
else
|
||||||
|
|
|
@ -760,7 +760,8 @@ static int uninit(priv_t *priv)
|
||||||
|
|
||||||
static int get_capture_buffer_size(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) {
|
if (priv->tv_param->buffer_size >= 0) {
|
||||||
bufsize = priv->tv_param->buffer_size*1024*1024;
|
bufsize = priv->tv_param->buffer_size*1024*1024;
|
||||||
|
@ -769,14 +770,10 @@ static int get_capture_buffer_size(priv_t *priv)
|
||||||
struct sysinfo si;
|
struct sysinfo si;
|
||||||
|
|
||||||
sysinfo(&si);
|
sysinfo(&si);
|
||||||
if (si.totalram<2*1024*1024) {
|
bufsize = (si.freeram/2)*si.mem_unit;
|
||||||
bufsize = 1024*1024;
|
if (bufsize < 16*1024*1024)
|
||||||
} else {
|
|
||||||
bufsize = si.totalram/2;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
bufsize = 16*1024*1024;
|
|
||||||
#endif
|
#endif
|
||||||
|
bufsize = 16*1024*1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt = bufsize/(priv->height*priv->bytesperline);
|
cnt = bufsize/(priv->height*priv->bytesperline);
|
||||||
|
|
|
@ -1376,7 +1376,8 @@ static int init(priv_t *priv)
|
||||||
|
|
||||||
static int get_capture_buffer_size(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) {
|
if (priv->tv_param->buffer_size >= 0) {
|
||||||
bufsize = priv->tv_param->buffer_size*1024*1024;
|
bufsize = priv->tv_param->buffer_size*1024*1024;
|
||||||
|
@ -1385,14 +1386,10 @@ static int get_capture_buffer_size(priv_t *priv)
|
||||||
struct sysinfo si;
|
struct sysinfo si;
|
||||||
|
|
||||||
sysinfo(&si);
|
sysinfo(&si);
|
||||||
if (si.totalram<2*1024*1024) {
|
bufsize = (si.freeram/2)*si.mem_unit;
|
||||||
bufsize = 1024*1024;
|
if ( bufsize < 16*1024*1024)
|
||||||
} else {
|
|
||||||
bufsize = si.totalram/2;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
bufsize = 16*1024*1024;
|
|
||||||
#endif
|
#endif
|
||||||
|
bufsize = 16*1024*1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt = bufsize/priv->format.fmt.pix.sizeimage;
|
cnt = bufsize/priv->format.fmt.pix.sizeimage;
|
||||||
|
|
Loading…
Reference in New Issue