gst-plugins-mythtv/src/gstmythtvsrc.c
branchtrunk
changeset 99 404189e73f8e
parent 95 51d013028674
child 100 f4be69980934
     1.1 --- a/gst-plugins-mythtv/src/gstmythtvsrc.c	Fri Nov 17 18:39:47 2006 +0000
     1.2 +++ b/gst-plugins-mythtv/src/gstmythtvsrc.c	Wed Nov 22 12:55:16 2006 +0000
     1.3 @@ -24,6 +24,8 @@
     1.4  #include <gmyth/gmyth_socket.h>
     1.5  #include <gmyth/gmyth_tvchain.h>
     1.6  
     1.7 +#include <gmyth/gmyth_context.h>
     1.8 +
     1.9  #include <string.h>
    1.10  #include <unistd.h>
    1.11  
    1.12 @@ -42,12 +44,12 @@
    1.13  //( 32*1024  )
    1.14  
    1.15  /* 4*1024 ??? */
    1.16 -#define MAX_READ_SIZE              		6*1024
    1.17 +#define MAX_READ_SIZE              		4*1024
    1.18  //( 32*1024 )
    1.19  
    1.20 -#define GST_FLOW_ERROR_NO_DATA  		-101
    1.21 +#define GST_FLOW_ERROR_NO_DATA  			-101
    1.22  
    1.23 -#define INTERNAL_BUFFER_SIZE			30*1024
    1.24 +#define INTERNAL_BUFFER_SIZE					64*1024
    1.25  
    1.26  /* stablish a maximum iteration value to the IS_RECORDING message */
    1.27  static guint wait_to_transfer = 0;
    1.28 @@ -81,20 +83,20 @@
    1.29  
    1.30  static void gst_mythtv_src_finalize (GObject * gobject);
    1.31  
    1.32 -/*
    1.33  static GstFlowReturn gst_mythtv_src_create (GstBaseSrc * psrc, guint64 offset, 
    1.34  	guint size, GstBuffer ** outbuf);
    1.35 -*/
    1.36  
    1.37 -//static GstFlowReturn gst_mythtv_src_chain ( GstPad* pad, GstBuffer* outbuf );
    1.38 -static GstFlowReturn gst_mythtv_src_create ( GstPushSrc* psrc, GstBuffer** outbuf );
    1.39 +//static GstFlowReturn gst_mythtv_src_create ( GstPushSrc* psrc, GstBuffer** outbuf );
    1.40  
    1.41  static gboolean gst_mythtv_src_start (GstBaseSrc * bsrc);
    1.42  static gboolean gst_mythtv_src_stop (GstBaseSrc * bsrc);
    1.43  static gboolean gst_mythtv_src_get_size (GstBaseSrc * bsrc, guint64 * size);
    1.44  static gboolean gst_mythtv_src_is_seekable( GstBaseSrc *push_src );
    1.45  
    1.46 -static gboolean gst_mythtv_src_do_seek( GstBaseSrc *base, GstSegment *segment );
    1.47 +//static void gst_mythtv_src_get_times (GstBaseSrc * src, GstBuffer * buffer,
    1.48 +//   GstClockTime * start, GstClockTime * end);
    1.49 +
    1.50 +//static gboolean gst_mythtv_src_do_seek( GstBaseSrc *base, GstSegment *segment );
    1.51  
    1.52  static gboolean gst_mythtv_src_next_program_chain ( GstMythtvSrc *src );
    1.53  
    1.54 @@ -135,8 +137,8 @@
    1.55  //GST_BOILERPLATE_FULL (GstMythtvSrc, gst_mythtv_src, GstBaseSrc,
    1.56  //    GST_TYPE_BASE_SRC, _urihandler_init)
    1.57      
    1.58 -GST_BOILERPLATE_FULL (GstMythtvSrc, gst_mythtv_src, GstPushSrc,
    1.59 -    GST_TYPE_PUSH_SRC, _urihandler_init)
    1.60 +GST_BOILERPLATE_FULL (GstMythtvSrc, gst_mythtv_src, GstBaseSrc,
    1.61 +    GST_TYPE_BASE_SRC, _urihandler_init)
    1.62      
    1.63  static void
    1.64  gst_mythtv_src_base_init (gpointer g_class)
    1.65 @@ -156,12 +158,12 @@
    1.66  gst_mythtv_src_class_init (GstMythtvSrcClass * klass)
    1.67  {
    1.68    GObjectClass *gobject_class; 
    1.69 -  GstPushSrcClass *gstpushsrc_class;
    1.70 +  //GstPushSrcClass *gstpushsrc_class;
    1.71    GstBaseSrcClass *gstbasesrc_class;
    1.72  
    1.73    gobject_class = (GObjectClass *) klass;
    1.74    gstbasesrc_class = (GstBaseSrcClass *) klass;
    1.75 -  gstpushsrc_class = (GstPushSrcClass *) klass;
    1.76 +  //gstpushsrc_class = (GstPushSrcClass *) klass;
    1.77  
    1.78    gobject_class->set_property = gst_mythtv_src_set_property;
    1.79    gobject_class->get_property = gst_mythtv_src_get_property;
    1.80 @@ -231,8 +233,10 @@
    1.81    gstbasesrc_class->get_size = gst_mythtv_src_get_size;
    1.82    gstbasesrc_class->is_seekable = gst_mythtv_src_is_seekable;
    1.83    
    1.84 -  gstbasesrc_class->do_seek = gst_mythtv_src_do_seek;
    1.85 -  gstpushsrc_class->create = gst_mythtv_src_create;
    1.86 +  //gstbasesrc_class->get_times = gst_mythtv_src_get_times;
    1.87 +  
    1.88 +  //gstbasesrc_class->do_seek = gst_mythtv_src_do_seek;
    1.89 +  gstbasesrc_class->create = gst_mythtv_src_create;
    1.90      
    1.91    GST_DEBUG_CATEGORY_INIT (mythtvsrc_debug, "mythtvsrc", 0,
    1.92        "MythTV Client Source");
    1.93 @@ -271,14 +275,14 @@
    1.94    
    1.95    this->eos = FALSE;
    1.96    
    1.97 -  this->adapter = NULL;
    1.98 +  this->bytes_queue = NULL;
    1.99    
   1.100    //this->th_read_ahead = NULL;
   1.101    
   1.102    this->th_mutex = NULL;
   1.103    
   1.104 -  this->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
   1.105 -  gst_element_add_pad (GST_ELEMENT (this), this->srcpad);
   1.106 +  //this->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
   1.107 +  //gst_element_add_pad (GST_ELEMENT (this), this->srcpad);
   1.108    
   1.109    gst_base_src_set_format( GST_BASE_SRC( this ), GST_FORMAT_BYTES );  
   1.110  
   1.111 @@ -338,7 +342,6 @@
   1.112    /* Loop sending the Myth File Transfer request:
   1.113     * Retry whilst authentication fails and we supply it. */
   1.114    gint len = 0;
   1.115 -  //*data_ptr = g_malloc0( size );
   1.116    
   1.117    //while ( sizetoread > 0 ) {
   1.118  
   1.119 @@ -362,7 +365,7 @@
   1.120  	if ( len == GMYTHTV_FILE_TRANSFER_READ_ERROR ) { /* -314 */
   1.121  	  src->update_prog_chain = TRUE;
   1.122  	  goto done;	  	
   1.123 -	} else if ( abs( src->content_size - src->bytes_read ) < GMYTHTV_TRANSFER_MAX_BUFFER ) {
   1.124 +	} /*if ( abs( src->content_size - src->bytes_read ) < GMYTHTV_TRANSFER_MAX_BUFFER ) {
   1.125  	    src->update_prog_chain = TRUE;
   1.126  	    if ( src->enable_timing_position ) {
   1.127  	      gint64 size_tmp = 0;
   1.128 @@ -375,7 +378,7 @@
   1.129  	      g_print( "\t[%s]\tGET_POSITION: file_position = %lld\n",
   1.130  		  __FUNCTION__, size_tmp );
   1.131  	    }
   1.132 -	  }
   1.133 +	  }*/
   1.134  	goto done;
   1.135        }
   1.136  
   1.137 @@ -400,161 +403,6 @@
   1.138  
   1.139  #if 0
   1.140  static GstFlowReturn
   1.141 -gst_mythtv_src_create ( GstBaseSrc * psrc, guint64 offset, guint size, GstBuffer **outbuf)
   1.142 -{
   1.143 -  GstMythtvSrc *src;
   1.144 -  GstFlowReturn ret = GST_FLOW_OK;
   1.145 -  gint read = -1;
   1.146 -  gint adapter_size = -1;
   1.147 -  
   1.148 -  guint max_adapter_rep = 40;
   1.149 -  
   1.150 -  src = GST_MYTHTV_SRC (psrc);
   1.151 -  
   1.152 -  /* The caller should know the number of bytes and not read beyond EOS. */
   1.153 -  if (G_UNLIKELY (src->eos))
   1.154 -    goto eos;
   1.155 -  if ( G_UNLIKELY (src->update_prog_chain) )
   1.156 -    goto change_progchain;
   1.157 -
   1.158 -  g_static_rec_mutex_lock( th_mutexth_mutex );
   1.159 -  
   1.160 -  while ( ( ( adapter_size = gst_adapter_available_fast( src->adapter ) ) < size ) &&
   1.161 -  		--max_adapter_rep > 0 )
   1.162 -  {
   1.163 -  	g_print ( "[%s] %d - Waiting for read_ahead task...\n", __FUNCTION__, max_adapter_rep );
   1.164 -  	GST_TASK_WAIT( src->th_read_ahead );
   1.165 -  }
   1.166 -  	
   1.167 -  g_static_rec_mutex_unlock( th_mutexth_mutex );
   1.168 -
   1.169 -	gint64 new_offset = -1;
   1.170 -	/* just get from the adapter, no network effort... */
   1.171 -	if ( offset > src->adapter_offset && size <= adapter_size )	
   1.172 -	{
   1.173 -		
   1.174 -		GstBuffer *buf = gst_adapter_take_buffer( src->adapter, size );
   1.175 -		*outbuf = gst_buffer_create_sub( buf, offset, size );
   1.176 -		src->read_offset = new_offset = offset;
   1.177 -		read = size;
   1.178 -		
   1.179 -		gst_adapter_flush( src->adapter, size );
   1.180 -		
   1.181 -	} else {
   1.182 -		/* no data on adapter... do all these mythtv network calls! */
   1.183 -		
   1.184 -		/* verify if it needs to seek */
   1.185 -		if ( src->read_offset != offset ) 
   1.186 -  	{
   1.187 -		
   1.188 -	  	new_offset = gmyth_file_transfer_seek( src->file_transfer, offset, SEEK_SET );
   1.189 -	  	
   1.190 -	    g_print( "[%s] SRC Offset = %lld, NEW actual backend SEEK Offset = %lld.\n",
   1.191 -	    	__FUNCTION__, src->read_offset, new_offset );
   1.192 -	    if ( G_UNLIKELY (new_offset < 0 ) )
   1.193 -	    {
   1.194 -	      if ( src->live_tv )
   1.195 -	      	goto change_progchain;
   1.196 -	      else
   1.197 -	      	goto eos;
   1.198 -	    }
   1.199 -	    
   1.200 -  	}
   1.201 -	
   1.202 -    src->read_offset = offset;
   1.203 -  	
   1.204 -	  /* Create the buffer. */
   1.205 -	  ret = gst_pad_alloc_buffer ( GST_BASE_SRC_PAD (GST_BASE_SRC (psrc)),
   1.206 -	      src->read_offset, size,
   1.207 -	      GST_PAD_CAPS ( GST_BASE_SRC_PAD (GST_BASE_SRC (psrc)) ), outbuf);
   1.208 -	
   1.209 -	  if (G_UNLIKELY (ret != GST_FLOW_OK)) {
   1.210 -	    if ( src->live_tv )
   1.211 -	    	goto change_progchain;
   1.212 -	    else
   1.213 -	    	goto done;
   1.214 -	  }
   1.215 -	  
   1.216 -	  read = do_read_request_response ( src, src->read_offset, size, outbuf ); 
   1.217 -  	
   1.218 -	}
   1.219 -
   1.220 -  if (G_UNLIKELY (src->update_prog_chain) )
   1.221 -    goto change_progchain;
   1.222 -
   1.223 -  if (G_UNLIKELY (read <= 0) || *outbuf == NULL) {
   1.224 -  	if ( src->live_tv )
   1.225 -    	goto change_progchain;
   1.226 -    else
   1.227 -    	goto read_error;
   1.228 -  }
   1.229 -  
   1.230 -  if ( read > 0 ) {
   1.231 -    src->read_offset += read;
   1.232 -    src->bytes_read += read;
   1.233 -    
   1.234 -    #if 0
   1.235 -    g_print( "[%s]\tBYTES READ (actual) = %d, BYTES READ (cumulative) = %llu, "\
   1.236 -			"OFFSET = %llu, CONTENT SIZE = %llu.\n", __FUNCTION__, read, src->bytes_read, 
   1.237 -			src->read_offset, src->content_size );
   1.238 -
   1.239 -    GST_BUFFER_SIZE (*outbuf) = read; //GST_BUFFER_SIZE (buffer) = read;
   1.240 -    //GST_BUFFER_MALLOCDATA( *outbuf ) = g_malloc0( GST_BUFFER_SIZE (*outbuf) );
   1.241 -    //GST_BUFFER_DATA( *outbuf ) = GST_BUFFER_MALLOCDATA( *outbuf );
   1.242 -    //g_memmove( GST_BUFFER_DATA( *outbuf ), data_ptr, read );
   1.243 -    GST_BUFFER_OFFSET (*outbuf) = offset; //GST_BUFFER_OFFSET (buffer) = offset;
   1.244 -    GST_BUFFER_OFFSET_END (*outbuf) = offset + read;//GST_BUFFER_OFFSET_END (buffer) = offset + read;
   1.245 -
   1.246 -    g_print( "Got buffer: [%s]\t\tBUFFER --->SIZE = %d, OFFSET = %llu, "\
   1.247 -			"OFFSET_END = %llu.\n\n", __FUNCTION__, GST_BUFFER_SIZE (*outbuf), 
   1.248 -			GST_BUFFER_OFFSET (*outbuf), GST_BUFFER_OFFSET_END (*outbuf) );
   1.249 -		#endif
   1.250 -			
   1.251 -  }
   1.252 -
   1.253 -done:
   1.254 - {
   1.255 -    const gchar *reason = gst_flow_get_name (ret);
   1.256 -
   1.257 -    GST_DEBUG_OBJECT (src, "DONE task, reason %s", reason);
   1.258 -  	return ret;
   1.259 - }
   1.260 -eos:
   1.261 -  {
   1.262 -    const gchar *reason = gst_flow_get_name (ret);
   1.263 -
   1.264 -    GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason);
   1.265 -    return GST_FLOW_UNEXPECTED;
   1.266 -  }
   1.267 -  /* ERRORS */
   1.268 -read_error:
   1.269 -  {
   1.270 -    GST_ELEMENT_ERROR (src, RESOURCE, READ,
   1.271 -	(NULL), ("Could not read any bytes (%i, %s)", read,
   1.272 -	  src->uri_name));
   1.273 -    return GST_FLOW_ERROR;
   1.274 -  }
   1.275 -change_progchain:
   1.276 -  {
   1.277 -    GST_ELEMENT_ERROR (src, RESOURCE, READ,
   1.278 -		(NULL), ("Seek failed, go to the next program info... (%i, %s)", read,
   1.279 -		  src->uri_name));
   1.280 -		  
   1.281 -		gst_pad_push_event ( GST_BASE_SRC_PAD (GST_BASE_SRC (src)),
   1.282 -  			gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, 0, -1, 0 ) );
   1.283 -		// go to the next program chain
   1.284 -		src->unique_setup = FALSE;
   1.285 -		src->update_prog_chain = TRUE;
   1.286 -		
   1.287 -		gst_mythtv_src_next_program_chain( src );
   1.288 -		
   1.289 -    return GST_FLOW_ERROR_NO_DATA;
   1.290 -  }
   1.291 -
   1.292 -}
   1.293 -#endif
   1.294 -
   1.295 -static GstFlowReturn
   1.296  gst_mythtv_src_create ( GstPushSrc* psrc, GstBuffer** outbuf )
   1.297  {
   1.298    GstMythtvSrc *src;
   1.299 @@ -595,7 +443,9 @@
   1.300  
   1.301    if ( ( src->buffer_remain = gst_adapter_available_fast( src->adapter ) ) < MAX_READ_SIZE ) {
   1.302  
   1.303 -    buffer = gst_buffer_new_and_alloc( INTERNAL_BUFFER_SIZE - src->buffer_remain );
   1.304 +    ret = gst_pad_alloc_buffer ( GST_BASE_SRC_PAD (GST_BASE_SRC (psrc)),
   1.305 +      src->read_offset /*GST_BUFFER_OFFSET_NONE*/, INTERNAL_BUFFER_SIZE - src->buffer_remain,
   1.306 +      GST_PAD_CAPS (GST_BASE_SRC_PAD (GST_BASE_SRC (psrc))), &buffer );
   1.307  
   1.308      read = do_read_request_response( src, 0, INTERNAL_BUFFER_SIZE - src->buffer_remain, &(GST_BUFFER_DATA(buffer)) );
   1.309  
   1.310 @@ -618,6 +468,11 @@
   1.311  	src->read_offset, src->content_size );
   1.312  
   1.313    }
   1.314 +  
   1.315 +  if ( now == -1 )
   1.316 +  	now = gst_element_get_base_time( GST_ELEMENT( src ) );
   1.317 +  //else
   1.318 +  //	now;
   1.319  
   1.320    size = ( src->buffer_remain < MAX_READ_SIZE) ? src->buffer_remain : MAX_READ_SIZE;
   1.321  
   1.322 @@ -629,6 +484,7 @@
   1.323    GST_BUFFER_MALLOCDATA( *outbuf ) = g_malloc0( GST_BUFFER_SIZE (*outbuf) );
   1.324    GST_BUFFER_DATA( *outbuf ) = GST_BUFFER_MALLOCDATA( *outbuf );
   1.325    g_memmove( GST_BUFFER_DATA( (*outbuf) ), GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(*outbuf) );
   1.326 +  //GST_BUFFER_TIMESTAMP( *outbuf ) = now;
   1.327    GST_BUFFER_OFFSET (*outbuf) = src->read_offset;
   1.328    GST_BUFFER_OFFSET_END (*outbuf) = src->read_offset + GST_BUFFER_SIZE (*outbuf);
   1.329  
   1.330 @@ -690,6 +546,142 @@
   1.331    }
   1.332  
   1.333  }
   1.334 +#endif
   1.335 +
   1.336 +static GstFlowReturn
   1.337 +gst_mythtv_src_create ( GstBaseSrc * psrc, guint64 offset, guint size, GstBuffer **outbuf )
   1.338 +{
   1.339 +  GstMythtvSrc *src;
   1.340 +  GstFlowReturn ret = GST_FLOW_OK;
   1.341 +  gint read = -1;
   1.342 +  gint adapter_size = 0;
   1.343 +  guint max_adapter_rep = 1;
   1.344 +
   1.345 +  src = GST_MYTHTV_SRC ( psrc );
   1.346 +
   1.347 +  /* The caller should know the number of bytes and not read beyond EOS. */
   1.348 +  if (G_UNLIKELY (src->eos))
   1.349 +    goto eos;
   1.350 +  if ( G_UNLIKELY (src->update_prog_chain) )
   1.351 +    goto change_progchain;
   1.352 +
   1.353 +  //g_static_rec_mutex_lock( &th_mutex );
   1.354 +  g_print ( "[%s] %d - Adapter size = (%d), offset = %llu, size = %d...\n", __FUNCTION__, 
   1.355 +  		max_adapter_rep, adapter_size, offset, size );
   1.356 +
   1.357 +  /* just get from the adapter, no network effort... */
   1.358 +  //GstBuffer *buffer = NULL;
   1.359 +
   1.360 +  g_print ( "[%s]\t\tCreate: buffer_remain: %d\n", __FUNCTION__, 
   1.361 +      (gint) src->buffer_remain);
   1.362 +
   1.363 +  if ( ( src->buffer_remain = src->bytes_queue->len ) < MAX_READ_SIZE ) {
   1.364 +  	guint8 *buffer = g_malloc0( INTERNAL_BUFFER_SIZE - src->buffer_remain );
   1.365 +
   1.366 +    read = do_read_request_response( src, 0, INTERNAL_BUFFER_SIZE - src->buffer_remain, &(buffer) );
   1.367 +
   1.368 +    if (G_UNLIKELY (read < 0)) {
   1.369 +      if ( src->live_tv )
   1.370 +	goto change_progchain;
   1.371 +      else
   1.372 +	goto read_error;
   1.373 +    }
   1.374 +
   1.375 +    if ( G_UNLIKELY (src->update_prog_chain) )
   1.376 +      goto change_progchain;
   1.377 +      
   1.378 +    src->bytes_queue = g_byte_array_append( src->bytes_queue, buffer, read );
   1.379 +
   1.380 +    src->buffer_remain = src->buffer_remain + read;
   1.381 +
   1.382 +    g_print( "[%s]\tBYTES READ (actual) = %d, BYTES READ (cumulative) = %llu, "\
   1.383 +	"OFFSET = %llu, CONTENT SIZE = %llu.\n", __FUNCTION__, read, src->bytes_read, 
   1.384 +	src->read_offset, src->content_size );
   1.385 +	
   1.386 +  }
   1.387 +  
   1.388 +  guint buffer_size = ( src->buffer_remain < MAX_READ_SIZE) ? src->buffer_remain : MAX_READ_SIZE;
   1.389 +  
   1.390 +  /* Create the buffer. */
   1.391 +  ret = gst_pad_alloc_buffer ( GST_BASE_SRC_PAD (GST_BASE_SRC (psrc)),
   1.392 +      offset, buffer_size,
   1.393 +      GST_PAD_CAPS (GST_BASE_SRC_PAD (GST_BASE_SRC (psrc))), outbuf );    
   1.394 +
   1.395 +  if (G_UNLIKELY (ret != GST_FLOW_OK)) {
   1.396 +    if ( src->live_tv )
   1.397 +      goto change_progchain;
   1.398 +    else
   1.399 +      goto done;
   1.400 +  }
   1.401 +  
   1.402 +  guint8 *buf = g_memdup( src->bytes_queue->data, buffer_size );
   1.403 +
   1.404 +  g_print( "[%s] read = %d, buffer_remain = %d\n", __FUNCTION__, read, src->buffer_remain );
   1.405 +  //src->read_offset = offset;
   1.406 +
   1.407 +  GST_BUFFER_SIZE (*outbuf) = buffer_size;
   1.408 +  GST_BUFFER_MALLOCDATA( *outbuf ) = g_malloc0( GST_BUFFER_SIZE (*outbuf) );
   1.409 +  GST_BUFFER_DATA( *outbuf ) = GST_BUFFER_MALLOCDATA( *outbuf );
   1.410 +  g_memmove( GST_BUFFER_DATA( (*outbuf) ), buf, GST_BUFFER_SIZE(*outbuf) );
   1.411 +  GST_BUFFER_OFFSET (*outbuf) = offset;
   1.412 +  GST_BUFFER_OFFSET_END (*outbuf) = offset + GST_BUFFER_SIZE (*outbuf);
   1.413 +
   1.414 +  src->buffer_remain -= GST_BUFFER_SIZE (*outbuf);
   1.415 +
   1.416 +  src->read_offset += GST_BUFFER_SIZE (*outbuf);
   1.417 +  src->bytes_read += GST_BUFFER_SIZE (*outbuf);
   1.418 +  g_print ( "[%s]\t\tBuffer output with size: %d\n", __FUNCTION__, GST_BUFFER_SIZE (*outbuf) );
   1.419 +
   1.420 +  src->bytes_queue = g_byte_array_remove_range( src->bytes_queue, 0, buffer_size );
   1.421 +
   1.422 +  g_print( "Got buffer: [%s]\t\tBUFFER --->SIZE = %d, OFFSET = %llu, "\
   1.423 +      "OFFSET_END = %llu.\n\n", __FUNCTION__, GST_BUFFER_SIZE (*outbuf), 
   1.424 +      GST_BUFFER_OFFSET (*outbuf), GST_BUFFER_OFFSET_END (*outbuf) );
   1.425 +
   1.426 +  /* just get from the adapter, no network effort... */
   1.427 +
   1.428 +  return ret;
   1.429 +
   1.430 +done:
   1.431 +  {
   1.432 +    const gchar *reason = gst_flow_get_name (ret);
   1.433 +
   1.434 +    GST_DEBUG_OBJECT (src, "DONE task, reason %s", reason);
   1.435 +    return ret;
   1.436 +  }
   1.437 +eos:
   1.438 +  {
   1.439 +    const gchar *reason = gst_flow_get_name (ret);
   1.440 +
   1.441 +    GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason);
   1.442 +    return GST_FLOW_UNEXPECTED;
   1.443 +  }
   1.444 +  /* ERRORS */
   1.445 +read_error:
   1.446 +  {
   1.447 +    GST_ELEMENT_ERROR (src, RESOURCE, READ,
   1.448 +	(NULL), ("Could not read any bytes (%i, %s)", read,
   1.449 +		 src->uri_name));
   1.450 +    return GST_FLOW_ERROR;
   1.451 +  }
   1.452 +change_progchain:
   1.453 +  {
   1.454 +    GST_ELEMENT_ERROR (src, RESOURCE, READ,
   1.455 +	(NULL), ("Seek failed, go to the next program info... (%i, %s)", read,
   1.456 +		 src->uri_name));
   1.457 +
   1.458 +    gst_pad_push_event ( GST_BASE_SRC_PAD (GST_BASE_SRC (psrc)),
   1.459 +	gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, 0, -1, 0 ) );
   1.460 +    // go to the next program chain
   1.461 +    src->unique_setup = FALSE;
   1.462 +    src->update_prog_chain = TRUE;
   1.463 +
   1.464 +    gst_mythtv_src_next_program_chain( src );
   1.465 +
   1.466 +    return GST_FLOW_ERROR_NO_DATA;
   1.467 +  }
   1.468 +
   1.469 +}
   1.470  
   1.471  gint64
   1.472  gst_mythtv_src_get_position ( GstMythtvSrc* src ) 
   1.473 @@ -717,6 +709,7 @@
   1.474  
   1.475  }
   1.476  
   1.477 +#if 0
   1.478  static gboolean
   1.479  gst_mythtv_src_do_seek( GstBaseSrc *base, GstSegment *segment )
   1.480  {
   1.481 @@ -792,6 +785,7 @@
   1.482    }
   1.483  
   1.484  }
   1.485 +#endif
   1.486  
   1.487  #if 0
   1.488  static void 
   1.489 @@ -871,6 +865,7 @@
   1.490    }
   1.491  
   1.492    if ( src->live_tv ) {
   1.493 +  	gmyth_context_initialize();
   1.494      src->spawn_livetv = gmyth_livetv_new( );
   1.495      if ( gmyth_livetv_setup( src->spawn_livetv ) == FALSE ) {
   1.496        ret = FALSE;
   1.497 @@ -907,6 +902,8 @@
   1.498  	  /*|| ( gmyth_file_transfer_get_file_position( src->file_transfer ) < ( src->content_size + 327680 ) )*/ ) )
   1.499        g_usleep( 100 );
   1.500    }
   1.501 +  
   1.502 +  //sleep( 30 );
   1.503  
   1.504    /* sets the FileTransfer instance connection (video/audio download) */
   1.505    ret = gmyth_file_transfer_setup( &(src->file_transfer), src->live_tv );
   1.506 @@ -924,7 +921,7 @@
   1.507    src->do_start = FALSE;
   1.508  
   1.509    //if ( src->live_tv ) {
   1.510 -  src->adapter = gst_adapter_new();
   1.511 +  src->bytes_queue = g_byte_array_new();
   1.512    //src->th_read_ahead = gst_task_create( (GstTaskFunction)gst_mythtv_src_read_ahead, src );
   1.513    //gst_task_set_lock( src->th_read_ahead, &th_mutex );
   1.514    //gst_task_start( src->th_read_ahead );
   1.515 @@ -970,6 +967,16 @@
   1.516    }
   1.517  }
   1.518  
   1.519 +#if 0
   1.520 +static void
   1.521 +gst_mythtv_src_get_times (GstBaseSrc * src, GstBuffer * buffer,
   1.522 +    GstClockTime * start, GstClockTime * end)
   1.523 +{
   1.524 +  *start = -1;
   1.525 +  *end = -1;
   1.526 +}
   1.527 +#endif
   1.528 +
   1.529  /* create a new socket for connecting to the next program chain */
   1.530  static gboolean
   1.531  gst_mythtv_src_next_program_chain ( GstMythtvSrc *src )
   1.532 @@ -1101,8 +1108,11 @@
   1.533    gboolean ret = TRUE;
   1.534    g_print( "[%s] Differs from previous content size: %d (max.: %d)\n", __FUNCTION__, 
   1.535    			abs( src->content_size - src->prev_content_size ), GMYTHTV_TRANSFER_MAX_BUFFER );
   1.536 -
   1.537 -  if (src->content_size == -1) {
   1.538 +  			
   1.539 +  if ( src->live_tv )
   1.540 +  	//src->content_size = (guint64)-1;
   1.541 +  	ret = FALSE;
   1.542 +	else if (src->content_size == -1) {
   1.543      //ret= FALSE;
   1.544    } else if ( src->live_tv && ( abs( src->content_size - src->bytes_read ) < 
   1.545  				GMYTHTV_TRANSFER_MAX_BUFFER ) ) {
   1.546 @@ -1262,7 +1272,7 @@
   1.547  static gboolean
   1.548  gst_mythtv_src_is_seekable( GstBaseSrc *push_src )
   1.549  {
   1.550 -  return TRUE;
   1.551 +  return FALSE;
   1.552  }
   1.553  
   1.554  static gboolean
   1.555 @@ -1332,8 +1342,11 @@
   1.556        g_print( "[%s] PLAYING to PAUSED called!\n", __FUNCTION__ );
   1.557      case GST_STATE_CHANGE_PAUSED_TO_READY:
   1.558        g_print( "[%s] PAUSED to READY called!\n", __FUNCTION__ );
   1.559 +      
   1.560        if ( src->live_tv && src->update_prog_chain ) {
   1.561        	
   1.562 +      /*
   1.563 +      	
   1.564    			gst_pad_push_event ( GST_BASE_SRC_PAD (GST_BASE_SRC (src)),
   1.565        			gst_event_new_new_segment (TRUE, 1.0, GST_FORMAT_TIME, 0, -1, 0 ) );
   1.566  
   1.567 @@ -1341,7 +1354,9 @@
   1.568  				src->bytes_read = 0;
   1.569  				src->unique_setup = FALSE;				
   1.570  				gst_mythtv_src_next_program_chain( src );
   1.571 +				*/
   1.572        }
   1.573 +      
   1.574        break;
   1.575      default:
   1.576        break;