Hi folks, The segfault was introduced in xineliboutput's cvs between 28.01.2010 and 29.01.2010 The following change produces it:
--- xine_input_vdr.c.old 2010-02-13 14:13:48.670894516 +0100 +++ xine_input_vdr.c 2010-02-13 14:13:56.246141788 +0100 @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: xine_input_vdr.c,v 1.289 2010/01/18 20:39:36 phintuka Exp $ + * $Id: xine_input_vdr.c,v 1.291 2010/01/28 11:50:07 phintuka Exp $ * */
@@ -62,6 +62,7 @@
#include "xine/adjustable_scr.h" #include "xine/osd_manager.h" +#include "xine/xvdr_metronom.h"
#include "xine_input_vdr.h" #include "xine_input_vdr_net.h" @@ -127,7 +128,7 @@ # include <linux/unistd.h> /* syscall(__NR_gettid) */ #endif
-static const char module_revision[] = "$Id: xine_input_vdr.c,v 1.289 2010/01/18 20:39:36 phintuka Exp $"; +static const char module_revision[] = "$Id: xine_input_vdr.c,v 1.291 2010/01/28 11:50:07 phintuka Exp $"; static const char log_module_input_vdr[] = "[input_vdr] "; #define LOG_MODULENAME log_module_input_vdr #define SysLogLevel iSysLogLevel @@ -313,6 +314,9 @@ uint8_t hd_stream : 1; /* true if current stream is HD */ uint8_t sw_volume_control : 1;
+ /* metronom */ + xvdr_metronom_t *metronom; + /* SCR */ adjustable_scr_t *scr; int speed_before_pause; @@ -1813,7 +1817,7 @@ this->class->xine->config->update_num(this->class->xine->config, "video.output.xv_deinterlace_method", method >= 0 ? method : 0); - xine_set_param(this->stream, XINE_PARAM_VO_DEINTERLACE, method ? 1 : 0); + xine_set_param(this->stream, XINE_PARAM_VO_DEINTERLACE, !!method);
return 0; } @@ -1935,7 +1939,7 @@ return 0; }
-static int set_playback_speed(vdr_input_plugin_t *this, int speed) +static int set_trick_speed(vdr_input_plugin_t *this, int speed, int backwards) { /* speed: <0 - show each abs(n)'th frame (drop other frames) @@ -1955,6 +1959,8 @@ return -2; }
+ this->metronom->set_trickspeed(this->metronom, backwards ? speed : 0); + if(speed > 1 || speed < -1) { reset_scr_tuning(this, -1); this->is_trickspeed = 1; @@ -1981,6 +1987,11 @@ return 0; }
+static int reset_trick_speed(vdr_input_plugin_t *this) +{ + return set_trick_speed(this, 1, 0); +} + static void send_meta_info(vdr_input_plugin_t *this) { if(this->slave_stream) { @@ -2263,10 +2274,10 @@ xine_usec_sleep(50*1000);
/* keep our own demux happy while playing another stream */ - set_playback_speed(this, 1); + reset_trick_speed(this); this->live_mode = 1; set_live_mode(this, 0); - set_playback_speed(this, 1); + reset_trick_speed(this); reset_scr_tuning(this, this->speed_before_pause = XINE_FINE_SPEED_NORMAL); this->slave_stream->metronom->set_option(this->slave_stream->metronom, METRONOM_PREBUFFER, 90000); @@ -2902,7 +2913,7 @@
} else if(!strncasecmp(cmd, "TRICKSPEED ", 11)) { err = (1 == sscanf(cmd+11, "%d", &tmp32)) ? - set_playback_speed(this, tmp32) : + set_trick_speed(this, tmp32, !!strstr(cmd+13, "Back")) : CONTROL_PARAM_ERROR;
} else if(!strncasecmp(cmd, "STILL ", 6)) { @@ -2938,13 +2949,13 @@
} else if(!strncasecmp(cmd, "MASTER ", 7)) { if(1 == sscanf(cmd+7, "%d", &tmp32)) - this->fixed_scr = tmp32 ? 1 : 0; + this->fixed_scr = !!tmp32; else err = CONTROL_PARAM_ERROR;
} else if(!strncasecmp(cmd, "VOLUME ", 7)) { if(1 == sscanf(cmd+7, "%d", &tmp32)) { - int sw = strstr(cmd, "SW") ? 1 : 0; + int sw = !!strstr(cmd, "SW"); if(!sw) { xine_set_param(stream, XINE_PARAM_AUDIO_VOLUME, tmp32); xine_set_param(stream, XINE_PARAM_AUDIO_MUTE, tmp32<=0 ? 1 : 0); @@ -2994,7 +3005,7 @@ } else if(!strncasecmp(cmd, "AUDIOSTREAM ", 12)) { if(!this->slave_stream) { #if 0 - int ac3 = strncmp(cmd+12, "AC3", 3) ? 0 : 1; + int ac3 = !strncmp(cmd+12, "AC3", 3); if(1 == sscanf(cmd+12 + 4*ac3, "%d", &tmp32)) { pthread_mutex_lock(&this->lock); this->audio_stream_id = tmp32; @@ -3016,7 +3027,7 @@ int old_ch = _x_get_spu_channel(stream); int max_ch = xine_get_stream_info(stream, XINE_STREAM_INFO_MAX_SPU_CHANNEL); int ch = old_ch; - int ch_auto = strstr(cmd+10, "auto") ? 1 : 0; + int ch_auto = !!strstr(cmd+10, "auto"); int is_dvd = 0;
if (this->slave_stream && this->slave_stream->input_plugin) { @@ -4512,7 +4523,7 @@
flush_all_fifos (this, 0);
- set_playback_speed(this, 1); + reset_trick_speed(this); this->live_mode = 0; reset_scr_tuning(this, XINE_FINE_SPEED_NORMAL); this->stream->emergency_brake = 1; @@ -4697,7 +4708,7 @@
this->control_running = 0;
- local = this->funcs.push_input_write ? 1 : 0; + local = !!this->funcs.push_input_write; memset(&this->funcs, 0, sizeof(this->funcs));
/* shutdown sockets */ @@ -4798,6 +4809,10 @@ if (this->scr) this->scr->dispose(this->scr);
+ /* metronom */ + if (this->metronom) + this->metronom->dispose(this->metronom); + free (this->mrl);
if(this->udp_data) @@ -4863,6 +4878,9 @@ this->scr_tuning = SCR_TUNING_OFF; this->curpos = 0;
+ /* replace stream metronom */ + this->metronom = xvdr_metronom_init(this->stream); + /* buffer */ this->block_buffer = fifo_buffer_new(this->stream, 4, 0x10000+64); /* dummy buf to be used before first read and for big PES frames */ ny ideas howto solve this? BR.