From 46329e6889feccf9bccb33b1d84ffb68e1b6a166 Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Oct 06 2010 17:42:53 +0000 Subject: fix some memory leaks and compile-time warnings --- diff --git a/libucil-0.9.10-leaks.patch b/libucil-0.9.10-leaks.patch new file mode 100644 index 0000000..8fe7ebf --- /dev/null +++ b/libucil-0.9.10-leaks.patch @@ -0,0 +1,47 @@ + src/ucil_png.c | 1 + + src/ucil_rawavi.c | 6 +++++- + 2 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/src/ucil_png.c b/src/ucil_png.c +index 9fd9de3..2406ce7 100644 +--- a/src/ucil_png.c ++++ b/src/ucil_png.c +@@ -286,6 +286,7 @@ unicap_status_t ucil_load_png( char *filename, unicap_data_buffer_t *buffer ) + if( !check_if_png( filename, &f ) ) + { + TRACE( "File '%s' is not a valid PNG image\n", filename ); ++ fclose( f ); + return STATUS_FAILURE; + } + +diff --git a/src/ucil_rawavi.c b/src/ucil_rawavi.c +index d578922..8b6f7b4 100644 +--- a/src/ucil_rawavi.c ++++ b/src/ucil_rawavi.c +@@ -225,6 +225,7 @@ static void avi_list_pad( avi_buffer_t *list, int offset, int padding ) + padsize = padding - ( ( offset + list->dwPtr + sizeof( avi_list_t ) - 4 ) % padding ); + + avi_add_chunk( list, UCIL_FOURCC( 'J', 'U', 'N', 'K' ), padsize, chunk_buffer ); ++ free( chunk_buffer ); + } + + +@@ -573,6 +574,7 @@ static avi_buffer_t *ucil_rawavi_create_index( ucil_rawavi_video_file_object_t * + avi_index_entry_t *idx; + int i; + int offset = 4; ++ avi_buffer_t *buf; + + idx = malloc( vobj->movi_frames * sizeof( avi_index_entry_t ) ); + +@@ -586,7 +588,9 @@ static avi_buffer_t *ucil_rawavi_create_index( ucil_rawavi_video_file_object_t * + offset += vobj->format.buffer_size + 8; + } + +- return avi_create_chunk( UCIL_FOURCC( 'i', 'd', 'x', '1' ), idx, vobj->movi_frames * sizeof( avi_index_entry_t ) ); ++ buf = avi_create_chunk( UCIL_FOURCC( 'i', 'd', 'x', '1' ), idx, vobj->movi_frames * sizeof( avi_index_entry_t ) ); ++ free( idx ); ++ return buf; + } + + unicap_status_t ucil_rawavi_close_video_file( ucil_rawavi_video_file_object_t *vobj ) diff --git a/libucil-0.9.10-warnings.patch b/libucil-0.9.10-warnings.patch new file mode 100644 index 0000000..b3b678c --- /dev/null +++ b/libucil-0.9.10-warnings.patch @@ -0,0 +1,454 @@ + src/colorspace.c | 15 --- + src/ucil_gstreamer.c | 12 -- + src/ucil_ppm.c | 1 + + src/ucil_rawavi.c | 29 ----- + src/ucil_theora.c | 280 -------------------------------------------------- + src/video_file.c | 8 -- + 6 files changed, 1 insertions(+), 344 deletions(-) + +diff --git a/src/colorspace.c b/src/colorspace.c +index 01ec086..2345270 100644 +--- a/src/colorspace.c ++++ b/src/colorspace.c +@@ -108,7 +108,6 @@ static void y4202rgb32( __u8 *dest, __u8 *source, int width, int height ); + static void y8002rgb24( __u8 *dest, __u8 *source, int width, int height ); + static void y8002rgb32( __u8 *dest, __u8 *source, int width, int height ); + static void rgb242y800( __u8 *dest, __u8 *source, int width, int height ); +-static void rgb322y800( __u8 *dest, __u8 *source, int width, int height ); + static void uyvytoyuv422p( __u8 *dest, __u8 *src, int width, int height ); + static void uyvytoyuv420p( __u8 *dest, __u8 *src, int width, int height ); + static void yuv420ptouyvy( __u8 *dest, __u8 *src, int width, int height ); +@@ -2832,20 +2831,6 @@ static void rgb242y800( __u8 *dest, __u8 *source, int width, int height ) + } + } + +-static void rgb322y800( __u8 *dest, __u8 *source, int width, int height ) +-{ +- int i; +- int dest_offset = 0; +- int source_size = width * height * 4; +- +- for( i = 1; i < source_size; i += 4 ){ +- __u8 y; +- y = source[i]; +- dest[dest_offset++] = y; +- } +-} +- +- + static void y8002rgb32( __u8 *dest, __u8 *source, int width, int height ) + { + int i; +diff --git a/src/ucil_gstreamer.c b/src/ucil_gstreamer.c +index 1c707fe..eaf025f 100644 +--- a/src/ucil_gstreamer.c ++++ b/src/ucil_gstreamer.c +@@ -269,18 +269,6 @@ static void destroy_vobj( ucil_gstreamer_video_file_object_t *vobj ) + g_free( vobj ); + } + +-static void parse_ogg_theora_parameters( GstElement *encoder, ucil_gstreamer_video_file_object_t *vobj, guint n_parameters, GParameter *parameters ) +-{ +- int i; +- for( i = 0; i < n_parameters; i++ ){ +- if( !strcmp( parameters[i].name, "quality" ) ){ +- g_object_set( encoder, "quality", g_value_get_int( ¶meters[i].value ), NULL ); +- } else if ( !strcmp( parameters[i].name, "bitrate" ) ){ +- g_object_set( encoder, "bitrate", g_value_get_int( ¶meters[i].value ), NULL ); +- } +- } +-} +- + static void parse_parameters( ucil_gstreamer_video_file_object_t *vobj, guint n_parameters, GParameter *parameters ) + { + int i; +diff --git a/src/ucil_ppm.c b/src/ucil_ppm.c +index f02240a..c536d3e 100644 +--- a/src/ucil_ppm.c ++++ b/src/ucil_ppm.c +@@ -1,6 +1,7 @@ + #include "ucil.h" + #include "ucil_private.h" + ++#include + #include + #include + #include +diff --git a/src/ucil_rawavi.c b/src/ucil_rawavi.c +index 8b6f7b4..de25da5 100644 +--- a/src/ucil_rawavi.c ++++ b/src/ucil_rawavi.c +@@ -77,7 +77,6 @@ struct _ucil_rawavi_video_file_object + #define AVI_PAD_SIZE 4096 + + static void avi_add_chunk( avi_buffer_t *buffer, __u32 fourcc, __u32 size, __u8 *data ); +-static __u32 avi_add_list_hdr( avi_buffer_t *buffer, __u32 fourcc, __u32 size ); + static __u32 avi_add_chunk_hdr( avi_buffer_t *buffer, __u32 fourcc, __u32 size ); + static void avi_list_pad( avi_buffer_t *list, int offset, int padding ); + static int avi_write_buffer( FILE *f, avi_buffer_t *buffer ); +@@ -137,7 +136,6 @@ static void *ucil_rawavi_encode_thread( ucil_rawavi_video_file_object_t *vobj ) + static int write_avi_header( FILE *f ) + { + __u32 hdr[3]; +- int res = 0; + + hdr[0] = UCIL_FOURCC( 'R', 'I', 'F', 'F'); + hdr[1] = 0; +@@ -229,33 +227,6 @@ static void avi_list_pad( avi_buffer_t *list, int offset, int padding ) + } + + +-static __u32 avi_add_list_hdr( avi_buffer_t *buffer, __u32 fourcc, __u32 size ) +-{ +- avi_list_t list; +- __u32 ret; +- +- list.dwList = UCIL_FOURCC( 'L', 'I', 'S', 'T' ); +- list.dwSize = size + 4; +- list.dwFourCC = fourcc; +- +- if( buffer->dwBufferSize < ( buffer->dwPtr + sizeof( list ) ) ) +- { +- __u8 *tmp; +- +- tmp = malloc( buffer->dwPtr + sizeof( list ) ); +- memcpy( tmp, buffer->bData, buffer->dwPtr ); +- free( buffer->bData ); +- buffer->bData = tmp; +- buffer->dwBufferSize = buffer->dwPtr + sizeof( list ); +- } +- +- memcpy( buffer->bData + buffer->dwPtr, &list, sizeof( list ) ); +- ret = buffer->dwPtr; +- buffer->dwPtr += sizeof( list ); +- +- return ret; +-} +- + static int avi_write_list_hdr( FILE *f, __u32 fourcc, __u32 size ) + { + avi_list_t list; +diff --git a/src/ucil_theora.c b/src/ucil_theora.c +index e2d00ef..bf95004 100644 +--- a/src/ucil_theora.c ++++ b/src/ucil_theora.c +@@ -947,286 +947,6 @@ static void *ucil_theora_encode_thread( ucil_theora_video_file_object_t *vobj ) + return NULL; + } + +-static void copy_yuv( unsigned char *dst, yuv_buffer *yuv, theora_info *ti ) +-{ +- int y; +- unsigned char *yoff; +- unsigned char *uvoff; +- unsigned char *dstoff; +- int crop_offset; +- +- dstoff = dst; +- crop_offset = ti->offset_x + yuv->y_stride * ti->offset_y; +- yoff = yuv->y + crop_offset; +- +- for( y = 0; y < yuv->y_height; y++ ) +- { +- memcpy( dstoff, yoff, yuv->y_width ); +- dstoff += yuv->y_width; +- yoff += yuv->y_stride; +- } +- +- crop_offset = ( ti->offset_x / 2 ) + ( yuv->uv_stride ) * ( ti->offset_y / 2 ); +- uvoff = yuv->u + crop_offset; +- +- for( y = 0; y < yuv->uv_height; y++ ) +- { +- memcpy( dstoff, uvoff, yuv->uv_width ); +- dstoff += yuv->uv_width; +- uvoff += yuv->uv_stride; +- } +- +- uvoff = yuv->v; +- +- for( y = 0; y < yuv->uv_height; y++ ) +- { +- memcpy( dstoff, uvoff, yuv->uv_width ); +- dstoff += yuv->uv_width; +- uvoff += yuv->uv_stride; +- } +-} +- +-// Video Playback disabled - see ucview_videoplay_plugin on how to play back video files +-#if 0 +- +-static void *ucil_theora_worker_thread( ucil_theora_input_file_object_t *vobj ) +-{ +- unicap_data_buffer_t new_frame_buffer; +- +- struct timeval ltime; +- int eos = 0; +- +- unicap_copy_format( &new_frame_buffer.format, &vobj->format ); +- new_frame_buffer.type = UNICAP_BUFFER_TYPE_SYSTEM; +- new_frame_buffer.buffer_size = new_frame_buffer.format.buffer_size; +- new_frame_buffer.data = malloc( new_frame_buffer.format.buffer_size ); +- +- gettimeofday( <ime, NULL ); +- +- while( !vobj->quit_capture_thread ) +- { +- struct timespec abs_timeout; +- struct timeval ctime; +- GList *entry; +- ogg_page og; +- ogg_packet op; +- size_t bytes; +- +- int buffer_ready = 0; +- +- +- +- if( !eos && ( ogg_stream_packetout( &vobj->os, &op ) > 0 ) ) +- { +- yuv_buffer yuv; +- +- theora_decode_packetin( &vobj->th, &op ); +- theora_decode_YUVout( &vobj->th, &yuv ); +- copy_yuv( new_frame_buffer.data, &yuv, &vobj->ti ); +- +- buffer_ready = 1; +- } +- else if( !eos ) +- { +- bytes = buffer_data( vobj->f, &vobj->oy ); +- if( !bytes ) +- { +- TRACE( "End of stream\n" ); +- eos = 1; +- +- } +- +- while( ogg_sync_pageout( &vobj->oy, &og ) > 0 ) +- { +- ogg_stream_pagein( &vobj->os, &og ); +- } +- continue; +- } +- else +- { +- buffer_ready = 1; +- } +- +- gettimeofday( &ctime, NULL ); +- abs_timeout.tv_sec = ctime.tv_sec + 1; +- abs_timeout.tv_nsec = ctime.tv_usec * 1000; +- if( sem_timedwait( &vobj->sema, &abs_timeout ) ) +- { +- TRACE( "SEM_WAIT FAILED\n" ); +- continue; +- } +- +- if( buffer_ready && vobj->event_callback ) +- { +- vobj->event_callback( vobj->event_unicap_handle, UNICAP_EVENT_NEW_FRAME, &new_frame_buffer ); +- TRACE( "New frame\n" ); +- } +- +- unicap_data_buffer_t *data_buffer = g_queue_pop_head( vobj->in_queue ); +- if( data_buffer ) +- { +- unicap_copy_format( &data_buffer->format, &vobj->format ); +- memcpy( data_buffer->data, new_frame_buffer.data, vobj->format.buffer_size ); +- +- g_queue_push_tail( vobj->out_queue, data_buffer ); +- } +- +- sem_post( &vobj->sema ); +- +- if( buffer_ready ) +- { +- gettimeofday( &ctime, NULL ); +- if( ctime.tv_usec < ltime.tv_usec ) +- { +- ctime.tv_usec += 1000000; +- ctime.tv_sec -= 1; +- } +- +- ctime.tv_usec -= ltime.tv_usec; +- ctime.tv_sec -= ltime.tv_sec; +- +- if( ( ctime.tv_sec == 0 ) && +- ( ctime.tv_usec < vobj->frame_intervall ) ) +- { +- usleep( vobj->frame_intervall - ctime.tv_usec ); +- } +- +- gettimeofday( <ime, NULL ); +- } +- } +- +- free( new_frame_buffer.data ); +- return NULL; +-} +- +- +-static unicap_status_t theoracpi_reenumerate_formats( ucil_theora_input_file_object_t vobj, int *count ) +-{ +- *count = 1; +- +- return STATUS_SUCCESS; +-} +- +-static unicap_status_t theoracpi_enumerate_formats( ucil_theora_input_file_object_t *vobj, unicap_format_t *format, int index ) +-{ +- unicap_status_t status = STATUS_NO_MATCH; +- if( index == 0 ) +- { +- unicap_copy_format( format, &vobj->format ); +- status = STATUS_SUCCESS; +- } +- +- return status; +-} +- +-static unicap_status_t theoracpi_set_format( ucil_theora_input_file_object_t *vobj, unicap_format_t *format ) +-{ +- unicap_status_t status = STATUS_SUCCESS; +- if( ( format->size.width != vobj->format.size.width ) || +- ( format->size.height != vobj->format.size.height ) || +- ( format->bpp != vobj->format.bpp ) ) +- { +- char buffer[1024]; +- size_t size = 1024; +- +- unicap_describe_format( format, buffer, &size ); +- TRACE( "Could not set format: %s\n", buffer ); +- size = 1024; +- unicap_describe_format( &vobj->format, buffer, &size ); +- TRACE( "Stored: %s\n" ); +- status = STATUS_FAILURE; +- } +- +- return status; +-} +- +-static unicap_status_t theoracpi_get_format( ucil_theora_input_file_object_t *vobj, unicap_format_t *format ) +-{ +- unicap_copy_format( format, &vobj->format ); +- return STATUS_SUCCESS; +-} +- +-static unicap_status_t theoracpi_reenumerate_properties( ucil_theora_input_file_object_t *vobj, int *count ) +-{ +- *count = 0; +- return STATUS_SUCCESS; +-} +- +-static unicap_status_t theoracpi_enumerate_properties( ucil_theora_input_file_object_t *vobj, unicap_property_t *property, int index ) +-{ +- return STATUS_NO_MATCH; +-} +- +-static unicap_status_t theoracpi_set_property( ucil_theora_input_file_object_t *vobj, unicap_property_t *property ) +-{ +- return STATUS_FAILURE; +-} +- +-static unicap_status_t theoracpi_get_property( ucil_theora_input_file_object_t *vobj, unicap_property_t *property ) +-{ +- return STATUS_FAILURE; +-} +- +-static unicap_status_t theoracpi_capture_start( ucil_theora_input_file_object_t *vobj ) +-{ +- unicap_status_t status = STATUS_SUCCESS; +- +- if( pthread_create( &vobj->worker_thread, NULL, (void*(*)(void*))ucil_theora_worker_thread, vobj ) ) +- { +- TRACE( "Failed to create worker thread!\n" ); +- return STATUS_FAILURE; +- } +- +- return status; +-} +- +-static unicap_status_t theoracpi_capture_stop( ucil_theora_input_file_object_t *vobj ) +-{ +- int res; +- +- vobj->quit_capture_thread = 1; +- res = pthread_join( vobj->worker_thread, NULL ); +- +- return ( res == 0 ) ? STATUS_SUCCESS : STATUS_FAILURE; +-} +- +-static unicap_status_t theoracpi_queue_buffer( ucil_theora_input_file_object_t *vobj, unicap_data_buffer_t *buffer ) +-{ +- unicap_status_t status = STATUS_SUCCESS; +- +- g_queue_push_tail( vobj->in_queue, buffer ); +- +- return status; +-} +- +-static unicap_status_t theoracpi_dequeue_buffer( ucil_theora_input_file_object_t *vobj, unicap_data_buffer_t **buffer ) +-{ +- unicap_status_t status = STATUS_SUCCESS; +- return status; +-} +- +-static unicap_status_t theoracpi_wait_buffer( ucil_theora_input_file_object_t *vobj, unicap_data_buffer_t **buffer ) +-{ +- unicap_status_t status = STATUS_SUCCESS; +- return status; +-} +- +-static unicap_status_t theoracpi_poll_buffer( ucil_theora_input_file_object_t *vobj, int *count ) +-{ +- *count = 1; +- return STATUS_SUCCESS; +-} +- +-static unicap_status_t theoracpi_set_event_notify( ucil_theora_input_file_object_t *vobj, unicap_event_callback_t func, unicap_handle_t handle ) +-{ +- vobj->event_callback = func; +- vobj->event_unicap_handle = handle; +- +- return STATUS_SUCCESS; +-} +- +-#endif +- + static void encode_parse_parameters( ucil_theora_video_file_object_t *vobj, guint n_parameters, GParameter *parameters ) + { + int i; +diff --git a/src/video_file.c b/src/video_file.c +index 9c9a3f1..547a3dc 100644 +--- a/src/video_file.c ++++ b/src/video_file.c +@@ -38,7 +38,6 @@ + + + #define MAX_CODECS 8 +-static gboolean ucil_video_is_initialized = FALSE; + + struct video_codec_cpi { + const gchar ** codec_names; +@@ -158,7 +157,6 @@ static enum ucil_codec_id get_codec_id( const char *codec ) + + for (id = 0; id < sizeof(codecs) / sizeof(video_codec_cpi); id ++) + { +- gboolean found = FALSE; + int i; + + for( i = 0; codecs[id].codec_names[i] != NULL; i++ ){ +@@ -171,12 +169,6 @@ static enum ucil_codec_id get_codec_id( const char *codec ) + } + + +-static void ucil_video_initialize( void ) +-{ +-/* load_vcp_modules(); */ +-} +- +- + ucil_video_file_object_t *ucil_create_video_filev( const char *path, unicap_format_t *format, const char *codec, + guint n_parameters, GParameter *parameters ) + { diff --git a/libucil.spec b/libucil.spec index a55a85d..2cafc4b 100644 --- a/libucil.spec +++ b/libucil.spec @@ -1,7 +1,7 @@ Summary: Library to render text and graphic overlays onto video images Name: libucil Version: 0.9.10 -Release: 1%{?dist} +Release: 2%{?dist} License: GPLv2+ Group: System Environment/Libraries URL: http://www.unicap-imaging.org/ @@ -10,6 +10,12 @@ Source0: http://www.unicap-imaging.org/downloads/%{name}-%{version}.tar.gz # check return value of theora_encode_init() (#627890) Patch0: libucil-0.9.8-bz627890.patch +# fix some memory leaks +Patch1: libucil-0.9.10-leaks.patch + +# fix some compile-time warnings +Patch2: libucil-0.9.10-warnings.patch + BuildRequires: intltool, /usr/bin/perl, perl(XML::Parser), gettext, gtk-doc >= 1.4 BuildRequires: libunicap-devel, glib2-devel, pango-devel, alsa-lib-devel BuildRequires: libtheora-devel, libogg-devel, libvorbis-devel, libpng-devel @@ -36,6 +42,8 @@ documentation of the library, too. %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 %build %configure --disable-rpath --enable-gtk-doc @@ -68,7 +76,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/gtk-doc/html/%{name} %changelog -* Mon Oct 04 2020 Robert Scheck 0.9.10-1 +* Wed Oct 06 2010 Kamil Dudka 0.9.10-2 +- fix some memory leaks and compile-time warnings + +* Mon Oct 04 2010 Robert Scheck 0.9.10-1 - Upgrade to 0.9.10 * Wed Sep 29 2010 Jesse Keating 0.9.8-6