vlc | branch: master | Victorien Le Couviour--Tuffet <victorien.lecouviour.tuf...@gmail.com> | Fri Jun 23 20:02:10 2017 +0200| [bbbcbfc08c0fdc95e7e9501a4125b31e6d230ba0] | committer: Thomas Guillem
vout_subpictures: add sub filter/source proxy callbacks This allows to trigger the sub filters/sources callbacks from the vout, just like the video-filter proxy. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bbbcbfc08c0fdc95e7e9501a4125b31e6d230ba0 --- include/vlc_spu.h | 4 +- modules/stream_out/transcode/osd.c | 4 +- modules/stream_out/transcode/spu.c | 2 +- modules/stream_out/transcode/transcode.c | 4 +- src/video_output/video_output.c | 2 +- src/video_output/vout_subpictures.c | 98 ++++++++++++++++++++++++++++++-- 6 files changed, 102 insertions(+), 12 deletions(-) diff --git a/include/vlc_spu.h b/include/vlc_spu.h index cf6897a78b..510ee151ec 100644 --- a/include/vlc_spu.h +++ b/include/vlc_spu.h @@ -51,8 +51,8 @@ struct spu_t spu_private_t *p; }; -VLC_API spu_t * spu_Create( vlc_object_t * ); -#define spu_Create(a) spu_Create(VLC_OBJECT(a)) + VLC_API spu_t * spu_Create( vlc_object_t *, vout_thread_t * ); +#define spu_Create(a,b) spu_Create(VLC_OBJECT(a),b) VLC_API void spu_Destroy( spu_t * ); /** diff --git a/modules/stream_out/transcode/osd.c b/modules/stream_out/transcode/osd.c index 6d6c71dbe6..19e974b04d 100644 --- a/modules/stream_out/transcode/osd.c +++ b/modules/stream_out/transcode/osd.c @@ -85,7 +85,7 @@ int transcode_osd_new( sout_stream_t *p_stream, sout_stream_id_sys_t *id ) } if( !p_sys->p_spu ) - p_sys->p_spu = spu_Create( p_stream ); + p_sys->p_spu = spu_Create( p_stream, NULL ); return VLC_SUCCESS; @@ -128,7 +128,7 @@ int transcode_osd_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id, { msg_Warn( p_stream, "spu channel not initialized, doing it now" ); if( !p_sys->p_spu ) - p_sys->p_spu = spu_Create( p_stream ); + p_sys->p_spu = spu_Create( p_stream, NULL ); } if( p_subpic ) diff --git a/modules/stream_out/transcode/spu.c b/modules/stream_out/transcode/spu.c index b5ef8db309..f822bef58b 100644 --- a/modules/stream_out/transcode/spu.c +++ b/modules/stream_out/transcode/spu.c @@ -113,7 +113,7 @@ int transcode_spu_new( sout_stream_t *p_stream, sout_stream_id_sys_t *id ) } if( !p_sys->p_spu ) - p_sys->p_spu = spu_Create( p_stream ); + p_sys->p_spu = spu_Create( p_stream, NULL ); return VLC_SUCCESS; } diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c index ebfcf14ebe..ec6854ed96 100644 --- a/modules/stream_out/transcode/transcode.c +++ b/modules/stream_out/transcode/transcode.c @@ -421,7 +421,7 @@ static int Open( vlc_object_t *p_this ) psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "sfilter" ); if( psz_string && *psz_string ) { - p_sys->p_spu = spu_Create( p_stream ); + p_sys->p_spu = spu_Create( p_stream, NULL ); if( p_sys->p_spu ) spu_ChangeSources( p_sys->p_spu, psz_string ); } @@ -447,7 +447,7 @@ static int Open( vlc_object_t *p_this ) if( !p_sys->p_spu ) { - p_sys->p_spu = spu_Create( p_stream ); + p_sys->p_spu = spu_Create( p_stream, NULL ); if( p_sys->p_spu ) spu_ChangeSources( p_sys->p_spu, "osdmenu" ); } diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 9448face90..57385154f4 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -150,7 +150,7 @@ static vout_thread_t *VoutCreate(vlc_object_t *object, vout_IntfInit(vout); /* Initialize subpicture unit */ - vout->p->spu = spu_Create(vout); + vout->p->spu = spu_Create(vout, vout); vout->p->title.show = var_InheritBool(vout, "video-title-show"); vout->p->title.timeout = var_InheritInteger(vout, "video-title-timeout"); diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 43d03f4232..62ac580fb4 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -84,15 +84,18 @@ struct spu_private_t { uint8_t palette[4][4]; /**< forced palette */ /* Subpiture filters */ + char *source_chain_current; char *source_chain_update; vlc_mutex_t source_chain_lock; filter_chain_t *source_chain; + char *filter_chain_current; char *filter_chain_update; vlc_mutex_t filter_chain_lock; filter_chain_t *filter_chain; /* */ - mtime_t last_sort_date; + mtime_t last_sort_date; + vout_thread_t *vout; }; /***************************************************************************** @@ -1197,6 +1200,54 @@ static int SubSourceClean(filter_t *filter, void *data) } /***************************************************************************** + * Proxy callbacks + *****************************************************************************/ + +static int RestartSubFilterCallback(vlc_object_t *obj, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data) +{ VLC_UNUSED(obj); VLC_UNUSED(psz_var); VLC_UNUSED(oldval); VLC_UNUSED(newval); + vout_ControlChangeSubFilters((vout_thread_t *)p_data, NULL); + return VLC_SUCCESS; +} + +static int SubFilterAddProxyCallbacks(filter_t *filter, void *opaque) +{ + filter_AddProxyCallbacks((vlc_object_t *)opaque, filter, + RestartSubFilterCallback); + return VLC_SUCCESS; +} + +static int SubFilterDelProxyCallbacks(filter_t *filter, void *opaque) +{ + filter_DelProxyCallbacks((vlc_object_t *)opaque, filter, + RestartSubFilterCallback); + return VLC_SUCCESS; +} + +static int RestartSubSourceCallback(vlc_object_t *obj, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data) +{ VLC_UNUSED(obj); VLC_UNUSED(psz_var); VLC_UNUSED(oldval); VLC_UNUSED(newval); + vout_ControlChangeSubSources((vout_thread_t *)p_data, NULL); + return VLC_SUCCESS; +} + +static int SubSourceAddProxyCallbacks(filter_t *filter, void *opaque) +{ + filter_AddProxyCallbacks((vlc_object_t *)opaque, filter, + RestartSubSourceCallback); + return VLC_SUCCESS; +} + +static int SubSourceDelProxyCallbacks(filter_t *filter, void *opaque) +{ + filter_DelProxyCallbacks((vlc_object_t *)opaque, filter, + RestartSubSourceCallback); + return VLC_SUCCESS; +} + +/***************************************************************************** * Public API *****************************************************************************/ @@ -1206,7 +1257,7 @@ static int SubSourceClean(filter_t *filter, void *data) * * \param p_this the parent object which creates the subpicture unit */ -spu_t *spu_Create(vlc_object_t *object) +spu_t *spu_Create(vlc_object_t *object, vout_thread_t *vout) { spu_t *spu = vlc_custom_create(object, sizeof(spu_t) + sizeof(spu_private_t), @@ -1253,6 +1304,7 @@ spu_t *spu_Create(vlc_object_t *object) /* */ sys->last_sort_date = -1; + sys->vout = vout; return spu; } @@ -1276,8 +1328,16 @@ void spu_Destroy(spu_t *spu) FilterRelease(sys->scale); filter_chain_ForEach(sys->source_chain, SubSourceClean, spu); + if (sys->vout) + filter_chain_ForEach(sys->source_chain, + SubSourceDelProxyCallbacks, sys->vout); filter_chain_Delete(sys->source_chain); + free(sys->source_chain_current); + if (sys->vout) + filter_chain_ForEach(sys->filter_chain, + SubFilterDelProxyCallbacks, sys->vout); filter_chain_Delete(sys->filter_chain); + free(sys->filter_chain_current); vlc_mutex_destroy(&sys->source_chain_lock); vlc_mutex_destroy(&sys->filter_chain_lock); free(sys->source_chain_update); @@ -1362,9 +1422,17 @@ void spu_PutSubpicture(spu_t *spu, subpicture_t *subpic) vlc_mutex_lock(&sys->filter_chain_lock); if (chain_update) { if (*chain_update) { + if (sys->vout) + filter_chain_ForEach(sys->filter_chain, + SubFilterDelProxyCallbacks, + sys->vout); filter_chain_Reset(sys->filter_chain, NULL, NULL); filter_chain_AppendFromString(spu->p->filter_chain, chain_update); + if (sys->vout) + filter_chain_ForEach(sys->filter_chain, + SubFilterAddProxyCallbacks, + sys->vout); } else if (filter_chain_GetLength(spu->p->filter_chain) > 0) filter_chain_Reset(sys->filter_chain, NULL, NULL); @@ -1386,6 +1454,7 @@ void spu_PutSubpicture(spu_t *spu, subpicture_t *subpic) if (sys->source_chain_update) free(sys->source_chain_update); sys->source_chain_update = chain_update; + sys->source_chain_current = strdup(chain_update); chain_update = NULL; } vlc_mutex_unlock(&sys->lock); @@ -1439,9 +1508,16 @@ subpicture_t *spu_Render(spu_t *spu, vlc_mutex_lock(&sys->source_chain_lock); if (chain_update) { filter_chain_ForEach(sys->source_chain, SubSourceClean, spu); + if (sys->vout) + filter_chain_ForEach(sys->source_chain, + SubSourceDelProxyCallbacks, + sys->vout); filter_chain_Reset(sys->source_chain, NULL, NULL); filter_chain_AppendFromString(spu->p->source_chain, chain_update); + if (sys->vout) + filter_chain_ForEach(sys->source_chain, + SubSourceAddProxyCallbacks, sys->vout); filter_chain_ForEach(sys->source_chain, SubSourceInit, spu); free(chain_update); @@ -1568,7 +1644,14 @@ void spu_ChangeSources(spu_t *spu, const char *filters) vlc_mutex_lock(&sys->lock); free(sys->source_chain_update); - sys->source_chain_update = strdup(filters); + if (filters) + { + sys->source_chain_update = strdup(filters); + free(sys->source_chain_current); + sys->source_chain_current = strdup(filters); + } + else if (sys->source_chain_current) + sys->source_chain_update = strdup(sys->source_chain_current); vlc_mutex_unlock(&sys->lock); } @@ -1580,7 +1663,14 @@ void spu_ChangeFilters(spu_t *spu, const char *filters) vlc_mutex_lock(&sys->lock); free(sys->filter_chain_update); - sys->filter_chain_update = strdup(filters); + if (filters) + { + sys->filter_chain_update = strdup(filters); + free(sys->filter_chain_current); + sys->filter_chain_current = strdup(filters); + } + else if (sys->filter_chain_current) + sys->filter_chain_update = strdup(sys->filter_chain_current); vlc_mutex_unlock(&sys->lock); } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits