summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-03-14 04:31:49 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-03-14 04:31:49 +0000
commit73ef7c8aabb3373603b0b863cbb9f27d3d323a57 (patch)
tree881914f39bfcd758a1bfeaff0531c736dcf422ad /src
parent95ff34e86e03584ef8271a3955cc5cc9249fa1d5 (diff)
downloadxine-lib-73ef7c8aabb3373603b0b863cbb9f27d3d323a57.tar.gz
xine-lib-73ef7c8aabb3373603b0b863cbb9f27d3d323a57.tar.bz2
Ewald Snel's latest memory leak fixes
CVS patchset: 1567 CVS date: 2002/03/14 04:31:49
Diffstat (limited to 'src')
-rw-r--r--src/xine-engine/osd.c37
-rw-r--r--src/xine-engine/osd.h4
-rw-r--r--src/xine-engine/video_out.c6
-rw-r--r--src/xine-engine/video_out.h4
-rw-r--r--src/xine-engine/video_overlay.c64
5 files changed, 64 insertions, 51 deletions
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;