[Mplayer-cvslog] CVS: main/libmpdemux tv.c,1.44,1.45 tv.h,1.20,1.21 tvi_v4l.c,1.46,1.47

Jindrich Makovicka CVS henry at mplayerhq.hu
Sat Dec 28 23:57:42 CET 2002


Update of /cvsroot/mplayer/main/libmpdemux
In directory mail:/var/tmp.root/cvs-serv23809/libmpdemux

Modified Files:
	tv.c tv.h tvi_v4l.c 
Log Message:
user friendly channel tuning + 10L fix in tvi_v4l (by Stephane Jourdois)

Index: tv.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/tv.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- tv.c	19 Dec 2002 10:09:43 -0000	1.44
+++ tv.c	28 Dec 2002 22:57:39 -0000	1.45
@@ -52,6 +52,7 @@
 int tv_param_input = 0; /* used in v4l and bttv */
 char *tv_param_outfmt = "yv12";
 float tv_param_fps = -1.0;
+char **tv_param_channels = NULL;
 #ifdef HAVE_TV_V4L
 int tv_param_amode = -1;
 int tv_param_audio_id = 0;
@@ -233,6 +234,72 @@
 	goto done;
     }
 
+    /* Handle channels names */
+    if (tv_param_channels) {
+	mp_msg(MSGT_TV, MSGL_INFO, "TV Channels names detected.\n");
+	tv_channel_list = malloc(sizeof(tv_channels_t));
+	tv_channel_list->index=1;
+	tv_channel_list->next=NULL;
+	tv_channel_list->prev=NULL;
+	tv_channel_current = tv_channel_list;
+
+	while (*tv_param_channels) {
+		char* tmp = *(tv_param_channels++);
+		int i;
+		struct CHANLIST cl;
+
+		strcpy(tv_channel_current->name, strchr(tmp, '-') + 1);
+		strchr(tmp, '-')[0] = '\0';
+		strncpy(tv_channel_current->number, tmp, 4);
+
+		while (strchr(tv_channel_current->name, '_'))
+			strchr(tv_channel_current->name, '_')[0] = ' ';
+
+		tv_channel_current->freq = 0;
+		for (i = 0; i < chanlists[tvh->chanlist].count; i++) {
+		    cl = tvh->chanlist_s[i];
+		    if (!strcasecmp(cl.name, tv_channel_current->number)) {
+			tv_channel_current->freq=cl.freq;
+			break;
+		    }
+		}
+	        if (tv_channel_current->freq == 0)
+		    mp_msg(MSGT_TV, MSGL_ERR, "Couldn't find frequency for channel %s (%s)\n",
+				    tv_channel_current->number, tv_channel_current->name);
+
+		/*mp_msg(MSGT_TV, MSGL_INFO, "-- Detected channel %s - %s (%5.3f)\n",
+				tv_channel_current->number, tv_channel_current->name,
+				(float)tv_channel_current->freq/1000);*/
+
+		tv_channel_current->next = malloc(sizeof(tv_channels_t));
+		tv_channel_current->next->index = tv_channel_current->index + 1;
+		tv_channel_current->next->prev = tv_channel_current;
+		tv_channel_current->next->next = NULL;
+		tv_channel_current = tv_channel_current->next;
+	}
+
+	tv_channel_current->prev->next = NULL;
+	free(tv_channel_current);
+    } else 
+	    tv_channel_last_real = malloc(sizeof(char)*5);
+
+    if (tv_channel_list) {
+	int i;
+	int channel;
+	if (tv_param_channel)
+		channel = atoi(tv_param_channel);
+	else
+		channel = 1;
+
+	tv_channel_current = tv_channel_list;
+	for (i = 1; i < channel; i++)
+		if (tv_channel_current->next)
+			tv_channel_current = tv_channel_current->next;
+	mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s - %s (freq: %.3f)\n", tv_channel_current->number,
+			tv_channel_current->name, (float)tv_channel_current->freq/1000);
+	tv_set_freq(tvh, (unsigned long)(((float)tv_channel_current->freq/1000)*16));
+	tv_channel_last = tv_channel_current;
+    } else {
     /* we need to set frequency */
     if (tv_param_freq)
     {
@@ -246,18 +313,18 @@
 	    freq, (float)freq/16);
     }
 
