X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Frtmp%2Faccess.c;h=eb656c2910624903f83b7d6ec21f630045b3c454;hb=e593067f8d39b5f7797808b31fbc2df76b438bb6;hp=a8613db57c2d4bbd1b1e5eee7b61fc66d73c300a;hpb=ec01f1da2483121e609fa771aad3ad834f1c7004;p=vlc diff --git a/modules/access/rtmp/access.c b/modules/access/rtmp/access.c index a8613db57c..eb656c2910 100644 --- a/modules/access/rtmp/access.c +++ b/modules/access/rtmp/access.c @@ -40,10 +40,15 @@ /***************************************************************************** * Module descriptor *****************************************************************************/ -#define CACHING_TEXT N_("Caching value in ms") -#define CACHING_LONGTEXT N_( \ - "Caching value for RTMP streams. This " \ - "value should be set in milliseconds." ) +#define SWFURL_TEXT N_("Default SWF Referrer URL") +#define SWFURL_LONGTEXT N_("The SFW URL to use as referrer when connecting to "\ + "the server. This is the SWF file that contained " \ + "the stream.") + +#define PAGEURL_TEXT N_("Default Page Referrer URL") +#define PAGEURL_LONGTEXT N_("The Page URL to use as referrer when connecting to " \ + "the server. This is the page housing the SWF " \ + "file.") static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); @@ -54,8 +59,10 @@ vlc_module_begin () set_category( CAT_INPUT ) set_subcategory( SUBCAT_INPUT_ACCESS ) - add_integer( "rtmp-caching", DEFAULT_PTS_DELAY / 1000, NULL, CACHING_TEXT, - CACHING_LONGTEXT, true ) + add_string( "rtmp-swfurl", "file:///player.swf", SWFURL_TEXT, + SWFURL_LONGTEXT, true ) + add_string( "rtmp-pageurl", "file:///player.htm", PAGEURL_TEXT, + PAGEURL_LONGTEXT, true ) set_capability( "access", 0 ) set_callbacks( Open, Close ) @@ -67,10 +74,10 @@ vlc_module_end () * Local prototypes *****************************************************************************/ static ssize_t Read( access_t *, uint8_t *, size_t ); -static int Seek( access_t *, int64_t ); +static int Seek( access_t *, uint64_t ); static int Control( access_t *, int, va_list ); -static void* ThreadControl( vlc_object_t * ); +static void* ThreadControl( void * ); /***************************************************************************** * Open: open the rtmp connection @@ -89,10 +96,9 @@ static int Open( vlc_object_t *p_this ) vlc_object_create( p_access, sizeof( rtmp_control_thread_t ) ); if( !p_sys->p_thread ) return VLC_ENOMEM; - vlc_object_attach( p_sys->p_thread, p_access ); /* Parse URI - remove spaces */ - p = psz = strdup( p_access->psz_path ); + p = psz = strdup( p_access->psz_location ); while( (p = strchr( p, ' ' )) != NULL ) *p = '+'; vlc_UrlParse( &p_sys->p_thread->url, psz, 0 ); @@ -123,6 +129,9 @@ static int Open( vlc_object_t *p_this ) p_sys->p_thread->psz_application = strndup( p_sys->p_thread->url.psz_path + 1, length_path - length_media_name - 2 ); p_sys->p_thread->psz_media = strdup( p_sys->p_thread->url.psz_path + ( length_path - length_media_name ) ); + p_sys->p_thread->psz_swf_url = var_CreateGetString( p_access, "rtmp-swfurl" ); + p_sys->p_thread->psz_page_url = var_CreateGetString( p_access, "rtmp-pageurl" ); + msg_Dbg( p_access, "rtmp: host='%s' port=%d path='%s'", p_sys->p_thread->url.psz_host, p_sys->p_thread->url.i_port, p_sys->p_thread->url.psz_path ); @@ -132,7 +141,6 @@ static int Open( vlc_object_t *p_this ) } /* Initialize thread variables */ - p_sys->p_thread->b_die = 0; p_sys->p_thread->b_error= 0; p_sys->p_thread->p_fifo_input = block_FifoNew(); p_sys->p_thread->p_empty_blocks = block_FifoNew(); @@ -185,7 +193,7 @@ static int Open( vlc_object_t *p_this ) goto error2; } - p_sys->p_thread->fd = net_Accept( p_access, p_fd_listen, -1 ); + p_sys->p_thread->fd = net_Accept( p_access, p_fd_listen ); net_ListenClose( p_fd_listen ); @@ -210,8 +218,8 @@ static int Open( vlc_object_t *p_this ) p_sys->p_thread->result_publish = 0; } - if( vlc_thread_create( p_sys->p_thread, "rtmp control thread", ThreadControl, - VLC_THREAD_PRIORITY_INPUT ) ) + if( vlc_clone( &p_sys->p_thread->thread, ThreadControl, p_sys->p_thread, + VLC_THREAD_PRIORITY_INPUT ) ) { msg_Err( p_access, "cannot spawn rtmp control thread" ); goto error2; @@ -222,6 +230,9 @@ static int Open( vlc_object_t *p_this ) if( rtmp_connect_active( p_sys->p_thread ) < 0 ) { msg_Err( p_access, "connect active failed"); + /* Kill the running thread */ + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); goto error2; } } @@ -230,23 +241,24 @@ static int Open( vlc_object_t *p_this ) p_access->p_sys->flv_packet = NULL; p_access->p_sys->read_packet = 1; - /* Update default_pts to a suitable value for rtmp access */ - var_Create( p_access, "rtmp-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); - return VLC_SUCCESS; error2: vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_mutex_destroy( &p_sys->p_thread->lock ); + block_FifoRelease( p_sys->p_thread->p_fifo_input ); + block_FifoRelease( p_sys->p_thread->p_empty_blocks ); + free( p_sys->p_thread->psz_application ); free( p_sys->p_thread->psz_media ); + free( p_sys->p_thread->psz_swf_url ); + free( p_sys->p_thread->psz_page_url ); net_Close( p_sys->p_thread->fd ); error: vlc_UrlClean( &p_sys->p_thread->url ); - vlc_object_detach( p_sys->p_thread ); vlc_object_release( p_sys->p_thread ); free( p_sys ); @@ -263,11 +275,8 @@ static void Close( vlc_object_t * p_this ) access_sys_t *p_sys = p_access->p_sys; int i; -/* p_sys->p_thread->b_die = true;*/ - vlc_object_kill( p_sys->p_thread ); - block_FifoWake( p_sys->p_thread->p_fifo_input ); - - vlc_thread_join( p_sys->p_thread ); + vlc_cancel( p_sys->p_thread->thread ); + vlc_join( p_sys->p_thread->thread, NULL ); vlc_cond_destroy( &p_sys->p_thread->wait ); vlc_mutex_destroy( &p_sys->p_thread->lock ); @@ -286,13 +295,12 @@ static void Close( vlc_object_t * p_this ) net_Close( p_sys->p_thread->fd ); - var_Destroy( p_access, "rtmp-caching" ); - vlc_UrlClean( &p_sys->p_thread->url ); free( p_sys->p_thread->psz_application ); free( p_sys->p_thread->psz_media ); + free( p_sys->p_thread->psz_swf_url ); + free( p_sys->p_thread->psz_page_url ); - vlc_object_detach( p_sys->p_thread ); vlc_object_release( p_sys->p_thread ); free( p_sys ); } @@ -323,8 +331,10 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) if( !p_sys->p_thread->metadata_received ) { /* Wait until enough data is received for extracting metadata */ +#warning This is not thread-safe (because block_FifoCount() is not)! if( block_FifoCount( p_sys->p_thread->p_fifo_input ) < 10 ) { +#warning This is wrong! msleep(100000); continue; } @@ -381,12 +391,8 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) i_ret = net_Write( p_sys->p_thread, p_sys->p_thread->fd, NULL, tmp_buffer, rtmp_packet->length_encoded ); if( i_ret != rtmp_packet->length_encoded ) { - free( rtmp_packet->body->body ); - free( rtmp_packet->body ); - free( rtmp_packet ); - free( tmp_buffer ); msg_Err( p_access, "failed send publish start" ); - return -1; + goto error; } free( rtmp_packet->body->body ); free( rtmp_packet->body ); @@ -403,12 +409,8 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) i_ret = net_Write( p_sys->p_thread, p_sys->p_thread->fd, NULL, tmp_buffer, rtmp_packet->length_encoded ); if( i_ret != rtmp_packet->length_encoded ) { - free( rtmp_packet->body->body ); - free( rtmp_packet->body ); - free( rtmp_packet ); - free( tmp_buffer ); msg_Err( p_access, "failed send bytes read" ); - return -1; + goto error; } free( rtmp_packet->body->body ); free( rtmp_packet->body ); @@ -417,12 +419,19 @@ static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) } return i_len_tmp; + +error: + free( rtmp_packet->body->body ); + free( rtmp_packet->body ); + free( rtmp_packet ); + free( tmp_buffer ); + return -1; } /***************************************************************************** * Seek: seek to a specific location in a file *****************************************************************************/ -static int Seek( access_t *p_access, int64_t i_pos ) +static int Seek( access_t *p_access, uint64_t i_pos ) { VLC_UNUSED( p_access ); VLC_UNUSED( i_pos ); @@ -471,7 +480,8 @@ static int Control( access_t *p_access, int i_query, va_list args ) /* */ case ACCESS_GET_PTS_DELAY: pi_64 = (int64_t*) va_arg( args, int64_t * ); - *pi_64 = var_GetInteger( p_access, "rtmp-caching" ) * INT64_C(1000); + *pi_64 = INT64_C(1000) + * var_InheritInteger( p_access, "network-caching" ); break; /* */ @@ -498,17 +508,19 @@ static int Control( access_t *p_access, int i_query, va_list args ) /***************************************************************************** * ThreadControl: manage control messages and pipe media to Read *****************************************************************************/ -static void* ThreadControl( vlc_object_t *p_this ) +static void* ThreadControl( void *p_this ) { - rtmp_control_thread_t *p_thread = (rtmp_control_thread_t *) p_this; + rtmp_control_thread_t *p_thread = p_this; rtmp_packet_t *rtmp_packet; int canc = vlc_savecancel (); rtmp_init_handler( p_thread->rtmp_handler ); - while( vlc_object_alive (p_thread) ) + for( ;; ) { + vlc_restorecancel( canc ); rtmp_packet = rtmp_read_net_packet( p_thread ); + canc = vlc_savecancel( ); if( rtmp_packet != NULL ) { if( rtmp_packet->content_type < 0x01 /* RTMP_CONTENT_TYPE_CHUNK_SIZE */ @@ -528,15 +540,16 @@ static void* ThreadControl( vlc_object_t *p_this ) /* Sometimes server close connection too soon */ if( p_thread->result_connect ) { +#warning There must be a bug here! vlc_mutex_lock( &p_thread->lock ); vlc_cond_signal( &p_thread->wait ); vlc_mutex_unlock( &p_thread->lock ); } - p_thread->b_die = 1; +#warning info cannot be accessed outside input thread! ((access_t *) p_thread->p_base_object)->info.b_eof = true; - block_FifoWake( p_thread->p_fifo_input ); + break; } } vlc_restorecancel (canc);