vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Fri Sep 4 21:33:00 2015 +0300| [da1ce99b947b3873c70e4742f43fd4f11030f7f2] | committer: Rémi Denis-Courmont
vdr: privatize seekpoint byte offsets > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=da1ce99b947b3873c70e4742f43fd4f11030f7f2 --- modules/access/vdr.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/modules/access/vdr.c b/modules/access/vdr.c index bf1870c..3866595 100644 --- a/modules/access/vdr.c +++ b/modules/access/vdr.c @@ -122,6 +122,7 @@ struct access_sys_t /* cut marks */ input_title_t *p_marks; + uint64_t *offsets; unsigned cur_seekpoint; float fps; @@ -220,6 +221,8 @@ static void Close( vlc_object_t * p_this ) if( p_sys->p_meta ) vlc_meta_Delete( p_sys->p_meta ); + size_t count = p_sys->p_marks->i_seekpoint; + TAB_CLEAN( count, p_sys->offsets ); vlc_input_title_Delete( p_sys->p_marks ); free( p_sys ); } @@ -318,7 +321,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_SET_SEEKPOINT: i = va_arg( args, int ); - return Seek( p_access, p_sys->p_marks->seekpoint[i]->i_byte_offset ); + return Seek( p_access, p_sys->offsets[i] ); case ACCESS_GET_META: if( !p_sys->p_meta ) @@ -425,8 +428,7 @@ static void FindSeekpoint( access_t *p_access ) return; int new_seekpoint = p_sys->cur_seekpoint; - if( p_sys->offset < (uint64_t)p_sys->p_marks-> - seekpoint[p_sys->cur_seekpoint]->i_byte_offset ) + if( p_sys->offset < p_sys->offsets[p_sys->cur_seekpoint] ) { /* i_pos moved backwards, start fresh */ new_seekpoint = 0; @@ -434,8 +436,7 @@ static void FindSeekpoint( access_t *p_access ) /* only need to check the following seekpoints */ while( new_seekpoint + 1 < p_sys->p_marks->i_seekpoint && - p_sys->offset >= (uint64_t)p_sys->p_marks-> - seekpoint[new_seekpoint + 1]->i_byte_offset ) + p_sys->offset >= p_sys->offsets[new_seekpoint + 1] ) { new_seekpoint++; } @@ -819,6 +820,9 @@ static void ImportMarks( access_t *p_access ) p_marks->psz_name = strdup( _("VDR Cut Marks") ); p_marks->i_length = i_frame_count * (int64_t)( CLOCK_FREQ / p_sys->fps ); + uint64_t *offsetv = NULL; + size_t offsetc = 0; + /* offset for chapter positions */ int i_chapter_offset = p_sys->fps / 1000 * var_InheritInteger( p_access, "vdr-chapter-offset" ); @@ -862,31 +866,38 @@ static void ImportMarks( access_t *p_access ) if( !sp ) continue; sp->i_time_offset = i_frame * (int64_t)( CLOCK_FREQ / p_sys->fps ); - sp->i_byte_offset = i_offset; - for( int i = 0; i + 1 < i_file_number; ++i ) - sp->i_byte_offset += FILE_SIZE( i ); sp->psz_name = strdup( line ); TAB_APPEND( p_marks->i_seekpoint, p_marks->seekpoint, sp ); + TAB_APPEND( offsetc, offsetv, i_offset ); + + for( int i = 0; i + 1 < i_file_number; ++i ) + offsetv[offsetc - 1] += FILE_SIZE( i ); } /* add a chapter at the beginning if missing */ - if( p_marks->i_seekpoint > 0 && p_marks->seekpoint[0]->i_byte_offset > 0 ) + if( p_marks->i_seekpoint > 0 && offsetv[0] > 0 ) { seekpoint_t *sp = vlc_seekpoint_New(); if( sp ) { - sp->i_byte_offset = 0; sp->i_time_offset = 0; sp->psz_name = strdup( _("Start") ); TAB_INSERT( p_marks->i_seekpoint, p_marks->seekpoint, sp, 0 ); + TAB_INSERT( offsetc, offsetv, UINT64_C(0), 0 ); } } if( p_marks->i_seekpoint > 0 ) + { p_sys->p_marks = p_marks; + p_sys->offsets = offsetv; + } else + { vlc_input_title_Delete( p_marks ); + TAB_CLEAN( offsetc, offsetv ); + } fclose( marksfile ); fclose( indexfile ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
