diff options
author | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-04-09 13:20:43 +0000 |
---|---|---|
committer | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-04-09 13:20:43 +0000 |
commit | 8ff820b65a21d201083237710298881e28d1f895 (patch) | |
tree | 3df78f26f5b47658e4b4dca9ab338c9d6f1a574e | |
parent | 78276079ea9d69a6160656e23e74c29133050f64 (diff) | |
download | xine-lib-8ff820b65a21d201083237710298881e28d1f895.tar.gz xine-lib-8ff820b65a21d201083237710298881e28d1f895.tar.bz2 |
Introducing steps towards a menu api in video_overlay.c
First step here is make libspudec use different calls to video_overlay than osd, so changes can be made to menu handling without effecting osd too much.
CVS patchset: 1702
CVS date: 2002/04/09 13:20:43
-rw-r--r-- | src/libspudec/spu.c | 6 | ||||
-rw-r--r-- | src/xine-engine/video_overlay.c | 107 | ||||
-rw-r--r-- | src/xine-engine/video_overlay.h | 15 |
3 files changed, 33 insertions, 95 deletions
diff --git a/src/libspudec/spu.c b/src/libspudec/spu.c index 611195612..01b0a67c7 100644 --- a/src/libspudec/spu.c +++ b/src/libspudec/spu.c @@ -35,7 +35,7 @@ * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: spu.c,v 1.32 2002/04/06 15:40:19 jcdutton Exp $ + * $Id: spu.c,v 1.33 2002/04/09 13:20:43 jcdutton Exp $ * */ @@ -158,7 +158,7 @@ void spudec_decode_nav(spudec_decoder_t *this, buf_element_t *buf) { if( this->menu_handle >= 0 ) { metronom_t *metronom = this->xine->metronom; this->event.object.handle = this->menu_handle; - this->event.event_type = EVENT_HIDE_SPU; + this->event.event_type = EVENT_HIDE_MENU; /* if !vpts then we are near a discontinuity but video_out havent detected it yet and we cannot provide correct vpts values. use current_time instead as an aproximation. @@ -308,7 +308,7 @@ void spudec_process (spudec_decoder_t *this, uint32_t stream_id) { this->overlay.rle=NULL; /* For force display menus */ if ( !(this->state.visible) ) { - this->state.visible = EVENT_SHOW_SPU; + this->state.visible = EVENT_SHOW_MENU; } this->event.event_type = this->state.visible; diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c index 9efc010be..a51f3cd85 100644 --- a/src/xine-engine/video_overlay.c +++ b/src/xine-engine/video_overlay.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_overlay.c,v 1.18 2002/03/25 13:57:25 jcdutton Exp $ + * $Id: video_overlay.c,v 1.19 2002/04/09 13:20:43 jcdutton Exp $ * */ @@ -243,7 +243,8 @@ static void video_overlay_init (video_overlay_instance_t *this_gen) { * * note: on success event->object.overlay is "taken" (caller will not have access * to overlay data including rle). - * note2: handle will be freed on HIDE events + * note2: handle will not be freed on HIDE events + * the handle is removed from the currently showing list. */ static int32_t video_overlay_add_event(video_overlay_instance_t *this_gen, void *event_gen ) { video_overlay_event_t *event = (video_overlay_event_t *) event_gen; @@ -418,101 +419,37 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) { remove_showing_handle( this, handle ); break; - case EVENT_MENU_SPU: - /* mixes palette and copy rle */ + case EVENT_SHOW_MENU: #ifdef LOG_DEBUG - printf ("video_overlay:MENU SPU NOW\n"); + printf ("video_overlay: SHOW MENU NOW\n"); #endif if (this->video_overlay_events[this_event].event->object.overlay != NULL) { - vo_overlay_t *event_overlay = this->video_overlay_events[this_event].event->object.overlay; - vo_overlay_t *overlay; - int menu_changed = 0; - printf ("video_overlay:overlay present\n"); #ifdef LOG_DEBUG video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ; #endif - - /* we need to allocate overlay on first EVENT_MENU_SPU */ - if( !this->video_overlay_objects[handle].overlay ) { - this->video_overlay_objects[handle].overlay - = xine_xmalloc( sizeof(vo_overlay_t) ); - menu_changed = 1; + /* this->video_overlay_objects[handle].overlay is about to be + * overwritten by this event data. make sure we free it if needed. + */ + if( this->video_overlay_objects[handle].overlay ) { + if( this->video_overlay_objects[handle].overlay->rle ) + free( this->video_overlay_objects[handle].overlay->rle ); + free( this->video_overlay_objects[handle].overlay ); + this->video_overlay_objects[handle].overlay = NULL; } - overlay = this->video_overlay_objects[handle].overlay; this->video_overlay_objects[handle].handle = handle; - - /* If rle is not empty, free it first */ - if(overlay->rle) { - free (overlay->rle); - overlay->rle=NULL; - } -#ifdef LOG_DEBUG - printf("video_overlay.c:Menu SPU area is (%u,%u)-(%u,%u), display = 1\n", - event_overlay->x, event_overlay->y, - event_overlay->x + event_overlay->width, - event_overlay->y + event_overlay->height); -#endif - if( overlay->num_rle != event_overlay->num_rle || - overlay->width != event_overlay->width || - overlay->height != event_overlay->height || - overlay->x != event_overlay->x || - overlay->y != event_overlay->y ) { - menu_changed = 1; - } - - overlay->rle = event_overlay->rle; - - overlay->data_size = event_overlay->data_size; - overlay->num_rle = event_overlay->num_rle; - overlay->x = event_overlay->x; - overlay->y = event_overlay->y; - overlay->width = event_overlay->width; - overlay->height = event_overlay->height; - - if( menu_changed ) { - if((event_overlay->color[0] + - event_overlay->color[1] + - event_overlay->color[2] + - event_overlay->color[3]) > 0 ) { - overlay->color[0] = event_overlay->color[0]; - overlay->color[1] = event_overlay->color[1]; - overlay->color[2] = event_overlay->color[2]; - overlay->color[3] = event_overlay->color[3]; - - overlay->rgb_clut = event_overlay->rgb_clut; - } - if((event_overlay->trans[0] + - event_overlay->trans[1] + - event_overlay->trans[2] + - event_overlay->trans[3]) > 0 ) { - overlay->trans[0] = event_overlay->trans[0]; - overlay->trans[1] = event_overlay->trans[1]; - overlay->trans[2] = event_overlay->trans[2]; - overlay->trans[3] = event_overlay->trans[3]; - } - } -#ifdef LOG_DEBUG - video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ; -#endif - - /* let EVENT_MENU_BUTTON set the correct clipping box */ - if( menu_changed ) { - overlay->clip_top = overlay->height; - overlay->clip_bottom = 0; - overlay->clip_left = overlay->width; - overlay->clip_right = 0; + if( this->video_overlay_objects[handle].overlay ) { + fprintf(stderr,"video_overlay: error: object->overlay was not freed!\n"); } - - add_showing_handle( this, handle ); - - /* The null test was done at the start of this case statement */ - free (this->video_overlay_events[this_event].event->object.overlay); + this->video_overlay_objects[handle].overlay = + this->video_overlay_events[this_event].event->object.overlay; + this->video_overlay_objects[handle].pts = + this->video_overlay_events[this_event].event->object.pts; this->video_overlay_events[this_event].event->object.overlay = NULL; - } else { - printf ("video_overlay:overlay present\n"); + + add_showing_handle( this, handle ); } - break; +break; case EVENT_MENU_BUTTON: /* mixes palette and copy clip coords */ diff --git a/src/xine-engine/video_overlay.h b/src/xine-engine/video_overlay.h index 489bac777..be6d392ff 100644 --- a/src/xine-engine/video_overlay.h +++ b/src/xine-engine/video_overlay.h @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_overlay.h,v 1.7 2002/03/14 13:57:15 miguelfreitas Exp $ + * $Id: video_overlay.h,v 1.8 2002/04/09 13:20:44 jcdutton Exp $ * */ @@ -39,8 +39,8 @@ #define EVENT_NULL 0 #define EVENT_SHOW_SPU 1 #define EVENT_HIDE_SPU 2 -#define EVENT_HIDE_MENU 3 -#define EVENT_MENU_SPU 4 +#define EVENT_SHOW_MENU 3 +#define EVENT_HIDE_MENU 4 #define EVENT_MENU_BUTTON 5 #define EVENT_DELETE_RESOURCE 6 /* Maybe release handle will do this */ #define EVENT_SHOW_OSD 7 /* Not yet implemented */ @@ -53,9 +53,9 @@ #define OVL_PALETTE_SIZE 256 typedef struct vo_buttons_s { - int32_t auto_action; /* -1:Button not valid, - 0:Button Valid, no auto_action, - 1:Button Valid, auto_action. + int32_t type; /* 0:Button not valid, + 1:Button Valid, no auto_action, + 2:Button Valid, auto_action. */ int32_t clip_top; int32_t clip_bottom; @@ -82,7 +82,8 @@ typedef struct video_overlay_object_s { vo_overlay_t *overlay; /* The image data. */ uint32_t palette_type; /* 1 Y'CrCB, 2 R'G'B' */ uint32_t *palette; /* If NULL, no palette contained in this event. */ - int32_t buttonN; /* Current highlighed button. -1 means no buttons present */ + int32_t buttonN; /* Current highlighed button. 0 means no info on which button to higlight */ + /* -1 means don't use this button info. */ vo_buttons_t button[32]; /* Info regarding each button on the overlay */ } video_overlay_object_t; |