/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <errno.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <vlc/vlc.h>
-#include <vlc_plugin.h>
-#include <vlc_vout.h>
-#include <vlc_sout.h>
-#include "vlc_filter.h"
+#include <errno.h>
#ifdef HAVE_ALTIVEC_H
# include <altivec.h>
#endif
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_vout.h>
+#include <vlc_sout.h>
+#include "vlc_filter.h"
+
#ifdef CAN_COMPILE_MMXEXT
# include "mmx.h"
#endif
{
int i_mode; /* Deinterlace mode */
bool b_double_rate; /* Shall we double the framerate? */
+ bool b_half_height; /* Shall be devide the height by 2 */
mtime_t last_date;
mtime_t next_date;
/* Allocate structure */
p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
if( p_vout->p_sys == NULL )
- {
- msg_Err( p_vout, "out of memory" );
return VLC_ENOMEM;
- }
p_vout->pf_init = Init;
p_vout->pf_end = End;
p_vout->p_sys->i_mode = DEINTERLACE_DISCARD;
p_vout->p_sys->b_double_rate = false;
+ p_vout->p_sys->b_half_height = true;
p_vout->p_sys->last_date = 0;
p_vout->p_sys->p_vout = 0;
vlc_mutex_init( &p_vout->p_sys->filter_lock );
*****************************************************************************/
static void SetFilterMethod( vout_thread_t *p_vout, char *psz_method )
{
- if( !strcmp( psz_method, "discard" ) )
- {
- p_vout->p_sys->i_mode = DEINTERLACE_DISCARD;
- p_vout->p_sys->b_double_rate = false;
- }
- else if( !strcmp( psz_method, "mean" ) )
+ if( !strcmp( psz_method, "mean" ) )
{
p_vout->p_sys->i_mode = DEINTERLACE_MEAN;
p_vout->p_sys->b_double_rate = false;
+ p_vout->p_sys->b_half_height = true;
}
else if( !strcmp( psz_method, "blend" )
|| !strcmp( psz_method, "average" )
{
p_vout->p_sys->i_mode = DEINTERLACE_BLEND;
p_vout->p_sys->b_double_rate = false;
+ p_vout->p_sys->b_half_height = false;
}
else if( !strcmp( psz_method, "bob" )
|| !strcmp( psz_method, "progressive-scan" ) )
{
p_vout->p_sys->i_mode = DEINTERLACE_BOB;
p_vout->p_sys->b_double_rate = true;
+ p_vout->p_sys->b_half_height = false;
}
else if( !strcmp( psz_method, "linear" ) )
{
p_vout->p_sys->i_mode = DEINTERLACE_LINEAR;
p_vout->p_sys->b_double_rate = true;
+ p_vout->p_sys->b_half_height = false;
}
else if( !strcmp( psz_method, "x" ) )
{
p_vout->p_sys->i_mode = DEINTERLACE_X;
p_vout->p_sys->b_double_rate = false;
+ p_vout->p_sys->b_half_height = false;
}
else
{
- msg_Err( p_vout, "no valid deinterlace mode provided, "
- "using \"discard\"" );
+ if( strcmp( psz_method, "discard" ) )
+ msg_Err( p_vout, "no valid deinterlace mode provided, "
+ "using \"discard\"" );
+
+ p_vout->p_sys->i_mode = DEINTERLACE_DISCARD;
+ p_vout->p_sys->b_double_rate = false;
+ p_vout->p_sys->b_half_height = true;
}
msg_Dbg( p_vout, "using %s deinterlace method", psz_method );
case VLC_FOURCC('I','4','2','0'):
case VLC_FOURCC('I','Y','U','V'):
case VLC_FOURCC('Y','V','1','2'):
- switch( p_vout->p_sys->i_mode )
+ if( p_vout->p_sys->b_half_height )
{
- case DEINTERLACE_MEAN:
- case DEINTERLACE_DISCARD:
fmt.i_height /= 2; fmt.i_visible_height /= 2; fmt.i_y_offset /= 2;
fmt.i_sar_den *= 2;
- p_real_vout = vout_Create( p_vout, &fmt );
- break;
-
- case DEINTERLACE_BOB:
- case DEINTERLACE_BLEND:
- case DEINTERLACE_LINEAR:
- case DEINTERLACE_X:
- p_real_vout = vout_Create( p_vout, &fmt );
- break;
}
+ p_real_vout = vout_Create( p_vout, &fmt );
break;
case VLC_FOURCC('I','4','2','2'):
{
int i_index;
+ DEL_PARENT_CALLBACKS( SendEventsToChild );
+
+ if( p_vout->p_sys->p_vout )
+ DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents );
+
/* Free the fake output buffers we allocated */
for( i_index = I_OUTPUTPICTURES ; i_index ; )
{
}
if( p_vout->p_sys->p_vout )
- {
- DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents );
- vlc_object_detach( p_vout->p_sys->p_vout );
- vout_Destroy( p_vout->p_sys->p_vout );
- }
-
- DEL_PARENT_CALLBACKS( SendEventsToChild );
+ vout_CloseAndRelease( p_vout->p_sys->p_vout );
}
/*****************************************************************************
vout_sys_t *p_sys = p_vout->p_sys;
picture_t *pp_outpic[2];
- p_vout->fmt_out.i_x_offset = p_sys->p_vout->fmt_in.i_x_offset =
- p_vout->fmt_in.i_x_offset;
- p_vout->fmt_out.i_y_offset = p_sys->p_vout->fmt_in.i_y_offset =
- p_vout->fmt_in.i_y_offset;
- p_vout->fmt_out.i_visible_width = p_sys->p_vout->fmt_in.i_visible_width =
- p_vout->fmt_in.i_visible_width;
- p_vout->fmt_out.i_visible_height = p_sys->p_vout->fmt_in.i_visible_height =
- p_vout->fmt_in.i_visible_height;
- if( p_vout->p_sys->i_mode == DEINTERLACE_MEAN ||
- p_vout->p_sys->i_mode == DEINTERLACE_DISCARD )
- {
- p_vout->fmt_out.i_y_offset /= 2; p_sys->p_vout->fmt_in.i_y_offset /= 2;
- p_vout->fmt_out.i_visible_height /= 2;
+ /* FIXME are they needed ? */
+ p_vout->fmt_out.i_x_offset = p_vout->fmt_in.i_x_offset;
+ p_vout->fmt_out.i_y_offset = p_vout->fmt_in.i_y_offset;
+ p_vout->fmt_out.i_visible_width = p_vout->fmt_in.i_visible_width;
+ p_vout->fmt_out.i_visible_height = p_vout->fmt_in.i_visible_height;
+
+ /* FIXME p_sys->p_vout->* should NOT be changed FIXME */
+ p_sys->p_vout->fmt_in.i_x_offset = p_vout->fmt_out.i_x_offset;
+ p_sys->p_vout->fmt_in.i_y_offset = p_vout->fmt_out.i_y_offset;
+ p_sys->p_vout->fmt_in.i_visible_width = p_vout->fmt_out.i_visible_width;
+ p_sys->p_vout->fmt_in.i_visible_height = p_vout->fmt_in.i_visible_height;
+ if( p_vout->p_sys->b_half_height )
+ {
+ p_sys->p_vout->fmt_in.i_y_offset /= 2;
p_sys->p_vout->fmt_in.i_visible_height /= 2;
}
-
+
+ if( p_vout->i_changes & VOUT_ASPECT_CHANGE )
+ {
+ p_vout->i_changes &= ~VOUT_ASPECT_CHANGE;
+
+ p_vout->fmt_out.i_aspect = p_vout->fmt_in.i_aspect;
+ p_vout->fmt_out.i_sar_num = p_vout->fmt_in.i_sar_num;
+ p_vout->fmt_out.i_sar_den = p_vout->fmt_in.i_sar_den;
+
+ video_format_t fmt = p_vout->fmt_out;
+ if( p_vout->p_sys->b_half_height )
+ {
+ fmt.i_height /= 2; fmt.i_visible_height /= 2; fmt.i_y_offset /= 2;
+ fmt.i_sar_den *= 2;
+ }
+
+ p_sys->p_vout = vout_Request( p_vout, p_sys->p_vout, &fmt );
+ }
+ if( !p_sys->p_vout )
+ return;
+
pp_outpic[0] = pp_outpic[1] = NULL;
vlc_mutex_lock( &p_vout->p_sys->filter_lock );
0, 0, 0 ) )
== NULL )
{
- if( p_vout->b_die || p_vout->b_error )
+ if( !vlc_object_alive( p_vout ) || p_vout->b_error )
{
vlc_mutex_unlock( &p_vout->p_sys->filter_lock );
return;
0, 0, 0 ) )
== NULL )
{
- if( p_vout->b_die || p_vout->b_error )
+ if( !vlc_object_alive( p_vout ) || p_vout->b_error )
{
vout_DestroyPicture( p_vout->p_sys->p_vout, pp_outpic[0] );
vlc_mutex_unlock( &p_vout->p_sys->filter_lock );
}
/* We need to kill the old vout */
-
- DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents );
-
- vlc_object_detach( p_vout->p_sys->p_vout );
- vout_Destroy( p_vout->p_sys->p_vout );
+ if( p_vout->p_sys->p_vout )
+ {
+ DEL_CALLBACKS( p_vout->p_sys->p_vout, SendEvents );
+ vout_CloseAndRelease( p_vout->p_sys->p_vout );
+ }
/* Try to open a new video output */
p_vout->p_sys->p_vout = SpawnRealVout( p_vout );
picture_t *p_pic_dst;
/* Request output picture */
- p_pic_dst = p_filter->pf_vout_buffer_new( p_filter );
+ p_pic_dst = filter_NewPicture( p_filter );
if( p_pic_dst == NULL )
- {
- msg_Warn( p_filter, "can't get output picture" );
- return NULL;
- }
+ return p_pic;
switch( p_vout->p_sys->i_mode )
{
RenderDiscard( p_vout, p_pic_dst, p_pic, 0 );
#endif
msg_Err( p_vout, "discarding lines is not supported yet" );
- p_pic_dst->pf_release( p_pic_dst );
+ picture_Release( p_pic_dst );
return p_pic;
break;
RenderLinear( p_vout, pp_outpic[1], p_pic, 1 );
#endif
msg_Err( p_vout, "doubling the frame rate is not supported yet" );
- p_pic_dst->pf_release( p_pic_dst );
+ picture_Release( p_pic_dst );
return p_pic;
break;
break;
}
- p_pic_dst->date = p_pic->date;
- p_pic_dst->b_force = p_pic->b_force;
- p_pic_dst->i_nb_fields = p_pic->i_nb_fields;
+ picture_CopyProperties( p_pic_dst, p_pic );
p_pic_dst->b_progressive = true;
- p_pic_dst->b_top_field_first = p_pic->b_top_field_first;
- p_pic->pf_release( p_pic );
+ picture_Release( p_pic );
return p_pic_dst;
}
var_Get( p_filter, FILTER_CFG_PREFIX "mode", &val );
var_Create( p_filter, "deinterlace-mode", VLC_VAR_STRING );
var_Set( p_filter, "deinterlace-mode", val );
+ free( val.psz_string );
if ( Create( VLC_OBJECT(p_vout) ) != VLC_SUCCESS )
{