]> git.sesse.net Git - vlc/commitdiff
* src/video_output/video_output.c: small bugfix + vout_Create() is now blocking until...
authorGildas Bazin <gbazin@videolan.org>
Sun, 27 Apr 2003 17:53:21 +0000 (17:53 +0000)
committerGildas Bazin <gbazin@videolan.org>
Sun, 27 Apr 2003 17:53:21 +0000 (17:53 +0000)
* src/video_output/vout_pictures.[ch]: added support for FOURCC I411.
* modules/codec/rawvideo.c: support for more chroma formats.

modules/codec/rawvideo.c
src/video_output/video_output.c
src/video_output/vout_pictures.c
src/video_output/vout_pictures.h

index d92159d8124de5afcc0f8347cd23c0895bce5950..de85678a52872cc12989423010f541348ed4a4d5 100644 (file)
@@ -2,7 +2,7 @@
  * rawvideo.c: Pseudo audio decoder; for raw video data
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: rawvideo.c,v 1.2 2003/04/26 12:26:46 gbazin Exp $
+ * $Id: rawvideo.c,v 1.3 2003/04/27 17:53:20 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -80,9 +80,25 @@ static int OpenDecoder( vlc_object_t *p_this )
 
     switch( p_fifo->i_fourcc )
     {
-        case VLC_FOURCC('I','4','2','0'):
+        /* Planar YUV */
+        case VLC_FOURCC('I','4','4','4'):
         case VLC_FOURCC('I','4','2','2'):
+        case VLC_FOURCC('I','4','2','0'):
+        case VLC_FOURCC('Y','V','1','2'):
+        case VLC_FOURCC('I','Y','U','V'):
+        case VLC_FOURCC('I','4','1','1'):
+        case VLC_FOURCC('I','4','1','0'):
+
+       /* Packed YUV */
         case VLC_FOURCC('Y','U','Y','2'):
+        case VLC_FOURCC('U','Y','V','Y'):
+
+       /* RGB */
+        case VLC_FOURCC('R','V','3','2'):
+        case VLC_FOURCC('R','V','2','4'):
+        case VLC_FOURCC('R','V','1','6'):
+        case VLC_FOURCC('R','V','1','5'):
+
             p_fifo->pf_run = RunDecoder;
             return VLC_SUCCESS;
 
@@ -145,7 +161,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
  *****************************************************************************/
 static int InitThread( vdec_thread_t * p_vdec )
 {
-    vlc_fourcc_t i_chroma;
+    picture_t *p_pic;
+    int i;
 
 #define bih ((BITMAPINFOHEADER*)p_vdec->p_fifo->p_bitmapinfoheader)
     if( bih == NULL )
@@ -162,29 +179,11 @@ static int InitThread( vdec_thread_t * p_vdec )
         return( VLC_EGENERIC );
     }
 
-    switch( p_vdec->p_fifo->i_fourcc )
-    {
-        case VLC_FOURCC( 'I', '4', '2', '0' ):
-            i_chroma = VLC_FOURCC( 'I', '4', '2', '0' );
-            p_vdec->i_raw_size = bih->biWidth * bih->biHeight * 3 / 2;
-            break;
-        case VLC_FOURCC( 'I', '4', '2', '2' ):
-            i_chroma = VLC_FOURCC( 'I', '4', '2', '2' );
-            p_vdec->i_raw_size = bih->biWidth * bih->biHeight * 2;
-            break;
-        case VLC_FOURCC( 'Y', 'U', 'Y', '2' ):
-            i_chroma = VLC_FOURCC( 'Y', 'U', 'Y', '2' );
-            p_vdec->i_raw_size = bih->biWidth * bih->biHeight * 2;
-            break;
-        default:
-            msg_Err( p_vdec->p_fifo, "invalid codec=%4.4s", (char*)&p_vdec->p_fifo->i_fourcc );
-            return( VLC_EGENERIC );
-    }
-
     p_vdec->p_vout = vout_Request( p_vdec->p_fifo, NULL,
                                    bih->biWidth, bih->biHeight,
-                                   i_chroma,
-                                   VOUT_ASPECT_FACTOR * bih->biWidth / bih->biHeight );
+                                   p_vdec->p_fifo->i_fourcc,
+                                   VOUT_ASPECT_FACTOR * bih->biWidth /
+                                   bih->biHeight );
 
     if( p_vdec->p_vout == NULL )
     {
@@ -192,6 +191,23 @@ static int InitThread( vdec_thread_t * p_vdec )
         return( VLC_EGENERIC );
     }
 
