summaryrefslogtreecommitdiff
path: root/src/xine-engine/video_overlay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-engine/video_overlay.c')
-rw-r--r--src/xine-engine/video_overlay.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c
index 783c73d26..da759b717 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.14 2002/01/15 20:22:44 jcdutton Exp $
+ * $Id: video_overlay.c,v 1.15 2002/03/14 04:31:49 miguelfreitas Exp $
*
*/
@@ -101,11 +101,12 @@ static void remove_showing_handle( video_overlay_t *this, int32_t handle )
pthread_mutex_unlock( &this->video_overlay_showing_mutex );
}
-static void remove_events_handle( video_overlay_t *this, int32_t handle )
+static void remove_events_handle( video_overlay_t *this, int32_t handle, int lock )
{
uint32_t last_event,this_event;
- pthread_mutex_lock( &this->video_overlay_events_mutex );
+ if( lock )
+ pthread_mutex_lock( &this->video_overlay_events_mutex );
this_event=0;
do {
@@ -134,7 +135,8 @@ static void remove_events_handle( video_overlay_t *this, int32_t handle )
}
} while ( this_event );
- pthread_mutex_unlock( &this->video_overlay_events_mutex );
+ if( lock )
+ pthread_mutex_unlock( &this->video_overlay_events_mutex );
}
@@ -187,7 +189,7 @@ static void video_overlay_free_handle(video_overlay_instance_t *this_gen, int32_
video_overlay_t *this = (video_overlay_t *) this_gen;
remove_showing_handle(this,handle);
- remove_events_handle(this,handle);
+ remove_events_handle(this,handle,1);
internal_video_overlay_free_handle(this,handle);
}
@@ -346,9 +348,15 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
#ifdef LOG_DEBUG
video_overlay_print_overlay( this->video_overlay_events[this_event].event->object.overlay ) ;
#endif
- /* This should not happen, the calling routine should do the free */
- /* FIXME: Need to add new event to free handle */
-/* internal_video_overlay_free_handle( this, handle ); */
+ /* 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;
+ }
this->video_overlay_objects[handle].handle = handle;
if( this->video_overlay_objects[handle].overlay ) {
@@ -368,10 +376,16 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
#ifdef LOG_DEBUG
printf ("video_overlay: FREE SPU NOW\n");
#endif
- free(this->video_overlay_events[this_event].event->object.overlay);
+ /* free any overlay associated with this event */
+ if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
+ free(this->video_overlay_events[this_event].event->object.overlay);
this->video_overlay_events[this_event].event->object.overlay = NULL;
+ }
+ /* this avoid removing this_event from the queue
+ * (it will be removed at the end of this loop) */
+ this->video_overlay_events[this_event].event->object.handle = -1;
remove_showing_handle(this,handle);
- remove_events_handle(this,handle);
+ remove_events_handle(this,handle,0);
internal_video_overlay_free_handle( this, handle );
break;
@@ -382,24 +396,23 @@ static void video_overlay_event( video_overlay_t *this, int vpts ) {
#ifdef LOG_DEBUG
printf ("video_overlay: HIDE SPU NOW\n");
#endif
- free(this->video_overlay_events[this_event].event->object.overlay);
+ /* free any overlay associated with this event */
+ if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
+ free(this->video_overlay_events[this_event].event->object.overlay);
this->video_overlay_events[this_event].event->object.overlay = NULL;
+ }
remove_showing_handle( this, handle );
- /* This should not happen, the calling routine should do the free */
- /* FIXME: Need to add new event to free handle */
- /* internal_video_overlay_free_handle( this, handle ); */
break;
case EVENT_HIDE_MENU:
#ifdef LOG_DEBUG
printf ("video_overlay: HIDE MENU NOW %d\n",handle);
#endif
- free(this->video_overlay_events[this_event].event->object.overlay);
+ if (this->video_overlay_events[this_event].event->object.overlay != NULL) {
+ free(this->video_overlay_events[this_event].event->object.overlay);
this->video_overlay_events[this_event].event->object.overlay = NULL;
+ }
remove_showing_handle( this, handle );
- /* This should not happen, the calling routine should do the free */
- /* FIXME: Need to add new event to free handle */
- /* internal_video_overlay_free_handle( this, handle ); */
break;
case EVENT_MENU_SPU:
@@ -623,6 +636,20 @@ static void video_overlay_flush_events(video_overlay_instance_t *this_gen )
video_overlay_event( this, 0 );
}
+static void video_overlay_dispose(video_overlay_instance_t *this_gen) {
+
+ video_overlay_t *this = (video_overlay_t *) this_gen;
+ int i;
+
+ for (i=0; i < MAX_EVENTS; i++) {
+ if (this->video_overlay_events[i].event != NULL) {
+ free (this->video_overlay_events[i].event);
+ }
+ }
+
+ free (this);
+}
+
video_overlay_instance_t *video_overlay_new_instance () {
@@ -631,6 +658,7 @@ video_overlay_instance_t *video_overlay_new_instance () {
this = (video_overlay_t *) xine_xmalloc (sizeof (video_overlay_t));
this->video_overlay.init = video_overlay_init;
+ this->video_overlay.dispose = video_overlay_dispose;
this->video_overlay.get_handle = video_overlay_get_handle;
this->video_overlay.free_handle = video_overlay_free_handle;
this->video_overlay.add_event = video_overlay_add_event;