You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vlc/vlc-1.0-bugfix-20090602.patch

1097 lines
40 KiB

diff --git a/include/vlc_url.h b/include/vlc_url.h
index 448c685..e5b29eb 100644
--- a/include/vlc_url.h
+++ b/include/vlc_url.h
@@ -45,8 +45,6 @@ struct vlc_url_t
char *psz_buffer; /* to be freed */
};
-VLC_EXPORT( char *, unescape_URI_duplicate, ( const char *psz ) );
-VLC_EXPORT( void, unescape_URI, ( char *psz ) );
VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) );
VLC_EXPORT( char *, decode_URI, ( char *psz ) );
VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) );
diff --git a/modules/access/directory.c b/modules/access/directory.c
index 05b6ec1..dd04b6a 100644
--- a/modules/access/directory.c
+++ b/modules/access/directory.c
@@ -307,6 +307,7 @@ static block_t *Block (access_t *p_access)
{ /* End of directory, go back to parent */
closedir (current->handle);
p_sys->current = current->parent;
+ free (current->uri);
free (current);
if (p_sys->current == NULL)
@@ -346,14 +347,20 @@ static block_t *Block (access_t *p_access)
/* Skip current, parent and hidden directories */
if (entry[0] == '.')
+ {
+ free (entry);
return NULL;
+ }
/* Handle recursion */
if (p_sys->mode != MODE_COLLAPSE)
{
directory_t *sub = malloc (sizeof (*sub) + strlen (current->path) + 1
+ strlen (entry));
if (sub == NULL)
+ {
+ free (entry);
return NULL;
+ }
sprintf (sub->path, "%s/%s", current->path, entry);
DIR *handle = utf8_opendir (sub->path);
@@ -373,7 +380,9 @@ static block_t *Block (access_t *p_access)
|| has_inode_loop (sub)
|| (sub->uri == NULL))
{
+ free (entry);
closedir (handle);
+ free (sub->uri);
free (sub);
return NULL;
}
@@ -382,9 +391,13 @@ static block_t *Block (access_t *p_access)
/* Add node to xspf extension */
char *old_xspf_extension = p_sys->psz_xspf_extension;
if (old_xspf_extension == NULL)
+ {
+ free (entry);
goto fatal;
+ }
char *title = convert_xml_special_chars (entry);
+ free (entry);
if (title == NULL
|| asprintf (&p_sys->psz_xspf_extension, "%s"
" <vlc:node title=\"%s\">\n", old_xspf_extension,
@@ -417,7 +430,10 @@ static block_t *Block (access_t *p_access)
if (type + extlen == end
&& !strncasecmp (ext, type, extlen))
+ {
+ free (entry);
return NULL;
+ }
if (*end == '\0')
break;
diff --git a/modules/access/qtcapture.m b/modules/access/qtcapture.m
index 088378f..a94f7d2 100644
--- a/modules/access/qtcapture.m
+++ b/modules/access/qtcapture.m
@@ -173,6 +173,7 @@ static int qtchroma_to_fourcc( int i_qt )
/* Raw data types */
{ k422YpCbCr8CodecType, VLC_FOURCC('U','Y','V','Y') },
{ kComponentVideoCodecType,VLC_FOURCC('Y','U','Y','2') },
+ { kComponentVideoUnsigned, VLC_FOURCC('U','Y','V','Y') },
{ 0, 0 }
};
int i;
diff --git a/modules/audio_filter/equalizer.c b/modules/audio_filter/equalizer.c
index 33b6469..ed9df4d 100644
--- a/modules/audio_filter/equalizer.c
+++ b/modules/audio_filter/equalizer.c
@@ -531,6 +531,7 @@ static int PresetCallback( vlc_object_t *p_this, char const *psz_cmd,
free( psz_newbands );
return VLC_ENOMEM;
}
+ free( psz_newbands );
psz_newbands = psz;
}
if( p_sys->b_first == false )
diff --git a/modules/audio_output/auhal.c b/modules/audio_output/auhal.c
index 1effe5b..58b25f0 100644
--- a/modules/audio_output/auhal.c
+++ b/modules/audio_output/auhal.c
@@ -993,6 +993,7 @@ static void Probe( aout_instance_t * p_aout )
if( !AudioDeviceHasOutput( p_devices[i]) )
{
msg_Dbg( p_aout, "this device is INPUT only. skipping..." );
+ free( psz_name );
continue;
}
diff --git a/modules/codec/invmem.c b/modules/codec/invmem.c
index d672ecb..e8490b7 100644
--- a/modules/codec/invmem.c
+++ b/modules/codec/invmem.c
@@ -191,7 +191,6 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( p_sys->p_pic != NULL )
picture_Release( p_sys->p_pic );
p_sys->p_pic = decoder_NewPicture( p_dec );
- p_sys->p_pic = p_dec->pf_vout_buffer_new( p_dec );
p_sys->p_pic->b_force = true;
p_sys->p_pic->p->i_pitch = p_dec->p_sys->i_pitch;
p_sys->p_pic->date = p_block->i_pts > 0 ? p_block->i_pts : p_block->i_dts;
diff --git a/modules/codec/x264.c b/modules/codec/x264.c
index 5004c2c..5602962 100644
--- a/modules/codec/x264.c
+++ b/modules/codec/x264.c
@@ -803,6 +803,7 @@ static int Open ( vlc_object_t *p_this )
return VLC_ENOMEM;
p_sys->i_interpolated_dts = 0;
p_sys->psz_stat_name = NULL;
+ p_sys->p_buffer = NULL;
x264_param_default( &p_sys->param );
p_sys->param.i_width = p_enc->fmt_in.video.i_width;
@@ -1304,6 +1305,13 @@ static int Open ( vlc_object_t *p_this )
/* Open the encoder */
p_sys->h = x264_encoder_open( &p_sys->param );
+ if( p_sys->h == NULL )
+ {
+ msg_Err( p_enc, "cannot open x264 encoder" );
+ Close( VLC_OBJECT(p_enc) );
+ return VLC_EGENERIC;
+ }
+
/* alloc mem */
p_sys->i_buffer = 4 * p_enc->fmt_in.video.i_width *
p_enc->fmt_in.video.i_height + 1000;
@@ -1440,7 +1448,8 @@ static void Close( vlc_object_t *p_this )
free( p_sys->psz_stat_name );
- x264_encoder_close( p_sys->h );
+ if( p_sys->h )
+ x264_encoder_close( p_sys->h );
#ifdef PTW32_STATIC_LIB
vlc_value_t lock, count;
diff --git a/modules/control/dbus.c b/modules/control/dbus.c
index 2753140..5704672 100644
--- a/modules/control/dbus.c
+++ b/modules/control/dbus.c
@@ -32,7 +32,7 @@
* extract:
* "If you use this low-level API directly, you're signing up for some pain."
*
- * MPRIS Specification (still drafting on Jan, 23 of 2008):
+ * MPRIS Specification version 1.0
* http://wiki.xmms2.xmms.se/index.php/MPRIS
*/
@@ -73,7 +73,7 @@ static int TrackListChangeEmit( intf_thread_t *, int, int );
static int AllCallback( vlc_object_t*, const char*, vlc_value_t, vlc_value_t, void* );
static int GetInputMeta ( input_item_t *, DBusMessageIter * );
-static int MarshalStatus ( intf_thread_t *, DBusMessageIter *, bool );
+static int MarshalStatus ( intf_thread_t *, DBusMessageIter * );
static int UpdateCaps( intf_thread_t* );
/* GetCaps() capabilities */
@@ -222,7 +222,7 @@ DBUS_METHOD( PositionSet )
if( p_input )
{
- position.i_time = i_pos * 1000;
+ position.i_time = ((mtime_t)i_pos) * 1000;
var_Set( p_input, "time", position );
vlc_object_release( p_input );
}
@@ -311,7 +311,7 @@ DBUS_METHOD( GetStatus )
REPLY_INIT;
OUT_ARGUMENTS;
- MarshalStatus( p_this, &args, true );
+ MarshalStatus( p_this, &args );
REPLY_SEND;
}
@@ -838,12 +838,28 @@ static void Run ( intf_thread_t *p_intf )
int canc = vlc_savecancel();
dbus_connection_read_write_dispatch( p_intf->p_sys->p_conn, 0 );
- // Get the messages
+ /* Get the list of events to process
+ *
+ * We can't keep the lock on p_intf->p_sys->p_events, else we risk a
+ * deadlock:
+ * The signal functions could lock mutex X while p_events is locked;
+ * While some other function in vlc (playlist) might lock mutex X
+ * and then set a variable which would call AllCallback(), which itself
+ * needs to lock p_events to add a new event.
+ */
vlc_mutex_lock( &p_intf->p_sys->lock );
- for( int i = vlc_array_count( p_intf->p_sys->p_events ) - 1; i >= 0; i-- )
+ int i_events = vlc_array_count( p_intf->p_sys->p_events );
+ callback_info_t* info[i_events];
+ for( int i = i_events - 1; i >= 0; i-- )
{
- callback_info_t* info = vlc_array_item_at_index( p_intf->p_sys->p_events, i );
- switch( info->signal )
+ info[i] = vlc_array_item_at_index( p_intf->p_sys->p_events, i );
+ vlc_array_remove( p_intf->p_sys->p_events, i );
+ }
+ vlc_mutex_unlock( &p_intf->p_sys->lock );
+
+ for( int i = 0; i < i_events; i++ )
+ {
+ switch( info[i]->signal )
{
case SIGNAL_ITEM_CURRENT:
TrackChange( p_intf );
@@ -851,7 +867,7 @@ static void Run ( intf_thread_t *p_intf )
case SIGNAL_INTF_CHANGE:
case SIGNAL_PLAYLIST_ITEM_APPEND:
case SIGNAL_PLAYLIST_ITEM_DELETED:
- TrackListChangeEmit( p_intf, info->signal, info->i_node );
+ TrackListChangeEmit( p_intf, info[i]->signal, info[i]->i_node );
break;
case SIGNAL_RANDOM:
case SIGNAL_REPEAT:
@@ -859,15 +875,13 @@ static void Run ( intf_thread_t *p_intf )
StatusChangeEmit( p_intf );
break;
case SIGNAL_STATE:
- StateChange( p_intf, info->i_input_state );
+ StateChange( p_intf, info[i]->i_input_state );
break;
default:
assert(0);
}
- free( info );
- vlc_array_remove( p_intf->p_sys->p_events, i );
+ free( info[i] );
}
- vlc_mutex_unlock( &p_intf->p_sys->lock );
vlc_restorecancel( canc );
}
}
@@ -931,7 +945,7 @@ DBUS_SIGNAL( CapsChangeSignal )
}
/******************************************************************************
- * TrackListChange: tracklist order / length change signal
+ * TrackListChange: tracklist order / length change signal
*****************************************************************************/
DBUS_SIGNAL( TrackListChangeSignal )
{ /* emit the new tracklist lengh */
@@ -1005,7 +1019,7 @@ DBUS_SIGNAL( StatusChangeSignal )
/* we're called from a callback of input_thread_t, so it can not be
* destroyed before we return */
- MarshalStatus( (intf_thread_t*) p_data, &args, false );
+ MarshalStatus( (intf_thread_t*) p_data, &args );
SIGNAL_SEND;
}
@@ -1119,7 +1133,7 @@ static int UpdateCaps( intf_thread_t* p_intf )
intf_sys_t* p_sys = p_intf->p_sys;
dbus_int32_t i_caps = CAPS_CAN_HAS_TRACKLIST;
playlist_t* p_playlist = pl_Hold( p_intf );
-
+
PL_LOCK;
if( p_playlist->current.i_size > 0 )
i_caps |= CAPS_CAN_PLAY | CAPS_CAN_GO_PREV | CAPS_CAN_GO_NEXT;
@@ -1233,8 +1247,7 @@ static int GetInputMeta( input_item_t* p_input,
* MarshalStatus: Fill a DBusMessage with the current player status
*****************************************************************************/
-static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args,
- bool lock )
+static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args )
{ /* This is NOT the right way to do that, it would be better to sore
the status information in p_sys and update it on change, thus
avoiding a long lock */
diff --git a/modules/control/http/http.c b/modules/control/http/http.c
index 75f24c2..6987029 100644
--- a/modules/control/http/http.c
+++ b/modules/control/http/http.c
@@ -27,6 +27,7 @@
#include "http.h"
#include <vlc_plugin.h>
+#include <vlc_url.h>
#include <assert.h>
@@ -787,7 +788,8 @@ int ArtCallback( httpd_handler_sys_t *p_args,
psz_art = input_item_GetArtURL( p_item );
}
- if( psz_art && !strncmp( psz_art, "file://", strlen( "file://" ) ) )
+ if( psz_art && !strncmp( psz_art, "file://", strlen( "file://" ) ) &&
+ decode_URI( psz_art + 7 ) )
{
FILE *f;
char *psz_ext;
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index f6b9f69..a66d090 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -42,7 +42,7 @@ static void Close( vlc_object_t * );
vlc_module_begin ()
set_shortname( "Matroska" )
set_description( N_("Matroska stream demuxer" ) )
- set_capability( "demux", 0 )
+ set_capability( "demux", 50 )
set_callbacks( Open, Close )
set_category( CAT_INPUT )
set_subcategory( SUBCAT_INPUT_DEMUX )
diff --git a/modules/demux/playlist/xspf.c b/modules/demux/playlist/xspf.c
index ed1ed92..eee5b85 100644
--- a/modules/demux/playlist/xspf.c
+++ b/modules/demux/playlist/xspf.c
@@ -546,32 +546,31 @@ static bool parse_track_node COMPLEX_INTERFACE
/* special case: location */
if( !strcmp( p_handler->name, "location" ) )
{
- char *psz_uri = NULL;
- psz_uri = decode_URI_duplicate( psz_value );
+ char *psz_location = psz_value;
+ if( !strncmp( psz_value, "file://", 7 ) )
+ psz_location = decode_URI( psz_value + 7 );
- if( !psz_uri )
+ if( !psz_location )
{
FREE_ATT();
return false;
}
- if( p_demux->p_sys->psz_base && !strstr( psz_uri, "://" ) )
+ if( p_demux->p_sys->psz_base && !strstr( psz_value, "://" ) )
{
char* psz_tmp;
if( asprintf( &psz_tmp, "%s%s", p_demux->p_sys->psz_base,
- psz_uri ) == -1 )
+ psz_location ) == -1 )
{
- free( psz_uri );
FREE_ATT();
return NULL;
}
- free( psz_uri );
- psz_uri = psz_tmp;
+ input_item_SetURI( p_new_input, psz_tmp );
+ free( psz_tmp );
}
- input_item_SetURI( p_new_input, psz_uri );
- free( psz_uri );
+ else
+ input_item_SetURI( p_new_input, psz_location );
input_item_CopyOptions( p_input_item, p_new_input );
- psz_uri = NULL;
FREE_ATT();
p_handler = NULL;
}
@@ -652,9 +651,7 @@ static bool set_item_info SIMPLE_INTERFACE
}
else if( !strcmp( psz_name, "image" ) )
{
- char *psz_uri = decode_URI_duplicate( psz_value );
- input_item_SetArtURL( p_input, psz_uri );
- free( psz_uri );
+ input_item_SetArtURL( p_input, psz_value );
}
return true;
}
diff --git a/modules/demux/vobsub.c b/modules/demux/vobsub.c
index 3b90e2d..bb0a47e 100644
--- a/modules/demux/vobsub.c
+++ b/modules/demux/vobsub.c
@@ -537,7 +537,7 @@ static int ParseVobSubIDX( demux_t *p_demux )
}
else if( !strncmp( "id:", line, 3 ) )
{
- char language[20];
+ char language[3];
int i_track_id;
es_format_t fmt;
@@ -547,6 +547,7 @@ static int ParseVobSubIDX( demux_t *p_demux )
{
p_sys->i_tracks++;
p_sys->track = realloc( p_sys->track, sizeof( vobsub_track_t ) * (p_sys->i_tracks + 1 ) );
+ language[2] = '\0';
/* Init the track */
current_tk = &p_sys->track[p_sys->i_tracks - 1];
@@ -560,7 +561,7 @@ static int ParseVobSubIDX( demux_t *p_demux )
es_format_Init( &fmt, SPU_ES, VLC_FOURCC( 's','p','u',' ' ) );
fmt.subs.spu.i_original_frame_width = p_sys->i_original_frame_width;
fmt.subs.spu.i_original_frame_height = p_sys->i_original_frame_height;
- fmt.psz_language = strdup( language );
+ fmt.psz_language = language;
if( p_sys->b_palette )
{
fmt.subs.spu.palette[0] = 0xBeef;
diff --git a/modules/gui/qt4/components/extended_panels.cpp b/modules/gui/qt4/components/extended_panels.cpp
index 464c27f..cf4d0cc 100644
--- a/modules/gui/qt4/components/extended_panels.cpp
+++ b/modules/gui/qt4/components/extended_panels.cpp
@@ -1340,7 +1340,7 @@ SyncControls::SyncControls( intf_thread_t *_p_intf, QWidget *_parent ) :
QLabel *subSpeedLabel = new QLabel;
subSpeedLabel->setText( qtr( "Speed of the subtitles:" ) );
- subsLayout->addWidget( subSpeedLabel, 1, 0, 1, 3 );
+ subsLayout->addWidget( subSpeedLabel, 1, 0, 1, 1 );
subSpeedSpin = new QDoubleSpinBox;
subSpeedSpin->setAlignment( Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter );
diff --git a/modules/gui/qt4/components/sout/profile_selector.cpp b/modules/gui/qt4/components/sout/profile_selector.cpp
index 7c47163..3ebaa66 100644
--- a/modules/gui/qt4/components/sout/profile_selector.cpp
+++ b/modules/gui/qt4/components/sout/profile_selector.cpp
@@ -331,7 +331,7 @@ void VLCProfileEditor::fillProfile( const QString& qs )
CHECKMUX( FLVMux, "flv" )
CHECKMUX( MKVMux, "mkv" )
CHECKMUX( AVIMux, "avi" )
- CHECKMUX( MJPEGMux, "mjpg" ){}
+ CHECKMUX( MJPEGMux, "mpjpeg" ){}
#undef CHECKMUX
ui.keepVideo->setChecked( !options[1].toInt() );
@@ -420,7 +420,7 @@ QString VLCProfileEditor::transcodeValue()
SMUX( FLVMux, "flv" )
SMUX( MKVMux, "mkv" )
SMUX( AVIMux, "avi" )
- SMUX( MJPEGMux, "mjpg" ){}
+ SMUX( MJPEGMux, "mpjpeg" ){}
#undef SMUX
#define currentData( box ) box->itemData( box->currentIndex() )
diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp
index 0b456ad..1fc1f49 100644
--- a/modules/gui/qt4/input_manager.cpp
+++ b/modules/gui/qt4/input_manager.cpp
@@ -29,6 +29,7 @@
#include "input_manager.hpp"
#include <vlc_keys.h>
+#include <vlc_url.h>
#include <QApplication>
@@ -589,12 +590,12 @@ void InputManager::UpdateArt()
if( hasInput() )
{
char *psz_art = input_item_GetArtURL( input_GetItem( p_input ) );
- url = qfu( psz_art );
+ if( psz_art && !strncmp( psz_art, "file://", 7 ) &&
+ decode_URI( psz_art + 7 ) )
+ url = qfu( psz_art + 7);
free( psz_art );
}
- url = url.replace( "file://", QString("" ) );
- /* Taglib seems to define a attachment://, It won't work yet */
- url = url.replace( "attachment://", QString("" ) );
+
/* Update Art meta */
emit artChanged( url );
}
diff --git a/modules/meta_engine/folder.c b/modules/meta_engine/folder.c
index 4d41b0a..5a0c3a0 100644
--- a/modules/meta_engine/folder.c
+++ b/modules/meta_engine/folder.c
@@ -33,6 +33,7 @@
#include <vlc_plugin.h>
#include <vlc_playlist.h>
#include <vlc_charset.h>
+#include <vlc_url.h>
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
@@ -98,26 +99,31 @@ static int FindMeta( vlc_object_t *p_this )
case 0:
/* Windows Folder.jpg */
snprintf( psz_filename, MAX_PATH,
- "file://%sFolder.jpg", psz_path );
+ "%sFolder.jpg", psz_path );
break;
case 1:
/* Windows AlbumArtSmall.jpg == small version of Folder.jpg */
snprintf( psz_filename, MAX_PATH,
- "file://%sAlbumArtSmall.jpg", psz_path );
+ "%sAlbumArtSmall.jpg", psz_path );
break;
case 2:
/* KDE (?) .folder.png */
snprintf( psz_filename, MAX_PATH,
- "file://%s.folder.png", psz_path );
+ "%s.folder.png", psz_path );
break;
}
- if( utf8_stat( psz_filename+7, &a ) != -1 )
+ if( utf8_stat( psz_filename, &a ) != -1 )
{
- input_item_SetArtURL( p_item, psz_filename );
- b_have_art = true;
+ char *psz_uri = make_URI( psz_filename );
+ if( psz_uri )
+ {
+ input_item_SetArtURL( p_item, psz_uri );
+ free( psz_uri );
+ b_have_art = true;
+ }
}
}
diff --git a/modules/misc/notify/growl.m b/modules/misc/notify/growl.m
index c0503b0..95ad205 100644
--- a/modules/misc/notify/growl.m
+++ b/modules/misc/notify/growl.m
@@ -58,6 +58,7 @@
#include <vlc_playlist.h>
#include <vlc_meta.h>
#include <vlc_interface.h>
+#include <vlc_url.h>
/*****************************************************************************
@@ -210,7 +211,7 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
char *psz_arturl = input_item_GetArtURL( p_item );
CFDataRef art = NULL;
if( psz_arturl && !strncmp( psz_arturl, "file://", 7 ) &&
- strlen( psz_arturl ) > 7 )
+ decode_URI( psz_arturl + 7 ) )
art = (CFDataRef) readFile( psz_arturl + 7 );
free( psz_title );
diff --git a/modules/misc/notify/notify.c b/modules/misc/notify/notify.c
index 6b3be7c..6fa084a 100644
--- a/modules/misc/notify/notify.c
+++ b/modules/misc/notify/notify.c
@@ -32,6 +32,7 @@
#include <vlc_plugin.h>
#include <vlc_interface.h>
#include <vlc_playlist.h>
+#include <vlc_url.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <libnotify/notify.h>
@@ -221,12 +222,11 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
vlc_object_release( p_input );
if( psz_arturl && !strncmp( psz_arturl, "file://", 7 ) &&
- strlen( psz_arturl ) > 7 )
+ decode_URI( psz_arturl + 7 ) )
{ /* scale the art to show it in notify popup */
GError *p_error = NULL;
pix = gdk_pixbuf_new_from_file_at_scale( &psz_arturl[7],
72, 72, TRUE, &p_error );
- free( psz_arturl );
}
else /* else we show state-of-the art logo */
{
@@ -239,6 +239,8 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
}
}
+ free( psz_arturl );
+
/* we need to replace '&' with '&amp;' because '&' is a keyword of
* notification-daemon parser */
const int i_len = strlen( psz_tmp );
diff --git a/modules/misc/playlist/xspf.c b/modules/misc/playlist/xspf.c
index 0f5f82c..6765adb 100644
--- a/modules/misc/playlist/xspf.c
+++ b/modules/misc/playlist/xspf.c
@@ -212,9 +212,7 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
if( psz == NULL ) psz = strdup( "" );
if( !EMPTY_STR( psz ) )
{
- psz_uri = make_URI( psz );
- fprintf( p_file, "\t\t\t<image>%s</image>\n", psz_uri );
- free( psz_uri );
+ fprintf( p_file, "\t\t\t<image>%s</image>\n", psz );
}
free( psz );
diff --git a/modules/misc/quartztext.c b/modules/misc/quartztext.c
index a19c2a3..3a8c7db 100644
--- a/modules/misc/quartztext.c
+++ b/modules/misc/quartztext.c
@@ -749,7 +749,9 @@ static offscreen_bitmap_t *Compose( int i_text_align, UniChar *psz_utf16_str, ui
CGContextSetTextDrawingMode( p_context, kCGTextFillStroke );
CGContextSetShadow( p_context, CGSizeMake( 0, 0 ), 5 );
float black_components[4] = {0, 0, 0, 1};
- CGContextSetShadowWithColor (p_context, CGSizeMake( 0, 0 ), 5, CGColorCreate( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ), black_components ));
+ CGColorRef outlinecolor = CGColorCreate( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ), black_components );
+ CGContextSetShadowWithColor (p_context, CGSizeMake( 0, 0 ), 5, outlinecolor);
+ CGColorRelease( outlinecolor );
do
{
// ATSUBreakLine will automatically pick up any manual '\n's also
diff --git a/modules/stream_out/rtp.c b/modules/stream_out/rtp.c
index edd06c6..c4770f5 100644
--- a/modules/stream_out/rtp.c
+++ b/modules/stream_out/rtp.c
@@ -853,10 +853,8 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
* mux (TS/PS), then p_fmt is NULL. */
sout_stream_sys_t *p_sys = p_stream->p_sys;
sout_stream_id_t *id;
- int i_port, cscov = -1;
+ int cscov = -1;
char *psz_sdp;
- int i_port_audio_option = var_GetInteger( p_stream, "port-audio" );
- int i_port_video_option = var_GetInteger( p_stream, "port-video" );
if (0xffffffff == p_sys->payload_bitmap)
{
@@ -864,38 +862,41 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
return NULL;
}
- id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) );
- if( id == NULL )
- return NULL;
- vlc_object_attach( id, p_stream );
-
/* Choose the port */
- i_port = 0;
+ uint16_t i_port = 0;
if( p_fmt == NULL )
;
else
if( p_fmt->i_cat == AUDIO_ES && p_sys->i_port_audio > 0 )
- {
i_port = p_sys->i_port_audio;
- p_sys->i_port_audio = 0;
- }
else
if( p_fmt->i_cat == VIDEO_ES && p_sys->i_port_video > 0 )
- {
i_port = p_sys->i_port_video;
- p_sys->i_port_video = 0;
- }
- while( i_port == 0 )
+ /* We do not need the ES lock (p_sys->lock_es) here, because this is the
+ * only one thread that can *modify* the ES table. The ES lock protects
+ * the other threads from our modifications (TAB_APPEND, TAB_REMOVE). */
+ for (int i = 0; i_port && (i < p_sys->i_es); i++)
+ if (i_port == p_sys->es[i]->i_port)
+ i_port = 0; /* Port already in use! */
+ for (uint16_t p = p_sys->i_port; i_port == 0; p += 2)
{
- if( p_sys->i_port != i_port_audio_option
- && p_sys->i_port != i_port_video_option )
+ if (p == 0)
{
- i_port = p_sys->i_port;
+ msg_Err (p_stream, "too many RTP elementary streams");
+ return NULL;
}
- p_sys->i_port += 2;
+ i_port = p;
+ for (int i = 0; i_port && (i < p_sys->i_es); i++)
+ if (p == p_sys->es[i]->i_port)
+ i_port = 0;
}
+ id = vlc_object_create( p_stream, sizeof( sout_stream_id_t ) );
+ if( id == NULL )
+ return NULL;
+ vlc_object_attach( id, p_stream );
+
id->p_stream = p_stream;
/* Look for free dymanic payload type */
@@ -1311,11 +1312,6 @@ static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
TAB_REMOVE( p_sys->i_es, p_sys->es, id );
vlc_mutex_unlock( &p_sys->lock_es );
- /* Release port */
- if( id->i_port == var_GetInteger( p_stream, "port-audio" ) )
- p_sys->i_port_audio = id->i_port;
- if( id->i_port == var_GetInteger( p_stream, "port-video" ) )
- p_sys->i_port_video = id->i_port;
/* Release dynamic payload type */
if (id->i_payload_type >= 96)
p_sys->payload_bitmap &= ~(1 << (id->i_payload_type - 96));
diff --git a/share/lua/meta/10_googleimage.lua b/share/lua/meta/10_googleimage.lua
index e203c9c..8dc1e04 100644
--- a/share/lua/meta/10_googleimage.lua
+++ b/share/lua/meta/10_googleimage.lua
@@ -44,9 +44,5 @@ function fetch_art()
page = fd:read( 65653 )
fd = nil
_, _, arturl = string.find( page, "imgurl=([^&]+)" )
- if arturl then
- return vlc.strings.decode_uri(arturl)
- else
- return nil
- end
+ return arturl
end
diff --git a/share/lua/playlist/dailymotion.lua b/share/lua/playlist/dailymotion.lua
index e850bcf..f4545c6 100644
--- a/share/lua/playlist/dailymotion.lua
+++ b/share/lua/playlist/dailymotion.lua
@@ -41,7 +41,7 @@ function parse()
if not line then break end
if string.match( line, "param name=\"flashvars\" value=\".*video=" )
then
- arturl = vlc.strings.decode_uri( find( line, "param name=\"flashvars\" value=\".*preview=([^&]*)" ) )
+ arturl = find( line, "param name=\"flashvars\" value=\".*preview=([^&]*)" )
videos = vlc.strings.decode_uri( find( line, "param name=\"flashvars\" value=\".*video=([^&]*)" ) )
--[[ we get a list of different streams available, at various codecs
and resolutions:
diff --git a/share/lua/playlist/youtube.lua b/share/lua/playlist/youtube.lua
index 452400f..238d3eb 100644
--- a/share/lua/playlist/youtube.lua
+++ b/share/lua/playlist/youtube.lua
@@ -26,7 +26,7 @@ end
function get_arturl( path, video_id )
if string.match( vlc.path, "iurl=" ) then
- return vlc.strings.decode_uri( get_url_param( vlc.path, "iurl" ) )
+ return vlc.strings( get_url_param( vlc.path, "iurl" ) )
end
if not arturl then
return "http://img.youtube.com/vi/"..video_id.."/default.jpg"
diff --git a/src/control/libvlc_internal.h b/src/control/libvlc_internal.h
index 417d38e..053716b 100644
--- a/src/control/libvlc_internal.h
+++ b/src/control/libvlc_internal.h
@@ -90,6 +90,7 @@ struct libvlc_media_list_t
libvlc_instance_t * p_libvlc_instance;
int i_refcount;
vlc_mutex_t object_lock;
+ vlc_mutex_t refcount_lock;
libvlc_media_t * p_md; /* The media from which the
* mlist comes, if any. */
vlc_array_t items;
diff --git a/src/control/media_list.c b/src/control/media_list.c
index e043c4c..0bb2276 100644
--- a/src/control/media_list.c
+++ b/src/control/media_list.c
@@ -170,6 +170,7 @@ libvlc_media_list_new( libvlc_instance_t * p_inst,
}
vlc_mutex_init( &p_mlist->object_lock );
+ vlc_mutex_init( &p_mlist->refcount_lock ); // FIXME: spinlock?
vlc_array_init( &p_mlist->items );
p_mlist->i_refcount = 1;
@@ -188,14 +189,14 @@ void libvlc_media_list_release( libvlc_media_list_t * p_mlist )
libvlc_media_t * p_md;
int i;
- vlc_mutex_lock( &p_mlist->object_lock );
+ vlc_mutex_lock( &p_mlist->refcount_lock );
p_mlist->i_refcount--;
if( p_mlist->i_refcount > 0 )
{
- vlc_mutex_unlock( &p_mlist->object_lock );
+ vlc_mutex_unlock( &p_mlist->refcount_lock );
return;
}
- vlc_mutex_unlock( &p_mlist->object_lock );
+ vlc_mutex_unlock( &p_mlist->refcount_lock );
/* Refcount null, time to free */
@@ -223,9 +224,9 @@ void libvlc_media_list_release( libvlc_media_list_t * p_mlist )
**************************************************************************/
void libvlc_media_list_retain( libvlc_media_list_t * p_mlist )
{
- vlc_mutex_lock( &p_mlist->object_lock );
+ vlc_mutex_lock( &p_mlist->refcount_lock );
p_mlist->i_refcount++;
- vlc_mutex_unlock( &p_mlist->object_lock );
+ vlc_mutex_unlock( &p_mlist->refcount_lock );
}
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index d72c10f..4f201d3 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -380,8 +380,6 @@ tls_ClientCreate
tls_ClientDelete
ToLocale
ToLocaleDup
-unescape_URI
-unescape_URI_duplicate
update_Check
update_Delete
update_Download
diff --git a/src/misc/mtime.c b/src/misc/mtime.c
index c735bdf..a0c24e8 100644
--- a/src/misc/mtime.c
+++ b/src/misc/mtime.c
@@ -56,7 +56,8 @@
# include <sys/time.h>
#endif
-#ifdef __APPLE__
+#if defined(__APPLE__) && !defined(__powerpc__) && !defined(__ppc__) && !defined(__ppc64__)
+#define USE_APPLE_MACH 1
# include <mach/mach.h>
# include <mach/mach_time.h>
#endif
@@ -173,7 +174,7 @@ static inline unsigned mprec( void )
#endif
}
-#ifdef __APPLE__
+#ifdef USE_APPLE_MACH
static mach_timebase_info_data_t mtime_timebase_info;
static pthread_once_t mtime_timebase_info_once = PTHREAD_ONCE_INIT;
static void mtime_init_timebase(void)
@@ -207,7 +208,7 @@ mtime_t mdate( void )
#elif defined( HAVE_KERNEL_OS_H )
res = real_time_clock_usecs();
-#elif defined( __APPLE__ )
+#elif defined( USE_APPLE_MACH )
pthread_once(&mtime_timebase_info_once, mtime_init_timebase);
uint64_t date = mach_absolute_time();
@@ -323,7 +324,7 @@ mtime_t mdate( void )
i_previous_time = res;
LeaveCriticalSection( &date_lock );
}
-#elif defined( __APPLE__ ) /* The version that should be used, if it was cancelable */
+#elif USE_APPLE_MACH /* The version that should be used, if it was cancelable */
pthread_once(&mtime_timebase_info_once, mtime_init_timebase);
uint64_t mach_time = date * 1000 * mtime_timebase_info.denom / mtime_timebase_info.numer;
mach_wait_until(mach_time);
@@ -424,7 +425,7 @@ void msleep( mtime_t delay )
while( nanosleep( &ts_delay, &ts_delay ) && ( errno == EINTR ) );
-#elif defined( __APPLE__ ) /* The version that should be used, if it was cancelable */
+#elif USE_APPLE_MACH /* The version that should be used, if it was cancelable */
pthread_once(&mtime_timebase_info_once, mtime_init_timebase);
uint64_t mach_time = delay * 1000 * mtime_timebase_info.denom / mtime_timebase_info.numer;
mach_wait_until(mach_time + mach_absolute_time());
diff --git a/src/misc/threads.c b/src/misc/threads.c
index 149e761..71d0afe 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -618,7 +618,7 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
mtime_t deadline)
{
#if defined(LIBVLC_USE_PTHREAD)
-#ifdef __APPLE__
+#if defined(__APPLE__) && !defined(__powerpc__) && !defined( __ppc__ ) && !defined( __ppc64__ )
/* mdate() is mac_absolute_time on osx, which we must convert to do
* the same base than gettimeofday() on which pthread_cond_timedwait
* counts on. */
diff --git a/src/playlist/art.c b/src/playlist/art.c
index 002ec6e..8b65121 100644
--- a/src/playlist/art.c
+++ b/src/playlist/art.c
@@ -32,6 +32,8 @@
#include <vlc_charset.h>
#include <vlc_strings.h>
#include <vlc_stream.h>
+#include <vlc_url.h>
+
#include <limits.h> /* PATH_MAX */
#ifdef HAVE_SYS_STAT_H
@@ -132,7 +134,7 @@ static char *ArtCacheName( input_item_t *p_item, const char *psz_type )
char *psz_ext = filename_sanitize( psz_type ? psz_type : "" );
char *psz_filename;
- if( asprintf( &psz_filename, "file://%s" DIR_SEP "art%s", psz_path, psz_ext ) < 0 )
+ if( asprintf( &psz_filename, "%s" DIR_SEP "art%s", psz_path, psz_ext ) < 0 )
psz_filename = NULL;
free( psz_ext );
@@ -164,12 +166,19 @@ int playlist_FindArtInCache( input_item_t *p_item )
if( !strncmp( psz_filename, "art", 3 ) )
{
char *psz_file;
- if( asprintf( &psz_file, "file://%s" DIR_SEP "%s",
+ if( asprintf( &psz_file, "%s" DIR_SEP "%s",
psz_path, psz_filename ) < 0 )
psz_file = NULL;
if( psz_file )
- input_item_SetArtURL( p_item, psz_file );
- free( psz_file );
+ {
+ char *psz_uri = make_URI( psz_file );
+ if( psz_uri )
+ {
+ input_item_SetArtURL( p_item, psz_uri );
+ free( psz_uri );
+ }
+ free( psz_file );
+ }
b_found = true;
}
@@ -192,17 +201,25 @@ int playlist_SaveArt( playlist_t *p_playlist, input_item_t *p_item,
if( !psz_filename )
return VLC_EGENERIC;
+ char *psz_uri = make_URI( psz_filename );
+ if( !psz_uri )
+ {
+ free( psz_filename );
+ return VLC_EGENERIC;
+ }
+
/* Check if we already dumped it */
struct stat s;
- if( !utf8_stat( psz_filename+7, &s ) )
+ if( !utf8_stat( psz_filename, &s ) )
{
- input_item_SetArtURL( p_item, psz_filename );
+ input_item_SetArtURL( p_item, psz_uri );
free( psz_filename );
+ free( psz_uri );
return VLC_SUCCESS;
}
/* Dump it otherwise */
- FILE *f = utf8_fopen( psz_filename+7, "wb" );
+ FILE *f = utf8_fopen( psz_filename, "wb" );
if( f )
{
if( fwrite( p_buffer, i_buffer, 1, f ) != 1 )
@@ -212,11 +229,12 @@ int playlist_SaveArt( playlist_t *p_playlist, input_item_t *p_item,
else
{
msg_Dbg( p_playlist, "album art saved to %s", psz_filename );
- input_item_SetArtURL( p_item, psz_filename );
+ input_item_SetArtURL( p_item, psz_uri );
}
fclose( f );
}
free( psz_filename );
+ free( psz_uri );
return VLC_SUCCESS;
}
diff --git a/src/text/strings.c b/src/text/strings.c
index 9c6d931..736bb87 100644
--- a/src/text/strings.c
+++ b/src/text/strings.c
@@ -49,89 +49,6 @@
#include <vlc_charset.h>
/**
- * Unescape URI encoded string
- * \return decoded duplicated string
- */
-char *unescape_URI_duplicate( const char *psz )
-{
- char *psz_dup = strdup( psz );
- unescape_URI( psz_dup );
- return psz_dup;
-}
-
-/**
- * Unescape URI encoded string in place
- * \return nothing
- */
-void unescape_URI( char *psz )
-{
- unsigned char *in = (unsigned char *)psz, *out = in, c;
- if( psz == NULL )
- return;
-
- while( ( c = *in++ ) != '\0' )
- {
- switch( c )
- {
- case '%':
- {
- char val[5], *pval = val;
- unsigned long cp;
-
- switch( c = *in++ )
- {
- case '\0':
- return;
-
- case 'u':
- case 'U':
- if( ( *pval++ = *in++ ) == '\0' )
- return;
- if( ( *pval++ = *in++ ) == '\0' )
- return;
- c = *in++;
-
- default:
- *pval++ = c;
- if( ( *pval++ = *in++ ) == '\0' )
- return;
- *pval = '\0';
- }
-
- cp = strtoul( val, NULL, 0x10 );
- if( cp < 0x80 )
- *out++ = cp;
- else
- if( cp < 0x800 )
- {
- *out++ = (( cp >> 6) | 0xc0);
- *out++ = (( cp & 0x3f) | 0x80);
- }
- else
- {
- assert( cp < 0x10000 );
- *out++ = (( cp >> 12) | 0xe0);
- *out++ = (((cp >> 6) & 0x3f) | 0x80);
- *out++ = (( cp & 0x3f) | 0x80);
- }
- break;
- }
-
- /* + is not a special case - it means plus, not space. */
-
- default:
- /* Inserting non-ASCII or non-printable characters is unsafe,
- * and no sane browser will send these unencoded */
- if( ( c < 32 ) || ( c > 127 ) )
- *out++ = '?';
- else
- *out++ = c;
- }
- }
- *out = '\0';
-}
-
-/**
* Decode encoded URI component. See also decode_URI().
* \return decoded duplicated string
*/
diff --git a/test/libvlc/media_list_player.c b/test/libvlc/media_list_player.c
index 712e0fe..49a1443 100644
--- a/test/libvlc/media_list_player.c
+++ b/test/libvlc/media_list_player.c
@@ -92,8 +92,11 @@ static void test_media_list_player_play_item_at_index(const char** argv, int arg
mlp = libvlc_media_list_player_new (vlc, &ex);
- libvlc_media_list_add_media( ml, md, &ex );
- catch ();
+ for (unsigned i = 0; i < 5; i++)
+ {
+ libvlc_media_list_add_media( ml, md, &ex );
+ catch ();
+ }
libvlc_media_list_player_set_media_list( mlp, ml, &ex );
diff --git a/test/libvlc/test.h b/test/libvlc/test.h
index 388a465..1015d25 100644
--- a/test/libvlc/test.h
+++ b/test/libvlc/test.h
@@ -100,7 +100,7 @@ static inline void catch (void)
static inline void test_init (void)
{
(void)test_default_sample; /* This one may not be used */
- alarm (50); /* Make sure "make check" does not get stuck */
+ alarm (10); /* Make sure "make check" does not get stuck */
}
#endif /* TEST_H */