* 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>
*
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;
+ }
+}
+