gst-plugins-mythtv/src/gstmythtvsrc.c
branchtrunk
changeset 105 ba9bf90e7c4b
parent 100 f4be69980934
child 106 a4a151d4735d
     1.1 --- a/gst-plugins-mythtv/src/gstmythtvsrc.c	Wed Nov 22 14:37:47 2006 +0000
     1.2 +++ b/gst-plugins-mythtv/src/gstmythtvsrc.c	Fri Nov 24 01:51:47 2006 +0000
     1.3 @@ -40,6 +40,8 @@
     1.4   
     1.5  #define GMYTHTV_TRANSFER_MAX_WAITS		100
     1.6  
     1.7 +#define GMYTHTV_TRANSFER_MAX_RESENDS	5
     1.8 +
     1.9  #define GMYTHTV_TRANSFER_MAX_BUFFER		128*1024
    1.10  //( 32*1024  )
    1.11  
    1.12 @@ -114,8 +116,7 @@
    1.13  
    1.14  static gboolean gst_mythtv_src_handle_event (GstPad * pad, GstEvent * event);
    1.15  
    1.16 -static gint do_read_request_response (GstMythtvSrc * src, guint64 offset, 
    1.17 -    guint size, guint8 **data_ptr);
    1.18 +static gint do_read_request_response (GstMythtvSrc * src, guint size, GByteArray *data_ptr);
    1.19  
    1.20  GStaticRecMutex th_mutex = G_STATIC_REC_MUTEX_INIT;
    1.21  
    1.22 @@ -334,10 +335,13 @@
    1.23  }
    1.24  
    1.25  static gint
    1.26 -do_read_request_response (GstMythtvSrc * src, guint64 offset, guint size, guint8 **data_ptr)
    1.27 +do_read_request_response (GstMythtvSrc * src, guint size, GByteArray *data_ptr)
    1.28  {
    1.29    gint read = 0;
    1.30    guint sizetoread = size;
    1.31 +  guint max_iters = GMYTHTV_TRANSFER_MAX_RESENDS;
    1.32 +  
    1.33 +  //*data_ptr = g_malloc0( size );
    1.34  
    1.35    g_print( "Starting: [%s] Reading %d bytes...\n", __FUNCTION__, sizetoread ); 
    1.36  
    1.37 @@ -345,10 +349,10 @@
    1.38     * Retry whilst authentication fails and we supply it. */
    1.39    gint len = 0;
    1.40    
    1.41 -  while ( sizetoread > 0 ) {
    1.42 +  while ( sizetoread == size && --max_iters > 0) {
    1.43  
    1.44      len = gmyth_file_transfer_read( src->file_transfer,
    1.45 -	*data_ptr + offset + read, sizetoread, TRUE );
    1.46 +				data_ptr, sizetoread, TRUE );
    1.47  
    1.48      if ( len > 0 ) {
    1.49        read += len;
    1.50 @@ -377,7 +381,7 @@
    1.51        goto done;
    1.52    }
    1.53  
    1.54 -  if ( read < 0 && !src->live_tv )
    1.55 +  if ( ( read < 0 && !src->live_tv ) || max_iters == 0 )
    1.56      goto eos;
    1.57  
    1.58    goto done;
    1.59 @@ -386,7 +390,6 @@
    1.60    src->eos = TRUE;
    1.61  
    1.62  done:
    1.63 -
    1.64    return read;
    1.65  }
    1.66  
    1.67 @@ -414,9 +417,10 @@
    1.68  
    1.69    /* just get from the byte array, no network effort... */
    1.70    if ( ( src->buffer_remain = src->bytes_queue->len ) < MAX_READ_SIZE ) {
    1.71 -  	guint8 *buffer = g_malloc0( INTERNAL_BUFFER_SIZE - src->buffer_remain );
    1.72 +  	guint buffer_size_inter = INTERNAL_BUFFER_SIZE - src->buffer_remain;
    1.73 +  	GByteArray *buffer = g_byte_array_new();
    1.74  
    1.75 -    read = do_read_request_response( src, 0, INTERNAL_BUFFER_SIZE - src->buffer_remain, &(buffer) );
    1.76 +    read = do_read_request_response( src, buffer_size_inter, buffer );
    1.77  
    1.78      if (G_UNLIKELY (read < 0)) {
    1.79        if ( src->live_tv )
    1.80 @@ -428,9 +432,14 @@
    1.81      if ( G_UNLIKELY (src->update_prog_chain) )
    1.82        goto change_progchain;
    1.83        
    1.84 -    src->bytes_queue = g_byte_array_append( src->bytes_queue, buffer, read );
    1.85 +    src->bytes_queue = g_byte_array_append( src->bytes_queue, g_memdup( buffer->data, read ), read );
    1.86  
    1.87      src->buffer_remain = src->buffer_remain + read;
    1.88 +    
    1.89 +    if ( buffer != NULL ) {
    1.90 +    	g_byte_array_free( buffer, TRUE );
    1.91 +    	buffer = NULL;    	
    1.92 +    }
    1.93  
    1.94      g_print( "[%s]\tBYTES READ (actual) = %d, BYTES READ (cumulative) = %llu, "\
    1.95  	"OFFSET = %llu, CONTENT SIZE = %llu.\n", __FUNCTION__, read, src->bytes_read,