+static void Render( intf_thread_t *p_intf, struct fbosd_render_t *render )
+{
+ intf_sys_t *p_sys = (intf_sys_t*) p_intf->p_sys;
+
+ if( render->i_state != FBOSD_STATE_RENDER ) return;
+ if( !render->psz_string ) return;
+
+ if( render->i_type == FBOSD_RENDER_IMAGE )
+ {
+ picture_t *p_pic;
+ p_pic = LoadImage( p_intf, &p_sys->fmt_out, render->psz_string );
+ if( p_pic )
+ {
+ RenderPicture( p_intf, render->i_x, render->i_y,
+ p_pic, p_sys->p_overlay );
+ picture_Release( p_pic );
+ }
+ }
+ else if( render->i_type == FBOSD_RENDER_TEXT )
+ {
+ picture_t *p_text;
+#if defined(FBOSD_BLENDING)
+ video_format_t fmt_in;
+ memset( &fmt_in, 0, sizeof(video_format_t) );
+ p_text = RenderText( p_intf, render->psz_string, &render->text_style,
+ &fmt_in );
+ if( p_text )
+ {
+ BlendPicture( p_intf, &fmt_in, &p_sys->fmt_out,
+ p_text, p_sys->p_overlay );
+ msg_Dbg( p_intf, "releasing picture" );
+ DeAllocatePicture( VLC_OBJECT( p_intf ), p_text, &fmt_in );
+ }
+#else
+ p_text = RenderText( p_intf, render->psz_string, &render->text_style,
+ &p_sys->fmt_out );
+ if( p_text )
+ {
+ RenderPicture( p_intf, render->i_x, render->i_y,
+ p_text, p_sys->p_overlay );
+ picture_Release( p_text );
+ }
+#endif
+ }
+}
+
+static void RenderClear( intf_thread_t *p_intf, struct fbosd_render_t *render )
+{
+ intf_sys_t *p_sys = (intf_sys_t*) p_intf->p_sys;
+
+ vlc_memcpy( &render->text_style, &default_text_style,
+ sizeof( text_style_t ) );
+ free( render->psz_string );
+ render->psz_string = NULL;
+
+ render->i_x = p_sys->i_x;
+ render->i_y = p_sys->i_y;
+ render->i_pos = p_sys->i_pos;
+ render->i_alpha = p_sys->i_alpha;
+ render->b_absolute = p_sys->b_absolute;
+ render->i_state = FBOSD_STATE_FREE;
+}
+
+static bool isRendererReady( intf_thread_t *p_intf )
+{
+ intf_sys_t *p_sys = (intf_sys_t*) p_intf->p_sys;
+ int i;
+
+ /* Check if there are more items to render */
+ for( i = 0; i < FBOSD_RENDER_MAX; i++ )
+ {
+ if( p_sys->render[i].i_state == FBOSD_STATE_RESERVED )
+ return false;
+ }
+ return true;
+}
+