vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Mar 2 13:01:36 2017 +0100| [ac50e7acfb38563d58341d8cc8e8d31d3bdf8de1] | committer: Francois Cartegnie
ttml: use native time spec (fix #18056) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ac50e7acfb38563d58341d8cc8e8d31d3bdf8de1 --- modules/codec/ttml/substtml.c | 35 ++++++------- modules/codec/ttml/ttml.c | 116 +++++++++++++++++++++--------------------- modules/codec/ttml/ttml.h | 75 ++++++++++++++++++++++++--- modules/demux/ttml.c | 79 +++++++++++++++------------- 4 files changed, 187 insertions(+), 118 deletions(-) diff --git a/modules/codec/ttml/substtml.c b/modules/codec/ttml/substtml.c index f41729c..d4cca23 100644 --- a/modules/codec/ttml/substtml.c +++ b/modules/codec/ttml/substtml.c @@ -671,10 +671,10 @@ static void AppendTextToRegion( ttml_context_t *p_ctx, const tt_textnode_t *p_tt static void ConvertNodesToRegionContent( ttml_context_t *p_ctx, const tt_node_t *p_node, ttml_region_t *p_region, const ttml_style_t *p_upper_set_styles, - int64_t i_playbacktime ) + tt_time_t playbacktime ) { - if( i_playbacktime != -1 && - !tt_timings_Contains( &p_node->timings, i_playbacktime ) ) + if( tt_time_Valid( &playbacktime ) && + !tt_timings_Contains( &p_node->timings, &playbacktime ) ) return; const char *psz_regionid = (const char *) @@ -707,8 +707,8 @@ static void ConvertNodesToRegionContent( ttml_context_t *p_ctx, const tt_node_t else if( !tt_node_NameCompare( ((const tt_node_t *)p_child)->psz_node_name, "set" ) ) { const tt_node_t *p_set = (const tt_node_t *)p_child; - if( i_playbacktime == -1 || - tt_timings_Contains( &p_set->timings, i_playbacktime ) ) + if( !tt_time_Valid( &playbacktime ) || + tt_timings_Contains( &p_set->timings, &playbacktime ) ) { if( p_set_styles != NULL || (p_set_styles = ttml_style_New()) ) { @@ -724,7 +724,7 @@ static void ConvertNodesToRegionContent( ttml_context_t *p_ctx, const tt_node_t else { ConvertNodesToRegionContent( p_ctx, (const tt_node_t *) p_child, - p_region, p_set_styles, i_playbacktime ); + p_region, p_set_styles, playbacktime ); } } @@ -762,7 +762,7 @@ static tt_node_t *ParseTTML( decoder_t *p_dec, const uint8_t *p_buffer, size_t i return p_rootnode; } -static ttml_region_t *GenerateRegions( tt_node_t *p_rootnode, int64_t i_playbacktime ) +static ttml_region_t *GenerateRegions( tt_node_t *p_rootnode, tt_time_t playbacktime ) { ttml_region_t* p_regions = NULL; ttml_region_t** pp_region_last = &p_regions; @@ -775,7 +775,7 @@ static ttml_region_t *GenerateRegions( tt_node_t *p_rootnode, int64_t i_playback ttml_context_t context; context.p_rootnode = p_rootnode; vlc_dictionary_init( &context.regions, 1 ); - ConvertNodesToRegionContent( &context, p_bodynode, NULL, NULL, i_playbacktime ); + ConvertNodesToRegionContent( &context, p_bodynode, NULL, NULL, playbacktime ); for( int i = 0; i < context.regions.i_size; ++i ) { @@ -801,15 +801,16 @@ static ttml_region_t *GenerateRegions( tt_node_t *p_rootnode, int64_t i_playback static int ParseBlock( decoder_t *p_dec, const block_t *p_block ) { - int64_t *p_timings_array = NULL; + tt_time_t *p_timings_array = NULL; size_t i_timings_count = 0; /* We Only support absolute timings */ tt_timings_t temporal_extent; temporal_extent.i_type = TT_TIMINGS_PARALLEL; - temporal_extent.i_begin = 0; - temporal_extent.i_end = -1; - temporal_extent.i_dur = -1; + tt_time_Init( &temporal_extent.begin ); + tt_time_Init( &temporal_extent.end ); + tt_time_Init( &temporal_extent.dur ); + temporal_extent.begin.base = 0; if( p_block->i_flags & BLOCK_FLAG_CORRUPTED ) return VLCDEC_SUCCESS; @@ -830,25 +831,25 @@ static int ParseBlock( decoder_t *p_dec, const block_t *p_block ) #ifdef TTML_DEBUG for( size_t i=0; i<i_timings_count; i++ ) - printf("%ld ", p_timings_array[i]); + printf("%ld ", tt_time_Convert( &p_timings_array[i] ) ); printf("\n"); #endif for( size_t i=0; i+1 < i_timings_count; i++ ) { /* We Only support absolute timings (2) */ - if( p_timings_array[i] + VLC_TS_0 < p_block->i_dts ) + if( tt_time_Convert( &p_timings_array[i] ) + VLC_TS_0 < p_block->i_dts ) continue; - if( p_timings_array[i] + VLC_TS_0 > p_block->i_dts + p_block->i_length ) + if( tt_time_Convert( &p_timings_array[i] ) + VLC_TS_0 > p_block->i_dts + p_block->i_length ) break; subpicture_t *p_spu = NULL; ttml_region_t *p_regions = GenerateRegions( p_rootnode, p_timings_array[i] ); if( p_regions && ( p_spu = decoder_NewSubpictureText( p_dec ) ) ) { - p_spu->i_start = VLC_TS_0 + p_timings_array[i]; - p_spu->i_stop = VLC_TS_0 + p_timings_array[i+1] - 1; + p_spu->i_start = VLC_TS_0 + tt_time_Convert( &p_timings_array[i] ); + p_spu->i_stop = VLC_TS_0 + tt_time_Convert( &p_timings_array[i+1] ) - 1; p_spu->b_ephemer = true; p_spu->b_absolute = false; diff --git a/modules/codec/ttml/ttml.c b/modules/codec/ttml/ttml.c index 1874530..582cdb2 100644 --- a/modules/codec/ttml/ttml.c +++ b/modules/codec/ttml/ttml.c @@ -77,8 +77,9 @@ static inline bool tt_ScanReset( unsigned *a, unsigned *b, unsigned *c, unsigned return false; } -static int64_t tt_ParseTime( const char *s ) +static tt_time_t tt_ParseTime( const char *s ) { + tt_time_t t = {-1, 0}; unsigned h1 = 0, m1 = 0, s1 = 0, d1 = 0; if( sscanf( s, "%u:%u:%u%*[,.]%u", &h1, &m1, &s1, &d1 ) == 4 || @@ -89,21 +90,21 @@ static int64_t tt_ParseTime( const char *s ) tt_ScanReset( &h1, &m1, &s1, &d1 ) || sscanf( s, "%us", &s1 ) == 1 ) { - return ( (int64_t)h1 * 3600 * 1000 + - (int64_t)m1 * 60 * 1000 + - (int64_t)s1 * 1000 + - (int64_t)d1 ) * 1000; + t.base = h1 * 3600 + m1 * 60 + s1; + t.frames = d1; } - return -1; + return t; } -bool tt_timings_Contains( const tt_timings_t *p_range, int64_t i_time ) +bool tt_timings_Contains( const tt_timings_t *p_range, const tt_time_t *time ) { - if( p_range->i_end != -1 && p_range->i_end <= i_time ) + if( tt_time_Valid( &p_range->end ) && + tt_time_Compare( &p_range->end, time ) <= 0 ) return false; - if( p_range->i_begin != -1 && p_range->i_begin > i_time ) + if( tt_time_Valid( &p_range->begin ) && + tt_time_Compare( &p_range->begin, time ) > 0 ) return false; return true; @@ -178,9 +179,9 @@ tt_node_t * tt_node_New( xml_reader_t* reader, tt_node_t* p_parent, const char* return NULL; } vlc_dictionary_init( &p_node->attr_dict, 0 ); - p_node->timings.i_begin = -1; - p_node->timings.i_end = -1; - p_node->timings.i_dur = -1; + tt_time_Init( &p_node->timings.begin ); + tt_time_Init( &p_node->timings.end ); + tt_time_Init( &p_node->timings.dur ); p_node->p_parent = p_parent; if( p_parent ) tt_node_ParentAddChild( p_parent, (tt_basenode_t *) p_node ); @@ -196,11 +197,11 @@ tt_node_t * tt_node_New( xml_reader_t* reader, tt_node_t* p_parent, const char* vlc_dictionary_insert( &p_node->attr_dict, psz_key, psz_val ); if( !strcasecmp( psz_key, "begin" ) ) - p_node->timings.i_begin = tt_ParseTime( psz_val ); + p_node->timings.begin = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "end" ) ) - p_node->timings.i_end = tt_ParseTime( psz_val ); + p_node->timings.end = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "dur" ) ) - p_node->timings.i_dur = tt_ParseTime( psz_val ); + p_node->timings.dur = tt_ParseTime( psz_val ); else if( ! strcasecmp( psz_key, "timeContainer" ) ) p_node->timings.i_type = strcmp( psz_val, "seq" ) ? TT_TIMINGS_PARALLEL : TT_TIMINGS_SEQUENTIAL; @@ -332,46 +333,46 @@ int tt_nodes_Read( xml_reader_t *p_reader, tt_node_t *p_root_node ) static int tt_bsearch_searchkey_Compare( const void *key, const void *other ) { struct tt_searchkey *p_key = (struct tt_searchkey *) key; - int64_t i_time = *((int64_t *) other); - p_key->p_last = (int64_t *) other; - return ( p_key->i_time >= i_time ) ? p_key->i_time - i_time : -1; + tt_time_t time = *((tt_time_t *) other); + p_key->p_last = (tt_time_t *) other; + return tt_time_Compare( &p_key->time, &time ); } -size_t tt_timings_FindLowerIndex( const int64_t *p_times, size_t i_times, int64_t i_time, bool *pb_found ) +size_t tt_timings_FindLowerIndex( const tt_time_t *p_times, size_t i_times, tt_time_t time, bool *pb_found ) { size_t i_index = 0; if( p_times ) { struct tt_searchkey key; - key.i_time = i_time; + key.time = time; key.p_last = NULL; - int64_t *lookup = bsearch( &key, p_times, i_times, - sizeof(int64_t), tt_bsearch_searchkey_Compare ); + tt_time_t *lookup = bsearch( &key, p_times, i_times, + sizeof(tt_time_t), tt_bsearch_searchkey_Compare ); if( lookup ) key.p_last = lookup; *pb_found = !!lookup; /* Compute index from last visited */ i_index = (key.p_last - p_times); - if( p_times[i_index] < i_time ) + if( tt_time_Compare( &p_times[i_index], &time ) < 0 ) i_index++; } else *pb_found = false; return i_index; } -static void tt_bsearch_Insert( int64_t **pp_times, size_t *pi_times, int64_t i_time ) +static void tt_bsearch_Insert( tt_time_t **pp_times, size_t *pi_times, tt_time_t time ) { bool b_exists; - size_t i_index = tt_timings_FindLowerIndex( *pp_times, *pi_times, i_time, &b_exists ); + size_t i_index = tt_timings_FindLowerIndex( *pp_times, *pi_times, time, &b_exists ); if( b_exists ) return; - if( SIZE_MAX / sizeof(int64_t) < (*pi_times + 1) ) + if( SIZE_MAX / sizeof(tt_time_t) < (*pi_times + 1) ) return; - int64_t *p_array = realloc( *pp_times, (*pi_times + 1) * sizeof(int64_t) ); + tt_time_t *p_array = realloc( *pp_times, (*pi_times + 1) * sizeof(tt_time_t) ); if( !p_array ) return; *pp_times = p_array; @@ -380,10 +381,10 @@ static void tt_bsearch_Insert( int64_t **pp_times, size_t *pi_times, int64_t i_t { memmove( &p_array[i_index + 1], &p_array[i_index], - (*pi_times - i_index) * sizeof(int64_t) ); + (*pi_times - i_index) * sizeof(tt_time_t) ); } - p_array[i_index] = i_time; + p_array[i_index] = time; *pi_times += 1; } @@ -391,58 +392,59 @@ static void tt_bsearch_Insert( int64_t **pp_times, size_t *pi_times, int64_t i_t /* Timings storage */ static void tt_timings_MergeParallel( const tt_timings_t *p_ref, tt_timings_t *p_local ) { - if( p_local->i_begin != -1 ) - p_local->i_begin += p_ref->i_begin; + if( tt_time_Valid( &p_local->begin ) ) + p_local->begin = tt_time_Add( p_local->begin, p_ref->begin ); else - p_local->i_begin = p_ref->i_begin; + p_local->begin = p_ref->begin; - if( p_local->i_end != -1 ) + if( tt_time_Valid( &p_local->end ) ) { - p_local->i_end += p_ref->i_begin; + p_local->end = tt_time_Add( p_local->end, p_ref->begin ); } - else if( p_local->i_dur != -1 && p_local->i_begin != -1 ) + else if( tt_time_Valid( &p_local->dur ) && tt_time_Valid( &p_local->begin ) ) { - p_local->i_end = p_local->i_begin + p_local->i_dur; + p_local->end = tt_time_Add( p_local->begin, p_local->dur ); } - else p_local->i_end = p_ref->i_end; + else p_local->end = p_ref->end; /* Enforce contained duration */ - if( p_ref->i_end != -1 && p_local->i_end > p_ref->i_end ) - p_local->i_end = p_ref->i_end; + + if( tt_time_Valid( &p_ref->end ) && tt_time_Compare( &p_local->end, &p_ref->end ) > 0 ) + p_local->end = p_ref->end; /* Just for consistency */ - if( p_local->i_begin != -1 && p_local->i_end != -1 ) - p_local->i_dur = p_local->i_end - p_local->i_begin; + if( tt_time_Valid( &p_local->begin ) && tt_time_Valid( &p_local->end ) ) + p_local->dur = tt_time_Sub( p_local->end, p_local->begin ); } static void tt_timings_MergeSequential( const tt_timings_t *p_restrict, const tt_timings_t *p_prevref, tt_timings_t *p_local ) { - if( p_local->i_begin != -1 ) - p_local->i_begin += p_prevref->i_end; + if( tt_time_Valid( &p_local->begin ) ) + p_local->begin = tt_time_Add( p_local->begin, p_prevref->end ); else - p_local->i_begin = p_prevref->i_end; + p_local->begin = p_prevref->end; - if( p_local->i_end != -1 ) + if( tt_time_Valid( &p_local->end ) ) { - p_local->i_end += p_prevref->i_end; + p_local->end = tt_time_Add( p_local->end, p_prevref->end ); } - else if( p_local->i_dur != -1 && p_local->i_begin != -1 ) + else if( tt_time_Valid( &p_local->dur ) && tt_time_Valid( &p_local->begin ) ) { - p_local->i_end = p_local->i_begin + p_local->i_dur; + p_local->end = tt_time_Add( p_local->begin, p_local->dur ); } /* Enforce contained duration */ - if( p_restrict->i_end != -1 && p_local->i_end > p_restrict->i_end ) - p_local->i_end = p_restrict->i_end; + if( tt_time_Valid( &p_restrict->end ) && tt_time_Compare( &p_local->end, &p_restrict->end ) > 0 ) + p_local->end = p_restrict->end; /* Just for consistency */ - if( p_local->i_begin != -1 && p_local->i_end != -1 ) - p_local->i_dur = p_local->i_end - p_local->i_begin; + if( tt_time_Valid( &p_local->begin ) && tt_time_Valid( &p_local->end ) ) + p_local->dur = tt_time_Sub( p_local->end, p_local->begin ); } void tt_timings_Resolve( tt_basenode_t *p_child, const tt_timings_t *p_container_timings, - int64_t **pp_array, size_t *pi_count ) + tt_time_t **pp_array, size_t *pi_count ) { const tt_node_t *p_prevnode = NULL; for( ; p_child; p_child = p_child->p_next ) @@ -464,11 +466,11 @@ void tt_timings_Resolve( tt_basenode_t *p_child, const tt_timings_t *p_container tt_timings_MergeParallel( p_container_timings, &p_childnode->timings ); } - if( p_childnode->timings.i_begin != -1 ) - tt_bsearch_Insert( pp_array, pi_count, p_childnode->timings.i_begin ); + if( tt_time_Valid( &p_childnode->timings.begin ) ) + tt_bsearch_Insert( pp_array, pi_count, p_childnode->timings.begin ); - if( p_childnode->timings.i_end != -1 ) - tt_bsearch_Insert( pp_array, pi_count, p_childnode->timings.i_end ); + if( tt_time_Valid( &p_childnode->timings.end ) ) + tt_bsearch_Insert( pp_array, pi_count, p_childnode->timings.end ); p_prevnode = p_childnode; diff --git a/modules/codec/ttml/ttml.h b/modules/codec/ttml/ttml.h index f842d2e..c2dc4dc 100644 --- a/modules/codec/ttml/ttml.h +++ b/modules/codec/ttml/ttml.h @@ -31,18 +31,27 @@ enum TT_TIMINGS_SEQUENTIAL, }; +#define TT_FRAME_RATE 30 + +typedef struct +{ + time_t base; + unsigned frames; + //unsigned ticks; +} tt_time_t; + typedef struct { uint8_t i_type; - int64_t i_begin; - int64_t i_end; - int64_t i_dur; + tt_time_t begin; + tt_time_t end; + tt_time_t dur; } tt_timings_t; struct tt_searchkey { - int64_t i_time; - int64_t *p_last; + tt_time_t time; + tt_time_t *p_last; }; enum @@ -87,10 +96,60 @@ bool tt_node_HasChild( const tt_node_t *p_node ); int tt_nodes_Read( xml_reader_t *p_reader, tt_node_t *p_root_node ); void tt_timings_Resolve( tt_basenode_t *p_child, const tt_timings_t *p_container_timings, - int64_t **pp_array, size_t *pi_count ); -bool tt_timings_Contains( const tt_timings_t *p_range, int64_t i_time ); -size_t tt_timings_FindLowerIndex( const int64_t *p_times, size_t i_times, int64_t i_time, bool *pb_found ); + tt_time_t **pp_array, size_t *pi_count ); +bool tt_timings_Contains( const tt_timings_t *p_range, const tt_time_t * ); +size_t tt_timings_FindLowerIndex( const tt_time_t *p_times, size_t i_times, tt_time_t time, bool *pb_found ); +static inline void tt_time_Init( tt_time_t *t ) +{ + t->base = -1; + t->frames = 0; +} +static inline tt_time_t tt_time_Create( mtime_t i ) +{ + tt_time_t t; + t.base = i / CLOCK_FREQ; + t.frames = (i % CLOCK_FREQ) * TT_FRAME_RATE / CLOCK_FREQ; + return t; +} +static inline bool tt_time_Valid( const tt_time_t *t ) +{ + return t->base != -1; +} +static inline mtime_t tt_time_Convert( const tt_time_t *t ) +{ + if( !tt_time_Valid( t ) ) + return -1; + else + return CLOCK_FREQ * t->base + CLOCK_FREQ * t->frames / TT_FRAME_RATE; +} + +static inline mtime_t tt_time_Compare( const tt_time_t *t1, const tt_time_t *t2 ) +{ + return tt_time_Convert( t1 ) - tt_time_Convert( t2 ); +} + +static inline tt_time_t tt_time_Add( tt_time_t t1, tt_time_t t2 ) +{ + t1.base += t2.base; + t1.frames += t2.frames; + t1.base += t1.frames / TT_FRAME_RATE; + t1.frames = t1.frames % TT_FRAME_RATE; + return t1; +} + +static inline tt_time_t tt_time_Sub( tt_time_t t1, tt_time_t t2 ) +{ + if( t2.frames > t1.frames ) + { + unsigned diff = 1 + (t2.frames - t1.frames) / TT_FRAME_RATE; + t1.base -= diff; + t1.frames += diff * TT_FRAME_RATE; + } + t1.frames -= t2.frames; + t1.base -= t2.base; + return t1; +} diff --git a/modules/demux/ttml.c b/modules/demux/ttml.c index d99653b..2019586 100644 --- a/modules/demux/ttml.c +++ b/modules/demux/ttml.c @@ -60,26 +60,24 @@ struct demux_sys_t */ struct { - int64_t *p_array; + tt_time_t *p_array; size_t i_count; size_t i_current; } times; }; -static char *tt_genTiming( int64_t i_time ) +static char *tt_genTiming( tt_time_t t ) { - if( i_time < 0 ) - i_time = 0; + if( !tt_time_Valid( &t ) ) + t.base = 0; - unsigned f = (i_time % CLOCK_FREQ) / 10000; - i_time /= CLOCK_FREQ; - unsigned h = i_time / 3600; - unsigned m = i_time % 3600 / 60; - unsigned s = i_time % 60; + unsigned h = t.base / 3600; + unsigned m = t.base % 3600 / 60; + unsigned s = t.base % 60; char *psz; - if( asprintf( &psz, "%2.2u:%2.2u:%2.2u.%2.2u", - h, m, s, f ) < 0 ) + if( asprintf( &psz, "%2.2u:%2.2u:%2.2u.%u", + h, m, s, t.frames ) < 0 ) psz = NULL; return psz; @@ -124,16 +122,16 @@ static void tt_node_AttributesToText( struct vlc_memstream *p_stream, const tt_n if( b_timed_node ) { - if( p_node->timings.i_begin != -1 ) + if( tt_time_Valid( &p_node->timings.begin ) ) { - char *psz = tt_genTiming( p_node->timings.i_begin ); + char *psz = tt_genTiming( p_node->timings.begin ); vlc_memstream_printf( p_stream, " begin=\"%s\"", psz ); free( psz ); } - if( p_node->timings.i_end != -1 ) + if( tt_time_Valid( &p_node->timings.end ) ) { - char *psz = tt_genTiming( p_node->timings.i_end ); + char *psz = tt_genTiming( p_node->timings.end ); vlc_memstream_printf( p_stream, " end=\"%s\"", psz ); free( psz ); } @@ -141,14 +139,14 @@ static void tt_node_AttributesToText( struct vlc_memstream *p_stream, const tt_n } static void tt_node_ToText( struct vlc_memstream *p_stream, const tt_basenode_t *p_basenode, - int64_t i_playbacktime ) + const tt_time_t *playbacktime ) { if( p_basenode->i_type == TT_NODE_TYPE_ELEMENT ) { const tt_node_t *p_node = (const tt_node_t *) p_basenode; - if( i_playbacktime != -1 && - !tt_timings_Contains( &p_node->timings, i_playbacktime ) ) + if( tt_time_Valid( playbacktime ) && + !tt_timings_Contains( &p_node->timings, playbacktime ) ) return; vlc_memstream_putc( p_stream, '<' ); @@ -162,14 +160,14 @@ static void tt_node_ToText( struct vlc_memstream *p_stream, const tt_basenode_t #ifdef TTML_DEMUX_DEBUG vlc_memstream_printf( p_stream, "<!-- starts %ld ends %ld -->", - p_node->timings.i_begin, - p_node->timings.i_end ); + tt_time_Convert( &p_node->timings.begin ), + tt_time_Convert( &p_node->timings.end ) ); #endif for( const tt_basenode_t *p_child = p_node->p_child; p_child; p_child = p_child->p_next ) { - tt_node_ToText( p_stream, p_child, i_playbacktime ); + tt_node_ToText( p_stream, p_child, playbacktime ); } vlc_memstream_printf( p_stream, "</%s>", p_node->psz_node_name ); @@ -204,8 +202,9 @@ static int Control( demux_t* p_demux, int i_query, va_list args ) i64 = (int64_t)va_arg( args, int64_t ); if( p_sys->times.i_count ) { + tt_time_t t = tt_time_Create( i64 - VLC_TS_0 ); size_t i_index = tt_timings_FindLowerIndex( p_sys->times.p_array, - p_sys->times.i_count, i64, &b ); + p_sys->times.i_count, t, &b ); p_sys->times.i_current = i_index; p_sys->b_first_time = true; return VLC_SUCCESS; @@ -220,8 +219,9 @@ static int Control( demux_t* p_demux, int i_query, va_list args ) pi64 = (int64_t*)va_arg( args, int64_t * ); if( p_sys->times.i_count ) { - *pi64 = p_sys->times.p_array[p_sys->times.i_count - 1] - - p_sys->temporal_extent.i_begin; + tt_time_t t = tt_time_Sub( p_sys->times.p_array[p_sys->times.i_count - 1], + p_sys->temporal_extent.begin ); + *pi64 = tt_time_Convert( &t ); return VLC_SUCCESS; } break; @@ -233,8 +233,8 @@ static int Control( demux_t* p_demux, int i_query, va_list args ) } else if( p_sys->times.i_count > 0 ) { - *pf = (double) p_sys->i_next_demux_time / - (p_sys->times.p_array[p_sys->times.i_count - 1] + 0.5); + i64 = tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_count - 1] ); + *pf = (double) p_sys->i_next_demux_time / (i64 + 0.5); } else { @@ -245,9 +245,10 @@ static int Control( demux_t* p_demux, int i_query, va_list args ) f = (double)va_arg( args, double ); if( p_sys->times.i_count ) { - i64 = f * p_sys->times.p_array[p_sys->times.i_count - 1]; + i64 = f * tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_count - 1] ); + tt_time_t t = tt_time_Create( i64 ); size_t i_index = tt_timings_FindLowerIndex( p_sys->times.p_array, - p_sys->times.i_count, i64, &b ); + p_sys->times.i_count, t, &b ); p_sys->times.i_current = i_index; p_sys->b_first_time = true; return VLC_SUCCESS; @@ -319,10 +320,12 @@ static int Demux( demux_t* p_demux ) /* Last one must be an end time */ while( p_sys->times.i_current + 1 < p_sys->times.i_count && - p_sys->times.p_array[p_sys->times.i_current] <= p_sys->i_next_demux_time ) + tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_current] ) <= p_sys->i_next_demux_time ) { - const int64_t i_playbacktime = p_sys->times.p_array[p_sys->times.i_current]; - const int64_t i_playbackendtime = p_sys->times.p_array[p_sys->times.i_current + 1] - 1; + const int64_t i_playbacktime = + tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_current] ); + const int64_t i_playbackendtime = + tt_time_Convert( &p_sys->times.p_array[p_sys->times.i_current + 1] ) - 1; if ( !p_sys->b_slave && p_sys->b_first_time ) { @@ -335,7 +338,8 @@ static int Demux( demux_t* p_demux ) if( vlc_memstream_open( &stream ) ) return VLC_DEMUXER_EGENERIC; - tt_node_ToText( &stream, (tt_basenode_t *) p_sys->p_rootnode, i_playbacktime ); + tt_node_ToText( &stream, (tt_basenode_t *) p_sys->p_rootnode, + &p_sys->times.p_array[p_sys->times.i_current] ); if( vlc_memstream_close( &stream ) == VLC_SUCCESS ) { @@ -396,9 +400,10 @@ int OpenDemux( vlc_object_t* p_this ) p_sys->b_first_time = true; p_sys->temporal_extent.i_type = TT_TIMINGS_PARALLEL; - p_sys->temporal_extent.i_begin = 0; - p_sys->temporal_extent.i_end = -1; - p_sys->temporal_extent.i_dur = -1; + tt_time_Init( &p_sys->temporal_extent.begin ); + tt_time_Init( &p_sys->temporal_extent.end ); + tt_time_Init( &p_sys->temporal_extent.dur ); + p_sys->temporal_extent.begin.base = 0; p_sys->p_xml = xml_Create( p_demux ); if( !p_sys->p_xml ) @@ -425,7 +430,9 @@ int OpenDemux( vlc_object_t* p_this ) if( vlc_memstream_open( &stream ) ) goto error; - tt_node_ToText( &stream, (tt_basenode_t*)p_sys->p_rootnode, -1 ); + tt_time_t t; + tt_time_Init( &t ); + tt_node_ToText( &stream, (tt_basenode_t*)p_sys->p_rootnode, &t /* invalid */ ); vlc_memstream_putc( &stream, '\0' ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
