X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Faccess%2Fmms%2Fmmstu.c;h=326b4313fef103e7034326a821d36167002bfba7;hb=7c7ad3b0759079c63f0fd0fbc3118cadaf05619f;hp=9f24789c5162c1fe29b47a4407da64f91b28e437;hpb=366ec46f5e2df248858b1a6ac978a823f33225ac;p=vlc diff --git a/modules/access/mms/mmstu.c b/modules/access/mms/mmstu.c index 9f24789c51..326b4313fe 100644 --- a/modules/access/mms/mmstu.c +++ b/modules/access/mms/mmstu.c @@ -38,24 +38,13 @@ #ifdef HAVE_UNISTD_H # include #endif -#ifdef HAVE_FCNTL_H -# include -#endif -#ifdef HAVE_SYS_TIME_H -# include -#endif -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif +#include #ifdef HAVE_POLL # include #endif #include -#include "vlc_url.h" +#include #include "asf.h" #include "buffer.h" @@ -77,7 +66,7 @@ void MMSTUClose ( access_t * ); static block_t *Block( access_t * ); -static int Seek( access_t *, int64_t ); +static int Seek( access_t *, uint64_t ); static int Control( access_t *, int, va_list ); static int MMSOpen ( access_t *, vlc_url_t *, int ); @@ -93,7 +82,8 @@ static int mms_HeaderMediaRead( access_t *, int ); static int mms_ReceivePacket( access_t * ); -static void* KeepAliveThread( void * ); +static void KeepAliveStart( access_t * ); +static void KeepAliveStop( access_t * ); int MMSTUOpen( access_t *p_access ) { @@ -190,6 +180,7 @@ int MMSTUOpen( access_t *p_access ) (uint64_t)p_sys->i_header + (uint64_t)p_sys->i_packet_count * (uint64_t)p_sys->i_packet_length; } + p_sys->b_keep_alive = false; /* *** Start stream *** */ if( MMSStart( p_access, 0xffffffff ) < 0 ) @@ -199,21 +190,6 @@ int MMSTUOpen( access_t *p_access ) return VLC_EGENERIC; } - /* Keep the connection alive when paused */ - p_sys->p_keepalive = malloc( sizeof( mmstu_keepalive_t ) ); - p_sys->p_keepalive->p_access = p_access; - vlc_mutex_init( &p_sys->p_keepalive->lock ); - vlc_cond_init( &p_sys->p_keepalive->wait ); - p_sys->p_keepalive->b_paused = false; - if( vlc_clone( &p_sys->p_keepalive->handle, KeepAliveThread, - p_sys->p_keepalive, VLC_THREAD_PRIORITY_LOW ) ) - { - vlc_cond_destroy( &p_sys->p_keepalive->wait ); - vlc_mutex_destroy( &p_sys->p_keepalive->lock ); - free( p_sys->p_keepalive ); - p_sys->p_keepalive = NULL; - } - return VLC_SUCCESS; } @@ -224,21 +200,13 @@ void MMSTUClose( access_t *p_access ) { access_sys_t *p_sys = p_access->p_sys; - if( p_sys->p_keepalive ) - { - vlc_cancel( p_sys->p_keepalive->handle ); - vlc_join( p_sys->p_keepalive->handle, NULL ); - vlc_cond_destroy( &p_sys->p_keepalive->wait ); - vlc_mutex_destroy( &p_sys->p_keepalive->lock ); - free( p_sys->p_keepalive ); - } + KeepAliveStop( p_access ); /* close connection with server */ MMSClose( p_access ); /* free memory */ vlc_UrlClean( &p_sys->url ); - vlc_mutex_destroy( &p_sys->lock_netwrite ); free( p_sys ); } @@ -253,7 +221,6 @@ static int Control( access_t *p_access, int i_query, va_list args ) bool b_bool; int64_t *pi_64; int i_int; - vlc_value_t val; switch( i_query ) { @@ -286,7 +253,6 @@ 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 * ); - var_Get( p_access, "mms-caching", &val ); *pi_64 = (int64_t)var_GetInteger( p_access, "mms-caching" ) * INT64_C(1000); break; @@ -303,15 +269,15 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_SET_PAUSE_STATE: b_bool = (bool)va_arg( args, int ); if( b_bool ) + { MMSStop( p_access ); + KeepAliveStart( p_access ); + } else + { + KeepAliveStop( p_access ); Seek( p_access, p_access->info.i_pos ); - - vlc_mutex_lock( &p_sys->p_keepalive->lock ); - p_sys->p_keepalive->b_paused = b_bool; - if( b_bool ) - vlc_cond_signal( &p_sys->p_keepalive->wait ); - vlc_mutex_unlock( &p_sys->p_keepalive->lock ); + } break; case ACCESS_GET_TITLE_INFO: @@ -333,19 +299,15 @@ static int Control( access_t *p_access, int i_query, va_list args ) /***************************************************************************** * Seek: try to go at the right place *****************************************************************************/ -static int Seek( access_t * p_access, int64_t i_pos ) +static int Seek( access_t * p_access, uint64_t i_pos ) { access_sys_t *p_sys = p_access->p_sys; uint32_t i_packet; uint32_t i_offset; var_buffer_t buffer; - if( i_pos < 0 ) - return VLC_EGENERIC; - if( i_pos < p_sys->i_header) { - if( p_access->info.i_pos < p_sys->i_header ) { /* no need to restart stream, it was already one @@ -364,7 +326,10 @@ static int Seek( access_t * p_access, int64_t i_pos ) i_packet = ( i_pos - p_sys->i_header ) / p_sys->i_packet_length; i_offset = ( i_pos - p_sys->i_header ) % p_sys->i_packet_length; } - msg_Dbg( p_access, "seeking to %"PRId64 " (packet:%d)", i_pos, i_packet ); + if( p_sys->b_seekable && i_packet >= p_sys->i_packet_count ) + return VLC_EGENERIC; + + msg_Dbg( p_access, "seeking to %"PRIu64 " (packet:%u)", i_pos, i_packet ); MMSStop( p_access ); msg_Dbg( p_access, "stream stopped (seek)" ); @@ -594,7 +559,7 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) #define GETUTF16( psz, size ) \ { \ int i; \ - psz = malloc( size + 1); \ + psz = xmalloc( size + 1); \ for( i = 0; i < size; i++ ) \ { \ psz[i] = p[i]; \ @@ -731,11 +696,11 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) msg_Dbg( p_access, "answer 0x06 flags:0x%8.8"PRIx32" media_length:%"PRIu32"s " - "packet_length:%u packet_count:%"PRId32" max_bit_rate:%d " + "packet_length:%zu packet_count:%"PRIu32" max_bit_rate:%d " "header_size:%zu", p_sys->i_flags_broadcast, p_sys->i_media_length, - (unsigned)p_sys->i_packet_length, + p_sys->i_packet_length, p_sys->i_packet_count, p_sys->i_max_bit_rate, p_sys->i_header_size ); @@ -804,10 +769,10 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) asf_HeaderParse ( &p_sys->asfh, p_sys->p_header, p_sys->i_header ); asf_StreamSelect( &p_sys->asfh, - var_CreateGetInteger( p_access, "mms-maxbitrate" ), - var_CreateGetInteger( p_access, "mms-all" ), - var_CreateGetInteger( p_access, "audio" ), - var_CreateGetInteger( p_access, "video" ) ); + var_InheritInteger( p_access, "mms-maxbitrate" ), + var_InheritBool( p_access, "mms-all" ), + var_InheritBool( p_access, "audio" ), + var_InheritBool( p_access, "video" ) ); /* *** now select stream we want to receive *** */ /* TODO take care of stream bitrate TODO */ @@ -1024,8 +989,10 @@ static int mms_CommandSend( access_t *p_access, int i_command, i_ret = net_Write( p_access, p_sys->i_handle_tcp, NULL, buffer.p_data, buffer.i_data - ( 8 - ( i_data - i_data_old ) ) ); vlc_mutex_unlock( &p_sys->lock_netwrite ); + if( i_ret != buffer.i_data - ( 8 - ( i_data - i_data_old ) ) ) { + var_buffer_free( &buffer ); msg_Err( p_access, "failed to send command" ); return VLC_EGENERIC; } @@ -1107,7 +1074,7 @@ static int NetFillBuffer( access_t *p_access ) return -1; } - if( !vlc_object_alive (p_access) || p_access->b_error ) + if( !vlc_object_alive (p_access) ) return -1; //msg_Dbg( p_access, "NetFillBuffer: trying again (select)" ); @@ -1175,7 +1142,7 @@ static int mms_ParseCommand( access_t *p_access, free( p_sys->p_cmd ); p_sys->i_cmd = i_data; - p_sys->p_cmd = malloc( i_data ); + p_sys->p_cmd = xmalloc( i_data ); memcpy( p_sys->p_cmd, p_data, i_data ); *pi_used = i_data; /* by default */ @@ -1298,8 +1265,8 @@ static int mms_ParsePacket( access_t *p_access, { if( p_sys->p_header ) { - p_sys->p_header = realloc( p_sys->p_header, - p_sys->i_header + i_packet_length - 8 ); + p_sys->p_header = xrealloc( p_sys->p_header, + p_sys->i_header + i_packet_length - 8 ); memcpy( &p_sys->p_header[p_sys->i_header], p_data + 8, i_packet_length - 8 ); p_sys->i_header += i_packet_length - 8; @@ -1307,7 +1274,7 @@ static int mms_ParsePacket( access_t *p_access, } else { - uint8_t* p_packet = malloc( i_packet_length - 8 ); // don't bother with preheader + uint8_t* p_packet = xmalloc( i_packet_length - 8 ); // don't bother with preheader memcpy( p_packet, p_data + 8, i_packet_length - 8 ); p_sys->p_header = p_packet; p_sys->i_header = i_packet_length - 8; @@ -1320,7 +1287,7 @@ static int mms_ParsePacket( access_t *p_access, } else { - uint8_t* p_packet = malloc( i_packet_length - 8 ); // don't bother with preheader + uint8_t* p_packet = xmalloc( i_packet_length - 8 ); // don't bother with preheader memcpy( p_packet, p_data + 8, i_packet_length - 8 ); FREENULL( p_sys->p_media ); p_sys->p_media = p_packet; @@ -1587,38 +1554,42 @@ static int mms_HeaderMediaRead( access_t *p_access, int i_type ) return -1; } -static void* KeepAliveThread( void *p_data ) +static void *KeepAliveThread( void *p_data ) { - mmstu_keepalive_t *p_thread = (mmstu_keepalive_t *) p_data; - access_t *p_access = p_thread->p_access; - - vlc_mutex_lock( &p_thread->lock ); - mutex_cleanup_push( &p_thread->lock ); + access_t *p_access = p_data; for( ;; ) { - /* Do nothing until paused (if ever) */ - while( !p_thread->b_paused ) - vlc_cond_wait( &p_thread->wait, &p_thread->lock ); + /* Send keep-alive every ten seconds */ + int canc = vlc_savecancel(); - do - { - int canc; + mms_CommandSend( p_access, 0x1b, 0, 0, NULL, 0 ); - /* Send keep-alive every ten seconds */ - vlc_mutex_unlock( &p_thread->lock ); - canc = vlc_savecancel(); + vlc_restorecancel( canc ); - mms_CommandSend( p_access, 0x1b, 0, 0, NULL, 0 ); + msleep( 10 * CLOCK_FREQ ); + } + assert(0); +} - vlc_restorecancel( canc ); - vlc_mutex_lock( &p_thread->lock ); +static void KeepAliveStart( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + if( p_sys->b_keep_alive ) + return; - msleep( 10 * CLOCK_FREQ ); - } - while( p_thread->b_paused ); - } + p_sys->b_keep_alive = !vlc_clone( &p_sys->keep_alive, + KeepAliveThread, p_access, + VLC_THREAD_PRIORITY_LOW ); +} - vlc_cleanup_pop(); - assert(0); +static void KeepAliveStop( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + if( !p_sys->b_keep_alive ) + return; + + vlc_cancel( p_sys->keep_alive ); + vlc_join( p_sys->keep_alive, NULL ); + p_sys->b_keep_alive = false; }