Changeset e3c6b242570ec32867138f9bd11414400814431b
- Timestamp:
- 04/06/08 19:42:57 (4 months ago)
- git-parent:
- Files:
-
- src/input/input.c (modified) (8 diffs)
- src/input/input_internal.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
src/input/input.c
rf2852bc re3c6b24 87 87 static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta ); 88 88 static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta ); 89 90 static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, bool * );91 static void SoutKeep( sout_instance_t * );92 89 93 90 static void DemuxMeta( input_thread_t *p_input, vlc_meta_t *p_meta, demux_t *p_demux ); … … 186 183 p_input->p->p_es_out = NULL; 187 184 p_input->p->p_sout = NULL; 188 p_input->p->b_owns_its_sout = true;189 p_input->p->b_sout_keep = false;190 185 p_input->p->b_out_pace_control = false; 191 186 p_input->i_pts_delay = 0; … … 294 289 /* */ 295 290 if( p_sout ) 296 {297 291 p_input->p->p_sout = p_sout; 298 p_input->p->b_owns_its_sout = false;299 }300 292 301 293 memset( &p_input->p->counters, 0, sizeof( p_input->p->counters ) ); … … 321 313 stats_TimerClean( p_input, STATS_TIMER_INPUT_LAUNCHING ); 322 314 #ifdef ENABLE_SOUT 323 if( priv->b_owns_its_sout && priv->p_sout ) 324 { 325 if( priv->b_sout_keep ) 326 SoutKeep( priv->p_sout ); 327 else 328 sout_DeleteInstance( priv->p_sout ); 329 } 315 if( priv->p_sout ) 316 sout_DeleteInstance( priv->p_sout ); 330 317 #endif 331 318 vlc_gc_decref( p_input->p->input.p_item ); … … 348 335 input_item_t *p_item ) 349 336 { 350 bool b_sout_keep; 351 sout_instance_t *p_sout = SoutFind( p_parent, p_item, &b_sout_keep ); 352 input_thread_t *p_input = __input_CreateThreadExtended( p_parent, p_item, NULL, p_sout ); 353 354 if( !p_input && p_sout ) 355 SoutKeep( p_sout ); 356 357 p_input->p->b_sout_keep = b_sout_keep; 358 return p_input; 337 return __input_CreateThreadExtended( p_parent, p_item, NULL, NULL ); 359 338 } 360 339 … … 396 375 bool b_block ) 397 376 { 398 bool b_sout_keep;399 sout_instance_t *p_sout = SoutFind( p_parent, p_item, &b_sout_keep );400 377 input_thread_t *p_input; 401 378 402 p_input = Create( p_parent, p_item, NULL, false, p_sout);379 p_input = Create( p_parent, p_item, NULL, false, NULL ); 403 380 if( !p_input ) 404 {405 if( p_sout )406 SoutKeep( p_sout );407 381 return VLC_EGENERIC; 408 }409 p_input->p->b_sout_keep = b_sout_keep;410 382 411 383 if( b_block ) … … 500 472 sout_instance_t * input_DetachSout( input_thread_t *p_input ) 501 473 { 502 p_input->p->b_owns_its_sout = false; 503 return p_input->p->p_sout; 474 sout_instance_t *p_sout = p_input->p->p_sout; 475 vlc_object_detach( p_sout ); 476 p_input->p->p_sout = NULL; 477 return p_sout; 504 478 } 505 479 … … 1391 1365 } 1392 1366 1393 static sout_instance_t *SoutFind( vlc_object_t *p_parent, input_item_t *p_item, bool *pb_sout_keep )1394 {1395 bool b_keep_sout = var_CreateGetBool( p_parent, "sout-keep" );1396 sout_instance_t *p_sout = NULL;1397 int i;1398 1399 /* Search sout-keep options1400 * XXX it has to be done here, but it is duplicated work :( */1401 vlc_mutex_lock( &p_item->lock );1402 for( i = 0; i < p_item->i_options; i++ )1403 {1404 const char *psz_option = p_item->ppsz_options[i];1405 if( !psz_option )1406 continue;1407 if( *psz_option == ':' )1408 psz_option++;1409 1410 if( !strcmp( psz_option, "sout-keep" ) )1411 b_keep_sout = true;1412 else if( !strcmp( psz_option, "no-sout-keep" ) || !strcmp( psz_option, "nosout-keep" ) )1413 b_keep_sout = false;1414 }1415 vlc_mutex_unlock( &p_item->lock );1416 1417 /* Find a potential sout to reuse1418 * XXX it might be unusable but this will be checked later */1419 if( b_keep_sout )1420 {1421 playlist_t *p_playlist = vlc_object_find( p_parent->p_libvlc,1422 VLC_OBJECT_PLAYLIST, FIND_CHILD );1423 if( p_playlist )1424 {1425 vlc_mutex_lock( &p_playlist->gc_lock );1426 p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD );1427 if( p_sout )1428 {1429 if( p_sout->p_parent != VLC_OBJECT( p_playlist ) )1430 {1431 vlc_object_release( p_sout );1432 p_sout = NULL;1433 }1434 else1435 {1436 vlc_object_detach( p_sout ); /* Remove it from the GC */1437 vlc_object_release( p_sout );1438 }1439 }1440 vlc_mutex_unlock( &p_playlist->gc_lock );1441 vlc_object_release( p_playlist );1442 }1443 }1444 1445 if( pb_sout_keep )1446 *pb_sout_keep = b_keep_sout;1447 1448 return p_sout;1449 }1450 1451 static void SoutKeep( sout_instance_t *p_sout )1452 {1453 playlist_t * p_playlist = vlc_object_find( p_sout, VLC_OBJECT_PLAYLIST,1454 FIND_PARENT );1455 if( p_playlist )1456 {1457 msg_Dbg( p_sout, "sout has been kept" );1458 vlc_object_attach( p_sout, p_playlist );1459 vlc_object_release( p_playlist );1460 }1461 else1462 sout_DeleteInstance( p_sout );1463 }1464 1465 1367 /***************************************************************************** 1466 1368 * Control src/input/input_internal.h
r7bc28ee re3c6b24 105 105 es_out_t *p_es_out; 106 106 sout_instance_t *p_sout; /* XXX Move it to es_out ? */ 107 bool b_sout_keep;108 107 bool b_out_pace_control; /* idem ? */ 109 bool b_owns_its_sout;110 108 111 109 /* Main input properties */
