/*****************************************************************************
* vout_pictures.c : picture management functions
*****************************************************************************
- * Copyright (C) 2000-2004 VideoLAN
+ * Copyright (C) 2000-2004 the VideoLAN team
* $Id$
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
#include "vlc_video.h"
#include "video_output.h"
+#include "vlc_spu.h"
#include "vout_pictures.h"
picture_t * vout_RenderPicture( vout_thread_t *p_vout, picture_t *p_pic,
subpicture_t *p_subpic )
{
+ int i_scale_width, i_scale_height;
+
if( p_pic == NULL )
{
/* XXX: subtitles */
-
return NULL;
}
+ i_scale_width = p_vout->fmt_out.i_visible_width * 1000 /
+ p_vout->fmt_in.i_visible_width;
+ i_scale_height = p_vout->fmt_out.i_visible_height * 1000 /
+ p_vout->fmt_in.i_visible_height;
+
if( p_pic->i_type == DIRECT_PICTURE )
{
if( !p_vout->render.b_allow_modify_pics || p_pic->i_refcount ||
* subtitles. */
vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
- vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0],
- p_pic , p_subpic );
+ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
+ PP_OUTPUTPICTURE[0], p_pic, p_subpic,
+ i_scale_width, i_scale_height );
return PP_OUTPUTPICTURE[0];
}
/* Picture is in a direct buffer but isn't used by the
* decoder. We can safely render subtitles on it and
* display it. */
- vout_RenderSubPictures( p_vout, p_pic, p_pic, p_subpic );
+ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_pic, p_pic,
+ p_subpic, i_scale_width, i_scale_height );
return p_pic;
}
if( PP_OUTPUTPICTURE[0]->pf_lock )
if( PP_OUTPUTPICTURE[0]->pf_lock( p_vout, PP_OUTPUTPICTURE[0] ) )
- {
- if( PP_OUTPUTPICTURE[0]->pf_unlock )
- PP_OUTPUTPICTURE[0]->pf_unlock( p_vout, PP_OUTPUTPICTURE[0] );
-
return NULL;
- }
vout_CopyPicture( p_vout, PP_OUTPUTPICTURE[0], p_pic );
- vout_RenderSubPictures( p_vout, PP_OUTPUTPICTURE[0], p_pic, p_subpic );
+ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
+ PP_OUTPUTPICTURE[0], p_pic,
+ p_subpic, i_scale_width, i_scale_height );
if( PP_OUTPUTPICTURE[0]->pf_unlock )
PP_OUTPUTPICTURE[0]->pf_unlock( p_vout, PP_OUTPUTPICTURE[0] );
if( p_tmp_pic->i_status == FREE_PICTURE )
{
vout_AllocatePicture( VLC_OBJECT(p_vout),
- p_tmp_pic, p_vout->output.i_chroma,
- p_vout->output.i_width,
- p_vout->output.i_height,
- p_vout->output.i_aspect );
+ p_tmp_pic, p_vout->fmt_out.i_chroma,
+ p_vout->fmt_out.i_width,
+ p_vout->fmt_out.i_height,
+ p_vout->fmt_out.i_aspect );
p_tmp_pic->i_type = MEMORY_PICTURE;
p_tmp_pic->i_status = RESERVED_PICTURE;
}
p_vout->chroma.pf_convert( p_vout, p_pic, p_tmp_pic );
/* Render subpictures on the first direct buffer */
- vout_RenderSubPictures( p_vout, p_tmp_pic, p_tmp_pic, p_subpic );
+ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out, p_tmp_pic,
+ p_tmp_pic, p_subpic,
+ i_scale_width, i_scale_height );
if( p_vout->p_picture[0].pf_lock )
if( p_vout->p_picture[0].pf_lock( p_vout, &p_vout->p_picture[0] ) )
p_vout->chroma.pf_convert( p_vout, p_pic, &p_vout->p_picture[0] );
/* Render subpictures on the first direct buffer */
- vout_RenderSubPictures( p_vout, &p_vout->p_picture[0],
- &p_vout->p_picture[0], p_subpic );
+ spu_RenderSubpictures( p_vout->p_spu, &p_vout->fmt_out,
+ &p_vout->p_picture[0], &p_vout->p_picture[0],
+ p_subpic, i_scale_width, i_scale_height );
}
if( p_vout->p_picture[0].pf_unlock )
if( (i_width <= 0) || (i_height <=0) )
{
*pi_width = *pi_height = *pi_x = *pi_y = 0;
-
return;
}
}
else
{
- *pi_width = __MIN( i_width, p_vout->render.i_width );
- *pi_height = __MIN( i_height, p_vout->render.i_height );
+ *pi_width = __MIN( i_width, p_vout->fmt_in.i_visible_width );
+ *pi_height = __MIN( i_height, p_vout->fmt_in.i_visible_height );
}
- if( VOUT_ASPECT_FACTOR * *pi_width / *pi_height < p_vout->render.i_aspect )
+ if( p_vout->fmt_in.i_visible_width * (int64_t)p_vout->fmt_in.i_sar_num *
+ *pi_height / p_vout->fmt_in.i_visible_height /
+ p_vout->fmt_in.i_sar_den > *pi_width )
{
- *pi_width = *pi_height * p_vout->render.i_aspect / VOUT_ASPECT_FACTOR;
+ *pi_height = p_vout->fmt_in.i_visible_height *
+ (int64_t)p_vout->fmt_in.i_sar_den * *pi_width /
+ p_vout->fmt_in.i_visible_width / p_vout->fmt_in.i_sar_num;
}
else
{
- *pi_height = *pi_width * VOUT_ASPECT_FACTOR / p_vout->render.i_aspect;
- }
-
- if( *pi_width > i_width )
- {
- *pi_width = i_width;
- *pi_height = VOUT_ASPECT_FACTOR * *pi_width / p_vout->render.i_aspect;
- }
-
- if( *pi_height > i_height )
- {
- *pi_height = i_height;
- *pi_width = *pi_height * p_vout->render.i_aspect / VOUT_ASPECT_FACTOR;
+ *pi_width = p_vout->fmt_in.i_visible_width *
+ (int64_t)p_vout->fmt_in.i_sar_num * *pi_height /
+ p_vout->fmt_in.i_visible_height / p_vout->fmt_in.i_sar_den;
}
switch( p_vout->i_alignment & VOUT_ALIGN_HMASK )
p_format->i_bits_per_pixel = 32;
break;
case FOURCC_I444:
+ case FOURCC_J444:
p_format->i_bits_per_pixel = 24;
break;
case FOURCC_I422:
case FOURCC_YUY2:
case FOURCC_UYVY:
+ case FOURCC_J422:
p_format->i_bits_per_pixel = 16;
p_format->i_bits_per_pixel = 16;
break;
case FOURCC_I411:
case FOURCC_YV12:
case FOURCC_I420:
+ case FOURCC_J420:
case FOURCC_IYUV:
p_format->i_bits_per_pixel = 12;
break;
case FOURCC_YV12:
case FOURCC_I420:
case FOURCC_IYUV:
+ case FOURCC_J420:
p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;
p_pic->p[ Y_PLANE ].i_visible_lines = i_height;
p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;
break;
case FOURCC_I422:
+ case FOURCC_J422:
p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;
p_pic->p[ Y_PLANE ].i_visible_lines = i_height;
p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;
break;
case FOURCC_I444:
+ case FOURCC_J444:
p_pic->p[ Y_PLANE ].i_lines = i_height_aligned;
p_pic->p[ Y_PLANE ].i_visible_lines = i_height;
p_pic->p[ Y_PLANE ].i_pitch = i_width_aligned;
}
p_dest->date = p_src->date;
+ p_dest->b_force = p_src->b_force;
+ p_dest->i_nb_fields = p_src->i_nb_fields;
+ p_dest->b_progressive = p_src->b_progressive;
+ p_dest->b_top_field_first = p_src->b_top_field_first;
}