[vlc-devel] [vlc-commits] demux: stl: fix offbyone in block offset
Rémi Denis-Courmont
remi at remlab.net
Sun Feb 12 18:58:33 CET 2017
Le sunnuntaina 12. helmikuuta 2017, 18.46.12 EET Francois Cartegnie a écrit :
> vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sun Feb 12
> 18:42:19 2017 +0100| [9c955b41932d3fc361806db112099181b96f6808] |
> committer: Francois Cartegnie
>
> demux: stl: fix offbyone in block offset
>
> as prev - current was always zero, first block was dropped
>
> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9c955b41932d3fc3618
> > 06db112099181b96f6808
> ---
>
> modules/demux/stl.c | 26 +++++++++++++++-----------
> 1 file changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/modules/demux/stl.c b/modules/demux/stl.c
> index b5d195e..74e1bbd 100644
> --- a/modules/demux/stl.c
> +++ b/modules/demux/stl.c
> @@ -54,7 +54,7 @@ vlc_module_end()
> typedef struct {
> mtime_t start;
> mtime_t stop;
> - int index;
> + size_t blocknumber;
> int count;
> } stl_entry_t;
>
> @@ -70,7 +70,7 @@ struct demux_sys_t {
> bool b_first_time;
> };
>
> -static int ParseInteger(uint8_t *data, size_t size)
> +static size_t ParseInteger(uint8_t *data, size_t size)
> {
> char tmp[16];
> assert(size < sizeof(tmp));
> @@ -122,7 +122,7 @@ static int Control(demux_t *demux, int query, va_list
> args) for( size_t i = 0; i + 1< sys->count; i++ )
> {
> if( sys->index[i + 1].start >= t &&
> - vlc_stream_Seek(demux->s, 1024 + 128LL *
> sys->index[i].index) == VLC_SUCCESS )
> + vlc_stream_Seek(demux->s, 1024 + 128LL * sys-
>index[i].blocknumber) == VLC_SUCCESS ) {
That´s still a signed value since long long has higher rank than size_t
AFAICT. Same below.
> sys->current = i;
> sys->next_date = t;
> @@ -172,7 +172,6 @@ static int Demux(demux_t *demux)
> {
> demux_sys_t *sys = demux->p_sys;
>
> - int prev_index = 0;
> int64_t i_barrier = sys->next_date - var_GetInteger(demux->obj.parent,
> "spu-delay"); if(i_barrier < 0)
> i_barrier = sys->next_date;
> @@ -188,8 +187,14 @@ static int Demux(demux_t *demux)
> sys->b_first_time = false;
> }
>
> - block_t *b = vlc_stream_Block(demux->s, 128 * (s->index -
> prev_index ));
> - if (b) {
> + /* Might be a gap in block # */
> + const uint64_t i_pos = 1024 + 128LL * s->blocknumber;
> + if(i_pos != vlc_stream_Tell(demux->s) &&
> + vlc_stream_Seek( demux->s, i_pos ) != VLC_SUCCESS )
> + return VLC_DEMUXER_EOF;
> +
> + block_t *b = vlc_stream_Block(demux->s, 128);
> + if (b){
> b->i_dts =
> b->i_pts = VLC_TS_0 + s->start;
> if (s->stop > s->start)
> @@ -197,7 +202,6 @@ static int Demux(demux_t *demux)
> es_out_Send(demux->out, sys->es, b);
> }
> sys->current++;
> - prev_index = s->index;
> }
>
> if (!sys->b_slave)
> @@ -230,7 +234,7 @@ static int Open(vlc_object_t *object)
> }
> const int cct = ParseInteger(&header[12], 2);
> const mtime_t program_start = ParseTextTimeCode(&header[256], fps);
> - const int tti_count = ParseInteger(&header[238], 5);
> + const size_t tti_count = ParseInteger(&header[238], 5);
> msg_Dbg(demux, "Detected EBU STL : CCT=%d TTI=%d start=%8.8s %"PRId64,
> cct, tti_count, &header[256], program_start);
>
> demux_sys_t *sys = malloc(sizeof(*sys));
> @@ -253,7 +257,7 @@ static int Open(vlc_object_t *object)
> stl_entry_t *s = &sys->index[0];
> s->count = 0;
>
> - for (int i = 0; i < tti_count; i++) {
> + for (size_t i = 0; i < tti_count; i++) {
> uint8_t tti[16];
> if (vlc_stream_Read(demux->s, tti, 16) != 16 ||
> vlc_stream_Read(demux->s, NULL, 112) != 112) {
> @@ -270,7 +274,7 @@ static int Open(vlc_object_t *object)
> comment = tti[15] != 0;
> s->start = ParseTimeCode(&tti[5], fps) - program_start;
> s->stop = ParseTimeCode(&tti[9], fps) - program_start;
> - s->index = i;
> + s->blocknumber = i;
> }
> s->count++;
> if (ebn == 0xff && !comment)
> @@ -280,7 +284,7 @@ static int Open(vlc_object_t *object)
> }
>
> if (sys->count == 0 ||
> - vlc_stream_Seek(demux->s, 1024 + 128LL * sys->index[0].index) !=
> VLC_SUCCESS) + vlc_stream_Seek(demux->s, 1024 + 128LL *
> sys->index[0].blocknumber) != VLC_SUCCESS) {
> Close(object);
> return VLC_EGENERIC;
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
--
雷米‧德尼-库尔蒙
https://www.remlab.net/
More information about the vlc-devel
mailing list