]> git.sesse.net Git - vlc/commitdiff
demux: implementation of demux2_vaControlHelper.
authorLaurent Aimar <fenrir@videolan.org>
Wed, 3 Mar 2004 12:01:38 +0000 (12:01 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Wed, 3 Mar 2004 12:01:38 +0000 (12:01 +0000)
src/input/demux.c

index b006134a2d44daebfc85d55e9224012cd05b72e5..5b320255d72d8a9c3ee71c6fa064cdecc11551e2 100644 (file)
@@ -2,7 +2,7 @@
  * demux.c
  *****************************************************************************
  * Copyright (C) 1999-2004 VideoLAN
- * $Id: demux.c,v 1.11 2004/01/31 05:25:36 fenrir Exp $
+ * $Id: demux.c,v 1.12 2004/03/03 12:01:38 fenrir Exp $
  *
  * Author: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -266,3 +266,89 @@ void demux2_Delete( demux_t *p_demux )
 
     vlc_object_destroy( p_demux );
 }
+
+/*****************************************************************************
+ * demux2_vaControlHelper:
+ *****************************************************************************/
+int demux2_vaControlHelper( stream_t *s,
+                            int64_t i_start, int64_t i_end,
+                            int i_bitrate, int i_align,
+                            int i_query, va_list args )
+{
+    int64_t i_tell;
+    double  f, *pf;
+    int64_t i64, *pi64;
+
+    if( i_end < 0 )    i_end   = stream_Size( s );
+    if( i_start < 0 )  i_start = 0;
+    if( i_align <= 0 ) i_align = 1;
+    i_tell = stream_Tell( s );
+
+    switch( i_query )
+    {
+        case DEMUX_GET_LENGTH:
+            pi64 = (int64_t*)va_arg( args, int64_t * );
+            if( i_bitrate > 0 && i_end > i_start )
+            {
+                *pi64 = I64C(8000000) * (i_end - i_start) / i_bitrate;
+                return VLC_SUCCESS;
+            }
+            return VLC_EGENERIC;
+
+        case DEMUX_GET_TIME:
+            pi64 = (int64_t*)va_arg( args, int64_t * );
+            if( i_bitrate > 0 && i_end > i_start )
+            {
+                *pi64 = I64C(8000000) * (i_tell - i_start) / i_bitrate;
+                return VLC_SUCCESS;
+            }
+            return VLC_EGENERIC;
+
+        case DEMUX_GET_POSITION:
+            pf = (double*)va_arg( args, double * );
+            if( i_start < i_end )
+            {
+                *pf = (double)( i_tell - i_start ) /
+                      (double)( i_end  - i_start );
+                return VLC_SUCCESS;
+            }
+            return VLC_EGENERIC;
+
+
+        case DEMUX_SET_POSITION:
+            f = (double)va_arg( args, double );
+            if( i_start < i_end && f >= 0.0 && f <= 1.0 )
+            {
+                int64_t i_block = (f * ( i_end - i_start )) / i_align;
+
+                if( stream_Seek( s, i_start + i_block * i_align ) )
+                {
+                    return VLC_EGENERIC;
+                }
+                return VLC_SUCCESS;
+            }
+            return VLC_EGENERIC;
+
+        case DEMUX_SET_TIME:
+            i64 = (int64_t)va_arg( args, int64_t );
+            if( i_bitrate > 0 && i64 >= 0 )
+            {
+                int64_t i_block = i64 * i_bitrate / I64C(8000000) / i_align;
+                if( stream_Seek( s, i_start + i_block * i_align ) )
+                {
+                    return VLC_EGENERIC;
+                }
+                return VLC_SUCCESS;
+            }
+            return VLC_EGENERIC;
+
+        case DEMUX_GET_FPS:
+        case DEMUX_GET_META:
+            return VLC_EGENERIC;
+
+        default:
+            msg_Err( s, "unknown query in demux_vaControlDefault" );
+            return VLC_EGENERIC;
+    }
+}
+