mirror of https://github.com/mpv-player/mpv
updated
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3816 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
193c7cf04a
commit
b0b22ba9b0
|
@ -113,6 +113,8 @@ int stream_open_tv(stream_t *stream, tvi_handle_t *tvh)
|
|||
picture_format = IMGFMT_I420;
|
||||
else if (!strcasecmp(tv_param_outfmt, "uyvy"))
|
||||
picture_format = IMGFMT_UYVY;
|
||||
// else if (!strcasecmp(tv_param_outfmt, "yuy2"))
|
||||
// picture_format = IMGFMT_YUY2;
|
||||
else if (!strcasecmp(tv_param_outfmt, "rgb32"))
|
||||
picture_format = IMGFMT_RGB32;
|
||||
else if (!strcasecmp(tv_param_outfmt, "rgb24"))
|
||||
|
@ -258,6 +260,8 @@ int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh)
|
|||
sh_video->fps = tv_param_fps;
|
||||
sh_video->frametime = 1.0f/sh_video->fps;
|
||||
|
||||
printf("fps: %f, frametime: %f\n", sh_video->fps, sh_video->frametime);
|
||||
|
||||
/* set width */
|
||||
funcs->control(tvh->priv, TVI_CONTROL_VID_GET_WIDTH, &sh_video->disp_w);
|
||||
|
||||
|
@ -285,6 +289,8 @@ int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh)
|
|||
/* yeah, audio is present */
|
||||
if (funcs->control(tvh->priv, TVI_CONTROL_AUD_GET_FORMAT, &audio_format) != TVI_CONTROL_TRUE)
|
||||
goto no_audio;
|
||||
sh_audio->sample_format = audio_format;
|
||||
sh_audio->wf->wBitsPerSample = 16;
|
||||
switch(audio_format)
|
||||
{
|
||||
case AFMT_U8:
|
||||
|
@ -336,21 +342,13 @@ tvi_handle_t *tv_begin(void)
|
|||
|
||||
int tv_init(tvi_handle_t *tvh)
|
||||
{
|
||||
tvi_param_t *params;
|
||||
|
||||
mp_msg(MSGT_TV, MSGL_INFO, "Selected driver: %s\n", tvh->info->short_name);
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " name: %s\n", tvh->info->name);
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " author: %s\n", tvh->info->author);
|
||||
if (tvh->info->comment)
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " comment: %s\n", tvh->info->comment);
|
||||
|
||||
params = malloc(sizeof(tvi_param_t)*2);
|
||||
params[0].opt = strdup("input");
|
||||
params[0].value = malloc(sizeof(int));
|
||||
(int)*(void **)params[0].value = tv_param_input;
|
||||
params[1].opt = params[1].value = NULL;
|
||||
|
||||
return(tvh->functions->init(tvh->priv, params));
|
||||
return(tvh->functions->init(tvh->priv));
|
||||
}
|
||||
|
||||
int tv_uninit(tvi_handle_t *tvh)
|
||||
|
|
|
@ -41,16 +41,10 @@ typedef struct tvi_functions_s
|
|||
int (*get_audio_framesize)();
|
||||
} tvi_functions_t;
|
||||
|
||||
typedef struct tvi_param_s {
|
||||
const char *opt;
|
||||
void *value;
|
||||
} tvi_param_t;
|
||||
|
||||
typedef struct tvi_handle_s {
|
||||
tvi_info_t *info;
|
||||
tvi_functions_t *functions;
|
||||
void *priv;
|
||||
tvi_param_t *params;
|
||||
int seq;
|
||||
|
||||
/* specific */
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
static int init(priv_t *priv, tvi_param_t *params);
|
||||
#include <stdlib.h> /* malloc */
|
||||
|
||||
static int init(priv_t *priv);
|
||||
static int uninit(priv_t *priv);
|
||||
static int control(priv_t *priv, int cmd, void *arg);
|
||||
static int start(priv_t *priv);
|
||||
|
@ -34,7 +36,6 @@ static tvi_handle_t *new_handle()
|
|||
memset(h->priv, 0, sizeof(priv_t));
|
||||
h->info = &info;
|
||||
h->functions = &functions;
|
||||
h->params = NULL;
|
||||
h->seq = 0;
|
||||
h->chanlist = -1;
|
||||
h->chanlist_s = NULL;
|
||||
|
|
|
@ -33,7 +33,7 @@ tvi_handle_t *tvi_init_dummy(char *device)
|
|||
}
|
||||
|
||||
/* initialisation */
|
||||
static int init(priv_t *priv, tvi_param_t *params)
|
||||
static int init(priv_t *priv)
|
||||
{
|
||||
priv->width = 320;
|
||||
priv->height = 200;
|
||||
|
@ -48,6 +48,7 @@ static int start(priv_t *priv)
|
|||
|
||||
static int uninit(priv_t *priv)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int control(priv_t *priv, int cmd, void *arg)
|
||||
|
@ -88,6 +89,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
static int grab_video_frame(priv_t *priv, char *buffer, int len)
|
||||
{
|
||||
memset(buffer, 0x42, len);
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int get_video_framesize(priv_t *priv)
|
||||
|
@ -99,6 +101,7 @@ static int get_video_framesize(priv_t *priv)
|
|||
static int grab_audio_frame(priv_t *priv, char *buffer, int len)
|
||||
{
|
||||
memset(buffer, 0x42, len);
|
||||
return(1);
|
||||
}
|
||||
|
||||
static int get_audio_framesize(priv_t *priv)
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <linux/videodev.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -33,16 +34,18 @@
|
|||
#include "tv.h"
|
||||
|
||||
static tvi_info_t info = {
|
||||
"Video for Linux TV Input",
|
||||
"Video 4 Linux input",
|
||||
"v4l",
|
||||
"Alex Beregszaszi <alex@naxine.org>",
|
||||
"under development"
|
||||
};
|
||||
|
||||
#define MAX_AUDIO_CHANNELS 10
|
||||
|
||||
typedef struct {
|
||||
/* general */
|
||||
char *video_device;
|
||||
int fd;
|
||||
int video_fd;
|
||||
struct video_capability capability;
|
||||
struct video_channel *channels;
|
||||
int act_channel;
|
||||
|
@ -62,8 +65,15 @@ typedef struct {
|
|||
int queue;
|
||||
|
||||
/* audio */
|
||||
struct video_audio *audio;
|
||||
int act_audio;
|
||||
int audio_id;
|
||||
char *audio_device;
|
||||
struct video_audio audio[MAX_AUDIO_CHANNELS];
|
||||
int audio_fd;
|
||||
int audio_channels[MAX_AUDIO_CHANNELS];
|
||||
int audio_format[MAX_AUDIO_CHANNELS];
|
||||
int audio_samplesize[MAX_AUDIO_CHANNELS];
|
||||
int audio_samplerate[MAX_AUDIO_CHANNELS];
|
||||
int audio_blocksize;
|
||||
} priv_t;
|
||||
|
||||
#include "tvi_def.h"
|
||||
|
@ -99,12 +109,12 @@ static int palette2depth(int palette)
|
|||
case VIDEO_PALETTE_RGB32:
|
||||
return(32);
|
||||
/* planar */
|
||||
case VIDEO_PALETTE_YUV422P:
|
||||
case VIDEO_PALETTE_YUV411P:
|
||||
case VIDEO_PALETTE_YUV420P:
|
||||
case VIDEO_PALETTE_YUV410P:
|
||||
return(12);
|
||||
/* packed */
|
||||
case VIDEO_PALETTE_YUV422P:
|
||||
case VIDEO_PALETTE_YUV422:
|
||||
case VIDEO_PALETTE_YUYV:
|
||||
case VIDEO_PALETTE_UYVY:
|
||||
|
@ -132,87 +142,12 @@ static int format2palette(int format)
|
|||
return(VIDEO_PALETTE_YUV420P);
|
||||
case IMGFMT_UYVY:
|
||||
return(VIDEO_PALETTE_YUV422);
|
||||
case IMGFMT_YUY2:
|
||||
return(VIDEO_PALETTE_YUYV);
|
||||
}
|
||||
return(-1);
|
||||
}
|
||||
|
||||
#if 0
|
||||
struct STRTAB {
|
||||
long nr;
|
||||
const char *str;
|
||||
};
|
||||
|
||||
static struct STRTAB stereo[] = {
|
||||
{ 0, "auto" },
|
||||
{ VIDEO_SOUND_MONO, "mono" },
|
||||
{ VIDEO_SOUND_STEREO, "stereo" },
|
||||
{ VIDEO_SOUND_LANG1, "lang1" },
|
||||
{ VIDEO_SOUND_LANG2, "lang1" },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
static struct STRTAB norms_v4l[] = {
|
||||
{ VIDEO_MODE_PAL, "PAL" },
|
||||
{ VIDEO_MODE_NTSC, "NTSC" },
|
||||
{ VIDEO_MODE_SECAM, "SECAM" },
|
||||
{ VIDEO_MODE_AUTO, "AUTO" },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
static struct STRTAB norms_bttv[] = {
|
||||
{ VIDEO_MODE_PAL, "PAL" },
|
||||
{ VIDEO_MODE_NTSC, "NTSC" },
|
||||
{ VIDEO_MODE_SECAM, "SECAM" },
|
||||
{ 3, "PAL-NC" },
|
||||
{ 4, "PAL-M" },
|
||||
{ 5, "PAL-N" },
|
||||
{ 6, "NTSC-JP" },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
static unsigned short _format2palette[VIDEO_FMT_COUNT] = {
|
||||
0, /* unused */
|
||||
VIDEO_PALETTE_HI240, /* RGB8 */
|
||||
VIDEO_PALETTE_GREY,
|
||||
VIDEO_PALETTE_RGB555,
|
||||
VIDEO_PALETTE_RGB565,
|
||||
0,
|
||||
0,
|
||||
VIDEO_PALETTE_RGB24,
|
||||
VIDEO_PALETTE_RGB32,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
VIDEO_PALETTE_YUV422,
|
||||
VIDEO_PALETTE_YUV422P,
|
||||
VIDEO_PALETTE_YUV420P,
|
||||
};
|
||||
#define FMT2PAL(fmt) ((fmt < sizeof(format2palette)/sizeof(unsigned short)) ? \
|
||||
format2palette[fmt] : 0);
|
||||
|
||||
const unsigned int vfmt_to_depth[] = {
|
||||
0,
|
||||
8,
|
||||
8,
|
||||
16,
|
||||
16,
|
||||
16,
|
||||
16,
|
||||
24,
|
||||
32,
|
||||
24,
|
||||
32,
|
||||
16,
|
||||
32,
|
||||
16,
|
||||
16,
|
||||
12,
|
||||
0,
|
||||
0,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int one = 1, zero = 0;
|
||||
|
||||
tvi_handle_t *tvi_init_v4l(char *device)
|
||||
|
@ -238,31 +173,34 @@ tvi_handle_t *tvi_init_v4l(char *device)
|
|||
return(NULL);
|
||||
}
|
||||
|
||||
/* set audio device name */
|
||||
priv->audio_device = strdup("/dev/dsp");
|
||||
|
||||
return(h);
|
||||
}
|
||||
|
||||
static int init(priv_t *priv, tvi_param_t *params)
|
||||
static int init(priv_t *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
priv->fd = open(priv->video_device, O_RDWR);
|
||||
if (priv->fd == -1)
|
||||
priv->video_fd = open(priv->video_device, O_RDWR);
|
||||
if (priv->video_fd == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n",
|
||||
priv->video_device, strerror(errno));
|
||||
goto err;
|
||||
}
|
||||
|
||||
mp_msg(MSGT_TV, MSGL_V, "Video fd: %d\n", priv->fd);
|
||||
mp_msg(MSGT_TV, MSGL_V, "Video fd: %d\n", priv->video_fd);
|
||||
|
||||
/* get capabilities (priv->capability is needed!) */
|
||||
if (ioctl(priv->fd, VIDIOCGCAP, &priv->capability) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGCAP, &priv->capability) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get capabilites failed: %s\n", strerror(errno));
|
||||
goto err;
|
||||
}
|
||||
|
||||
fcntl(priv->fd, F_SETFD, FD_CLOEXEC);
|
||||
fcntl(priv->video_fd, F_SETFD, FD_CLOEXEC);
|
||||
|
||||
mp_msg(MSGT_TV, MSGL_INFO, "Selected device: %s\n", priv->capability.name);
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " Capabilites: ");
|
||||
|
@ -285,7 +223,7 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
for (i = 0; i < priv->capability.channels; i++)
|
||||
{
|
||||
priv->channels[i].channel = i;
|
||||
if (ioctl(priv->fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno));
|
||||
break;
|
||||
|
@ -300,22 +238,51 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
priv->channels[i].norm);
|
||||
}
|
||||
|
||||
/* audio chanlist */
|
||||
if (priv->capability.audios)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " Audio devices: %d\n", priv->capability.audios);
|
||||
|
||||
priv->act_audio = 0;
|
||||
|
||||
for (i = 0; i < priv->capability.audios; i++)
|
||||
{
|
||||
priv->audio = realloc(priv->audio, sizeof(struct video_audio)*(i+1));
|
||||
if (i >= MAX_AUDIO_CHANNELS)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "no space for more audio channels (incrase in source!) (%d > %d)\n",
|
||||
i, MAX_AUDIO_CHANNELS);
|
||||
i = priv->capability.audios;
|
||||
break;
|
||||
}
|
||||
|
||||
priv->audio[i].audio = i;
|
||||
if (ioctl(priv->fd, VIDIOCGAUDIO, &priv->audio[i]) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
if (priv->audio[i].volume <= 0)
|
||||
priv->audio[i].volume = 100;
|
||||
priv->audio[i].flags &= ~VIDEO_AUDIO_MUTE;
|
||||
ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]);
|
||||
|
||||
switch(priv->audio[i].mode)
|
||||
{
|
||||
case VIDEO_SOUND_MONO:
|
||||
case VIDEO_SOUND_LANG1:
|
||||
case VIDEO_SOUND_LANG2:
|
||||
priv->audio_channels[i] = 1;
|
||||
break;
|
||||
case VIDEO_SOUND_STEREO:
|
||||
priv->audio_channels[i] = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
priv->audio_format[i] = AFMT_S16_LE;
|
||||
priv->audio_samplerate[i] = 44100;
|
||||
priv->audio_samplesize[i] = /*76000*/priv->audio_channels[i]*
|
||||
16*priv->audio_samplerate[i]/8;
|
||||
|
||||
/* display stuff */
|
||||
mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio,
|
||||
priv->audio[i].name);
|
||||
if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE)
|
||||
|
@ -324,10 +291,9 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
mp_msg(MSGT_TV, MSGL_V, "volume=%d bass=%d treble=%d balance=%d mode=%s\n",
|
||||
priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble,
|
||||
priv->audio[i].balance, audio_mode2name[priv->audio[i].mode]);
|
||||
|
||||
/* un-mute channels */
|
||||
priv->audio[i].flags &= ~VIDEO_AUDIO_MUTE;
|
||||
ioctl(priv->fd, VIDIOCGAUDIO, &priv->audio[i]);
|
||||
mp_msg(MSGT_TV, MSGL_V, " channels: %d, samplerate: %d, samplesize: %d, format: %s\n",
|
||||
priv->audio_channels[i], priv->audio_samplerate[i], priv->audio_samplesize[i],
|
||||
audio_out_format_name(priv->audio_format[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -338,7 +304,7 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
}
|
||||
|
||||
/* map grab buffer */
|
||||
if (ioctl(priv->fd, VIDIOCGMBUF, &priv->mbuf) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGMBUF, &priv->mbuf) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get mbuf failed: %s\n", strerror(errno));
|
||||
goto err;
|
||||
|
@ -347,10 +313,10 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
mp_msg(MSGT_TV, MSGL_V, "mbuf: size=%d, frames=%d\n",
|
||||
priv->mbuf.size, priv->mbuf.frames);
|
||||
priv->mmap = mmap(0, priv->mbuf.size, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, priv->fd, 0);
|
||||
MAP_SHARED, priv->video_fd, 0);
|
||||
if (priv->mmap == (unsigned char *)-1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "Unabel to map memory for buffers: %s\n", strerror(errno));
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "Unable to map memory for buffers: %s\n", strerror(errno));
|
||||
goto err;
|
||||
}
|
||||
mp_msg(MSGT_TV, MSGL_DBG2, "our buffer: %p\n", priv->mmap);
|
||||
|
@ -364,6 +330,86 @@ static int init(priv_t *priv, tvi_param_t *params)
|
|||
goto malloc_failed;
|
||||
memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap));
|
||||
|
||||
/* audio init */
|
||||
#if 0
|
||||
priv->audio_fd = open(priv->audio_device, O_RDONLY);
|
||||
if (priv->audio_fd < 0)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n",
|
||||
priv->audio_device, strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
int ioctl_param;
|
||||
|
||||
fcntl(priv->audio_fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
#if 0
|
||||
ioctl_param = 0x7fff000d; /* 8k */
|
||||
printf("ioctl dsp setfragment: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SETFRAGMENT, &ioctl_param));
|
||||
#endif
|
||||
|
||||
ioctl_param = 0 ;
|
||||
printf("ioctl dsp getfmt: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_GETFMTS, &ioctl_param));
|
||||
|
||||
printf("Supported formats: %x\n", ioctl_param);
|
||||
if (!(ioctl_param & priv->audio_format[priv->audio_id]))
|
||||
printf("notsupported format\n");
|
||||
|
||||
ioctl_param = priv->audio_format[priv->audio_id];
|
||||
printf("ioctl dsp setfmt: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SETFMT, &ioctl_param));
|
||||
|
||||
// ioctl(priv->audio_fd, SNDCTL_DSP_GETISPACE, &ioctl_param);
|
||||
// printf("getispace: %d\n", ioctl_param);
|
||||
|
||||
if (priv->audio_channels[priv->audio_id] > 2)
|
||||
{
|
||||
ioctl_param = priv->audio_channels[priv->audio_id];
|
||||
printf("ioctl dsp channels: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_CHANNELS, &ioctl_param));
|
||||
}
|
||||
else
|
||||
{
|
||||
// if (priv->audio_channels[priv->audio_id] == 2)
|
||||
// ioctl_param = 1;
|
||||
// else
|
||||
// ioctl_param = 0;
|
||||
|
||||
ioctl_param = (priv->audio_channels[priv->audio_id] == 2);
|
||||
printf("ioctl dsp stereo: %d (req: %d)\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_STEREO, &ioctl_param),
|
||||
ioctl_param);
|
||||
}
|
||||
|
||||
ioctl_param = priv->audio_samplerate[priv->audio_id];
|
||||
printf("ioctl dsp speed: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SPEED, &ioctl_param));
|
||||
|
||||
#if 0
|
||||
ioctl_param = 0;
|
||||
ioctl_param = ~PCM_ENABLE_INPUT;
|
||||
printf("ioctl dsp trigger: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
|
||||
ioctl_param = PCM_ENABLE_INPUT;
|
||||
printf("ioctl dsp trigger: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
|
||||
#endif
|
||||
|
||||
printf("ioctl dsp trigger: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_GETTRIGGER, &ioctl_param));
|
||||
printf("trigger: %x\n", ioctl_param);
|
||||
ioctl_param = PCM_ENABLE_INPUT;
|
||||
printf("ioctl dsp trigger: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
|
||||
|
||||
printf("ioctl dsp getblocksize: %d\n",
|
||||
ioctl(priv->audio_fd, SNDCTL_DSP_GETBLKSIZE, &priv->audio_blocksize));
|
||||
printf("blocksize: %d\n", priv->audio_blocksize);
|
||||
}
|
||||
#endif
|
||||
return(1);
|
||||
|
||||
|
||||
|
@ -373,14 +419,19 @@ malloc_failed:
|
|||
if (priv->buf)
|
||||
free(priv->buf);
|
||||
err:
|
||||
if (priv->fd != -1)
|
||||
close(priv->fd);
|
||||
if (priv->video_fd != -1)
|
||||
close(priv->video_fd);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int uninit(priv_t *priv)
|
||||
{
|
||||
close(priv->fd);
|
||||
close(priv->video_fd);
|
||||
|
||||
priv->audio[priv->audio_id].volume = 0;
|
||||
priv->audio[priv->audio_id].flags |= VIDEO_AUDIO_MUTE;
|
||||
ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]);
|
||||
close(priv->audio_fd);
|
||||
#warning "Implement uninit!"
|
||||
|
||||
return(1);
|
||||
|
@ -391,7 +442,7 @@ static int start(priv_t *priv)
|
|||
int i;
|
||||
|
||||
|
||||
if (ioctl(priv->fd, VIDIOCGPICT, &priv->picture) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
|
||||
return(0);
|
||||
|
@ -400,7 +451,14 @@ static int start(priv_t *priv)
|
|||
priv->picture.palette = format2palette(priv->format);
|
||||
priv->picture.depth = palette2depth(priv->picture.palette);
|
||||
priv->bytesperline = priv->width * priv->picture.depth / 8;
|
||||
|
||||
// if (IMGFMT_IS_BGR(priv->format) || IMGFMT_IS_RGB(priv->format))
|
||||
// priv->bytesperline = priv->width * priv->picture.depth / 8;
|
||||
// if ((priv->format == IMGFMT_YV12) || (priv->format == IMGFMT_I420) || (priv->format == IMGFMT_IYUV))
|
||||
// priv->bytesperline = priv->width * 3 / 2;
|
||||
|
||||
printf("palette: %d, depth: %d, bytesperline: %d\n",
|
||||
priv->picture.palette, priv->picture.depth, priv->bytesperline);
|
||||
|
||||
mp_msg(MSGT_TV, MSGL_INFO, "Picture values:\n");
|
||||
mp_msg(MSGT_TV, MSGL_INFO, " Depth: %d, Palette: %d (Format: %s)\n", priv->picture.depth,
|
||||
priv->picture.palette, vo_format_name(priv->format));
|
||||
|
@ -409,7 +467,7 @@ static int start(priv_t *priv)
|
|||
priv->picture.colour, priv->picture.contrast);
|
||||
|
||||
|
||||
if (ioctl(priv->fd, VIDIOCSPICT, &priv->picture) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno));
|
||||
return(0);
|
||||
|
@ -432,7 +490,7 @@ static int start(priv_t *priv)
|
|||
pmode.mode = VID_PLAY_NORMAL;
|
||||
pmode.p1 = 1;
|
||||
pmode.p2 = 0;
|
||||
if (ioctl(priv->fd, VIDIOCSPLAYMODE, &pmode) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSPLAYMODE, &pmode) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set play mode failed: %s\n", strerror(errno));
|
||||
// return(0);
|
||||
|
@ -451,11 +509,11 @@ static int start(priv_t *priv)
|
|||
win.chromakey = -1;
|
||||
win.flags = 0;
|
||||
|
||||
ioctl(priv->fd, VIDIOCSWIN, &win);
|
||||
ioctl(priv->video_fd, VIDIOCSWIN, &win);
|
||||
}
|
||||
|
||||
/* start capture */
|
||||
if (ioctl(priv->fd, VIDIOCCAPTURE, &one) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCCAPTURE, &one) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl capture failed: %s\n", strerror(errno));
|
||||
return(0);
|
||||
|
@ -479,11 +537,14 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
return(TVI_CONTROL_FALSE);
|
||||
}
|
||||
case TVI_CONTROL_IS_AUDIO:
|
||||
#if 0 /* also disable audio for as it's not working! */
|
||||
if (priv->channels[priv->act_channel].flags & VIDEO_VC_AUDIO)
|
||||
return(TVI_CONTROL_TRUE);
|
||||
#endif
|
||||
return(TVI_CONTROL_FALSE);
|
||||
/* also disable audio for as it's not working! */
|
||||
if (priv->channels[priv->act_channel].flags & VIDEO_VC_AUDIO)
|
||||
{
|
||||
// printf("yeah, audio csennel!!");
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
return(TVI_CONTROL_TRUE);
|
||||
case TVI_CONTROL_IS_TUNER:
|
||||
{
|
||||
// if (priv->capability.type & VID_TYPE_TUNER)
|
||||
|
@ -544,14 +605,14 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
priv->height = (int)*(void **)arg;
|
||||
return(TVI_CONTROL_TRUE);
|
||||
case TVI_CONTROL_VID_GET_PICTURE:
|
||||
if (ioctl(priv->fd, VIDIOCGPICT, &priv->picture) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
}
|
||||
return(TVI_CONTROL_TRUE);
|
||||
case TVI_CONTROL_VID_SET_PICTURE:
|
||||
if (ioctl(priv->fd, VIDIOCSPICT, &priv->picture) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -579,7 +640,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
{
|
||||
unsigned long freq;
|
||||
|
||||
if (ioctl(priv->fd, VIDIOCGFREQ, &freq) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGFREQ, &freq) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get freq failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -602,7 +663,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
// if (priv->tuner.flags & VIDEO_TUNER_LOW)
|
||||
// freq *= 1000;
|
||||
// mp_msg(MSGT_TV, MSGL_V, " requesting from driver: freq=%.3f\n", (float)freq/16);
|
||||
if (ioctl(priv->fd, VIDIOCSFREQ, &freq) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSFREQ, &freq) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set freq failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -611,7 +672,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
}
|
||||
case TVI_CONTROL_TUN_GET_TUNER:
|
||||
{
|
||||
if (ioctl(priv->fd, VIDIOCGTUNER, &priv->tuner) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -623,7 +684,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
}
|
||||
case TVI_CONTROL_TUN_SET_TUNER:
|
||||
{
|
||||
if (ioctl(priv->fd, VIDIOCSTUNER, &priv->tuner) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSTUNER, &priv->tuner) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -645,7 +706,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
|
||||
priv->tuner.mode = req_mode;
|
||||
|
||||
if (control(priv->fd, TVI_CONTROL_TUN_SET_TUNER, &priv->tuner) != TVI_CONTROL_TRUE)
|
||||
if (control(priv->video_fd, TVI_CONTROL_TUN_SET_TUNER, &priv->tuner) != TVI_CONTROL_TRUE)
|
||||
return(TVI_CONTROL_FALSE);
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
|
@ -659,22 +720,22 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
/* ========== AUDIO controls =========== */
|
||||
case TVI_CONTROL_AUD_GET_FORMAT:
|
||||
{
|
||||
(int)*(void **)arg = AFMT_S16_LE;
|
||||
(int)*(void **)arg = priv->audio_format[priv->audio_id];
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
case TVI_CONTROL_AUD_GET_CHANNELS:
|
||||
{
|
||||
(int)*(void **)arg = 2;
|
||||
(int)*(void **)arg = priv->audio_channels[priv->audio_id];
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
case TVI_CONTROL_AUD_GET_SAMPLERATE:
|
||||
{
|
||||
(int)*(void **)arg = 44100;
|
||||
(int)*(void **)arg = priv->audio_samplerate[priv->audio_id];
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
case TVI_CONTROL_AUD_GET_SAMPLESIZE:
|
||||
{
|
||||
(int)*(void **)arg = 76000;
|
||||
(int)*(void **)arg = priv->audio_samplesize[priv->audio_id];
|
||||
return(TVI_CONTROL_TRUE);
|
||||
}
|
||||
|
||||
|
@ -692,7 +753,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
|
||||
priv->act_channel = i;
|
||||
|
||||
if (ioctl(priv->fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -719,7 +780,7 @@ static int control(priv_t *priv, int cmd, void *arg)
|
|||
chan = priv->channels[i];
|
||||
}
|
||||
|
||||
if (ioctl(priv->fd, VIDIOCSCHAN, &chan) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCSCHAN, &chan) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set chan failed: %s\n", strerror(errno));
|
||||
return(TVI_CONTROL_FALSE);
|
||||
|
@ -752,13 +813,13 @@ static int grab_video_frame(priv_t *priv, char *buffer, int len)
|
|||
|
||||
mp_dbg(MSGT_TV, MSGL_DBG3, "buf: %p + frame: %d => %p\n",
|
||||
priv->buf, nextframe, &priv->buf[nextframe]);
|
||||
if (ioctl(priv->fd, VIDIOCMCAPTURE, &priv->buf[nextframe]) == -1)
|
||||
if (ioctl(priv->video_fd, VIDIOCMCAPTURE, &priv->buf[nextframe]) == -1)
|
||||
{
|
||||
mp_msg(MSGT_TV, MSGL_ERR, "ioctl mcapture failed: %s\n", strerror(errno));
|
||||
return(0);
|
||||
}
|
||||
|
||||
while (ioctl(priv->fd, VIDIOCSYNC, &priv->buf[frame].frame) < 0 &&
|
||||
while (ioctl(priv->video_fd, VIDIOCSYNC, &priv->buf[frame].frame) < 0 &&
|
||||
(errno == EAGAIN || errno == EINTR));
|
||||
mp_dbg(MSGT_TV, MSGL_DBG3, "picture sync failed\n");
|
||||
|
||||
|
@ -784,12 +845,34 @@ static int get_video_framesize(priv_t *priv)
|
|||
|
||||
static int grab_audio_frame(priv_t *priv, char *buffer, int len)
|
||||
{
|
||||
return(65536);
|
||||
int in_len = 0;
|
||||
|
||||
/* DBG2 !! */
|
||||
mp_dbg(MSGT_TV, MSGL_V, "grab_audio_frame(priv=%p, buffer=%p, len=%d)\n",
|
||||
priv, buffer, len);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
in_len = read(priv->audio_fd, buffer, len);
|
||||
// printf("in_len: %d\n", in_len);
|
||||
// fflush(NULL);
|
||||
|
||||
if (in_len > 0)
|
||||
break;
|
||||
if (!((in_len == 0) || (in_len == -1 && (errno == EAGAIN || errno == EINTR))))
|
||||
{
|
||||
in_len = 0; /* -EIO */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(in_len);
|
||||
}
|
||||
|
||||
static int get_audio_framesize(priv_t *priv)
|
||||
{
|
||||
return(65536);
|
||||
return(priv->audio_blocksize);
|
||||
// return(priv->audio_samplesize[priv->audio_id]);
|
||||
}
|
||||
|
||||
#endif /* USE_TV */
|
||||
|
|
Loading…
Reference in New Issue