+    /* Get a 1 picture to be able to compute p_vdec->i_raw_size */
+    p_pic = vout_CreatePicture( p_vdec->p_vout, 0, 0, 0 );
+    if( p_pic == NULL )
+    {
+        msg_Err( p_vdec->p_fifo, "failled to get a vout picture" );
+        return( VLC_EGENERIC );
+    }
+
+    p_vdec->i_raw_size = 0;
+    for( i = 0; i < p_pic->i_planes; i++ )
+    {
+        p_vdec->i_raw_size += p_pic->p[i].i_lines * p_pic->p[i].i_visible_pitch
+            * p_pic->p[i].i_pixel_pitch;
+    }
+
+    vout_DestroyPicture( p_vdec->p_vout, p_pic );
+
     return( VLC_SUCCESS );
 #undef bih
 }
index d5474ce6391fa2b0d3820dc23010eb5464bb93df..75047b4aba27b8ed14e4a9d294d9941fc8ac40ff 100644 (file)
@@ -5,7 +5,7 @@
  * thread, and destroy a previously oppened video output thread.
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.218 2003/04/14 22:22:32 massiot Exp $
+ * $Id: video_output.c,v 1.219 2003/04/27 17:53:20 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -394,7 +394,7 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent,
     vlc_object_attach( p_vout, p_parent );
 
     if( vlc_thread_create( p_vout, "video output", RunThread,
-                           VLC_THREAD_PRIORITY_OUTPUT, VLC_FALSE ) )
+                           VLC_THREAD_PRIORITY_OUTPUT, VLC_TRUE ) )
     {
         msg_Err( p_vout, "out of memory" );
         module_Unneed( p_vout, p_vout->p_module );
@@ -620,6 +620,10 @@ static void RunThread( vout_thread_t *p_vout)
      * Initialize thread
      */
     p_vout->b_error = InitThread( p_vout );
+
+    /* signal the creation of the vout */
+    vlc_thread_ready( p_vout );
+
     if( p_vout->b_error )
     {
         /* Destroy thread structures allocated by Create and InitThread */
@@ -885,7 +889,8 @@ static void RunThread( vout_thread_t *p_vout)
             }
 
             /* Need to reinitialise the chroma plugin */
-            p_vout->chroma.p_module->pf_deactivate( VLC_OBJECT(p_vout) );
+            if( p_vout->chroma.p_module->pf_deactivate )
+                p_vout->chroma.p_module->pf_deactivate( VLC_OBJECT(p_vout) );
             p_vout->chroma.p_module->pf_activate( VLC_OBJECT(p_vout) );
         }
     }
index 15dfaa51cf1b3039605a76f0ee8b986e6e3d51b7..3dff1615bf3f5ee6ddfba9a6dcdf9e9ec5c9b2c9 100644 (file)
@@ -2,7 +2,7 @@
  * vout_pictures.c : picture management functions
  *****************************************************************************
  * Copyright (C) 2000 VideoLAN
- * $Id: vout_pictures.c,v 1.37 2003/04/20 12:59:02 massiot Exp $
+ * $Id: vout_pictures.c,v 1.38 2003/04/27 17:53:21 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -448,6 +448,19 @@ void vout_AllocatePicture( vout_thread_t *p_vout, picture_t *p_pic,
     /* Calculate coordinates */
     switch( i_chroma )
     {
+        case FOURCC_I411:
+            p_pic->p[ Y_PLANE ].i_lines = i_height;
+            p_pic->p[ Y_PLANE ].i_pitch = i_width;
+            p_pic->p[ Y_PLANE ].i_visible_pitch = p_pic->p[ Y_PLANE ].i_pitch;
+            p_pic->p[ U_PLANE ].i_lines = i_height;
+            p_pic->p[ U_PLANE ].i_pitch = i_width / 4;
+            p_pic->p[ U_PLANE ].i_visible_pitch = p_pic->p[ U_PLANE ].i_pitch;
+            p_pic->p[ V_PLANE ].i_lines = i_height;
+            p_pic->p[ V_PLANE ].i_pitch = i_width / 4;
+            p_pic->p[ V_PLANE ].i_visible_pitch = p_pic->p[ V_PLANE ].i_pitch;
+            p_pic->i_planes = 3;
+            break;
+
         case FOURCC_I410:
             p_pic->p[ Y_PLANE ].i_lines = i_height;
             p_pic->p[ Y_PLANE ].i_pitch = i_width;
index 46e0066e7fef670a61d31163a7053c7a6eba17f4..b46ac0546a3df7cd19fcec673c7cfc7368824568 100644 (file)
@@ -2,7 +2,7 @@
  * vout_pictures.h : picture management definitions
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: vout_pictures.h,v 1.3 2002/11/28 17:35:01 sam Exp $
+ * $Id: vout_pictures.h,v 1.4 2003/04/27 17:53:21 gbazin Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -72,6 +72,9 @@
 /* Packed YUV 2:1:1, Y:U:Y:V */
 #define FOURCC_Y211         VLC_FOURCC('Y','2','1','1')
 
+/* Planar YUV 4:1:1, Y:U:V */
+#define FOURCC_I411         VLC_FOURCC('I','4','1','1')
+
 /* Planar YUV 4:1:0, Y:U:V */
 #define FOURCC_I410         VLC_FOURCC('I','4','1','0')