[vlc-commits] commit: Used subpicture_updater_t for vout_OSDEpg. (Laurent Aimar )
git at videolan.org
git at videolan.org
Mon May 10 19:55:08 CEST 2010
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Wed May 5 21:19:01 2010 +0200| [01164765feb2d776e4c1cc91b30d7120cf750480] | committer: Laurent Aimar
Used subpicture_updater_t for vout_OSDEpg.
It avoid acessing private vout fields and will allows
rendering at the display size (not yet done).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=01164765feb2d776e4c1cc91b30d7120cf750480
---
src/video_output/video_epg.c | 118 +++++++++++++++++++++++++++---------------
1 files changed, 77 insertions(+), 41 deletions(-)
diff --git a/src/video_output/video_epg.c b/src/video_output/video_epg.c
index f212a5f..00dfdc9 100644
--- a/src/video_output/video_epg.c
+++ b/src/video_output/video_epg.c
@@ -34,19 +34,13 @@
#include <vlc_input_item.h>
#include <vlc_epg.h>
-/* TODO remove access to private vout data */
-#include "vout_internal.h"
-
/* Layout percentage defines */
#define EPG_TOP 0.7
#define EPG_LEFT 0.1
#define EPG_NAME_SIZE 0.05
#define EPG_PROGRAM_SIZE 0.03
-
-
-static subpicture_region_t * vout_OSDEpgSlider( vout_thread_t *p_vout,
- int i_x, int i_y,
+static subpicture_region_t * vout_OSDEpgSlider( int i_x, int i_y,
int i_width, int i_height,
float f_ratio )
{
@@ -62,10 +56,7 @@ static subpicture_region_t * vout_OSDEpgSlider( vout_thread_t *p_vout,
p_region = subpicture_region_New( &fmt );
if( !p_region )
- {
- msg_Err( p_vout, "Cannot allocate SPU region." );
return NULL;
- }
p_region->i_x = i_x;
p_region->i_y = i_y;
@@ -104,8 +95,7 @@ static subpicture_region_t * vout_OSDEpgSlider( vout_thread_t *p_vout,
}
-static subpicture_region_t * vout_OSDEpgText( vout_thread_t *p_vout,
- const char *psz_string,
+static subpicture_region_t * vout_OSDEpgText( const char *psz_string,
int i_x, int i_y,
int i_size, uint32_t i_color )
{
@@ -122,10 +112,7 @@ static subpicture_region_t * vout_OSDEpgText( vout_thread_t *p_vout,
p_region = subpicture_region_New( &fmt );
if( !p_region )
- {
- msg_Err( p_vout, "Cannot allocate SPU region." );
return NULL;
- }
/* Set subpicture parameters */
p_region->psz_text = strdup( psz_string );
@@ -146,8 +133,8 @@ static subpicture_region_t * vout_OSDEpgText( vout_thread_t *p_vout,
}
-static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
- vlc_epg_t *p_epg,
+static subpicture_region_t * vout_BuildOSDEpg( vlc_epg_t *p_epg,
+ int i_x, int i_y,
int i_visible_width,
int i_visible_height )
{
@@ -157,10 +144,9 @@ static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
time_t i_test = time( NULL );
/* Display the name of the channel. */
- *pp_region = vout_OSDEpgText( p_vout,
- p_epg->psz_name,
- i_visible_width * EPG_LEFT,
- i_visible_height * EPG_TOP,
+ *pp_region = vout_OSDEpgText( p_epg->psz_name,
+ i_x + i_visible_width * EPG_LEFT,
+ i_y + i_visible_height * EPG_TOP,
i_visible_height * EPG_NAME_SIZE,
0x00ffffff );
@@ -169,9 +155,9 @@ static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
/* Display the name of the current program. */
pp_region = &(* pp_region)->p_next;
- *pp_region = vout_OSDEpgText( p_vout, p_epg->p_current->psz_name,
- i_visible_width * ( EPG_LEFT + 0.025 ),
- i_visible_height * ( EPG_TOP + 0.05 ),
+ *pp_region = vout_OSDEpgText( p_epg->p_current->psz_name,
+ i_x + i_visible_width * ( EPG_LEFT + 0.025 ),
+ i_y + i_visible_height * ( EPG_TOP + 0.05 ),
i_visible_height * EPG_PROGRAM_SIZE,
0x00ffffff );
@@ -180,9 +166,8 @@ static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
/* Display the current program time slider. */
pp_region = &(* pp_region)->p_next;
- *pp_region = vout_OSDEpgSlider( p_vout,
- i_visible_width * EPG_LEFT,
- i_visible_height * ( EPG_TOP + 0.1 ),
+ *pp_region = vout_OSDEpgSlider( i_x + i_visible_width * EPG_LEFT,
+ i_y + i_visible_height * ( EPG_TOP + 0.1 ),
i_visible_width * ( 1 - 2 * EPG_LEFT ),
i_visible_height * 0.05,
( i_test - p_epg->p_current->i_start )
@@ -206,9 +191,9 @@ static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
/* Display those hours. */
pp_region = &(* pp_region)->p_next;
- *pp_region = vout_OSDEpgText( p_vout, psz_start,
- i_visible_width * ( EPG_LEFT + 0.02 ),
- i_visible_height * ( EPG_TOP + 0.15 ),
+ *pp_region = vout_OSDEpgText( psz_start,
+ i_x + i_visible_width * ( EPG_LEFT + 0.02 ),
+ i_y + i_visible_height * ( EPG_TOP + 0.15 ),
i_visible_height * EPG_PROGRAM_SIZE,
0x00ffffff );
@@ -216,15 +201,57 @@ static subpicture_region_t * vout_BuildOSDEpg( vout_thread_t *p_vout,
return p_region_ret;
pp_region = &(* pp_region)->p_next;
- *pp_region = vout_OSDEpgText( p_vout, psz_end,
- i_visible_width * ( 1 - EPG_LEFT - 0.085 ),
- i_visible_height * ( EPG_TOP + 0.15 ),
+ *pp_region = vout_OSDEpgText( psz_end,
+ i_x + i_visible_width * ( 1 - EPG_LEFT - 0.085 ),
+ i_y + i_visible_height * ( EPG_TOP + 0.15 ),
i_visible_height * EPG_PROGRAM_SIZE,
0x00ffffff );
return p_region_ret;
}
+struct subpicture_updater_sys_t
+{
+ vlc_epg_t *p_epg;
+};
+
+static int OSDEpgValidate( subpicture_t *p_subpic,
+ bool has_src_changed, const video_format_t *p_fmt_src,
+ bool has_dst_changed, const video_format_t *p_fmt_dst,
+ mtime_t i_ts )
+{
+ VLC_UNUSED(p_subpic); VLC_UNUSED(i_ts); VLC_UNUSED(p_fmt_src);
+ VLC_UNUSED(has_dst_changed); VLC_UNUSED(p_fmt_dst);
+
+ if( !has_src_changed && !has_dst_changed)
+ return VLC_SUCCESS;
+ return VLC_EGENERIC;
+}
+
+static void OSDEpgUpdate( subpicture_t *p_subpic,
+ const video_format_t *p_fmt_src,
+ const video_format_t *p_fmt_dst,
+ mtime_t i_ts )
+{
+ subpicture_updater_sys_t *p_sys = p_subpic->updater.p_sys;
+ VLC_UNUSED(p_fmt_dst); VLC_UNUSED(i_ts);
+
+ p_subpic->i_original_picture_width = p_fmt_src->i_width;
+ p_subpic->i_original_picture_height = p_fmt_src->i_height;
+ p_subpic->p_region = vout_BuildOSDEpg( p_sys->p_epg,
+ p_fmt_src->i_x_offset,
+ p_fmt_src->i_y_offset,
+ p_fmt_src->i_visible_width,
+ p_fmt_src->i_visible_height );
+}
+
+static void OSDEpgDestroy( subpicture_t *p_subpic )
+{
+ subpicture_updater_sys_t *p_sys = p_subpic->updater.p_sys;
+
+ vlc_epg_Delete( p_sys->p_epg );
+ free( p_sys );
+}
/**
* \brief Show EPG information about the current program of an input item
@@ -262,12 +289,27 @@ int vout_OSDEpg( vout_thread_t *p_vout, input_item_t *p_input )
if( p_epg == NULL )
return VLC_EGENERIC;
- p_spu = subpicture_New( NULL );
- if( !p_spu )
+ subpicture_updater_sys_t *p_sys = malloc( sizeof( *p_sys ) );
+ if( !p_sys )
{
vlc_epg_Delete( p_epg );
return VLC_EGENERIC;
}
+ p_sys->p_epg = p_epg;
+ subpicture_updater_t updater = {
+ .pf_validate = OSDEpgValidate,
+ .pf_update = OSDEpgUpdate,
+ .pf_destroy = OSDEpgDestroy,
+ .p_sys = p_sys
+ };
+
+ p_spu = subpicture_New( &updater );
+ if( !p_spu )
+ {
+ vlc_epg_Delete( p_sys->p_epg );
+ free( p_sys );
+ return VLC_EGENERIC;
+ }
p_spu->i_channel = SPU_DEFAULT_CHANNEL;
p_spu->i_start = i_now;
@@ -276,12 +318,6 @@ int vout_OSDEpg( vout_thread_t *p_vout, input_item_t *p_input )
p_spu->b_absolute = true;
p_spu->b_fade = true;
- /* Build the EPG event subpictures. */
- p_spu->p_region = vout_BuildOSDEpg( p_vout, p_epg,
- p_vout->p->fmt_in.i_width,
- p_vout->p->fmt_in.i_height );
-
- vlc_epg_Delete( p_epg );
spu_DisplaySubpicture( vout_GetSpu( p_vout ), p_spu );
return VLC_SUCCESS;
More information about the vlc-commits
mailing list