From 73ef7c8aabb3373603b0b863cbb9f27d3d323a57 Mon Sep 17 00:00:00 2001 From: Miguel Freitas Date: Thu, 14 Mar 2002 04:31:49 +0000 Subject: Ewald Snel's latest memory leak fixes CVS patchset: 1567 CVS date: 2002/03/14 04:31:49 --- src/xine-engine/osd.c | 37 ++++++------------------ src/xine-engine/osd.h | 4 +-- src/xine-engine/video_out.c | 6 +++- src/xine-engine/video_out.h | 4 ++- src/xine-engine/video_overlay.c | 64 +++++++++++++++++++++++++++++------------ 5 files changed, 64 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c index d5b505861..7944907c8 100644 --- a/src/xine-engine/osd.c +++ b/src/xine-engine/osd.c @@ -104,27 +104,6 @@ static osd_object_t *osd_new_object (osd_renderer_t *this, int width, int height osd_object_t *osd; -#if 0 - static clut_t default_color[] = { - CLUT_Y_CR_CB_INIT(0x00, 0x00, 0x00), - CLUT_Y_CR_CB_INIT(0x00, 0x80, 0x80), - CLUT_Y_CR_CB_INIT(0x8d, 0x7f, 0x85), - CLUT_Y_CR_CB_INIT(0xc9, 0x7f, 0x85), - CLUT_Y_CR_CB_INIT(0x00, 0x00, 0x00), - CLUT_Y_CR_CB_INIT(0x00, 0x00, 0x00), - CLUT_Y_CR_CB_INIT(0x00, 0x00, 0x00) - - /* - CLUT_Y_CR_CB_INIT(0x19, 0x7e, 0x89), - CLUT_Y_CR_CB_INIT(0x32, 0x7c, 0x93), - CLUT_Y_CR_CB_INIT(0x4b, 0x7b, 0x9c), - CLUT_Y_CR_CB_INIT(0x64, 0x79, 0xa6), - CLUT_Y_CR_CB_INIT(0x7d, 0x78, 0xaf) - */ - }; - static uint8_t default_trans[] = {0, 10, 12, 15, 15, 15, 15}; -#endif - pthread_mutex_lock (&this->osd_mutex); osd = xine_xmalloc( sizeof(osd_object_t) ); @@ -172,11 +151,6 @@ static int osd_show (osd_object_t *osd, uint32_t vpts ) { printf("osd_show %p vpts=%d\n", osd, vpts); #endif -// if( osd->handle >= 0 ) -// return 0; /* must hide first */ - -// if( (osd->handle = this->video_overlay->get_handle(this->video_overlay,0)) == -1 ) -// return 0; if( osd->handle < 0 ) { if( (osd->handle = this->video_overlay->get_handle(this->video_overlay,0)) == -1 ) { return 0; @@ -270,7 +244,6 @@ static int osd_hide (osd_object_t *osd, uint32_t vpts) { pthread_mutex_lock (&this->osd_mutex); this->event.object.handle = osd->handle; -// osd->handle = -1; /* handle will be freed after hide */ /* not really needed this, but good pratice to clean it up */ memset( this->event.object.overlay, 0, sizeof(this->event.object.overlay) ); @@ -279,6 +252,12 @@ static int osd_hide (osd_object_t *osd, uint32_t vpts) { this->event.vpts = vpts; this->video_overlay->add_event(this->video_overlay,(void *)&this->event); + this->event.event_type = EVENT_FREE_HANDLE; + this->event.vpts = vpts+1; + this->video_overlay->add_event(this->video_overlay,(void *)&this->event); + + osd->handle = -1; /* handle will be freed */ + pthread_mutex_unlock (&this->osd_mutex); return 1; @@ -797,8 +776,6 @@ static void osd_free_object (osd_object_t *osd_to_close) { osd_object_t *osd, *last; if( osd_to_close->handle >= 0 ) { -/* FIXME:This should be replaced by a video_overlay free object. */ - printf("osd.c:osd_free_object:trying to free overlay object\n"); osd_hide(osd_to_close,0); } @@ -831,6 +808,8 @@ static void osd_renderer_close (osd_renderer_t *this) { while( this->fonts ) osd_renderer_unload_font( this, this->fonts->name ); + pthread_mutex_destroy (&this->osd_mutex); + free(this->event.object.overlay); free(this); } diff --git a/src/xine-engine/osd.h b/src/xine-engine/osd.h index ba75554a5..37205fdbc 100644 --- a/src/xine-engine/osd.h +++ b/src/xine-engine/osd.h @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * OSD stuff (text and graphic primitives) - * $Id: osd.h,v 1.7 2002/01/08 16:47:57 cvogler Exp $ + * $Id: osd.h,v 1.8 2002/03/14 04:31:49 miguelfreitas Exp $ */ #ifndef HAVE_OSD_H @@ -138,7 +138,7 @@ struct osd_renderer_s { void (*close) (osd_renderer_t *this); /* - * clear an osd object + * clear an osd object (empty drawing area) */ void (*clear) (osd_object_t *osd ); diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c index bc7358cc7..2850f3616 100644 --- a/src/xine-engine/video_out.c +++ b/src/xine-engine/video_out.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_out.c,v 1.79 2002/03/12 19:51:29 guenter Exp $ + * $Id: video_out.c,v 1.80 2002/03/14 04:31:49 miguelfreitas Exp $ * * frame allocation / queuing / scheduling / output functions */ @@ -843,6 +843,10 @@ static void vo_exit (vo_instance_t *this_gen) { printf ("video_out: vo_exit... done\n"); #endif + if (this->overlay_source) { + this->overlay_source->dispose (this->overlay_source); + } + free (this->free_img_buf_queue); free (this->display_img_buf_queue); free (this->logo_yuy2); diff --git a/src/xine-engine/video_out.h b/src/xine-engine/video_out.h index 96b7927c5..5fe24da4f 100644 --- a/src/xine-engine/video_out.h +++ b/src/xine-engine/video_out.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_out.h,v 1.48 2002/03/10 21:16:14 miguelfreitas Exp $ + * $Id: video_out.h,v 1.49 2002/03/14 04:31:49 miguelfreitas Exp $ * * * xine version of video_out.h @@ -344,6 +344,8 @@ struct vo_overlay_s { struct video_overlay_instance_s { void (*init) (video_overlay_instance_t *this_gen); + void (*dispose) (video_overlay_instance_t *this_gen); + int32_t (*get_handle) (video_overlay_instance_t *this_gen, int object_type ); void (*free_handle) (video_overlay_instance_t *this_gen, int32_t handle); 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; -- cgit v1.2.3