-    if (tv_param_channel)
-    {
+	    if (tv_param_channel) {
 	struct CHANLIST cl;
 
 	mp_msg(MSGT_TV, MSGL_V, "Requested channel: %s\n", tv_param_channel);
 	for (i = 0; i < chanlists[tvh->chanlist].count; i++)
 	{
 	    cl = tvh->chanlist_s[i];
-//	    printf("count%d: name: %s, freq: %d\n",
-//		i, cl.name, cl.freq);
+		    //  printf("count%d: name: %s, freq: %d\n",
+		    //	i, cl.name, cl.freq);
 	    if (!strcasecmp(cl.name, tv_param_channel))
 	    {
+			strcpy(tv_channel_last_real, cl.name);
 		tvh->channel = i;
 		mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s (freq: %.3f)\n",
 		    cl.name, (float)cl.freq/1000);
@@ -266,6 +333,7 @@
 	    }
 	}
     }
+    }
     
     /* grep frequency in chanlist */
     {
@@ -526,7 +594,7 @@
     return(1);
 }
 
-int tv_step_channel(tvi_handle_t *tvh, int direction)
+int tv_step_channel_real(tvi_handle_t *tvh, int direction)
 {
     struct CHANLIST cl;
 
@@ -534,6 +602,7 @@
     {
 	if (tvh->channel-1 >= 0)
 	{
+	    strcpy(tv_channel_last_real, tvh->chanlist_s[tvh->channel].name);
 	    cl = tvh->chanlist_s[--tvh->channel];
 	    mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s (freq: %.3f)\n",
 		cl.name, (float)cl.freq/1000);
@@ -545,6 +614,7 @@
     {
 	if (tvh->channel+1 < chanlists[tvh->chanlist].count)
 	{
+	    strcpy(tv_channel_last_real, tvh->chanlist_s[tvh->channel].name);
 	    cl = tvh->chanlist_s[++tvh->channel];
 	    mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s (freq: %.3f)\n",
 		cl.name, (float)cl.freq/1000);
@@ -554,11 +624,35 @@
     return(1);
 }
 
-int tv_set_channel(tvi_handle_t *tvh, char *channel)
-{
+int tv_step_channel(tvi_handle_t *tvh, int direction) {
+	if (tv_channel_list) {
+		if (direction == TV_CHANNEL_HIGHER) {
+			if (tv_channel_current->next) {
+				tv_channel_last = tv_channel_current;
+				tv_channel_current = tv_channel_current->next;
+				tv_set_freq(tvh, (unsigned long)(((float)tv_channel_current->freq/1000)*16));
+				mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s - %s (freq: %.3f)\n",
+			tv_channel_current->number, tv_channel_current->name, (float)tv_channel_current->freq/1000);
+			}
+		}
+		if (direction == TV_CHANNEL_LOWER) {
+			if (tv_channel_current->prev) {
+				tv_channel_last = tv_channel_current;
+				tv_channel_current = tv_channel_current->prev;
+				tv_set_freq(tvh, (unsigned long)(((float)tv_channel_current->freq/1000)*16));
+				mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s - %s (freq: %.3f)\n",
+			tv_channel_current->number, tv_channel_current->name, (float)tv_channel_current->freq/1000);
+			}
+		}
+	} else tv_step_channel_real(tvh, direction);
+	return(1);
+}
+
+int tv_set_channel_real(tvi_handle_t *tvh, char *channel) {
 	int i;
 	struct CHANLIST cl;
 
+        strcpy(tv_channel_last_real, tvh->chanlist_s[tvh->channel].name);
 	for (i = 0; i < chanlists[tvh->chanlist].count; i++)
 	{
 	    cl = tvh->chanlist_s[i];
@@ -573,6 +667,57 @@
 		break;
 	    }
 	}
+	return(1);
+}
+
+int tv_set_channel(tvi_handle_t *tvh, char *channel) {
+	int i, channel_int;
+
+	if (tv_channel_list) {
+		tv_channel_last = tv_channel_current;
+		channel_int = atoi(channel);
+		tv_channel_current = tv_channel_list;
+		for (i = 1; i < channel_int; i++)
+			if (tv_channel_current->next)
+				tv_channel_current = tv_channel_current->next;
+		mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s - %s (freq: %.3f)\n", tv_channel_current->number,
+				tv_channel_current->name, (float)tv_channel_current->freq/1000);
+		tv_set_freq(tvh, (unsigned long)(((float)tv_channel_current->freq/1000)*16));
+	} else tv_set_channel_real(tvh, channel);
+	return(1);
+}
+
+int tv_last_channel(tvi_handle_t *tvh) {
+
+	if (tv_channel_list) {
+		tv_channels_t *tmp;
+
+		tmp = tv_channel_last;
+		tv_channel_last = tv_channel_current;
+		tv_channel_current = tmp;
+
+		mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s - %s (freq: %.3f)\n", tv_channel_current->number,
+				tv_channel_current->name, (float)tv_channel_current->freq/1000);
+		tv_set_freq(tvh, (unsigned long)(((float)tv_channel_current->freq/1000)*16));
+	} else {
+		int i;
+		struct CHANLIST cl;
+
+		for (i = 0; i < chanlists[tvh->chanlist].count; i++)
+		{
+		    cl = tvh->chanlist_s[i];
+		    if (!strcasecmp(cl.name, tv_channel_last_real))
+		    {
+			strcpy(tv_channel_last_real, tvh->chanlist_s[tvh->channel].name);
+			tvh->channel = i;
+			mp_msg(MSGT_TV, MSGL_INFO, "Selected channel: %s (freq: %.3f)\n",
+			    cl.name, (float)cl.freq/1000);
+			tv_set_freq(tvh, (unsigned long)(((float)cl.freq/1000)*16));
+			break;
+		    }
+		}
+	}
+	return(1);
 }
 
 int tv_step_norm(tvi_handle_t *tvh)

