[vlc-devel] [PATCH 3/3] Smooth Streaming: fix a memory leak
Frédéric Yhuel
yhuelf at gmail.com
Wed Oct 10 18:54:59 CEST 2012
initialization chunks were not freed on Close()
---
modules/stream_filter/smooth/downloader.c | 3 +++
modules/stream_filter/smooth/smooth.c | 13 +++++++++++--
modules/stream_filter/smooth/smooth.h | 1 +
3 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/modules/stream_filter/smooth/downloader.c b/modules/stream_filter/smooth/downloader.c
index 26cca95..3173849 100644
--- a/modules/stream_filter/smooth/downloader.c
+++ b/modules/stream_filter/smooth/downloader.c
@@ -514,6 +514,7 @@ static int Download( stream_t *s, sms_stream_t *sms )
vlc_mutex_lock( &p_sys->download.lock_wait );
vlc_array_append( p_sys->download.chunks, new_init_ck );
+ vlc_array_append( p_sys->init_chunks, new_init_ck );
vlc_mutex_unlock( &p_sys->download.lock_wait );
}
return VLC_SUCCESS;
@@ -578,6 +579,7 @@ void* sms_Thread( void *p_this )
vlc_mutex_lock( &p_sys->download.lock_wait );
vlc_array_append( p_sys->download.chunks, init_ck );
+ vlc_array_append( p_sys->init_chunks, init_ck );
vlc_mutex_unlock( &p_sys->download.lock_wait );
p_sys->download.next_chunk_offset = init_ck->size;
@@ -664,6 +666,7 @@ void* sms_Thread( void *p_this )
p_sys->download.next_chunk_offset += new_init_ck->size;
vlc_array_append( p_sys->download.chunks, new_init_ck );
+ vlc_array_append( p_sys->init_chunks, new_init_ck );
p_sys->b_tseek = false;
}
vlc_mutex_unlock( &p_sys->download.lock_wait );
diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c
index 7293ab1..15bc5f7 100644
--- a/modules/stream_filter/smooth/smooth.c
+++ b/modules/stream_filter/smooth/smooth.c
@@ -403,8 +403,9 @@ static int Open( vlc_object_t *p_this )
p_sys->sms_streams = vlc_array_new();
p_sys->selected_st = vlc_array_new();
p_sys->download.chunks = vlc_array_new();
+ p_sys->init_chunks = vlc_array_new();
if( unlikely( !p_sys->sms_streams || !p_sys->download.chunks ||
- !p_sys->selected_st ) )
+ !p_sys->selected_st || !p_sys->init_chunks ) )
{
free( p_sys );
return VLC_ENOMEM;
@@ -492,14 +493,22 @@ static void Close( vlc_object_t *p_this )
for( int i = 0; i < vlc_array_count( p_sys->sms_streams ); i++ )
{
sms = vlc_array_item_at_index( p_sys->sms_streams, i );
- if( sms)
+ if( sms )
sms_Free( sms );
}
+ /* Free downloaded chunks */
+ chunk_t *chunk;
+ for( int i = 0; i < vlc_array_count( p_sys->init_chunks ); i++ )
+ {
+ chunk = vlc_array_item_at_index( p_sys->init_chunks, i );
+ chunk_Free( chunk );
+ }
sms_queue_free( p_sys->bws );
vlc_array_destroy( p_sys->sms_streams );
vlc_array_destroy( p_sys->selected_st );
vlc_array_destroy( p_sys->download.chunks );
+ vlc_array_destroy( p_sys->init_chunks );
free( p_sys->base_url );
free( p_sys );
diff --git a/modules/stream_filter/smooth/smooth.h b/modules/stream_filter/smooth/smooth.h
index c121973..a800dd7 100644
--- a/modules/stream_filter/smooth/smooth.h
+++ b/modules/stream_filter/smooth/smooth.h
@@ -92,6 +92,7 @@ struct stream_sys_t
vlc_array_t *sms_streams; /* available streams */
vlc_array_t *selected_st; /* selected streams */
+ vlc_array_t *init_chunks;
unsigned i_tracks; /* Total number of tracks in the Manifest */
sms_queue_t *bws; /* Measured bandwidths of the N last chunks */
uint64_t vod_duration; /* total duration of the VOD media */
--
1.7.9.5
More information about the vlc-devel
mailing list