vlc | branch: master | Thomas Guillem <[email protected]> | Tue Feb 11 09:56:28 2020 +0100| [0c0a4d1d4a39c4841340226b16944309a7eb27e0] | committer: Thomas Guillem
es_out: propagate the input_source_t It will be used to differentiate the master source (in = NULL) from the slave ones. It is passed from input_EsOutSourceNew() to the timeshift es_out to the core es_out, via cbs->add() and cbs->control(). > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0c0a4d1d4a39c4841340226b16944309a7eb27e0 --- include/vlc_es_out.h | 8 +- modules/access/bluray.c | 6 +- modules/demux/adaptive/plumbing/FakeESOut.cpp | 8 +- modules/demux/timestamps_filter.h | 6 +- src/Makefile.am | 1 + src/input/es_out.c | 25 +++-- src/input/es_out.h | 1 + src/input/es_out_source.c | 102 +++++++++++++++++++ src/input/es_out_timeshift.c | 139 +++++++++++++++++--------- test/modules/demux/timestamps_filter.c | 6 +- 10 files changed, 229 insertions(+), 73 deletions(-) diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h index 5cf5116ab6..d7dd98a655 100644 --- a/include/vlc_es_out.h +++ b/include/vlc_es_out.h @@ -125,10 +125,10 @@ enum es_out_policy_e struct es_out_callbacks { - es_out_id_t *(*add)(es_out_t *, const es_format_t *); + es_out_id_t *(*add)(es_out_t *, input_source_t *in, const es_format_t *); int (*send)(es_out_t *, es_out_id_t *, block_t *); void (*del)(es_out_t *, es_out_id_t *); - int (*control)(es_out_t *, int query, va_list); + int (*control)(es_out_t *, input_source_t *in, int query, va_list); void (*destroy)(es_out_t *); /** * Private control callback, must be NULL for es_out created from modules. @@ -144,7 +144,7 @@ struct es_out_t VLC_USED static inline es_out_id_t * es_out_Add( es_out_t *out, const es_format_t *fmt ) { - return out->cbs->add( out, fmt ); + return out->cbs->add( out, NULL, fmt ); } static inline void es_out_Del( es_out_t *out, es_out_id_t *id ) @@ -160,7 +160,7 @@ static inline int es_out_Send( es_out_t *out, es_out_id_t *id, static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args ) { - return out->cbs->control( out, i_query, args ); + return out->cbs->control( out, NULL, i_query, args ); } static inline int es_out_Control( es_out_t *out, int i_query, ... ) diff --git a/modules/access/bluray.c b/modules/access/bluray.c index f044063330..2796f099ea 100644 --- a/modules/access/bluray.c +++ b/modules/access/bluray.c @@ -1331,8 +1331,9 @@ static es_out_id_t *bluray_esOutAddUnlocked(bluray_esout_priv_t *esout_priv, return p_es; } -static es_out_id_t *bluray_esOutAdd(es_out_t *p_out, const es_format_t *p_fmt) +static es_out_id_t *bluray_esOutAdd(es_out_t *p_out, input_source_t *in, const es_format_t *p_fmt) { + VLC_UNUSED(in); bluray_esout_priv_t *esout_priv = container_of(p_out, bluray_esout_priv_t, es_out); vlc_mutex_lock(&esout_priv->lock); @@ -1408,8 +1409,9 @@ static void bluray_esOutDel(es_out_t *p_out, es_out_id_t *p_es) vlc_mutex_unlock(&esout_priv->lock); } -static int bluray_esOutControl(es_out_t *p_out, int i_query, va_list args) +static int bluray_esOutControl(es_out_t *p_out, input_source_t *in, int i_query, va_list args) { + VLC_UNUSED(in); bluray_esout_priv_t *esout_priv = container_of(p_out, bluray_esout_priv_t, es_out); int i_ret; vlc_mutex_lock(&esout_priv->lock); diff --git a/modules/demux/adaptive/plumbing/FakeESOut.cpp b/modules/demux/adaptive/plumbing/FakeESOut.cpp index f16503b40c..5ada11dd5d 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.cpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.cpp @@ -37,10 +37,10 @@ namespace adaptive { public: /* static callbacks for demuxer */ - static es_out_id_t *es_out_Add( es_out_t *, const es_format_t * ); + static es_out_id_t *es_out_Add( es_out_t *, input_source_t *, const es_format_t * ); static int es_out_Send( es_out_t *, es_out_id_t *, block_t * ); static void es_out_Del( es_out_t *, es_out_id_t * ); - static int es_out_Control( es_out_t *, int, va_list ); + static int es_out_Control( es_out_t *, input_source_t *in, int, va_list ); static void es_out_Destroy( es_out_t * ); static const struct es_out_callbacks cbs; struct Private @@ -60,7 +60,7 @@ const struct es_out_callbacks EsOutCallbacks::cbs = EsOutCallbacks::es_out_Destroy, }; -es_out_id_t * EsOutCallbacks::es_out_Add(es_out_t *fakees, const es_format_t *p_fmt) +es_out_id_t * EsOutCallbacks::es_out_Add(es_out_t *fakees, input_source_t *, const es_format_t *p_fmt) { AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; return me->esOutAdd(p_fmt); @@ -78,7 +78,7 @@ void EsOutCallbacks::es_out_Del(es_out_t *fakees, es_out_id_t *p_es) me->esOutDel(p_es); } -int EsOutCallbacks::es_out_Control(es_out_t *fakees, int i_query, va_list args) +int EsOutCallbacks::es_out_Control(es_out_t *fakees, input_source_t *, int i_query, va_list args) { AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; return me->esOutControl(i_query, args); diff --git a/modules/demux/timestamps_filter.h b/modules/demux/timestamps_filter.h index 4d2b2e0883..a3563326e3 100644 --- a/modules/demux/timestamps_filter.h +++ b/modules/demux/timestamps_filter.h @@ -156,8 +156,9 @@ static void timestamps_filter_es_out_Reset(struct tf_es_out_s *out) out->b_discontinuity = false; } -static int timestamps_filter_es_out_Control(es_out_t *out, int i_query, va_list va_list) +static int timestamps_filter_es_out_Control(es_out_t *out, input_source_t *in, int i_query, va_list va_list) { + VLC_UNUSED(in); struct tf_es_out_s *p_sys = container_of(out, struct tf_es_out_s, es_out); switch(i_query) { @@ -303,8 +304,9 @@ static void timestamps_filter_es_out_Delete(es_out_t *out) free(p_sys); } -static es_out_id_t *timestamps_filter_es_out_Add(es_out_t *out, const es_format_t *fmt) +static es_out_id_t *timestamps_filter_es_out_Add(es_out_t *out, input_source_t *in, const es_format_t *fmt) { + VLC_UNUSED(in); struct tf_es_out_s *p_sys = container_of(out, struct tf_es_out_s, es_out); struct tf_es_out_id_s *tf_es_sys = malloc(sizeof(*tf_es_sys)); diff --git a/src/Makefile.am b/src/Makefile.am index bf91159fcc..896aeb558b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -258,6 +258,7 @@ libvlccore_la_SOURCES = \ input/demux.c \ input/demux_chained.c \ input/es_out.c \ + input/es_out_source.c \ input/es_out_timeshift.c \ input/input.c \ input/info.h \ diff --git a/src/input/es_out.c b/src/input/es_out.c index 81083e56c5..51be6e70fb 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -243,7 +243,7 @@ static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced ); static void EsOutGlobalMeta( es_out_t *p_out, const vlc_meta_t *p_meta ); static void EsOutMeta( es_out_t *p_out, const vlc_meta_t *p_meta, const vlc_meta_t *p_progmeta ); static int EsOutEsUpdateFmt(es_out_t *out, es_out_id_t *es, const es_format_t *fmt); -static int EsOutControlLocked( es_out_t *out, int i_query, ... ); +static int EsOutControlLocked( es_out_t *out, input_source_t *, int i_query, ... ); static int EsOutPrivControlLocked( es_out_t *out, int i_query, ... ); static char *LanguageGetName( const char *psz_code ); @@ -1982,8 +1982,9 @@ static es_out_id_t *EsOutAddLocked( es_out_t *out, const es_format_t *fmt, /* EsOutAdd: * Add an es_out */ -static es_out_id_t *EsOutAdd( es_out_t *out, const es_format_t *fmt ) +static es_out_id_t *EsOutAdd( es_out_t *out, input_source_t *source, const es_format_t *fmt ) { + VLC_UNUSED(source); es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); vlc_mutex_lock( &p_sys->lock ); es_out_id_t *es = EsOutAddLocked( out, fmt, NULL ); @@ -2693,13 +2694,13 @@ static void EsOutDel( es_out_t *out, es_out_id_t *es ) vlc_mutex_unlock( &p_sys->lock ); } -static int EsOutVaControlLocked( es_out_t *, int, va_list ); -static int EsOutControlLocked( es_out_t *out, int i_query, ... ) +static int EsOutVaControlLocked( es_out_t *, input_source_t *, int, va_list ); +static int EsOutControlLocked( es_out_t *out, input_source_t *source, int i_query, ... ) { va_list args; va_start( args, i_query ); - int ret = EsOutVaControlLocked( out, i_query, args ); + int ret = EsOutVaControlLocked( out, source, i_query, args ); va_end( args ); return ret; } @@ -2742,7 +2743,8 @@ static vlc_tick_t EsOutGetTracksDelay(es_out_t *out) * \param args a variable list of arguments for the query * \return VLC_SUCCESS or an error code */ -static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args ) +static int EsOutVaControlLocked( es_out_t *out, input_source_t *source, + int i_query, va_list args ) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); @@ -3002,7 +3004,7 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args ) } /* Force a rebufferization when we are too late */ - EsOutControlLocked( out, ES_OUT_RESET_PCR ); + EsOutControlLocked( out, source, ES_OUT_RESET_PCR ); EsOutPrivControlLocked( out, ES_OUT_PRIV_SET_JITTER, p_sys->i_pts_delay, i_new_jitter, @@ -3292,7 +3294,7 @@ static int EsOutVaPrivControlLocked( es_out_t *out, int query, va_list args ) case ES_OUT_PRIV_RESTART_ES: new_query = ES_OUT_RESTART_ES; break; default: vlc_assert_unreachable(); } - return EsOutControlLocked( out, new_query, es ); + return EsOutControlLocked( out, NULL, new_query, es ); } case ES_OUT_PRIV_GET_WAKE_UP: { @@ -3350,7 +3352,7 @@ static int EsOutVaPrivControlLocked( es_out_t *out, int query, va_list args ) default: vlc_assert_unreachable(); } - int i_ret = EsOutControlLocked( out, i_new_query, p_es ); + int i_ret = EsOutControlLocked( out, NULL, i_new_query, p_es ); return i_ret; } @@ -3567,13 +3569,14 @@ static int EsOutVaPrivControlLocked( es_out_t *out, int query, va_list args ) } -static int EsOutControl( es_out_t *out, int i_query, va_list args ) +static int EsOutControl( es_out_t *out, input_source_t *source, + int i_query, va_list args ) { es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); int i_ret; vlc_mutex_lock( &p_sys->lock ); - i_ret = EsOutVaControlLocked( out, i_query, args ); + i_ret = EsOutVaControlLocked( out, source, i_query, args ); vlc_mutex_unlock( &p_sys->lock ); return i_ret; diff --git a/src/input/es_out.h b/src/input/es_out.h index 6d9d60619d..953b6a576c 100644 --- a/src/input/es_out.h +++ b/src/input/es_out.h @@ -260,6 +260,7 @@ static inline int es_out_SetVbiTransparency( es_out_t *p_out, vlc_es_id_t *id, es_out_t *input_EsOutNew( input_thread_t *, float rate ); es_out_t *input_EsOutTimeshiftNew( input_thread_t *, es_out_t *, float i_rate ); +es_out_t *input_EsOutSourceNew(es_out_t *master_out, input_source_t *in); es_out_id_t *vlc_es_id_get_out(vlc_es_id_t *id); diff --git a/src/input/es_out_source.c b/src/input/es_out_source.c new file mode 100644 index 0000000000..41bb3a1561 --- /dev/null +++ b/src/input/es_out_source.c @@ -0,0 +1,102 @@ +/***************************************************************************** + * es_out_source.c: Es Out Source handle + ***************************************************************************** + * Copyright (C) 2020 VLC authors, VideoLAN and Videolabs SAS + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/***************************************************************************** + * Preamble + *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <assert.h> +#include <vlc_common.h> + +#include <vlc_atomic.h> +#include <vlc_es_out.h> +#include <vlc_block.h> + +#include "input_internal.h" +#include "es_out.h" + +typedef struct +{ + es_out_t out; + input_source_t *in; + es_out_t *parent_out; +} es_out_sys_t; + +static es_out_id_t *EsOutSourceAdd(es_out_t *out, input_source_t *in, + const es_format_t *fmt) +{ + assert(in == NULL); + es_out_sys_t *sys = container_of(out, es_out_sys_t, out); + return sys->parent_out->cbs->add(sys->parent_out, sys->in, fmt); +} + +static int EsOutSourceSend(es_out_t *out, es_out_id_t *es, block_t *block) +{ + es_out_sys_t *sys = container_of(out, es_out_sys_t, out); + return es_out_Send(sys->parent_out, es, block); +} + +static void EsOutSourceDel(es_out_t *out, es_out_id_t *es) +{ + es_out_sys_t *sys = container_of(out, es_out_sys_t, out); + es_out_Del(sys->parent_out, es); +} + +static int EsOutSourceControl(es_out_t *out, input_source_t *in, int query, + va_list args) +{ + assert(in == NULL); + es_out_sys_t *sys = container_of(out, es_out_sys_t, out); + return sys->parent_out->cbs->control(sys->parent_out, sys->in, query, args); +} + +static void EsOutSourceDestroy(es_out_t *out) +{ + es_out_sys_t *sys = container_of(out, es_out_sys_t, out); + free(sys); +} + +es_out_t *input_EsOutSourceNew(es_out_t *parent_out, input_source_t *in) +{ + assert(parent_out && in); + + static const struct es_out_callbacks es_out_cbs = + { + .add = EsOutSourceAdd, + .send = EsOutSourceSend, + .del = EsOutSourceDel, + .control = EsOutSourceControl, + .destroy = EsOutSourceDestroy, + }; + + es_out_sys_t *sys = malloc(sizeof(*sys)); + if (!sys) + return NULL; + + sys->in = in; + sys->out.cbs = &es_out_cbs; + sys->parent_out = parent_out; + + return &sys->out; +} diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c index 96229a9a0e..65c1526ee0 100644 --- a/src/input/es_out_timeshift.c +++ b/src/input/es_out_timeshift.c @@ -69,6 +69,7 @@ enum typedef struct attribute_packed { + input_source_t *in; es_out_id_t *p_es; es_format_t *p_fmt; } ts_cmd_add_t; @@ -87,6 +88,7 @@ typedef struct attribute_packed typedef struct attribute_packed { + input_source_t *in; int i_query; union @@ -284,10 +286,10 @@ static void TsStoragePopCmd( ts_storage_t *p_storage, ts_cmd_t *p_cmd, b static void CmdClean( ts_cmd_t * ); static void cmd_cleanup_routine( void *p ) { CmdClean( p ); } -static int CmdInitAdd ( ts_cmd_t *, es_out_id_t *, const es_format_t *, bool b_copy ); +static int CmdInitAdd ( ts_cmd_t *, input_source_t *, es_out_id_t *, const es_format_t *, bool b_copy ); static void CmdInitSend ( ts_cmd_t *, es_out_id_t *, block_t * ); static int CmdInitDel ( ts_cmd_t *, es_out_id_t * ); -static int CmdInitControl( ts_cmd_t *, int i_query, va_list, bool b_copy ); +static int CmdInitControl( ts_cmd_t *, input_source_t *, int i_query, va_list, bool b_copy ); static int CmdInitPrivControl( ts_cmd_t *, int i_query, va_list, bool b_copy ); /* */ @@ -420,7 +422,7 @@ static void Destroy( es_out_t *p_out ) free( p_sys ); } -static es_out_id_t *Add( es_out_t *p_out, const es_format_t *p_fmt ) +static es_out_id_t *Add( es_out_t *p_out, input_source_t *in, const es_format_t *p_fmt ) { es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out); ts_cmd_t cmd; @@ -433,7 +435,7 @@ static es_out_id_t *Add( es_out_t *p_out, const es_format_t *p_fmt ) TsAutoStop( p_out ); - if( CmdInitAdd( &cmd, p_es, p_fmt, p_sys->b_delayed ) ) + if( CmdInitAdd( &cmd, in, p_es, p_fmt, p_sys->b_delayed ) ) { vlc_mutex_unlock( &p_sys->lock ); free( p_es ); @@ -491,14 +493,36 @@ static void Del( es_out_t *p_out, es_out_id_t *p_es ) vlc_mutex_unlock( &p_sys->lock ); } -static int ControlLockedGetEmpty( es_out_t *p_out, bool *pb_empty ) +static inline int es_out_in_vaControl( es_out_t *p_out, input_source_t *in, + int i_query, va_list args) +{ + return p_out->cbs->control( p_out, in, i_query, args ); +} + +static inline int es_out_in_Control( es_out_t *p_out, input_source_t *in, + int i_query, ... ) +{ + va_list args; + int i_result; + + va_start( args, i_query ); + i_result = es_out_in_vaControl( p_out, in, i_query, args ); + va_end( args ); + return i_result; +} + +static int ControlLockedGetEmpty( es_out_t *p_out, input_source_t *in, + bool *pb_empty ) { es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out); if( p_sys->b_delayed && TsHasCmd( p_sys->p_ts ) ) *pb_empty = false; else - *pb_empty = es_out_GetEmpty( p_sys->p_out ); + { + int ret = es_out_in_Control( p_sys->p_out, in, ES_OUT_GET_EMPTY, pb_empty ); + assert( ret == VLC_SUCCESS ); + } return VLC_SUCCESS; } @@ -607,7 +631,8 @@ static int ControlLockedSetFrameNext( es_out_t *p_out ) return es_out_SetFrameNext( p_sys->p_out ); } -static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) +static int ControlLocked( es_out_t *p_out, input_source_t *in, int i_query, + va_list args ) { es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out); @@ -635,7 +660,7 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) case ES_OUT_SET_ES_FMT: { ts_cmd_t cmd; - if( CmdInitControl( &cmd, i_query, args, p_sys->b_delayed ) ) + if( CmdInitControl( &cmd, in, i_query, args, p_sys->b_delayed ) ) return VLC_EGENERIC; if( p_sys->b_delayed ) { @@ -656,43 +681,44 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) *pb_enabled = true; return VLC_SUCCESS; } - return es_out_Control( p_sys->p_out, ES_OUT_GET_ES_STATE, p_es->p_es, pb_enabled ); + return es_out_in_Control( p_sys->p_out, in, ES_OUT_GET_ES_STATE, + p_es->p_es, pb_enabled ); } case ES_OUT_VOUT_SET_MOUSE_EVENT: { es_out_id_t *p_es = va_arg( args, es_out_id_t * ); vlc_mouse_event cb = va_arg( args, vlc_mouse_event ); void *user_data = va_arg( args, void * ); - return es_out_Control( p_sys->p_out, ES_OUT_VOUT_SET_MOUSE_EVENT, - p_es->p_es, cb, user_data ); + return es_out_in_Control( p_sys->p_out, in, ES_OUT_VOUT_SET_MOUSE_EVENT, + p_es->p_es, cb, user_data ); } case ES_OUT_VOUT_ADD_OVERLAY: { es_out_id_t *p_es = va_arg( args, es_out_id_t * ); subpicture_t *sub = va_arg( args, subpicture_t * ); size_t *channel = va_arg( args, size_t * ); - return es_out_Control( p_sys->p_out, ES_OUT_VOUT_ADD_OVERLAY, - p_es->p_es, sub, channel ); + return es_out_in_Control( p_sys->p_out, in, ES_OUT_VOUT_ADD_OVERLAY, + p_es->p_es, sub, channel ); } case ES_OUT_VOUT_DEL_OVERLAY: { es_out_id_t *p_es = va_arg( args, es_out_id_t * ); size_t channel = va_arg( args, size_t ); - return es_out_Control( p_sys->p_out, ES_OUT_VOUT_DEL_OVERLAY, - p_es->p_es, channel ); + return es_out_in_Control( p_sys->p_out, in, ES_OUT_VOUT_DEL_OVERLAY, + p_es->p_es, channel ); } case ES_OUT_SPU_SET_HIGHLIGHT: { es_out_id_t *p_es = va_arg( args, es_out_id_t * ); const vlc_spu_highlight_t *p_hl = va_arg( args, const vlc_spu_highlight_t * ); - return es_out_Control( p_sys->p_out, ES_OUT_SPU_SET_HIGHLIGHT, - p_es->p_es, p_hl ); + return es_out_in_Control( p_sys->p_out, in, ES_OUT_SPU_SET_HIGHLIGHT, + p_es->p_es, p_hl ); } /* Special internal input control */ case ES_OUT_GET_EMPTY: { bool *pb_empty = va_arg( args, bool* ); - return ControlLockedGetEmpty( p_out, pb_empty ); + return ControlLockedGetEmpty( p_out, in, pb_empty ); } case ES_OUT_GET_PCR_SYSTEM: @@ -700,7 +726,7 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) return VLC_EGENERIC; /* fall through */ case ES_OUT_POST_SUBNODE: - return es_out_vaControl( p_sys->p_out, i_query, args ); + return es_out_in_vaControl( p_sys->p_out, in, i_query, args ); case ES_OUT_MODIFY_PCR_SYSTEM: { @@ -710,7 +736,8 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) if( b_absolute && p_sys->b_delayed ) return VLC_EGENERIC; - return es_out_ControlModifyPcrSystem( p_sys->p_out, b_absolute, i_system ); + return es_out_in_Control( p_sys->p_out, in, i_query, b_absolute, + i_system ); } default: @@ -719,7 +746,7 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) } } -static int Control( es_out_t *p_out, int i_query, va_list args ) +static int Control( es_out_t *p_out, input_source_t *in, int i_query, va_list args ) { es_out_sys_t *p_sys = container_of(p_out, es_out_sys_t, out); int i_ret; @@ -728,7 +755,7 @@ static int Control( es_out_t *p_out, int i_query, va_list args ) TsAutoStop( p_out ); - i_ret = ControlLocked( p_out, i_query, args ); + i_ret = ControlLocked( p_out, in, i_query, args ); vlc_mutex_unlock( &p_sys->lock ); @@ -1366,7 +1393,8 @@ static void CmdClean( ts_cmd_t *p_cmd ) } } -static int CmdInitAdd( ts_cmd_t *p_cmd, es_out_id_t *p_es, const es_format_t *p_fmt, bool b_copy ) +static int CmdInitAdd( ts_cmd_t *p_cmd, input_source_t *in, es_out_id_t *p_es, + const es_format_t *p_fmt, bool b_copy ) { p_cmd->i_type = C_ADD; p_cmd->i_date = vlc_tick_now(); @@ -1377,20 +1405,25 @@ static int CmdInitAdd( ts_cmd_t *p_cmd, es_out_id_t *p_es, const es_format_t *p_ if( !p_cmd->u.add.p_fmt ) return VLC_EGENERIC; es_format_Copy( p_cmd->u.add.p_fmt, p_fmt ); + p_cmd->u.add.in = in ? input_source_Hold( in ) : NULL; } else { p_cmd->u.add.p_fmt = (es_format_t*)p_fmt; + p_cmd->u.add.in = in; } return VLC_SUCCESS; } static void CmdExecuteAdd( es_out_t *p_out, ts_cmd_t *p_cmd ) { - p_cmd->u.add.p_es->p_es = es_out_Add( p_out, p_cmd->u.add.p_fmt ); + p_cmd->u.add.p_es->p_es = p_out->cbs->add( p_out, p_cmd->u.add.in, + p_cmd->u.add.p_fmt ); } static void CmdCleanAdd( ts_cmd_t *p_cmd ) { es_format_Clean( p_cmd->u.add.p_fmt ); + if( p_cmd->u.add.in ) + input_source_Release( p_cmd->u.add.in ); free( p_cmd->u.add.p_fmt ); } @@ -1435,12 +1468,18 @@ static void CmdExecuteDel( es_out_t *p_out, ts_cmd_t *p_cmd ) free( p_cmd->u.del.p_es ); } -static int CmdInitControl( ts_cmd_t *p_cmd, int i_query, va_list args, bool b_copy ) +static int CmdInitControl( ts_cmd_t *p_cmd, input_source_t *in, + int i_query, va_list args, bool b_copy ) { p_cmd->i_type = C_CONTROL; p_cmd->i_date = vlc_tick_now(); p_cmd->u.control.i_query = i_query; + if( b_copy ) + p_cmd->u.control.in = in ? input_source_Hold( in ) : NULL; + else + p_cmd->u.control.in = in; + switch( i_query ) { /* Pass-through control */ @@ -1575,66 +1614,67 @@ static int CmdInitControl( ts_cmd_t *p_cmd, int i_query, va_list args, bool b_co static int CmdExecuteControl( es_out_t *p_out, ts_cmd_t *p_cmd ) { const int i_query = p_cmd->u.control.i_query; + input_source_t *in = p_cmd->u.control.in; switch( i_query ) { /* Pass-through control */ case ES_OUT_SET_GROUP: /* arg1= int */ case ES_OUT_DEL_GROUP: /* arg1=int i_group */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.i_int ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.i_int ); case ES_OUT_SET_PCR: /* arg1=vlc_tick_t i_pcr(microsecond!) (using default group 0)*/ case ES_OUT_SET_NEXT_DISPLAY_TIME: /* arg1=int64_t i_pts(microsecond) */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.i_i64 ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.i_i64 ); case ES_OUT_SET_GROUP_PCR: /* arg1= int i_group, arg2=vlc_tick_t i_pcr(microsecond!)*/ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.int_i64.i_int, - p_cmd->u.control.u.int_i64.i_i64 ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.int_i64.i_int, + p_cmd->u.control.u.int_i64.i_i64 ); case ES_OUT_RESET_PCR: /* no arg */ - return es_out_Control( p_out, i_query ); + return es_out_in_Control( p_out, in, i_query ); case ES_OUT_SET_GROUP_META: /* arg1=int i_group arg2=const vlc_meta_t* */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.int_meta.i_int, - p_cmd->u.control.u.int_meta.p_meta ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.int_meta.i_int, + p_cmd->u.control.u.int_meta.p_meta ); case ES_OUT_SET_GROUP_EPG: /* arg1=int i_group arg2=const vlc_epg_t* */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.int_epg.i_int, - p_cmd->u.control.u.int_epg.p_epg ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.int_epg.i_int, + p_cmd->u.control.u.int_epg.p_epg ); case ES_OUT_SET_GROUP_EPG_EVENT: /* arg1=int i_group arg2=const vlc_epg_event_t* */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.int_epg_evt.i_int, - p_cmd->u.control.u.int_epg_evt.p_evt ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.int_epg_evt.i_int, + p_cmd->u.control.u.int_epg_evt.p_evt ); case ES_OUT_SET_EPG_TIME: /* arg1=int64_t */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.i_i64 ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.i_i64 ); case ES_OUT_SET_ES_SCRAMBLED_STATE: /* arg1=int es_out_id_t* arg2=bool */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.es_bool.p_es->p_es, - p_cmd->u.control.u.es_bool.b_bool ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.es_bool.p_es->p_es, + p_cmd->u.control.u.es_bool.b_bool ); case ES_OUT_SET_META: /* arg1=const vlc_meta_t* */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.int_meta.p_meta ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.int_meta.p_meta ); /* Modified control */ case ES_OUT_SET_ES: /* arg1= es_out_id_t* */ case ES_OUT_UNSET_ES: /* arg1= es_out_id_t* */ case ES_OUT_RESTART_ES: /* arg1= es_out_id_t* */ case ES_OUT_SET_ES_DEFAULT: /* arg1= es_out_id_t* */ - return es_out_Control( p_out, i_query, !p_cmd->u.control.u.p_es ? NULL : - p_cmd->u.control.u.p_es->p_es ); + return es_out_in_Control( p_out, in, i_query, !p_cmd->u.control.u.p_es ? NULL : + p_cmd->u.control.u.p_es->p_es ); case ES_OUT_SET_ES_STATE:/* arg1= es_out_id_t* arg2=bool */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.es_bool.p_es->p_es, - p_cmd->u.control.u.es_bool.b_bool ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.es_bool.p_es->p_es, + p_cmd->u.control.u.es_bool.b_bool ); case ES_OUT_SET_ES_CAT_POLICY: - return es_out_Control( p_out, i_query, p_cmd->u.control.u.es_policy.i_cat, - p_cmd->u.control.u.es_policy.i_policy ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.es_policy.i_cat, + p_cmd->u.control.u.es_policy.i_policy ); case ES_OUT_SET_ES_FMT: /* arg1= es_out_id_t* arg2=es_format_t* */ - return es_out_Control( p_out, i_query, p_cmd->u.control.u.es_fmt.p_es->p_es, - p_cmd->u.control.u.es_fmt.p_fmt ); + return es_out_in_Control( p_out, in, i_query, p_cmd->u.control.u.es_fmt.p_es->p_es, + p_cmd->u.control.u.es_fmt.p_fmt ); default: vlc_assert_unreachable(); @@ -1643,6 +1683,9 @@ static int CmdExecuteControl( es_out_t *p_out, ts_cmd_t *p_cmd ) } static void CmdCleanControl( ts_cmd_t *p_cmd ) { + if( p_cmd->u.control.in ) + input_source_Release( p_cmd->u.control.in ); + switch( p_cmd->u.control.i_query ) { case ES_OUT_SET_GROUP_META: diff --git a/test/modules/demux/timestamps_filter.c b/test/modules/demux/timestamps_filter.c index f115fc394d..6c5038ba25 100644 --- a/test/modules/demux/timestamps_filter.c +++ b/test/modules/demux/timestamps_filter.c @@ -35,10 +35,11 @@ #define TRASH_ID 0xfeca1 #define ESID(n) ((void *)(INT64_C(0)+TRASH_ID+n)) -static int trash_es_out_Control(es_out_t *out, int i_query, va_list va_list) +static int trash_es_out_Control(es_out_t *out, input_source_t *in, int i_query, va_list va_list) { VLC_UNUSED(i_query); VLC_UNUSED(out); + VLC_UNUSED(in); VLC_UNUSED(va_list); return VLC_EGENERIC; } @@ -56,9 +57,10 @@ static void trash_es_out_Delete(es_out_t *out) VLC_UNUSED(out); } -static es_out_id_t *trash_es_out_Add(es_out_t *out, const es_format_t *fmt) +static es_out_id_t *trash_es_out_Add(es_out_t *out, input_source_t *in, const es_format_t *fmt) { VLC_UNUSED(out); + VLC_UNUSED(in); VLC_UNUSED(fmt); return ESID(fmt->i_id); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
