[vlc-commits] vdr: privatize seekpoint byte offsets

Rémi Denis-Courmont git at videolan.org
Fri Sep 4 21:45:18 CEST 2015


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | 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 );



More information about the vlc-commits mailing list