[vlc-devel] [PATCH 2/2] demux: mock: audio and video sample lengths can be different

Thomas Guillem thomas at gllm.fr
Wed Aug 28 15:36:16 CEST 2019



On Wed, Aug 28, 2019, at 15:04, Steve Lhomme wrote:
> On 2019-08-28 14:42, Thomas Guillem wrote:
> > The video sample length (calculated from the FPS) can be now different than the
> > audio sample length. This will be used by player timer tests/
> > ---
> >   modules/demux/mock.c | 154 +++++++++++++++++++++++++++++++------------
> >   1 file changed, 112 insertions(+), 42 deletions(-)
> > 
> > diff --git a/modules/demux/mock.c b/modules/demux/mock.c
> > index 50fa6e79e8..c071026cdc 100644
> > --- a/modules/demux/mock.c
> > +++ b/modules/demux/mock.c
> > @@ -89,7 +89,7 @@ var_InheritFourcc(vlc_object_t *obj, const char *name)
> >       X(audio_format, vlc_fourcc_t, add_string, var_InheritFourcc, "u8") \
> >       X(audio_rate, unsigned, add_integer, var_InheritUnsigned, 44100) \
> >       X(audio_packetized, bool, add_bool, var_InheritBool, true) \
> > -    X(audio_sample_length, vlc_tick_t, add_integer, var_InheritInteger, VLC_TICK_FROM_MS(100) ) \
> > +    X(audio_sample_length, vlc_tick_t, add_integer, var_InheritInteger, VLC_TICK_FROM_MS(40) ) \
> 
> nitpicking: put the right value in the first patch ?
> 
> >       X(video_track_count, ssize_t, add_integer, var_InheritSsize, 0) \
> >       X(video_chroma, vlc_fourcc_t, add_string, var_InheritFourcc, "I420") \
> >       X(video_width, unsigned, add_integer, var_InheritUnsigned, 640) \
> > @@ -117,7 +117,10 @@ struct demux_sys
> >   {
> >       mock_track_vector tracks;
> >       vlc_tick_t pts;
> > -    vlc_tick_t step_length;
> > +    vlc_tick_t audio_pts;
> > +    vlc_tick_t video_pts;
> > +    vlc_tick_t video_step_length;
> > +    vlc_tick_t audio_step_length;
> >   
> >       int current_title;
> >       size_t chapter_gap;
> > @@ -205,7 +208,7 @@ Control(demux_t *demux, int query, va_list args)
> >                   if (new_title >= sys->title_count)
> >                       return VLC_EGENERIC;
> >                   sys->current_title = new_title;
> > -                sys->pts = VLC_TICK_0;
> > +                sys->pts = sys->audio_pts = sys->video_pts = VLC_TICK_0;
> >                   return VLC_SUCCESS;
> >               }
> >               return VLC_EGENERIC;
> > @@ -215,7 +218,8 @@ Control(demux_t *demux, int query, va_list args)
> >                   const int seekpoint_idx = va_arg(args, int);
> >                   if (seekpoint_idx < sys->chapter_count)
> >                   {
> > -                    sys->pts = seekpoint_idx * sys->chapter_gap;
> > +                    sys->pts = sys->audio_pts = sys->video_pts =
> > +                        seekpoint_idx * sys->chapter_gap;
> 
> It seems odd that this is not shifted given the default values are shifted.
> 
> Also a size_t * size_t doesn't make a vlc_tick_t. chapter_gap should be 
> a vlc_tick_t.

OK with everything, fixed locally, thanks.

> 
> >                       return VLC_SUCCESS;
> >                   }
> >               }
> > @@ -242,7 +246,7 @@ Control(demux_t *demux, int query, va_list args)
> >           case DEMUX_SET_POSITION:
> >               if (!sys->can_seek)
> >                   return VLC_EGENERIC;
> > -            sys->pts = va_arg(args, double) * sys->length;
> > +            sys->pts = sys->video_pts = sys->audio_pts = va_arg(args, double) * sys->length;
> >               return VLC_SUCCESS;
> >           case DEMUX_GET_LENGTH:
> >               *va_arg(args, vlc_tick_t *) = sys->length;
> > @@ -253,7 +257,7 @@ Control(demux_t *demux, int query, va_list args)
> >           case DEMUX_SET_TIME:
> >               if (!sys->can_seek)
> >                   return VLC_EGENERIC;
> > -            sys->pts = va_arg(args, vlc_tick_t);
> > +            sys->pts = sys->video_pts = sys->audio_pts = va_arg(args, vlc_tick_t);
> >               return VLC_SUCCESS;
> >           case DEMUX_GET_TITLE_INFO:
> >               if (sys->title_count > 0)
> > @@ -334,7 +338,7 @@ CreateAudioBlock(demux_t *demux, struct mock_track *track)
> >   {
> >       struct demux_sys *sys = demux->p_sys;
> >       const int64_t samples =
> > -        samples_from_vlc_tick(sys->step_length, track->fmt.audio.i_rate);
> > +        samples_from_vlc_tick(sys->audio_step_length, track->fmt.audio.i_rate);
> >       const int64_t bytes = samples / track->fmt.audio.i_frame_length
> >                           * track->fmt.audio.i_bytes_per_frame;
> >       block_t *b = block_Alloc(bytes);
> > @@ -382,7 +386,7 @@ CreateVideoBlock(demux_t *demux, struct mock_track *track)
> >       size_t block_len = 0;
> >       for (int i = 0; i < pic->i_planes; ++i)
> >           block_len += pic->p[i].i_lines * pic->p[i].i_pitch;
> > -    memset(pic->p[0].p_pixels, (sys->pts / VLC_TICK_FROM_MS(10)) % 255,
> > +    memset(pic->p[0].p_pixels, (sys->video_pts / VLC_TICK_FROM_MS(10)) % 255,
> >              block_len);
> >       return block_Init(&video->b, &cbs, pic->p[0].p_pixels, block_len);
> >       (void) demux;
> > @@ -393,7 +397,7 @@ CreateSubBlock(demux_t *demux, struct mock_track *track)
> >   {
> >       struct demux_sys *sys = demux->p_sys;
> >       char *text;
> > -    if (asprintf(&text, "subtitle @ %"PRId64, sys->pts) == -1)
> > +    if (asprintf(&text, "subtitle @ %"PRId64, sys->video_pts) == -1)
> >           return NULL;
> >       size_t len = strlen(text) + 1;
> >   
> > @@ -559,43 +563,108 @@ InitSubTracks(demux_t *demux, int group, size_t count)
> >   }
> >   
> >   static int
> > -Demux(demux_t *demux)
> > +DemuxAudio(demux_t *demux, vlc_tick_t end_pts)
> >   {
> >       struct demux_sys *sys = demux->p_sys;
> >   
> > -    if (sys->error)
> > -        return VLC_DEMUXER_EGENERIC;
> > +    while (sys->audio_pts < end_pts)
> > +    {
> > +        struct mock_track *track;
> > +        vlc_vector_foreach(track, &sys->tracks)
> > +        {
> > +            block_t *block;
> > +            switch (track->fmt.i_cat)
> > +            {
> > +                case AUDIO_ES:
> > +                    block = CreateAudioBlock(demux, track);
> > +                    break;
> > +                default:
> > +                    continue;
> > +            }
> > +            if (!block)
> > +                return VLC_DEMUXER_EGENERIC;
> >   
> > -    struct mock_track *track;
> > -    vlc_vector_foreach(track, &sys->tracks)
> > +            block->i_length = sys->audio_step_length;
> > +            block->i_pts = block->i_dts = sys->audio_pts;
> > +
> > +            int ret = es_out_Send(demux->out, track->id, block);
> > +            if (ret != VLC_SUCCESS)
> > +                return VLC_DEMUXER_EGENERIC;
> > +        }
> > +        sys->audio_pts += sys->audio_step_length;
> > +    }
> > +    return VLC_DEMUXER_SUCCESS;
> > +}
> > +
> > +static int
> > +DemuxVideo(demux_t *demux, vlc_tick_t end_pts)
> > +{
> > +    struct demux_sys *sys = demux->p_sys;
> > +
> > +    while (sys->video_pts < end_pts)
> >       {
> > -        block_t *block;
> > -        switch (track->fmt.i_cat)
> > +        struct mock_track *track;
> > +        vlc_vector_foreach(track, &sys->tracks)
> >           {
> > -            case AUDIO_ES:
> > -                block = CreateAudioBlock(demux, track);
> > -                break;
> > -            case VIDEO_ES:
> > -                block = CreateVideoBlock(demux, track);
> > -                break;
> > -            case SPU_ES:
> > -                block = CreateSubBlock(demux, track);
> > -                break;
> > -            default:
> > -                vlc_assert_unreachable();
> > +            block_t *block;
> > +            switch (track->fmt.i_cat)
> > +            {
> > +                case VIDEO_ES:
> > +                    block = CreateVideoBlock(demux, track);
> > +                    break;
> > +                case SPU_ES:
> > +                    block = CreateSubBlock(demux, track);
> > +                    break;
> > +                default:
> > +                    continue;
> > +            }
> > +            if (!block)
> > +                return VLC_DEMUXER_EGENERIC;
> > +
> > +            block->i_length = sys->video_step_length;
> > +            block->i_pts = block->i_dts = sys->video_pts;
> > +
> > +            int ret = es_out_Send(demux->out, track->id, block);
> > +            if (ret != VLC_SUCCESS)
> > +                return VLC_DEMUXER_EGENERIC;
> >           }
> > -        if (!block)
> > -            return VLC_DEMUXER_EGENERIC;
> > -        block->i_length = sys->step_length;
> > -        block->i_pts = block->i_dts = sys->pts;
> > -        int ret = es_out_Send(demux->out, track->id, block);
> > -        if (ret != VLC_SUCCESS)
> > -            return VLC_DEMUXER_EGENERIC;
> > +        sys->video_pts += sys->video_step_length;
> >       }
> > -    es_out_SetPCR(demux->out, sys->pts);
> > -    sys->pts += sys->step_length;
> > +    return VLC_DEMUXER_SUCCESS;
> > +}
> > +
> > +static int
> > +Demux(demux_t *demux)
> > +{
> > +    struct demux_sys *sys = demux->p_sys;
> > +
> > +    if (sys->error)
> > +        return VLC_DEMUXER_EGENERIC;
> > +
> > +    if (sys->audio_track_count > 0
> > +     && (sys->video_track_count > 0 || sys->sub_track_count > 0))
> > +        sys->pts = __MIN(sys->audio_pts, sys->video_pts);
> > +    else if (sys->audio_track_count > 0)
> > +        sys->pts = sys->audio_pts;
> > +    else
> > +        sys->pts = sys->video_pts;
> > +
> >       if (sys->pts > sys->length)
> >           sys->pts = sys->length;
> > +    es_out_SetPCR(demux->out, sys->pts);
> > +
> > +    vlc_tick_t step_length = __MAX(sys->audio_step_length, sys->video_step_length);
> > +
> > +    int ret = VLC_DEMUXER_SUCCESS;
> > +    if (sys->audio_track_count > 0)
> > +        ret = DemuxAudio(demux, step_length + sys->audio_pts);
> > +
> > +    if (ret == VLC_DEMUXER_SUCCESS
> > +     && (sys->video_track_count > 0 || sys->sub_track_count > 0))
> > +        ret = DemuxVideo(demux, step_length + sys->video_pts);
> > +
> > +    if (ret != VLC_DEMUXER_SUCCESS)
> > +        return ret;
> >   
> >       if (sys->add_video_track_at != VLC_TICK_INVALID &&
> >           sys->add_video_track_at <= sys->pts)
> > @@ -709,13 +778,14 @@ Open(vlc_object_t *obj)
> >               goto error;
> >       }
> >   
> > -    if (sys->video_track_count > 0)
> > -        sys->step_length = VLC_TICK_FROM_SEC(1) * sys->video_frame_rate_base
> > -                         / sys->video_frame_rate;
> > -    else
> > -        sys->step_length = sys->audio_sample_length;
> > +    sys->video_step_length = sys->video_track_count > 0 ?
> > +                             VLC_TICK_FROM_SEC(1) * sys->video_frame_rate_base
> > +                             / sys->video_frame_rate : 0;
> > +
> > +    sys->audio_step_length = sys->audio_track_count > 0 ?
> > +                             sys->audio_sample_length : 0;
> >   
> > -    sys->pts = VLC_TICK_0;
> > +    sys->pts = sys->audio_pts = sys->video_pts = VLC_TICK_0;
> >       sys->current_title = 0;
> >       sys->chapter_gap = sys->chapter_count > 0 ?
> >                          (sys->length / sys->chapter_count) : 0;
> > -- 
> > 2.20.1
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> > 
> _______________________________________________
> 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