]> git.sesse.net Git - vlc/commitdiff
* ./src/misc/extras.c: removed a duplicate calculation inside a macro.
authorSam Hocevar <sam@videolan.org>
Wed, 6 Nov 2002 09:26:25 +0000 (09:26 +0000)
committerSam Hocevar <sam@videolan.org>
Wed, 6 Nov 2002 09:26:25 +0000 (09:26 +0000)
  * ./src/libvlc.c: fixed a bug causing all commandline targets to be ignored
    for playback except the last one.
  * ./modules/codec/dv.c: we detach p_vout before quitting.
  * ./modules/codec/xvid.c: fixed image corruption, added a direct rendering
    option which doesn't work yet.

modules/codec/dv.c
modules/codec/xvid.c
src/libvlc.c
src/misc/extras.c

index d628dfbd49df7997371a38245567eb5dcd14b6dd..f0dda649381c623c9cdcfa104767e6b134bb7292 100644 (file)
@@ -2,7 +2,7 @@
  * dv.c: a decoder for DV video
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: dv.c,v 1.1 2002/11/05 14:52:28 sam Exp $
+ * $Id: dv.c,v 1.2 2002/11/06 09:26:25 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
@@ -267,6 +267,7 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
 
         if( p_vout )
         {
+            vlc_object_detach( p_vout );
             vout_DestroyThread( p_vout );
         }
     }
index fa8b798d502697f067f7595d3bfaa2d1663e5859..2a8d1cfe29a79f7f501c0cbd7e3c9f4de12248f3 100644 (file)
@@ -2,7 +2,7 @@
  * xvid.c: a decoder for libxvidcore, the Xvid video codec
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: xvid.c,v 1.1 2002/11/05 22:53:21 sam Exp $
+ * $Id: xvid.c,v 1.2 2002/11/06 09:26:25 sam Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *      
@@ -48,12 +48,14 @@ vlc_module_begin();
     set_description( _("Xvid video decoder") );
     set_capability( "decoder", 50 );
     set_callbacks( OpenDecoder, NULL );
