summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-04-09 13:20:43 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-04-09 13:20:43 +0000
commit8ff820b65a21d201083237710298881e28d1f895 (patch)
tree3df78f26f5b47658e4b4dca9ab338c9d6f1a574e
parent78276079ea9d69a6160656e23e74c29133050f64 (diff)
downloadxine-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.c6
-rw-r--r--src/xine-engine/video_overlay.c107
-rw-r--r--src/xine-engine/video_overlay.h15
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;