Changeset 06abc54acb3e7eb8e62f9d59cac2e827e7630a0c

Show
Ignore:
Timestamp:
24/08/07 18:38:37 (1 year ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1187973517 +0000
git-parent:

[a593a91356cbd0555a077d746096cbb1bd69da16]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1187973517 +0000
Message:

Use a single table with a single index for tracks for each session

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/stream_out/rtsp.c

    ra593a91 r06abc54  
    135135 
    136136 
     137typedef struct rtsp_strack_t rtsp_strack_t; 
     138 
    137139/* For unicast streaming */ 
    138140struct rtsp_session_t 
     
    144146 
    145147    /* output (id-access) */ 
    146     int               i_id; 
    147     sout_stream_id_t  **id; 
    148     int               i_access; 
    149     sout_access_out_t **access; 
     148    int            trackc; 
     149    rtsp_strack_t *trackv; 
    150150 
    151151    char name[0]; 
     152}; 
     153 
     154 
     155/* Unicast session track */ 
     156struct rtsp_strack_t 
     157{ 
     158    sout_stream_id_t  *id; 
     159    sout_access_out_t *access; 
     160    vlc_bool_t         playing; 
    152161}; 
    153162 
     
    204213        rtsp_session_t *ses = rtsp->sessionv[i]; 
    205214 
    206         for( int j = 0; j < ses->i_id; j++ ) 
     215        for( int j = 0; j < ses->trackc; j++ ) 
    207216        { 
    208             if( ses->id[j] == id->sout_id ) 
     217            if( ses->trackv[j].id == id->sout_id ) 
    209218            { 
    210                 REMOVE_ELEM( ses->id, ses->i_id, j ); 
    211  
    212                 assert( ses->access[j] != NULL ); 
    213                 sout_AccessOutDelete( ses->access[j] ); 
    214                 REMOVE_ELEM( ses->access, ses->i_access, j ); 
     219                rtsp_strack_t *tr = ses->trackv + j; 
     220                sout_AccessOutDelete( tr->access ); 
     221                REMOVE_ELEM( ses->trackv, ses->trackc, j ); 
    215222                /* FIXME: are we supposed to notify the client? */ 
    216223            } 
     
    232239    s->stream = rtsp; 
    233240    s->b_playing = VLC_FALSE; 
    234     s->i_id = s->i_access = 0; 
    235     s->id = NULL; 
    236     s->access = NULL; 
     241    s->trackc = 0; 
     242    s->trackv = NULL; 
    237243    strcpy( s->name, name ); 
    238244 
     
    269275    TAB_REMOVE( rtsp->sessionc, rtsp->sessionv, session ); 
    270276 
    271     for( i = 0; i < session->i_access; i++ ) 
    272     { 
    273         rtp_del_sink( session->id[i], session->access[i] ); 
    274         sout_AccessOutDelete( session->access[i] ); 
    275     } 
    276  
    277     free( session->id ); 
    278     free( session->access ); 
     277    for( i = 0; i < session->trackc; i++ ) 
     278    { 
     279        rtp_del_sink( session->trackv[i].id, session->trackv[i].access ); 
     280        sout_AccessOutDelete( session->trackv[i].access ); 
     281    } 
     282 
     283    free( session->trackv ); 
    279284    free( session ); 
    280285} 
     
    282287 
    283288/** Aggregate RTSP callback */ 
    284 static int RtspCallback( httpd_callback_sys_t *p_args, 
    285                           httpd_client_t *cl, 
    286                           httpd_message_t *answer, httpd_message_t *query ) 
     289static int RtspCallback( httpd_callback_sys_t *p_args, 
     290                         httpd_client_t *cl, 
     291                         httpd_message_t *answer, httpd_message_t *query ) 
    287292{ 
    288293    rtsp_stream_t *rtsp = (rtsp_stream_t *)p_args; 
     
    340345                ses->b_playing = VLC_TRUE; 
    341346 
    342                 for( int i_id = 0; i_id < ses->i_id; i_id++ ) 
    343                     rtp_add_sink( ses->id[i_id], ses->access[i_id] ); 
     347                for( int i = 0; i < ses->trackc; i++ ) 
     348                    rtp_add_sink( ses->trackv[i].id, ses->trackv[i].access ); 
    344349            } 
    345350            vlc_mutex_unlock( &rtsp->lock ); 
     
    420425    rtsp_stream_t    *rtsp = id->stream; 
    421426    sout_stream_t    *p_stream = id->stream->owner; 
    422     sout_stream_id_t *sid = id->sout_id; 
    423427    char psz_session_init[21]; 
    424428    const char *psz_session; 
     
    540544                    char ip[NI_MAXNUMERICHOST], url[NI_MAXNUMERICHOST + 8]; 
    541545                    static const char access[] = "udp{raw,rtcp}"; 
    542                     sout_access_out_t *p_access; 
    543546                    rtsp_session_t *ses = NULL; 
     547                    rtsp_strack_t track = { id->sout_id, NULL, VLC_FALSE }; 
    544548 
    545549                    if( httpd_ClientIP( cl, ip ) == NULL ) 
     
    553557                              ip, loport ); 
    554558 
    555                     p_access = sout_AccessOutNew( p_stream->p_sout, access
    556                                                   url ); 
    557                     if( p_access == NULL ) 
     559                    track.access = sout_AccessOutNew( p_stream->p_sout
     560                                                      access, url ); 
     561                    if( track.access == NULL ) 
    558562                    { 
    559563                        msg_Err( p_stream, 
     
    563567                        continue; 
    564568                    } 
     569 
     570                    char *src = var_GetNonEmptyString( track.access, "src-addr" ); 
     571                    int sport = var_GetInteger( track.access, "src-port" ); 
    565572 
    566573                    vlc_mutex_lock( &rtsp->lock ); 
     
    583590                    } 
    584591 
    585                     assert( ses->i_id == ses->i_access ); 
    586                     TAB_APPEND( ses->i_id, ses->id, sid ); 
    587                     TAB_APPEND( ses->i_access, ses->access, p_access ); 
    588                     assert( ses->i_id == ses->i_access ); 
     592                    INSERT_ELEM( ses->trackv, ses->trackc, ses->trackc, track ); 
    589593                    vlc_mutex_unlock( &rtsp->lock ); 
    590  
    591                     char *src = var_GetNonEmptyString (p_access, "src-addr"); 
    592                     int sport = var_GetInteger (p_access, "src-port"); 
    593594 
    594595                    httpd_ServerIP( cl, ip ); 
     
    641642            if( ses != NULL ) 
    642643            { 
    643                 for( int i = 0; i < ses->i_id; i++ ) 
     644                for( int i = 0; i < ses->trackc; i++ ) 
    644645                { 
    645                     if( ses->id[i] == id->sout_id ) 
    646                     { 
    647                         rtp_del_sink( id->sout_id, ses->access[i] ); 
    648                         REMOVE_ELEM( ses->id, ses->i_id, i ); 
    649                         REMOVE_ELEM( ses->access, ses->i_access, i ); 
    650                         sout_AccessOutDelete( ses->access[i] ); 
     646                    if( ses->trackv[i].id == id->sout_id ) 
     647                    { 
     648                        rtp_del_sink( id->sout_id, ses->trackv[i].access ); 
     649                        sout_AccessOutDelete( ses->trackv[i].access ); 
     650                        REMOVE_ELEM( ses->trackv, ses->trackc, i ); 
    651651                    } 
    652652                }