]> git.sesse.net Git - vlc/blobdiff - src/input/stream.c
* modules/demux/ts.c, modules/access/dvb: Added support for the CAM device
[vlc] / src / input / stream.c
index e27e61c83aa7c9d963b9a91360e50be1290a2fde..7347d5adaef964079ec1627510fe49691b1e2516 100644 (file)
@@ -394,7 +394,8 @@ static int AStreamControl( stream_t *s, int i_query, va_list args )
 
         case STREAM_CONTROL_ACCESS:
             i_int = (int) va_arg( args, int );
-            if( i_int != ACCESS_SET_PRIVATE_ID_STATE )
+            if( i_int != ACCESS_SET_PRIVATE_ID_STATE
+                 && i_int != ACCESS_SET_PRIVATE_ID_CA )
             {
                 msg_Err( s, "Hey, what are you thinking ?"
                             "DON'T USE STREAM_CONTROL_ACCESS !!!" );
@@ -489,7 +490,15 @@ static int AStreamReadBlock( stream_t *s, void *p_read, int i_read )
         return 0;
 
     if( p_read == NULL )
-        return AStreamSeekBlock( s, p_sys->i_pos + i_read ) ? 0 : i_read;
+    {
+       /* seek within this stream if possible, else use plain old read and discard */
+        stream_sys_t *p_sys = s->p_sys;
+        access_t     *p_access = p_sys->p_access;
+        vlc_bool_t   b_aseek;
+        access2_Control( p_access, ACCESS_CAN_SEEK, &b_aseek );
+        if( b_aseek )
+            return AStreamSeekBlock( s, p_sys->i_pos + i_read ) ? 0 : i_read;
+    }
 
     while( i_data < i_read )
     {
@@ -808,7 +817,15 @@ static int AStreamReadStream( stream_t *s, void *p_read, int i_read )
     if( tk->i_start >= tk->i_end ) return 0; /* EOF */
 
     if( p_read == NULL )
-        return AStreamSeekStream( s, p_sys->i_pos + i_read ) ? 0 : i_read;
+    {
+       /* seek within this stream if possible, else use plain old read and discard */
+        stream_sys_t *p_sys = s->p_sys;
+        access_t     *p_access = p_sys->p_access;
+        vlc_bool_t   b_aseek;
+        access2_Control( p_access, ACCESS_CAN_SEEK, &b_aseek );
+        if( b_aseek )
+            return AStreamSeekStream( s, p_sys->i_pos + i_read ) ? 0 : i_read;
+    }
 
 #if 0
     msg_Dbg( s, "AStreamReadStream: %d pos="I64Fd" tk=%d start="I64Fd
@@ -948,6 +965,7 @@ static int AStreamSeekStream( stream_t *s, int64_t i_pos )
     if( !b_aseek )
     {
         /* We can't do nothing */
+        msg_Dbg( s, "AStreamSeekStream: can't seek" );
         return VLC_EGENERIC;
     }