+    add_bool( "xvid-direct-render", 0, NULL, "direct rendering", 
+              "Use libxvidcore's direct rendering feature." );
 vlc_module_end();
 
 /*****************************************************************************
  * OpenDecoder: probe the decoder and return score
  *****************************************************************************
- * The fourcc format for DV is "dvsd"
+ * FIXME: find fourcc formats supported by xvid
  *****************************************************************************/
 static int OpenDecoder ( vlc_object_t *p_this )
 {
@@ -87,7 +89,9 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
     uint8_t *  p_buffer, * p_image;
     int        i_ret;
     int        i_width, i_height, i_chroma, i_aspect;
-    int        i_size, i_offset;
+    int        i_size, i_offset, i_image_size;
+
+    vlc_bool_t b_direct = config_GetInt( p_fifo, "xvid-direct-render" );
 
     if( InitBitstream( &bit_stream, p_fifo, NULL, NULL ) != VLC_SUCCESS )
     {
@@ -107,9 +111,11 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
 
     /* XXX: Completely arbitrary buffer size */
     i_size = i_width * i_height / 4;
+    i_image_size = b_direct ? 0 : i_width * i_height * 4;
     i_offset = 0;
-    p_buffer = malloc( i_size + 4 * i_width * i_height );
-    p_image = p_buffer + 4 * i_width * i_height;
+
+    p_buffer = malloc( i_size + i_image_size );
+    p_image = p_buffer + i_size;
 
     if( !p_buffer )
     {
@@ -192,7 +198,9 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
     while( !p_fifo->b_die && !p_fifo->b_error )
     {
         XVID_DEC_FRAME xframe;
+        XVID_DEC_PICTURE xpic;
         mtime_t i_pts = 0;
+        picture_t *p_pic;
 
         GetChunk( &bit_stream, p_buffer + i_offset, i_size - i_offset );
 
@@ -214,33 +222,41 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
             break;
         }
 
+        while( !(p_pic = vout_CreatePicture( p_vout, 0, 0, 0 ) ) )
+        {
+            if( p_fifo->b_die || p_fifo->b_error )
+            {
+                break;
+            } 
+            msleep( VOUT_OUTMEM_SLEEP );
+        }
+
+        if( !p_pic )
+        {
+            break;
+        }
+
+        if( b_direct )
+        {
+            xpic.y = p_pic->p[0].p_pixels;
+            xpic.u = p_pic->p[1].p_pixels;
+            xpic.v = p_pic->p[2].p_pixels;
+            xpic.stride_y = p_pic->p[0].i_pitch;
+            xpic.stride_u = p_pic->p[1].i_pitch;
+            xpic.stride_v = p_pic->p[2].i_pitch;
+        }
+
         /* Decode the stuff */
         xframe.bitstream = p_buffer;
         xframe.length = i_size;
-        xframe.image = p_image;
+        xframe.image = b_direct ? (void*)&xpic : p_image;
         xframe.stride = i_width;
-        xframe.colorspace = XVID_CSP_YV12;
+        xframe.colorspace = b_direct ? XVID_CSP_EXTERN : XVID_CSP_YV12;
         i_ret = xvid_decore( p_xvid, XVID_DEC_DECODE, &xframe, NULL );
         /* FIXME: check i_ret */
 
-        if( p_vout )
+        if( !b_direct )
         {
-            picture_t *p_pic;
-
-            while( !(p_pic = vout_CreatePicture( p_vout, 0, 0, 0 ) ) )
-            {
-                if( p_fifo->b_die || p_fifo->b_error )
-                {
-                    break;
-                } 
-                msleep( VOUT_OUTMEM_SLEEP );
-            }
-
-            if( !p_pic )
-            {
-                break;
-            }
-
             /* TODO: use pf_memcpy when this is stable. */
             memcpy( p_pic->p[0].p_pixels,
                     p_image,
@@ -251,11 +267,11 @@ static int RunDecoder ( decoder_fifo_t *p_fifo )
             memcpy( p_pic->p[1].p_pixels,
                     p_image + i_width * i_height + i_width * i_height / 4,
                     i_width * i_height / 4 );
-
-            vout_DatePicture( p_vout, p_pic, i_pts );
-            vout_DisplayPicture( p_vout, p_pic );
         }
 
+        vout_DatePicture( p_vout, p_pic, i_pts );
+        vout_DisplayPicture( p_vout, p_pic );
+
         /* Move the remaining data. TODO: only do this when necessary. */
         memmove( p_buffer, p_buffer + xframe.length, i_size - xframe.length );
         i_offset = i_size - xframe.length;
index 0aa7d72e98d7d266d26c41a2d1bff6fb0d4cc250..9a08cf642eb0b2cdb235bc4e2286e867b1f934fe 100644 (file)
@@ -2,7 +2,7 @@
  * libvlc.c: main libvlc source
  *****************************************************************************
  * Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.c,v 1.42 2002/10/16 15:10:39 sam Exp $
+ * $Id: libvlc.c,v 1.43 2002/11/06 09:26:25 sam Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -956,12 +956,19 @@ static int GetFilenames( vlc_t *p_vlc, int i_argc, char *ppsz_argv[] )
     int i_opt;
 
     /* We assume that the remaining parameters are filenames */
-    for( i_opt = optind; i_opt < i_argc; i_opt++ )
+    for( i_opt = i_argc - 1; i_opt > optind; i_opt-- )
     {
         /* TODO: write an internal function of this one, to avoid
          *       unnecessary lookups. */
         VLC_AddTarget( p_vlc->i_object_id, ppsz_argv[ i_opt ],
-                          PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
+                       PLAYLIST_INSERT, 0 );
+    }
+
+    /* If there is at least one target, play it */
+    if( i_argc > optind )
+    {
+        VLC_AddTarget( p_vlc->i_object_id, ppsz_argv[ optind ],
+                       PLAYLIST_INSERT | PLAYLIST_GO, 0 );
     }
 
     return VLC_SUCCESS;
index 0ce94c2ba9e2680fcfdf263ee6e1d2b111752bf9..b735486c0803bf67e5f891ca087cf0a821465e68 100644 (file)
@@ -2,7 +2,7 @@
  * extras.c: Extra libc functions for some systems.
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: extras.c,v 1.1 2002/07/05 11:18:56 sam Exp $
+ * $Id: extras.c,v 1.2 2002/11/06 09:26:25 sam Exp $
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  *
@@ -33,9 +33,9 @@
 char *strndup( const char *string, size_t n )
 {
     char *psz;
-    size_t len;
+    size_t len = strlen( string );
 
-    len = __MIN( strlen( string ), n ); 
+    len = __MIN( len, n ); 
     psz = (char*)malloc( len + 1 );
 
     if( psz != NULL )