free( psz_filter_chain );
}
- if( p_vout->fmt_render.i_chroma != p_fmt->i_chroma ||
+ if( p_vout->fmt_render.i_chroma != vlc_fourcc_GetCodec( VIDEO_ES, p_fmt->i_chroma ) ||
p_vout->fmt_render.i_width != p_fmt->i_width ||
p_vout->fmt_render.i_height != p_fmt->i_height ||
p_vout->p->b_filter_change )
{
msg_Dbg( p_this, "reusing provided vout" );
- spu_Attach( p_vout->p_spu, p_this, true );
-
+ spu_Attach( p_vout->p_spu, VLC_OBJECT(p_vout), false );
vlc_object_detach( p_vout );
+
vlc_object_attach( p_vout, p_this );
+ spu_Attach( p_vout->p_spu, VLC_OBJECT(p_vout), true );
}
}
unsigned int i_width = p_fmt->i_width;
unsigned int i_height = p_fmt->i_height;
- vlc_fourcc_t i_chroma = p_fmt->i_chroma;
+ vlc_fourcc_t i_chroma = vlc_fourcc_GetCodec( VIDEO_ES, p_fmt->i_chroma );
unsigned int i_aspect = p_fmt->i_aspect;
config_chain_t *p_cfg;
p_vout->i_alignment = 0;
p_vout->p->render_time = 10;
p_vout->p->c_fps_samples = 0;
- p_vout->p->i_picture_lost = 0;
- p_vout->p->i_picture_displayed = 0;
+ vout_statistic_Init( &p_vout->p->statistic );
p_vout->p->b_filter_change = 0;
p_vout->p->b_paused = false;
p_vout->p->i_pause_date = 0;
p_vout->p->b_picture_empty = false;
p_vout->p->i_picture_qtype = QTYPE_NONE;
- p_vout->p->snapshot.b_available = true;
- p_vout->p->snapshot.i_request = 0;
- p_vout->p->snapshot.p_picture = NULL;
- vlc_mutex_init( &p_vout->p->snapshot.lock );
- vlc_cond_init( &p_vout->p->snapshot.wait );
+ vout_snapshot_Init( &p_vout->p->snapshot );
/* Initialize locks */
vlc_mutex_init( &p_vout->picture_lock );
/* Initialize subpicture unit */
p_vout->p_spu = spu_Create( p_vout );
- spu_Attach( p_vout->p_spu, p_parent, true );
/* Attach the new object now so we can use var inheritance below */
vlc_object_attach( p_vout, p_parent );
+ /* */
spu_Init( p_vout->p_spu );
+ spu_Attach( p_vout->p_spu, VLC_OBJECT(p_vout), true );
+
/* Take care of some "interface/control" related initialisations */
vout_IntfInit( p_vout );
vlc_cond_signal( &p_vout->p->change_wait );
vlc_mutex_unlock( &p_vout->change_lock );
- vlc_mutex_lock( &p_vout->p->snapshot.lock );
- p_vout->p->snapshot.b_available = false;
- vlc_cond_broadcast( &p_vout->p->snapshot.wait );
- vlc_mutex_unlock( &p_vout->p->snapshot.lock );
+ vout_snapshot_End( &p_vout->p->snapshot );
vlc_join( p_vout->p->thread, NULL );
module_unneed( p_vout, p_vout->p_module );
vlc_mutex_destroy( &p_vout->p->vfilter_lock );
/* */
- for( ;; )
- {
- picture_t *p_picture = p_vout->p->snapshot.p_picture;
- if( !p_picture )
- break;
-
- p_vout->p->snapshot.p_picture = p_picture->p_next;
+ vout_statistic_Clean( &p_vout->p->statistic );
- picture_Release( p_picture );
- }
- vlc_cond_destroy( &p_vout->p->snapshot.wait );
- vlc_mutex_destroy( &p_vout->p->snapshot.lock );
+ /* */
+ vout_snapshot_Clean( &p_vout->p->snapshot );
/* */
free( p_vout->p->psz_filter_chain );
void vout_GetResetStatistic( vout_thread_t *p_vout, int *pi_displayed, int *pi_lost )
{
- vlc_mutex_lock( &p_vout->change_lock );
-
- *pi_displayed = p_vout->p->i_picture_displayed;
- *pi_lost = p_vout->p->i_picture_lost;
-
- p_vout->p->i_picture_displayed = 0;
- p_vout->p->i_picture_lost = 0;
-
- vlc_mutex_unlock( &p_vout->change_lock );
+ vout_statistic_GetReset( &p_vout->p->statistic,
+ pi_displayed, pi_lost );
}
void vout_Flush( vout_thread_t *p_vout, mtime_t i_date )
vlc_mutex_unlock( &p_vout->change_lock );
}
+spu_t *vout_GetSpu( vout_thread_t *p_vout )
+{
+ return p_vout->p_spu;
+}
+
/*****************************************************************************
* InitThread: initialize video output thread
*****************************************************************************
if( !vout_ChromaCmp( p_output->i_chroma, p_render->i_chroma ) )
return false;
- if( p_output->i_chroma != FOURCC_RV15 &&
- p_output->i_chroma != FOURCC_RV16 &&
- p_output->i_chroma != FOURCC_RV24 &&
- p_output->i_chroma != FOURCC_RV32 )
+ if( p_output->i_chroma != VLC_CODEC_RGB15 &&
+ p_output->i_chroma != VLC_CODEC_RGB16 &&
+ p_output->i_chroma != VLC_CODEC_RGB24 &&
+ p_output->i_chroma != VLC_CODEC_RGB32 )
return true;
return p_output->i_rmask == p_render->i_rmask &&
}
}
- /* Link pictures back to their heap */
- for( i = 0 ; i < I_RENDERPICTURES ; i++ )
- {
- PP_RENDERPICTURE[ i ]->p_heap = &p_vout->render;
- }
-
- for( i = 0 ; i < I_OUTPUTPICTURES ; i++ )
- {
- PP_OUTPUTPICTURE[ i ]->p_heap = &p_vout->output;
- }
-
return VLC_SUCCESS;
}
/* Picture is late: it will be destroyed and the thread
* will directly choose the next picture */
vout_UsePictureLocked( p_vout, p_pic );
- p_vout->p->i_picture_lost++;
+ vout_statistic_Update( &p_vout->p->statistic, 0, 1 );
msg_Warn( p_vout, "late picture skipped (%"PRId64" > %d)",
current_date - p_pic->date, - p_vout->p->render_time );
p_filtered_picture = filter_chain_VideoFilter( p_vout->p->p_vf2_chain,
p_picture );
- bool b_snapshot = false;
- if( vlc_mutex_trylock( &p_vout->p->snapshot.lock ) == 0 )
- {
- b_snapshot = p_vout->p->snapshot.i_request > 0
- && p_picture != NULL;
- vlc_mutex_unlock( &p_vout->p->snapshot.lock );
- }
+ const bool b_snapshot = vout_snapshot_IsRequested( &p_vout->p->snapshot );
/*
* Check for subpictures to display
*/
- subpicture_t *p_subpic = NULL;
- if( display_date > 0 )
- p_subpic = spu_SortSubpictures( p_vout->p_spu, display_date,
- p_vout->p->b_paused, b_snapshot );
+ mtime_t spu_render_time;
+ if( p_vout->p->b_paused )
+ spu_render_time = p_vout->p->i_pause_date;
+ else if( p_picture )
+ spu_render_time = p_picture->date > 1 ? p_picture->date : mdate();
+ else
+ spu_render_time = 0;
+ subpicture_t *p_subpic = spu_SortSubpictures( p_vout->p_spu,
+ spu_render_time,
+ b_snapshot );
/*
* Perform rendering
*/
- p_vout->p->i_picture_displayed++;
- p_directbuffer = vout_RenderPicture( p_vout, p_filtered_picture,
- p_subpic, p_vout->p->b_paused );
+ vout_statistic_Update( &p_vout->p->statistic, 1, 0 );
+ p_directbuffer = vout_RenderPicture( p_vout,
+ p_filtered_picture, p_subpic,
+ spu_render_time );
/*
* Take a snapshot if requested
*/
if( p_directbuffer && b_snapshot )
- {
- vlc_mutex_lock( &p_vout->p->snapshot.lock );
- assert( p_vout->p->snapshot.i_request > 0 );
- while( p_vout->p->snapshot.i_request > 0 )
- {
- picture_t *p_pic = picture_New( p_vout->fmt_out.i_chroma,
- p_vout->fmt_out.i_width,
- p_vout->fmt_out.i_height,
- p_vout->fmt_out.i_aspect );
- if( !p_pic )
- break;
-
- picture_Copy( p_pic, p_directbuffer );
-
- p_pic->p_next = p_vout->p->snapshot.p_picture;
- p_vout->p->snapshot.p_picture = p_pic;
- p_vout->p->snapshot.i_request--;
- }
- vlc_cond_broadcast( &p_vout->p->snapshot.wait );
- vlc_mutex_unlock( &p_vout->p->snapshot.lock );
- }
+ vout_snapshot_Set( &p_vout->p->snapshot,
+ &p_vout->fmt_out, p_directbuffer );
/*
* Call the plugin-specific rendering method if there is one
}
/* following functions are local */
-static int ReduceHeight( int i_ratio )
-{
- int i_dummy = VOUT_ASPECT_FACTOR;
- int i_pgcd = 1;
-
- if( !i_ratio )
- {
- return i_pgcd;
- }
-
- /* VOUT_ASPECT_FACTOR is (2^7 * 3^3 * 5^3), we just check for 2, 3 and 5 */
- while( !(i_ratio & 1) && !(i_dummy & 1) )
- {
- i_ratio >>= 1;
- i_dummy >>= 1;
- i_pgcd <<= 1;
- }
-
- while( !(i_ratio % 3) && !(i_dummy % 3) )
- {
- i_ratio /= 3;
- i_dummy /= 3;
- i_pgcd *= 3;
- }
-
- while( !(i_ratio % 5) && !(i_dummy % 5) )
- {
- i_ratio /= 5;
- i_dummy /= 5;
- i_pgcd *= 5;
- }
-
- return i_pgcd;
-}
-
static void AspectRatio( int i_aspect, int *i_aspect_x, int *i_aspect_y )
{
- unsigned int i_pgcd = ReduceHeight( i_aspect );
+ const int i_pgcd = i_aspect ? GCD( i_aspect, VOUT_ASPECT_FACTOR ) : 1;
*i_aspect_x = i_aspect / i_pgcd;
*i_aspect_y = VOUT_ASPECT_FACTOR / i_pgcd;
}
}
static void PostProcessEnable( vout_thread_t *p_vout )
{
+ vlc_value_t text;
msg_Dbg( p_vout, "Post-processing available" );
var_Create( p_vout, "postprocess", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE );
+ text.psz_string = _("Post processing");
+ var_Change( p_vout, "postprocess", VLC_VAR_SETTEXT, &text, NULL );
+
for( int i = 0; i <= 6; i++ )
{
vlc_value_t val;
const mtime_t i_start = mdate();
const mtime_t i_stop = i_start + INT64_C(1000) * p_vout->p->i_title_timeout;
+ if( i_stop <= i_start )
+ return;
+
vlc_assert_locked( &p_vout->change_lock );
vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN,
const deinterlace_mode_t *p_mode;
for( p_mode = &p_deinterlace_mode[0]; p_mode->psz_mode; p_mode++ )
{
- if( !strcmp( p_mode->psz_mode, newval.psz_string ?: "" ) )
+ if( !strcmp( p_mode->psz_mode,
+ newval.psz_string ? newval.psz_string : "" ) )
break;
}
if( !p_mode->psz_mode )
for( int i = 0; p_deinterlace_mode[i].psz_mode; i++ )
{
val.psz_string = (char*)p_deinterlace_mode[i].psz_mode;
- text.psz_string = (char*)_(p_deinterlace_mode[i].psz_description);
+ text.psz_string = (char*)vlc_gettext(p_deinterlace_mode[i].psz_description);
var_Change( p_vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text );
}
var_AddCallback( p_vout, "deinterlace", DeinterlaceCallback, NULL );
else if( DeinterlaceIsPresent( p_vout, false ) )
psz_mode = var_CreateGetNonEmptyString( p_vout, "sout-deinterlace-mode" );
}
- var_SetString( p_vout, "deinterlace", psz_mode ?: "" );
+ var_SetString( p_vout, "deinterlace", psz_mode ? psz_mode : "" );
free( psz_mode );
}