X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fservices_discovery%2Fsap.c;h=a6717e4639287ced01317bdfb08f2e6c935c08a3;hb=9c55abfc0aff5630b735bf0a7b491d14082b9e7b;hp=741fb55f02f13e1966a477175dd48ac8e7246fcc;hpb=b0c7796b8f9a6aaab5767595ba8595e4154aef82;p=vlc diff --git a/modules/services_discovery/sap.c b/modules/services_discovery/sap.c index 741fb55f02..a6717e4639 100644 --- a/modules/services_discovery/sap.c +++ b/modules/services_discovery/sap.c @@ -78,14 +78,14 @@ #define SAP_IPV4_TEXT N_( "IPv4-SAP listening" ) #define SAP_IPV4_LONGTEXT N_( \ "Set this if you want the SAP module to listen to IPv4 announces " \ - "on the standard address" ) + "on the standard address." ) #define SAP_IPV6_TEXT N_( "IPv6-SAP listening" ) #define SAP_IPV6_LONGTEXT N_( \ "Set this if you want the SAP module to listen to IPv6 announces " \ - "on the standard address" ) + "on the standard address." ) #define SAP_SCOPE_TEXT N_( "IPv6 SAP scope" ) #define SAP_SCOPE_LONGTEXT N_( \ - "Sets the scope for IPv6 announces (default is 8)" ) + "Sets the scope for IPv6 announces (default is 8)." ) #define SAP_TIMEOUT_TEXT N_( "SAP timeout (seconds)" ) #define SAP_TIMEOUT_LONGTEXT N_( \ "Sets the time before SAP items get deleted if no new announce " \ @@ -93,14 +93,14 @@ #define SAP_PARSE_TEXT N_( "Try to parse the SAP" ) #define SAP_PARSE_LONGTEXT N_( \ "When SAP can it will try to parse the SAP. If you don't select " \ - "this, all announces will be parsed by the livedotcom module" ) + "this, all announces will be parsed by the livedotcom module." ) #define SAP_STRICT_TEXT N_( "SAP Strict mode" ) #define SAP_STRICT_LONGTEXT N_( \ "When this is set, the SAP parser will discard some non-compliant " \ - "announces" ) + "announces." ) #define SAP_CACHE_TEXT N_("Use SAP cache") #define SAP_CACHE_LONGTEXT N_( \ - "If this option is selected, a SAP caching mechanism will be used." \ + "If this option is selected, a SAP caching mechanism will be used. " \ "This will result in lower SAP startup time, but you could end up " \ "with items corresponding to legacy streams." ) @@ -211,6 +211,7 @@ struct services_discovery_sys_t /* playlist node */ playlist_item_t *p_node; + playlist_t *p_playlist; /* charset conversion */ vlc_iconv_t iconvHandle; @@ -276,7 +277,6 @@ static int Open( vlc_object_t *p_this ) services_discovery_sys_t *p_sys = (services_discovery_sys_t *) malloc( sizeof( services_discovery_sys_t ) ); - playlist_t *p_playlist; playlist_view_t *p_view; char *psz_addr, *psz_charset; vlc_value_t val; @@ -346,23 +346,22 @@ static int Open( vlc_object_t *p_this ) } /* Create our playlist node */ - p_playlist = (playlist_t *)vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( !p_playlist ) + p_sys->p_playlist = (playlist_t *)vlc_object_find( p_sd, + VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + if( !p_sys->p_playlist ) { msg_Warn( p_sd, "unable to find playlist, cancelling SAP listening"); return VLC_EGENERIC; } - p_view = playlist_ViewFind( p_playlist, VIEW_CATEGORY ); - p_sys->p_node = playlist_NodeCreate( p_playlist, VIEW_CATEGORY, + p_view = playlist_ViewFind( p_sys->p_playlist, VIEW_CATEGORY ); + p_sys->p_node = playlist_NodeCreate( p_sys->p_playlist, VIEW_CATEGORY, _("SAP"), p_view->p_root ); p_sys->p_node->i_flags |= PLAYLIST_RO_FLAG; p_sys->p_node->i_flags =~ PLAYLIST_SKIP_FLAG; val.b_bool = VLC_TRUE; - var_Set( p_playlist, "intf-change", val ); - - vlc_object_release( p_playlist ); + var_Set( p_sys->p_playlist, "intf-change", val ); p_sys->i_announces = 0; p_sys->pp_announces = NULL; @@ -468,7 +467,6 @@ static void Close( vlc_object_t *p_this ) services_discovery_t *p_sd = ( services_discovery_t* )p_this; services_discovery_sys_t *p_sys = p_sd->p_sys; - playlist_t *p_playlist; int i; for( i = p_sys->i_fd-1 ; i >= 0 ; i-- ) @@ -488,13 +486,11 @@ static void Close( vlc_object_t *p_this ) } FREE( p_sys->pp_announces ); - p_playlist = (playlist_t *) vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - - if( p_playlist ) + if( p_sys->p_playlist ) { - playlist_NodeDelete( p_playlist, p_sys->p_node, VLC_TRUE , VLC_TRUE ); - vlc_object_release( p_playlist ); + playlist_NodeDelete( p_sys->p_playlist, p_sys->p_node, VLC_TRUE, + VLC_TRUE ); + vlc_object_release( p_sys->p_playlist ); } vlc_iconv_close( p_sys->iconvHandle ); @@ -519,14 +515,13 @@ static void CloseDemux( vlc_object_t *p_this ) static void Run( services_discovery_t *p_sd ) { - int i; - playlist_t *p_playlist; + int i; /* read SAP packets */ while( !p_sd->b_die ) { int i_read; - uint8_t p_buffer[MAX_SAP_BUFFER]; + uint8_t p_buffer[MAX_SAP_BUFFER + 1]; i_read = net_Select( p_sd, p_sd->p_sys->pi_fd, NULL, p_sd->p_sys->i_fd, p_buffer, @@ -540,25 +535,11 @@ static void Run( services_discovery_t *p_sd ) if( mdate() - p_sd->p_sys->pp_announces[i]->i_last > i_timeout ) { struct sap_announce_t *p_announce; - playlist_item_t * p_item; p_announce = p_sd->p_sys->pp_announces[i]; /* Remove the playlist item */ - p_playlist = vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist ) - { - p_item = playlist_ItemGetById( p_playlist, - p_announce->i_item_id ); - if( !p_item ) continue; - - msg_Dbg( p_sd, "Time out for %s, deleting (%i/%i)", - p_item->input.psz_name, - i , p_sd->p_sys->i_announces ); - - playlist_Delete( p_playlist, p_announce->i_item_id ); - vlc_object_release( p_playlist ); - } + playlist_LockDelete( p_sd->p_sys->p_playlist, + p_announce->i_item_id ); /* Remove the sap_announce from the array */ REMOVE_ELEM( p_sd->p_sys->pp_announces, @@ -802,7 +783,6 @@ static int ParseSAP( services_discovery_t *p_sd, uint8_t *p_buffer, int i_read ) sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, sdp_t *p_sdp ) { - playlist_t *p_playlist; playlist_item_t *p_item, *p_child; char *psz_value; sap_announce_t *p_sap = (sap_announce_t *)malloc( @@ -849,15 +829,6 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, psz_value = GetAttribute( p_sap->p_sdp, "plgroup" ); } - p_playlist = (playlist_t *)vlc_object_find( p_sd, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( !p_playlist ) - { - msg_Err( p_sd, "playlist not found" ); - free( p_sap ); - return NULL; - } - if( psz_value != NULL ) { char *psz_grp = convert_from_utf8( p_sd, psz_value ); @@ -869,15 +840,15 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, if( p_child == NULL ) { - p_child = playlist_NodeCreate( p_playlist, VIEW_CATEGORY, - psz_grp, p_sd->p_sys->p_node ); + p_child = playlist_NodeCreate( p_sd->p_sys->p_playlist, + VIEW_CATEGORY, psz_grp, + p_sd->p_sys->p_node ); p_child->i_flags =~ PLAYLIST_SKIP_FLAG; } free( psz_grp ); } else { - vlc_object_release( p_playlist ); msg_Err( p_sd, "out of memory"); free( p_sap ); return NULL; @@ -891,10 +862,8 @@ sap_announce_t *CreateAnnounce( services_discovery_t *p_sd, uint16_t i_hash, p_item->i_flags &= ~PLAYLIST_SKIP_FLAG; p_item->i_flags &= ~PLAYLIST_SAVE_FLAG; - playlist_NodeAddItem( p_playlist, p_item, VIEW_CATEGORY, p_child, - PLAYLIST_APPEND, PLAYLIST_END ); - - vlc_object_release( p_playlist ); + playlist_NodeAddItem( p_sd->p_sys->p_playlist, p_item, VIEW_CATEGORY, + p_child, PLAYLIST_APPEND, PLAYLIST_END ); p_sap->i_item_id = p_item->input.i_id; @@ -1109,8 +1078,15 @@ static sdp_t * ParseSDP( vlc_object_t *p_obj, char* psz_sdp ) } p_sdp = (sdp_t *)malloc( sizeof( sdp_t ) ); + if( p_sdp == NULL ) + return NULL; p_sdp->psz_sdp = strdup( psz_sdp ); + if( p_sdp->psz_sdp == NULL ) + { + free( p_sdp ); + return NULL; + } p_sdp->psz_sessionname = NULL; p_sdp->psz_media = NULL; @@ -1156,7 +1132,7 @@ static sdp_t * ParseSDP( vlc_object_t *p_obj, char* psz_sdp ) if( psz_sdp[1] != '=' ) { msg_Warn( p_obj, "invalid packet" ) ; - /* MEMLEAK ! */ + FreeSDP( p_sdp ); return NULL; } @@ -1459,20 +1435,12 @@ static int RemoveAnnounce( services_discovery_t *p_sd, sap_announce_t *p_announce ) { int i; - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_sd, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_announce->p_sdp ) FreeSDP( p_announce->p_sdp ); - if( !p_playlist ) - { - free( p_announce ); - return VLC_EGENERIC; - } - if( p_announce->i_item_id > -1 ) { - playlist_LockDelete( p_playlist, p_announce->i_item_id ); + playlist_LockDelete( p_sd->p_sys->p_playlist, p_announce->i_item_id ); } for( i = 0; i< p_sd->p_sys->i_announces; i++) @@ -1485,8 +1453,6 @@ static int RemoveAnnounce( services_discovery_t *p_sd, } } - vlc_object_release( p_playlist ); - free( p_announce ); return VLC_SUCCESS;