summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-11-16 21:30:10 +0000
committeralex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-11-16 21:30:10 +0000
commit70eb7d6a585393d21090b0752513c0a96ede979e (patch)
tree4f02bbd52b5ed537e8c1fc9015c9e4b7cec70f83
parentfa0d4bc0f672db0063cbaaeae22a1ea5bc83b9e1 (diff)
downloadmpv-70eb7d6a585393d21090b0752513c0a96ede979e.tar.bz2
mpv-70eb7d6a585393d21090b0752513c0a96ede979e.tar.xz
tv interface update
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2932 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--libmpdemux/demuxer.c11
-rw-r--r--libmpdemux/open.c25
-rw-r--r--libmpdemux/tv.c9
-rw-r--r--libmpdemux/tv.h3
-rw-r--r--libmpdemux/tvi_v4l.c35
5 files changed, 64 insertions, 19 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 93e5062311..a6ccb1b019 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -160,7 +160,10 @@ int demux_vivo_fill_buffer(demuxer_t *demux);
#ifdef USE_TV
#include "tv.h"
extern tvi_handle_t *tv_handler;
-int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh);
+extern int tv_param_on;
+
+extern int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh);
+extern int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh);
#endif
int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
@@ -352,10 +355,8 @@ demuxer_t* demux_open_avi(demuxer_t* demuxer);
int mov_check_file(demuxer_t* demuxer);
int mov_read_header(demuxer_t* demuxer);
-#ifdef USE_TV
-/* tv ! */
-extern int tv_param_on;
-#endif
+extern int vivo_check_file(demuxer_t *demuxer);
+extern void demux_open_vivo(demuxer_t *demuxer);
demuxer_t* demux_open(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id){
diff --git a/libmpdemux/open.c b/libmpdemux/open.c
index 3279f6a8fa..5f73540201 100644
--- a/libmpdemux/open.c
+++ b/libmpdemux/open.c
@@ -73,6 +73,8 @@ extern int vcd_get_track_end(int fd,int track);
#ifdef USE_TV
#include "tv.h"
tvi_handle_t *tv_handler;
+
+extern int stream_open_tv(stream_t *stream, tvi_handle_t *tvh);
#endif
// Open a new stream (stdin/file/vcd/url)
@@ -249,14 +251,29 @@ if(dvd_title){
#ifdef USE_TV
//============ Check for TV-input ====
- if (tv_param_on==1)
+ if (tv_param_on == 1)
{
- stream = new_stream(-1,STREAMTYPE_TV);
+ /* create stream */
+ stream = new_stream(-1, STREAMTYPE_TV);
+ if (!stream)
+ return(NULL);
+
+ /* create tvi handler */
tv_handler = tv_begin();
if (!tv_handler)
return(NULL);
- if (tv_init(tv_handler) == 1)
- return(stream);
+
+ /* preinit */
+ if (!tv_init(tv_handler))
+ goto tv_err;
+
+ if (!stream_open_tv(stream, tv_handler))
+ goto tv_err;
+
+ return(stream);
+
+ /* something went wrong - uninit */
+tv_err:
tv_uninit(tv_handler);
return(NULL);
}
diff --git a/libmpdemux/tv.c b/libmpdemux/tv.c
index 7f92dbf563..0da3ca030f 100644
--- a/libmpdemux/tv.c
+++ b/libmpdemux/tv.c
@@ -3,7 +3,7 @@
API idea based on libvo2's
- UNDER HEAVY DEVELOPEMENT, DO NOT USE! :)
+ UNDER HEAVY DEVELOPEMENT, NO FEATURE REQUESTS PLEASE! :)
*/
#include <stdio.h>
@@ -53,7 +53,7 @@ int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh)
demux_packet_t* dp;
int len;
- mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_tv_fill_buffer(sequence:%d) called!\n", seq);
+ mp_dbg(MSGT_DEMUX, MSGL_DBG2, "demux_tv_fill_buffer(sequence:%d) called!\n", seq);
// demux->filepos = -1;
@@ -88,6 +88,10 @@ int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh)
return 1;
}
+int stream_open_tv(stream_t *stream, tvi_handle_t *tvh)
+{
+}
+
int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh)
{
sh_video_t *sh_video = NULL;
@@ -176,6 +180,7 @@ int demux_open_tv(demuxer_t *demuxer, tvi_handle_t *tvh)
demuxer->video->sh = sh_video;
sh_video->ds = demuxer->video;
demuxer->video->id = 0;
+ demuxer->seekable = 0;
/* here comes audio init */
if (funcs->control(tvh->priv, TVI_CONTROL_IS_AUDIO, 0) == TVI_CONTROL_TRUE)
diff --git a/libmpdemux/tv.h b/libmpdemux/tv.h
index 19e5c2cd14..f87fca9390 100644
--- a/libmpdemux/tv.h
+++ b/libmpdemux/tv.h
@@ -97,9 +97,8 @@ typedef struct tvi_handle_s {
#define TVI_CONTROL_SPC_GET_INPUT 0x401 /* set input channel (tv,s-video,composite..) */
#define TVI_CONTROL_SPC_SET_INPUT 0x402 /* set input channel (tv,s-video,composite..) */
-//extern int demux_tv_fill_buffer(demuxer_t *demux, tvi_handle_t *tvh);
-//extern int demux_open_tv(demuxer_t *demux, tvi_handle_t *tvh);
extern tvi_handle_t *tv_begin(void);
extern int tv_init(tvi_handle_t *tvh);
+extern int tv_uninit(tvi_handle_t *tvh);
#endif /* USE_TV */
diff --git a/libmpdemux/tvi_v4l.c b/libmpdemux/tvi_v4l.c
index 45648747f6..05a950ec38 100644
--- a/libmpdemux/tvi_v4l.c
+++ b/libmpdemux/tvi_v4l.c
@@ -22,6 +22,8 @@
#include <linux/videodev.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <stdlib.h>
+#include <string.h>
#include "mp_msg.h"
#include "../libao2/afmt.h"
@@ -349,7 +351,6 @@ static int init(priv_t *priv, tvi_param_t *params)
/* video buffers */
priv->buf = (struct video_mmap *)malloc(priv->nbuf * sizeof(struct video_mmap));
memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap));
-
return(1);
@@ -363,6 +364,8 @@ static int uninit(priv_t *priv)
{
close(priv->fd);
#warning "Implement uninit!"
+
+ return(1);
}
static int start(priv_t *priv)
@@ -404,6 +407,20 @@ static int start(priv_t *priv)
mp_msg(MSGT_TV, MSGL_DBG2, "buffer: %d => %p\n", i, &priv->buf[i]);
}
+#if 0
+ {
+ struct video_play_mode pmode;
+
+ pmode.mode = VID_PLAY_NORMAL;
+ pmode.p1 = 1;
+ pmode.p2 = 0;
+ if (ioctl(priv->fd, VIDIOCSPLAYMODE, &pmode) == -1)
+ {
+ mp_msg(MSGT_TV, MSGL_ERR, "ioctl set play mode failed: %s\n", strerror(errno));
+// return(0);
+ }
+ }
+#endif
#if 0
{
@@ -709,10 +726,10 @@ static int grab_video_frame(priv_t *priv, char *buffer, int len)
int frame = priv->queue % priv->nbuf;
int nextframe = (priv->queue+1) % priv->nbuf;
- mp_msg(MSGT_TV, MSGL_DBG2, "grab_video_frame(priv=%p, buffer=%p, len=%d\n",
+ mp_dbg(MSGT_TV, MSGL_DBG2, "grab_video_frame(priv=%p, buffer=%p, len=%d\n",
priv, buffer, len);
- mp_msg(MSGT_TV, MSGL_DBG3, "buf: %p + frame: %d => %p\n",
+ 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)
{
@@ -724,9 +741,14 @@ static int grab_video_frame(priv_t *priv, char *buffer, int len)
mp_msg(MSGT_TV, MSGL_ERR, "ioctl sync failed: %s\n", strerror(errno));
priv->queue++;
- mp_msg(MSGT_TV, MSGL_DBG3, "mmap: %p + offset: %d => %p\n",
+ mp_dbg(MSGT_TV, MSGL_DBG3, "mmap: %p + offset: %d => %p\n",
priv->mmap, priv->mbuf.offsets[frame],
priv->mmap+priv->mbuf.offsets[frame]);
+
+ /* XXX also directrendering would be nicer! */
+ /* 3 times copying the same picture to other buffer :( */
+
+ /* copy the actual frame */
memcpy(buffer, priv->mmap+priv->mbuf.offsets[frame], len);
return(len);
@@ -734,16 +756,17 @@ static int grab_video_frame(priv_t *priv, char *buffer, int len)
static int get_video_framesize(priv_t *priv)
{
- return priv->bytesperline * priv->height;
+ return(priv->bytesperline * priv->height);
}
static int grab_audio_frame(priv_t *priv, char *buffer, int len)
{
+ return(65536);
}
static int get_audio_framesize(priv_t *priv)
{
- return 65536;
+ return(65536);
}
#endif /* USE_TV */