]> git.sesse.net Git - vlc/blobdiff - src/input/input.c
Fixed input bookmark thread safety, support and event.
[vlc] / src / input / input.c
index 51bde8390bf8f5b59e7b8774dffacbae04398540..4c0b4c99b189b48b5e93098942c1f33d6629f694 100644 (file)
@@ -2115,6 +2115,45 @@ static bool Control( input_thread_t *p_input, int i_type,
             break;
 
         case INPUT_CONTROL_SET_BOOKMARK:
+        {
+            seekpoint_t bookmark;
+
+            bookmark.i_time_offset = -1;
+            bookmark.i_byte_offset = -1;
+
+            vlc_mutex_lock( &p_input->p->p_item->lock );
+            if( val.i_int >= 0 && val.i_int < p_input->p->i_bookmark )
+            {
+                const seekpoint_t *p_bookmark = p_input->p->pp_bookmark[val.i_int];
+                bookmark.i_time_offset = p_bookmark->i_time_offset;
+                bookmark.i_byte_offset = p_bookmark->i_byte_offset;
+            }
+            vlc_mutex_unlock( &p_input->p->p_item->lock );
+
+            if( bookmark.i_time_offset < 0 && bookmark.i_byte_offset < 0 )
+            {
+                msg_Err( p_input, "invalid bookmark %d", val.i_int );
+                break;
+            }
+
+            if( bookmark.i_time_offset >= 0 )
+            {
+                val.i_time = bookmark.i_time_offset;
+                b_force_update = Control( p_input, INPUT_CONTROL_SET_TIME, val );
+            }
+            else if( bookmark.i_byte_offset >= 0 &&
+                     p_input->p->input.p_stream )
+            {
+                const int64_t i_size = stream_Size( p_input->p->input.p_stream );
+                if( i_size > 0 && bookmark.i_byte_offset <= i_size )
+                {
+                    val.f_float = (double)bookmark.i_byte_offset / i_size;
+                    b_force_update = Control( p_input, INPUT_CONTROL_SET_POSITION, val );
+                }
+            }
+            break;
+        }
+
         default:
             msg_Err( p_input, "not yet implemented" );
             break;