mirror of https://github.com/mpv-player/mpv
New "automute" tv:// option.
Will switch off sound and show blue screen instead of video with noise when signal level (in 0-255 scale) is less than specified value. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23440 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
d244fffa74
commit
eb5bf3b88e
|
@ -1722,6 +1722,10 @@ Available options are:
|
|||
.RSs
|
||||
.IPs noaudio
|
||||
no sound
|
||||
.IPs automute=<0-255> (v4l and v4l2 only)
|
||||
If signal strength reported by device is less then this value,
|
||||
audio and video will be muted. In most cases automute=100 will be enough.
|
||||
Default is 0 (automute disabled).
|
||||
.IPs driver=<value>
|
||||
See \-tv driver=help for a list of compiled-in TV input drivers.
|
||||
available: dummy, v4l, v4l2, bsdbt848
|
||||
|
|
|
@ -429,6 +429,7 @@ m_option_t tvopts_conf[]={
|
|||
{"channel", &tv_param_channel, CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{"chanlist", &tv_param_chanlist, CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{"norm", &tv_param_norm, CONF_TYPE_STRING, 0, 0, 0, NULL},
|
||||
{"automute", &tv_param_automute, CONF_TYPE_INT, CONF_RANGE, 0, 255, NULL},
|
||||
#ifdef HAVE_TV_V4L2
|
||||
{"normid", &tv_param_normid, CONF_TYPE_INT, 0, 0, 0, NULL},
|
||||
#endif
|
||||
|
|
|
@ -55,6 +55,7 @@ int tv_param_outfmt = -1;
|
|||
float tv_param_fps = -1.0;
|
||||
char **tv_param_channels = NULL;
|
||||
int tv_param_audio_id = 0;
|
||||
int tv_param_automute = 0;
|
||||
#if defined(HAVE_TV_V4L)
|
||||
int tv_param_amode = -1;
|
||||
int tv_param_volume = -1;
|
||||
|
|
|
@ -12,6 +12,7 @@ extern char *tv_param_freq;
|
|||
extern char *tv_param_channel;
|
||||
extern char *tv_param_chanlist;
|
||||
extern char *tv_param_norm;
|
||||
extern int tv_param_automute;
|
||||
#ifdef HAVE_TV_V4L2
|
||||
extern int tv_param_normid;
|
||||
#endif
|
||||
|
|
|
@ -52,3 +52,41 @@ static void free_handle(tvi_handle_t *h)
|
|||
free(h);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Fills video frame in given buffer with blue color for yv12,i420,uyvy,yuy2.
|
||||
Other formats will be filled with 0xC0
|
||||
*/
|
||||
static inline void fill_blank_frame(char* buffer,int len,int fmt){
|
||||
int i;
|
||||
|
||||
switch(fmt){
|
||||
case IMGFMT_YV12:
|
||||
memset(buffer, 0xFF,5*len/6);
|
||||
memset(buffer+5*len/6, 0xFF,len/6);
|
||||
break;
|
||||
case IMGFMT_I420:
|
||||
memset(buffer, 0xFF,4*len/6);
|
||||
memset(buffer+4*len/6, 0xFF,len/6);
|
||||
memset(buffer+5*len/6, 0xFF,len/6);
|
||||
break;
|
||||
case IMGFMT_UYVY:
|
||||
for(i=0;i<len;i+=4){
|
||||
buffer[i]=0xFF;
|
||||
buffer[i+1]=0;
|
||||
buffer[i+2]=0;
|
||||
buffer[i+3]=0;
|
||||
}
|
||||
break;
|
||||
case IMGFMT_YUY2:
|
||||
for(i=0;i<len;i+=4){
|
||||
buffer[i]=0;
|
||||
buffer[i+1]=0xFF;
|
||||
buffer[i+2]=0;
|
||||
buffer[i+3]=0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
memset(buffer,0xC0,len);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1381,6 +1381,21 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
return(TVI_CONTROL_UNKNOWN);
|
||||
}
|
||||
|
||||
static int set_mute(priv_t* priv,int value)
|
||||
{
|
||||
if (!priv->capability.audios) {
|
||||
return 0;
|
||||
|
||||
if(value)
|
||||
priv->audio[priv->audio_id].flags |=VIDEO_AUDIO_MUTE;
|
||||
else
|
||||
priv->audio[priv->audio_id].flags &= ~VIDEO_AUDIO_MUTE;
|
||||
}
|
||||
if(ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id])<0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// copies a video frame
|
||||
// for RGB (i.e. BGR in mplayer) flips the image upside down
|
||||
// for YV12 swaps the 2nd and 3rd plane
|
||||
|
@ -1389,6 +1404,16 @@ static inline void copy_frame(priv_t *priv, unsigned char *dest, unsigned char *
|
|||
int i;
|
||||
unsigned char *sptr;
|
||||
|
||||
if(tv_param_automute>0){
|
||||
if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) >= 0) {
|
||||
if(tv_param_automute<<8>priv->tuner.signal){
|
||||
fill_blank_frame(dest,priv->bytesperline * priv->height,priv->format);
|
||||
set_mute(priv,1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
set_mute(priv,0);
|
||||
}
|
||||
// YV12 uses VIDEO_PALETTE_YUV420P, but the planes are swapped
|
||||
if (priv->format == IMGFMT_YV12) {
|
||||
memcpy(dest, source, priv->width * priv->height);
|
||||
|
|
|
@ -1321,6 +1321,16 @@ static inline void copy_frame(priv_t *priv, unsigned char *dest, unsigned char *
|
|||
int d = pixfmt2depth(priv->format.fmt.pix.pixelformat);
|
||||
int bytesperline = w*d/8;
|
||||
|
||||
if(tv_param_automute>0){
|
||||
if (ioctl(priv->video_fd, VIDIOC_G_TUNER, &priv->tuner) >= 0) {
|
||||
if(tv_param_automute<<8>priv->tuner.signal){
|
||||
fill_blank_frame(dest,bytesperline * h,fcc_vl2mp(priv->format.fmt.pix.pixelformat));
|
||||
set_mute(priv,1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
set_mute(priv,0);
|
||||
}
|
||||
memcpy(dest, source, bytesperline * h);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue