gst-plugins-mythtv/src/gstmythtvsrc.c
branchtrunk
changeset 138 1c777fffb664
parent 118 1374c8f47f33
child 142 998bdad22bfe
     1.1 --- a/gst-plugins-mythtv/src/gstmythtvsrc.c	Mon Nov 27 22:07:09 2006 +0000
     1.2 +++ b/gst-plugins-mythtv/src/gstmythtvsrc.c	Wed Nov 29 17:20:00 2006 +0000
     1.3 @@ -12,6 +12,16 @@
     1.4   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     1.5   * Library General Public License for more 
     1.6   */
     1.7 + /**
     1.8 +  * When using the LiveTV content, put the location URI in the following
     1.9 +  * format:
    1.10 +  * 
    1.11 +  * 	myth://mythtv:mythtv@xxx.xxx.xxx.xxx:6543/#mythconverg
    1.12 +  * 
    1.13 +  * Where the first field is the protocol (myth), the second and third are user 
    1.14 +  * name (mythtv) and password (mythtv), then backend host name and port number, 
    1.15 +  * and the last field is the database name (mythconverg).
    1.16 +  */
    1.17  
    1.18  #ifdef HAVE_CONFIG_H
    1.19  #include "config.h"
    1.20 @@ -49,7 +59,9 @@
    1.21  
    1.22  #define GST_FLOW_ERROR_NO_DATA  			-101
    1.23  
    1.24 -#define INTERNAL_BUFFER_SIZE					40*1024
    1.25 +#define REQUEST_MAX_SIZE							64*1024
    1.26 +
    1.27 +#define INTERNAL_BUFFER_SIZE					200*1024
    1.28  
    1.29  /* stablish a maximum iteration value to the IS_RECORDING message */
    1.30  static guint wait_to_transfer = 0;
    1.31 @@ -411,38 +423,50 @@
    1.32        (gint) src->buffer_remain, src->bytes_queue->len );
    1.33  
    1.34    /* just get from the byte array, no network effort... */
    1.35 -  if ( ( src->buffer_remain = src->bytes_queue->len ) < MAX_READ_SIZE ) {
    1.36 -  //if ( src->buffer_remain  ) {
    1.37 -  	guint buffer_size_inter = INTERNAL_BUFFER_SIZE - src->buffer_remain;
    1.38 -  	GByteArray *buffer = g_byte_array_new();
    1.39 +  if ( ( src->buffer_remain = src->bytes_queue->len ) < MAX_READ_SIZE ) { 
    1.40 +  			//( ( INTERNAL_BUFFER_SIZE - src->buffer_remain )  >=  REQUEST_MAX_SIZE ) ) {
    1.41 +  	GByteArray *buffer = NULL;
    1.42 +  	guint amount_to_fill = ( INTERNAL_BUFFER_SIZE - src->buffer_remain );
    1.43 +  	guint buffer_size_inter = 0;
    1.44 +  		
    1.45 +  	//do {
    1.46 +	  	if ( amount_to_fill < REQUEST_MAX_SIZE )
    1.47 +	  		buffer_size_inter = amount_to_fill;
    1.48 +	  	else
    1.49 +	  		buffer_size_inter = REQUEST_MAX_SIZE;
    1.50  
    1.51 -    read = do_read_request_response( src, buffer_size_inter, buffer );
    1.52 -
    1.53 -    if (G_UNLIKELY (read < 0)) {
    1.54 -      if ( src->live_tv )
    1.55 -	goto change_progchain;
    1.56 -      else
    1.57 -	goto read_error;
    1.58 -    }
    1.59 -
    1.60 -    if ( G_UNLIKELY (src->update_prog_chain) )
    1.61 -      goto change_progchain;
    1.62 -      
    1.63 -    src->bytes_queue = g_byte_array_append( src->bytes_queue, g_memdup( buffer->data, read ), read );
    1.64 -    if ( read > buffer_size_inter )
    1.65 -    	GST_WARNING_OBJECT( src, "[%s] INCREASED buffer size! Backend sent more than we ask him... (%d)\n", 
    1.66 -    			__FUNCTION__, abs( read - buffer_size_inter ) );
    1.67 -
    1.68 -    src->buffer_remain = src->buffer_remain + read;
    1.69 -    
    1.70 -    if ( buffer != NULL ) {
    1.71 -    	g_byte_array_free( buffer, TRUE );
    1.72 -    	buffer = NULL;    	
    1.73 -    }
    1.74 -
    1.75 -    GST_DEBUG_OBJECT( src, "[%s]\tBYTES READ (actual) = %d, BYTES READ (cumulative) = %llu, "\
    1.76 -	"OFFSET = %llu, CONTENT SIZE = %llu.\n", __FUNCTION__, read, src->bytes_read, 
    1.77 -	src->read_offset, src->content_size );
    1.78 +	  	buffer = g_byte_array_new();
    1.79 +	
    1.80 +	    read = do_read_request_response( src, buffer_size_inter, buffer );
    1.81 +	
    1.82 +	    if (G_UNLIKELY (read < 0)) {
    1.83 +	      if ( src->live_tv )
    1.84 +		goto change_progchain;
    1.85 +	      else
    1.86 +		goto read_error;
    1.87 +	    }
    1.88 +	
    1.89 +	    if ( G_UNLIKELY (src->update_prog_chain) )
    1.90 +	      goto change_progchain;
    1.91 +	      
    1.92 +	    src->bytes_queue = g_byte_array_append( src->bytes_queue, g_memdup( buffer->data, read ), read );
    1.93 +	    if ( read > buffer_size_inter )
    1.94 +	    	GST_WARNING_OBJECT( src, "[%s] INCREASED buffer size! Backend sent more than we ask him... (%d)\n", 
    1.95 +	    			__FUNCTION__, abs( read - buffer_size_inter ) );
    1.96 +	
    1.97 +	    src->buffer_remain += read;
    1.98 +	    amount_to_fill -= read;
    1.99 +	
   1.100 +	  	//} while ( amount_to_fill > 0 );
   1.101 +	    
   1.102 +	    if ( buffer != NULL ) {
   1.103 +	    	g_byte_array_free( buffer, TRUE );
   1.104 +	    	buffer = NULL;    	
   1.105 +	    }
   1.106 +	
   1.107 +	    GST_DEBUG_OBJECT( src, "[%s]\tBYTES READ (actual) = %d, BYTES READ (cumulative) = %llu, "\
   1.108 +		"OFFSET = %llu, CONTENT SIZE = %llu.\n", __FUNCTION__, read, src->bytes_read, 
   1.109 +		src->read_offset, src->content_size );
   1.110  	
   1.111    }
   1.112    
   1.113 @@ -673,6 +697,7 @@
   1.114    if ( src->file_transfer == NULL ) {
   1.115      goto init_failed;
   1.116    }
   1.117 +  GST_INFO_OBJECT( src, "[%s] uri = %s.\n", __FUNCTION__, src->uri_name );
   1.118  
   1.119  	ret = gmyth_file_transfer_open( src->file_transfer, g_string_new( src->uri_name ) );
   1.120  
   1.121 @@ -690,7 +715,7 @@
   1.122      /* IS_RECORDING again, just like the MythTV backend does... */
   1.123  	  gmyth_livetv_is_recording( src->spawn_livetv );
   1.124  	  
   1.125 -	  sleep( 4 );  
   1.126 +	  sleep( 3 );  
   1.127  
   1.128    }
   1.129    /* sets the FileTransfer instance connection (video/audio download) */
   1.130 @@ -712,8 +737,8 @@
   1.131    src->bytes_queue = g_byte_array_sized_new( INTERNAL_BUFFER_SIZE );
   1.132    src->buffer_remain = 0;
   1.133    
   1.134 -  //gst_pad_push_event ( GST_BASE_SRC_PAD (GST_BASE_SRC (src)),
   1.135 -	//		gst_event_new_new_segment ( TRUE, 1.0, GST_FORMAT_TIME, 0, src->content_size, 0 ) );
   1.136 +  gst_pad_push_event ( GST_BASE_SRC_PAD (GST_BASE_SRC (src)),
   1.137 +		gst_event_new_new_segment ( TRUE, 1.0, GST_FORMAT_TIME, 0, src->content_size, 0 ) );
   1.138  
   1.139  done:
   1.140    return TRUE;
   1.141 @@ -978,10 +1003,13 @@
   1.142      	gint64 pos = -1;
   1.143        gst_query_parse_position (query, &formt, &pos );
   1.144        res = TRUE;
   1.145 -      if ( formt == GST_FORMAT_BYTES )
   1.146 +      if ( formt == GST_FORMAT_BYTES ) {
   1.147 +      	gst_query_set_position (query, formt, pos = myth->read_offset );
   1.148        	GST_DEBUG_OBJECT (myth, "POS %lld (BYTES).\n", pos );
   1.149 -      else if ( formt == GST_FORMAT_TIME )
   1.150 +      } else if ( formt == GST_FORMAT_TIME ) {
   1.151        	GST_DEBUG_OBJECT (myth, "POS %lld (TIME).\n", pos );
   1.152 +      	res = gst_pad_query_default(pad, query);
   1.153 +      }
   1.154        break;
   1.155      }
   1.156      case GST_QUERY_DURATION:
   1.157 @@ -996,18 +1024,21 @@
   1.158        }
   1.159  #endif
   1.160  	gint64 dur = -1;
   1.161 -	gst_query_parse_duration( query, &formt, &dur );
   1.162 -	//gst_query_set_duration (query, GST_FORMAT_TIME, myth->content_size);
   1.163 -  if ( formt == GST_FORMAT_BYTES )
   1.164 +	gst_query_parse_duration ( query, &formt, &dur );	
   1.165 +  if ( formt == GST_FORMAT_BYTES ) {
   1.166 +  	gst_query_set_duration (query, formt, dur = myth->content_size);
   1.167    	GST_DEBUG_OBJECT (myth, "DURATION %lld (BYTES).\n", dur );
   1.168 -  else if ( formt == GST_FORMAT_TIME )
   1.169 +  } else if ( formt == GST_FORMAT_TIME ) {
   1.170    	GST_DEBUG_OBJECT (myth, "DURATION %lld (TIME).\n", dur );
   1.171 +  	gst_query_ref(query);
   1.172 +  	res = gst_pad_query_default(pad, query);  	
   1.173 +  }
   1.174  	res = TRUE;
   1.175        break;
   1.176      }
   1.177      default:
   1.178      {
   1.179 -      res = FALSE;
   1.180 +      res = gst_pad_query_default(pad, query);
   1.181        break;
   1.182      }
   1.183    }
   1.184 @@ -1029,8 +1060,17 @@
   1.185        //src->unique_setup = FALSE;
   1.186        break;
   1.187      case GST_STATE_CHANGE_READY_TO_PAUSED:
   1.188 +    	GST_INFO_OBJECT( src, "[%s] READY to PAUSED called!\n", __FUNCTION__ );
   1.189 +    	break;
   1.190      case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
   1.191 -      //src->eos = FALSE;
   1.192 +    	GST_INFO_OBJECT( src, "[%s] PAUSED to PLAYING called!\n", __FUNCTION__ );
   1.193 +      if ( src->live_tv ) {
   1.194 +	      if ( !gmyth_recorder_send_frontend_ready_command( src->spawn_livetv->recorder ) )
   1.195 +	      	GST_WARNING_OBJECT( src, "[%s] Couldn't send the FRONTEND_READY message to the backend!", __FUNCTION__ );
   1.196 +	      else
   1.197 +	      	GST_DEBUG_OBJECT( src, "[%s] Message FRONTEND_READY was sent to the backend!", __FUNCTION__ );
   1.198 +      }
   1.199 +
   1.200        break;
   1.201      default:
   1.202        break;
   1.203 @@ -1048,7 +1088,7 @@
   1.204        GST_INFO_OBJECT( src, "[%s] PLAYING to PAUSED called!\n", __FUNCTION__ );
   1.205      case GST_STATE_CHANGE_PAUSED_TO_READY:
   1.206        GST_INFO_OBJECT( src, "[%s] PAUSED to READY called!\n", __FUNCTION__ );
   1.207 -      if ( src->live_tv && src->update_prog_chain ) {
   1.208 +      if ( src->live_tv ) {
   1.209  	      if ( !gmyth_recorder_send_frontend_ready_command( src->spawn_livetv->recorder ) )
   1.210  	      	GST_WARNING_OBJECT( src, "[%s] Couldn't send the FRONTEND_READY message to the backend!", __FUNCTION__ );
   1.211  	      else