[vlc-devel] [PATCH 3/7] demux: mock: process extra per track configuration

Thomas Guillem thomas at gllm.fr
Tue Jun 9 13:39:22 CEST 2020


A commit log could help, with an example of how to use the new track configuration.

On Tue, Jun 9, 2020, at 10:38, Francois Cartegnie wrote:
> ---
>  modules/demux/mock.c | 150 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 150 insertions(+)
> 
> diff --git a/modules/demux/mock.c b/modules/demux/mock.c
> index 0be5eb4859..d8fe154222 100644
> --- a/modules/demux/mock.c
> +++ b/modules/demux/mock.c
> @@ -73,6 +73,45 @@ var_InheritFourcc(vlc_object_t *obj, const char *name)
>      return fourcc;
>  }
>  
> +static vlc_fourcc_t
> +var_Read_vlc_fourcc_t(const char *psz)
> +{
> +    char fourcc[5] = { 0 };
> +    if (psz)
> +    {
> +        strncpy(fourcc, psz, 4);
> +        return VLC_FOURCC(fourcc[0], fourcc[1],fourcc[2],fourcc[3]);
> +    }
> +    return 0;
> +}
> +
> +static bool
> +var_Read_bool(const char *psz)
> +{
> +    if (!psz)
> +        return false;
> +    char *endptr;
> +    long long int value = strtoll(psz, &endptr, 0);
> +    if (endptr == psz) /* Not an integer */
> +        return strcasecmp(psz, "true") == 0
> +            || strcasecmp(psz, "yes") == 0;
> +    return !!value;
> +}
> +
> +static int64_t
> +var_Read_integer(const char *psz)
> +{
> +    return psz ? strtoll(psz, NULL, 0) : 0;
> +}
> +#define var_Read_vlc_tick_t var_Read_integer
> +
> +static unsigned
> +var_Read_unsigned(const char *psz)
> +{
> +    int64_t value = var_Read_integer(psz);
> +    return value >= 0 && value < UINT_MAX ? value : UINT_MAX;
> +}
> +
>  #define LIST_OPTIONS_AUDIO \
>      Y(audio, packetized, bool, add_bool, var_InheritBool, true) \
>      Y(audio, add_track_at, vlc_tick_t, add_integer, 
> var_InheritInteger, VLC_TICK_INVALID) \
> @@ -161,6 +200,7 @@ static_assert(offsetof(struct mock_video_options, 
> add_track_at) ==
>  struct demux_sys
>  {
>      mock_track_vector tracks;
> +
>      vlc_tick_t pts;
>      vlc_tick_t audio_pts;
>      vlc_tick_t video_pts;
> @@ -631,6 +671,94 @@ ConfigureSubTrack(demux_t *demux,
>      return VLC_SUCCESS;
>  }
>  
> +static struct mock_track *
> +GetMockTrackByID(struct demux_sys *sys,
> +                 enum es_format_category_e cat, unsigned id)
> +{
> +    unsigned current=0;
> +    struct mock_track *track;
> +    vlc_vector_foreach(track, &sys->tracks)
> +    {
> +        if (track->fmt.i_cat != cat)
> +            continue;
> +        if (id == current++)
> +            return track;
> +    }
> +    return NULL;
> +}
> +
> +#define OVERRIDE(var_name, member_name, reader) \
> +    msg_Warn(demux,"%s", var_name);\
> +    if (!strcmp(var_name, config_chain->psz_name)) \
> +    { \
> +        msg_Err(demux,"read %s", config_chain->psz_name); \
> +        track->member_name = reader(config_chain->psz_value); \
> +        break; \
> +    }
> +#define Y(group_name, var_name, type, module_header_type, getter, 
> default_value) \
> +   OVERRIDE(""#var_name, u.group_name.var_name, var_Read_ ## type)
> +
> +static int
> +OverrideTrackOptions(demux_t *demux, const config_chain_t 
> *config_chain,
> +                     struct mock_track *track)
> +{
> +    for (; config_chain ; config_chain = config_chain->p_next)
> +    {
> +        switch (track->fmt.i_cat)
> +        {
> +            case VIDEO_ES:
> +                LIST_OPTIONS_VIDEO
> +                        break;
> +            case AUDIO_ES:
> +                LIST_OPTIONS_AUDIO
> +                        break;
> +            case SPU_ES:
> +                LIST_OPTIONS_SUB
> +                        break;
> +            default:
> +                vlc_assert_unreachable();
> +                break;
> +        }
> +    }
> +    return VLC_SUCCESS;
> +}
> +
> +#undef OVERRIDE
> +#undef Y
> +
> +static int
> +UpdateTrackConfiguration(demux_t *demux,
> +                         const char *config_name,
> +                         const config_chain_t *config_chain)
> +{
> +    struct demux_sys *sys = demux->p_sys;
> +
> +    const struct
> +    {
> +        const char *name;
> +        const int cat;
> +    } chain_names[3] = {
> +        { "audio[%u]", AUDIO_ES },
> +        { "video[%u]", VIDEO_ES },
> +        { "sub[%u]",   SPU_ES   },
> +    };
> +
> +    for (int i=0; i<3; i++)
> +    {
> +        unsigned trackid;
> +        struct mock_track *track;
> +        if (sscanf(config_name, chain_names[i].name, &trackid) == 1)
> +        {
> +            if (!(track = GetMockTrackByID(sys, chain_names[i].cat, 
> trackid)))
> +                return VLC_EGENERIC;
> +            OverrideTrackOptions(demux, config_chain, track);
> +            return VLC_SUCCESS;
> +        }
> +    }
> +    msg_Warn(demux, "ignoring %s", config_name);
> +    return VLC_SUCCESS;
> +}
> +
>  static int
>  DemuxAudio(demux_t *demux, vlc_tick_t step_length, vlc_tick_t end_pts)
>  {
> @@ -847,6 +975,7 @@ Open(vlc_object_t *obj)
>      size_t track_count = (sys->video_track_count + 
> sys->audio_track_count +
>                            sys->sub_track_count) * sys->program_count;
>      vlc_vector_init(&sys->tracks);
> +
>      if (track_count > 0)
>      {
>          bool success = vlc_vector_reserve(&sys->tracks, track_count);
> @@ -884,6 +1013,27 @@ Open(vlc_object_t *obj)
>      }
>      assert(track_count == sys->tracks.size);
>  
> +    /* Convert config to config chain separators (collides with 
> parselocation) */
> +    if (sys->config)
> +    {
> +        for (int i=0; sys->config[i]; i++)
> +            if (sys->config[i] == '+')
> +                sys->config[i] = ':';
> +    }
> +
> +    /* Read per track config chain */
> +    for (char *psz_in = sys->config; psz_in;)
> +    {
> +        config_chain_t *chain = NULL;
> +        char *name;
> +        char *psz_next = config_ChainCreate(&name, &chain, psz_in);
> +        if (name)
> +            UpdateTrackConfiguration(demux, name, chain);
> +        config_ChainDestroy(chain);
> +        if (sys->config != psz_in)
> +            free(psz_in);
> +        psz_in = psz_next;
> +    };
>  
>      struct mock_track *track;
>      vlc_vector_foreach(track, &sys->tracks)
> -- 
> 2.25.4
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list