Index: tv.h
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/tv.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- tv.h	19 Dec 2002 10:09:43 -0000	1.20
+++ tv.h	28 Dec 2002 22:57:39 -0000	1.21
@@ -20,6 +20,7 @@
 extern int tv_param_input;
 extern char *tv_param_outfmt;
 extern float tv_param_fps;
+extern char **tv_param_channels;
 extern int tv_param_noaudio;
 extern int tv_param_immediate;
 extern int tv_param_audiorate;
@@ -75,6 +76,18 @@
     int			channel;
 } tvi_handle_t;
 
+typedef struct tv_channels_s {
+    int index;
+    char number[5];
+    char name[20];
+    int   freq;
+    struct tv_channels_s *next;
+    struct tv_channels_s *prev;
+} tv_channels_t;
+
+tv_channels_t *tv_channel_list;
+tv_channels_t *tv_channel_current, *tv_channel_last;
+char *tv_channel_last_real;
 
 #define TVI_CONTROL_FALSE		0
 #define TVI_CONTROL_TRUE		1
@@ -144,10 +157,14 @@
 #define TV_COLOR_SATURATION	3
 #define TV_COLOR_CONTRAST	4
 
+int tv_step_channel_real(tvi_handle_t *tvh, int direction);
 int tv_step_channel(tvi_handle_t *tvh, int direction);
 #define TV_CHANNEL_LOWER	1
 #define TV_CHANNEL_HIGHER	2
 
+int tv_last_channel(tvi_handle_t *tvh);
+
+int tv_set_channel_real(tvi_handle_t *tvh, char *channel);
 int tv_set_channel(tvi_handle_t *tvh, char *channel);
 
 int tv_step_norm(tvi_handle_t *tvh);

Index: tvi_v4l.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpdemux/tvi_v4l.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- tvi_v4l.c	16 Dec 2002 23:24:02 -0000	1.46
+++ tvi_v4l.c	28 Dec 2002 22:57:39 -0000	1.47
@@ -1225,7 +1225,6 @@
     struct timeval curtime;
     long long skew, prev_skew, xskew, interval, prev_interval;
     int frame, nextframe;
-    int fsize = priv->bytesperline * priv->height;
     int i;
     int first = 1;
     int framecount;
@@ -1284,7 +1283,7 @@
 		if (!priv->immediate_mode) {
 		    interval = (long long)1e6*curtime.tv_sec + curtime.tv_usec - priv->starttime;
 		} else {
-		    interval = (double)framecount/priv->fps;
+		    interval = (long long)1e6*framecount/priv->fps;
 		}
 
 		if (!priv->immediate_mode) {




More information about the MPlayer-cvslog mailing list