Commit 15fb1485 authored by Gildas Bazin's avatar Gildas Bazin

* src/video_output/video_output.c: small bugfix + vout_Create() is now blocking until InitThread() has been run.
* src/video_output/vout_pictures.[ch]: added support for FOURCC I411.
* modules/codec/rawvideo.c: support for more chroma formats.
parent 8c1779bb
......@@ -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
}
......
......@@ -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) );
}
}
......
......@@ -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;
......
......@@ -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')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment