Changeset 06abc54acb3e7eb8e62f9d59cac2e827e7630a0c
- 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
| ra593a91 |
r06abc54 |
|
| 135 | 135 | |
|---|
| 136 | 136 | |
|---|
| | 137 | typedef struct rtsp_strack_t rtsp_strack_t; |
|---|
| | 138 | |
|---|
| 137 | 139 | /* For unicast streaming */ |
|---|
| 138 | 140 | struct rtsp_session_t |
|---|
| … | … | |
| 144 | 146 | |
|---|
| 145 | 147 | /* 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; |
|---|
| 150 | 150 | |
|---|
| 151 | 151 | char name[0]; |
|---|
| | 152 | }; |
|---|
| | 153 | |
|---|
| | 154 | |
|---|
| | 155 | /* Unicast session track */ |
|---|
| | 156 | struct rtsp_strack_t |
|---|
| | 157 | { |
|---|
| | 158 | sout_stream_id_t *id; |
|---|
| | 159 | sout_access_out_t *access; |
|---|
| | 160 | vlc_bool_t playing; |
|---|
| 152 | 161 | }; |
|---|
| 153 | 162 | |
|---|
| … | … | |
| 204 | 213 | rtsp_session_t *ses = rtsp->sessionv[i]; |
|---|
| 205 | 214 | |
|---|
| 206 | | for( int j = 0; j < ses->i_id; j++ ) |
|---|
| | 215 | for( int j = 0; j < ses->trackc; j++ ) |
|---|
| 207 | 216 | { |
|---|
| 208 | | if( ses->id[j] == id->sout_id ) |
|---|
| | 217 | if( ses->trackv[j].id == id->sout_id ) |
|---|
| 209 | 218 | { |
|---|
| 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 ); |
|---|
| 215 | 222 | /* FIXME: are we supposed to notify the client? */ |
|---|
| 216 | 223 | } |
|---|
| … | … | |
| 232 | 239 | s->stream = rtsp; |
|---|
| 233 | 240 | 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; |
|---|
| 237 | 243 | strcpy( s->name, name ); |
|---|
| 238 | 244 | |
|---|
| … | … | |
| 269 | 275 | TAB_REMOVE( rtsp->sessionc, rtsp->sessionv, session ); |
|---|
| 270 | 276 | |
|---|
| 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 ); |
|---|
| 279 | 284 | free( session ); |
|---|
| 280 | 285 | } |
|---|
| … | … | |
| 282 | 287 | |
|---|
| 283 | 288 | /** 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 ) |
|---|
| | 289 | static int RtspCallback( httpd_callback_sys_t *p_args, |
|---|
| | 290 | httpd_client_t *cl, |
|---|
| | 291 | httpd_message_t *answer, httpd_message_t *query ) |
|---|
| 287 | 292 | { |
|---|
| 288 | 293 | rtsp_stream_t *rtsp = (rtsp_stream_t *)p_args; |
|---|
| … | … | |
| 340 | 345 | ses->b_playing = VLC_TRUE; |
|---|
| 341 | 346 | |
|---|
| 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 ); |
|---|
| 344 | 349 | } |
|---|
| 345 | 350 | vlc_mutex_unlock( &rtsp->lock ); |
|---|
| … | … | |
| 420 | 425 | rtsp_stream_t *rtsp = id->stream; |
|---|
| 421 | 426 | sout_stream_t *p_stream = id->stream->owner; |
|---|
| 422 | | sout_stream_id_t *sid = id->sout_id; |
|---|
| 423 | 427 | char psz_session_init[21]; |
|---|
| 424 | 428 | const char *psz_session; |
|---|
| … | … | |
| 540 | 544 | char ip[NI_MAXNUMERICHOST], url[NI_MAXNUMERICHOST + 8]; |
|---|
| 541 | 545 | static const char access[] = "udp{raw,rtcp}"; |
|---|
| 542 | | sout_access_out_t *p_access; |
|---|
| 543 | 546 | rtsp_session_t *ses = NULL; |
|---|
| | 547 | rtsp_strack_t track = { id->sout_id, NULL, VLC_FALSE }; |
|---|
| 544 | 548 | |
|---|
| 545 | 549 | if( httpd_ClientIP( cl, ip ) == NULL ) |
|---|
| … | … | |
| 553 | 557 | ip, loport ); |
|---|
| 554 | 558 | |
|---|
| 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 ) |
|---|
| 558 | 562 | { |
|---|
| 559 | 563 | msg_Err( p_stream, |
|---|
| … | … | |
| 563 | 567 | continue; |
|---|
| 564 | 568 | } |
|---|
| | 569 | |
|---|
| | 570 | char *src = var_GetNonEmptyString( track.access, "src-addr" ); |
|---|
| | 571 | int sport = var_GetInteger( track.access, "src-port" ); |
|---|
| 565 | 572 | |
|---|
| 566 | 573 | vlc_mutex_lock( &rtsp->lock ); |
|---|
| … | … | |
| 583 | 590 | } |
|---|
| 584 | 591 | |
|---|
| 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 ); |
|---|
| 589 | 593 | vlc_mutex_unlock( &rtsp->lock ); |
|---|
| 590 | | |
|---|
| 591 | | char *src = var_GetNonEmptyString (p_access, "src-addr"); |
|---|
| 592 | | int sport = var_GetInteger (p_access, "src-port"); |
|---|
| 593 | 594 | |
|---|
| 594 | 595 | httpd_ServerIP( cl, ip ); |
|---|
| … | … | |
| 641 | 642 | if( ses != NULL ) |
|---|
| 642 | 643 | { |
|---|
| 643 | | for( int i = 0; i < ses->i_id; i++ ) |
|---|
| | 644 | for( int i = 0; i < ses->trackc; i++ ) |
|---|
| 644 | 645 | { |
|---|
| 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 ); |
|---|
| 651 | 651 | } |
|---|
| 652 | 652 | } |
|---|