#define DISABLE_LONGTEXT N_( \
"Disable ES id at startup." )
+#define ENABLE_TEXT N_("Enable ES id")
+#define ENABLE_LONGTEXT N_( \
+ "Only enable ES id at startup." )
+
#define SOUT_CFG_PREFIX "sout-select-"
vlc_module_begin ()
set_capability("sout stream", 50 )
add_integer(SOUT_CFG_PREFIX "port", 5001, PORT_TEXT, PORT_LONGTEXT, true)
add_integer(SOUT_CFG_PREFIX "disable", -1, DISABLE_TEXT, DISABLE_LONGTEXT, false)
+ add_integer(SOUT_CFG_PREFIX "enable", -1, ENABLE_TEXT, ENABLE_LONGTEXT, false)
add_shortcut("select")
set_callbacks(Open, Close)
vlc_module_end ()
static int Del (sout_stream_t *, sout_stream_id_t *);
static int Send (sout_stream_t *, sout_stream_id_t *, block_t *);
-static void* Command(vlc_object_t *);
+static void* Command(void *);
struct sout_stream_id_t
{
int i_es_num;
vlc_mutex_t es_lock;
+ vlc_thread_t thread;
+
int i_fd;
int i_id_disable;
+ int i_id_enable;
};
static const char *const ppsz_sout_options[] = {
- "disable", "port", NULL
+ "enable", "disable", "port", NULL
};
/*****************************************************************************
config_ChainParse(p_stream, SOUT_CFG_PREFIX, ppsz_sout_options,
p_stream->p_cfg);
- int port = var_CreateGetInteger(p_stream, SOUT_CFG_PREFIX "port");
+ int port = var_GetInteger(p_stream, SOUT_CFG_PREFIX "port");
p_sys->i_fd = net_ListenUDP1(VLC_OBJECT(p_stream), NULL, port);
if (p_sys->i_fd < 0)
{
free( p_sys );
return VLC_EGENERIC;
}
- p_sys->i_id_disable = var_CreateGetInteger(p_stream, SOUT_CFG_PREFIX "disable");
+ p_sys->i_id_disable = var_GetInteger(p_stream, SOUT_CFG_PREFIX "disable");
+ p_sys->i_id_enable = var_GetInteger(p_stream, SOUT_CFG_PREFIX "enable");
p_sys->pp_es = NULL;
p_sys->i_es_num = 0;
vlc_mutex_init(&p_sys->es_lock);
- if (vlc_thread_create(p_stream, Command, VLC_THREAD_PRIORITY_LOW))
+ if(vlc_clone(&p_sys->thread, Command, p_stream, VLC_THREAD_PRIORITY_LOW))
{
vlc_mutex_destroy(&p_sys->es_lock);
free(p_sys);
sout_stream_t *p_stream = (sout_stream_t*)p_this;
sout_stream_sys_t *p_sys = (sout_stream_sys_t *)p_stream->p_sys;
- net_Close( p_sys->i_fd );
- p_sys->i_fd = -1;
-
- vlc_thread_join(p_stream);
+ /* Stop the thread */
+ vlc_cancel(p_sys->thread);
+ vlc_join(p_sys->thread, NULL);
+ /* Free the ressources */
+ net_Close( p_sys->i_fd );
vlc_mutex_destroy(&p_sys->es_lock);
p_stream->p_sout->i_out_pace_nocontrol--;
/****************************************************************************
* Command Thread:
****************************************************************************/
-static void* Command(vlc_object_t *p_this)
+static void* Command(void *p_this)
{
sout_stream_t *p_stream = (sout_stream_t *)p_this;
sout_stream_sys_t *p_sys = p_stream->p_sys;
- int canc = vlc_savecancel();
-
while (vlc_object_alive(p_stream))
{
- if (p_sys->i_fd < 0)
- break;
-
char psz_buffer[20];
int i_len = recv(p_sys->i_fd, psz_buffer, sizeof(psz_buffer)-1, 0);
if (strncmp(psz_buffer, "show", 4) == 0)
{
vlc_mutex_lock(&p_sys->es_lock);
+ mutex_cleanup_push(&p_sys->es_lock);
for (int i = 0; i < p_sys->i_es_num; i++)
{
- i_len = snprintf(psz_buffer, sizeof(psz_buffer), "%.4s : %d",
+ msg_Info(p_stream, "%.4s : %d",
(char *)&p_sys->pp_es[i]->fmt.i_codec,
p_sys->pp_es[i]->fmt.i_id);
- psz_buffer[i_len] = '\0';
- msg_Info(p_stream, psz_buffer);
}
- vlc_mutex_unlock(&p_sys->es_lock);
+ vlc_cleanup_pop();
}
else
{
if (b_apply)
{
vlc_mutex_lock(&p_sys->es_lock);
+ mutex_cleanup_push(&p_sys->es_lock);
for (int i = 0; i < p_sys->i_es_num; i++)
{
msg_Info(p_stream, "elementary stream pid %d",
msg_Info(p_stream, "%s: %d", b_select ? "enable" : "disable", i_pid);
}
}
- vlc_mutex_unlock(&p_sys->es_lock);
+ vlc_cleanup_pop();
}
}
}
- vlc_restorecancel(canc);
return NULL;
}
p_es->fmt = *p_fmt;
p_es->id = NULL;
p_es->b_error = false;
- p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_disable) ? false : true;
+ if (p_sys->i_id_disable >= -1)
+ p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_disable) ? false : true;
+ else if (p_sys->i_id_enable >= -1)
+ p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_enable) ? true: false;
vlc_mutex_lock(&p_sys->es_lock);
TAB_APPEND(p_sys->i_es_num, p_sys->pp_es, p_es);
static int Send(sout_stream_t *p_stream, sout_stream_id_t *p_es,
block_t *p_buffer)
{
- if (p_es->id == NULL && p_es->b_error != true)
+ if (p_es->id == NULL && !p_es->b_error)
{
p_es->id = p_stream->p_next->pf_add(p_stream->p_next, &p_es->fmt);
if (p_es->id == NULL)
}
}
- if ((p_es->b_error != true) && p_es->b_enabled)
+ if (!p_es->b_error && p_es->b_enabled)
p_stream->p_next->pf_send(p_stream->p_next, p_es->id, p_buffer);
else
block_ChainRelease(p_buffer);