From 34582f81a9d28b6e22d506cfa5b12e1d819d4e9d Mon Sep 17 00:00:00 2001 From: Nicolas Chauvet Date: Fri, 16 Oct 2009 10:10:22 +0000 Subject: [PATCH] Rebuild for x264/ffmpeg --- vlc-1.0-bugfix-20091016.patch | 905 ++++++++++++++++++++++++++++++++++ vlc.spec | 8 +- 2 files changed, 912 insertions(+), 1 deletion(-) create mode 100644 vlc-1.0-bugfix-20091016.patch diff --git a/vlc-1.0-bugfix-20091016.patch b/vlc-1.0-bugfix-20091016.patch new file mode 100644 index 0000000..5850030 --- /dev/null +++ b/vlc-1.0-bugfix-20091016.patch @@ -0,0 +1,905 @@ +diff --git a/modules/access/dvb/en50221.c b/modules/access/dvb/en50221.c +index b2d8991..fbf2147 100644 +--- a/modules/access/dvb/en50221.c ++++ b/modules/access/dvb/en50221.c +@@ -151,7 +151,7 @@ static uint8_t *SetLength( uint8_t *p_data, int i_length ) + * Transport layer + */ + +-#define MAX_TPDU_SIZE 2048 ++#define MAX_TPDU_SIZE 4096 + #define MAX_TPDU_DATA (MAX_TPDU_SIZE - 4) + + #define DATA_INDICATOR 0x80 +diff --git a/modules/access/v4l2.c b/modules/access/v4l2.c +index 4b1c67c..113162d 100644 +--- a/modules/access/v4l2.c ++++ b/modules/access/v4l2.c +@@ -204,7 +204,11 @@ static void AccessClose( vlc_object_t * ); + "please use 'v4l2:/""/ :input-slave=alsa:/""/' or " \ + "'v4l2:/""/ :input-slave=oss:/""/' instead." ) + ++#define ASPECT_TEXT N_("Picture aspect-ratio n:m") ++#define ASPECT_LONGTEXT N_("Define input picture aspect-ratio to use. Default is 4:3" ) ++ + typedef enum { ++ IO_METHOD_AUTO, + IO_METHOD_READ, + IO_METHOD_MMAP, + IO_METHOD_USERPTR, +@@ -216,9 +220,9 @@ static const char *const psz_standards_list_text[] = + { N_("Default"), N_("SECAM"), N_("PAL"), N_("NTSC") }; + + static const int i_iomethod_list[] = +- { IO_METHOD_READ, IO_METHOD_MMAP, IO_METHOD_USERPTR }; ++ { IO_METHOD_AUTO, IO_METHOD_READ, IO_METHOD_MMAP, IO_METHOD_USERPTR }; + static const char *const psz_iomethod_list_text[] = +- { N_("READ"), N_("MMAP"), N_("USERPTR") }; ++ { N_("AUTO"), N_("READ"), N_("MMAP"), N_("USERPTR") }; + + static const int i_tuner_audio_modes_list[] = + { V4L2_TUNER_MODE_MONO, V4L2_TUNER_MODE_STEREO, +@@ -251,13 +255,15 @@ vlc_module_begin () + true ) + add_integer( CFG_PREFIX "audio-input", 0, NULL, AUDIO_INPUT_TEXT, + AUDIO_INPUT_LONGTEXT, true ) +- add_integer( CFG_PREFIX "io", IO_METHOD_MMAP, NULL, IOMETHOD_TEXT, ++ add_integer( CFG_PREFIX "io", IO_METHOD_AUTO, NULL, IOMETHOD_TEXT, + IOMETHOD_LONGTEXT, true ) + change_integer_list( i_iomethod_list, psz_iomethod_list_text, NULL ) + add_integer( CFG_PREFIX "width", -1, NULL, WIDTH_TEXT, + WIDTH_LONGTEXT, true ) + add_integer( CFG_PREFIX "height", -1, NULL, HEIGHT_TEXT, + HEIGHT_LONGTEXT, true ) ++ add_string( CFG_PREFIX "aspect-ratio", "4:3", NULL, ASPECT_TEXT, ++ ASPECT_LONGTEXT, true ) + add_float( CFG_PREFIX "fps", 0, NULL, FPS_TEXT, FPS_LONGTEXT, true ) + add_integer( CFG_PREFIX "caching", DEFAULT_PTS_DELAY / 1000, NULL, + CACHING_TEXT, CACHING_LONGTEXT, true ) +@@ -363,6 +369,7 @@ static int AccessControl( access_t *, int, va_list ); + + static int Demux( demux_t * ); + static block_t *AccessRead( access_t * ); ++static ssize_t AccessReadStream( access_t * p_access, uint8_t * p_buffer, size_t i_len ); + + static block_t* GrabVideo( vlc_object_t *p_demux, demux_sys_t *p_sys ); + static block_t* ProcessVideoFrame( vlc_object_t *p_demux, uint8_t *p_frame, size_t ); +@@ -525,6 +532,7 @@ struct demux_sys_t + + int i_width; + int i_height; ++ unsigned int i_aspect; + float f_fps; /* <= 0.0 mean to grab at full rate */ + mtime_t i_video_pts; /* only used when f_fps > 0 */ + int i_fourcc; +@@ -687,6 +695,19 @@ static void GetV4L2Params( demux_sys_t *p_sys, vlc_object_t *p_obj ) + + p_sys->psz_set_ctrls = var_CreateGetString( p_obj, "v4l2-set-ctrls" ); + ++ char *psz_aspect = var_CreateGetString( p_obj, "v4l2-aspect-ratio" ); ++ if( psz_aspect && *psz_aspect && strchr( psz_aspect, ":" ) ) ++ { ++ char psz_delim = strchr( psz_aspect, ":" ); ++ p_sys->i_aspect = atoi( psz_aspect ) * VOUT_ASPECT_FACTOR / atoi( psz_delim + 1 ); ++ } ++ else ++ { ++ p_sys->i_aspect = 4 * VOUT_ASPECT_FACTOR / 3 ; ++ ++ } ++ free( psz_aspect ); ++ + p_sys->psz_device = NULL; + p_sys->i_fd = -1; + +@@ -793,6 +814,11 @@ static void ParseMRL( demux_sys_t *p_sys, char *psz_path, vlc_object_t *p_obj ) + p_sys->io = IO_METHOD_USERPTR; + psz_parser += strlen( "userptr" ); + } ++ else if( !strncmp( psz_parser, "auto", strlen( "auto" ) ) ) ++ { ++ p_sys->io = IO_METHOD_AUTO; ++ psz_parser += strlen( "auto" ); ++ } + else + { + p_sys->io = strtol( psz_parser, &psz_parser, 0 ); +@@ -812,6 +838,17 @@ static void ParseMRL( demux_sys_t *p_sys, char *psz_path, vlc_object_t *p_obj ) + strtol( psz_parser + strlen( "height=" ), + &psz_parser, 0 ); + } ++ else if( !strncmp( psz_parser, "aspect-ratio=", ++ strlen( "aspect-ratio=" ) ) ) ++ { ++ unsigned int num,den; ++ num = strtol( psz_parser + strlen( "aspect-ratio=" ), ++ &psz_parser, 0 ); ++ den = strtol( psz_parser + strlen( ":" ), ++ &psz_parser, 0 ); ++ if( num && den ) ++ p_sys->i_aspect = num * VOUT_ASPECT_FACTOR / den; ++ } + else if( !strncmp( psz_parser, "controls-reset", + strlen( "controls-reset" ) ) ) + { +@@ -990,6 +1027,9 @@ static void DemuxClose( vlc_object_t *p_this ) + } + + break; ++ ++ default: ++ break; + } + } + +@@ -1017,6 +1057,9 @@ static void DemuxClose( vlc_object_t *p_this ) + free( p_sys->p_buffers[i].start ); + } + break; ++ ++ default: ++ break; + } + free( p_sys->p_buffers ); + } +@@ -1056,7 +1099,6 @@ static int AccessOpen( vlc_object_t * p_this ) + if( *p_access->psz_access == '\0' ) return VLC_EGENERIC; + + access_InitFields( p_access ); +- ACCESS_SET_CALLBACKS( NULL, AccessRead, AccessControl, NULL ); + p_sys = calloc( 1, sizeof( demux_sys_t )); + if( !p_sys ) return VLC_ENOMEM; + p_access->p_sys = (access_sys_t*)p_sys; +@@ -1071,14 +1113,34 @@ static int AccessOpen( vlc_object_t * p_this ) + msg_Dbg( p_this, "Trying direct kernel v4l2" ); + use_kernel_v4l2( p_sys ); + if( FindMainDevice( p_this, p_sys, false ) == VLC_SUCCESS) ++ { ++ if( p_sys->io == IO_METHOD_READ ) ++ { ++ ACCESS_SET_CALLBACKS( AccessReadStream, NULL, AccessControl, NULL ); ++ } ++ else ++ { ++ ACCESS_SET_CALLBACKS( NULL, AccessRead, AccessControl, NULL ); ++ } + return VLC_SUCCESS; ++ } + } + + msg_Dbg( p_this, "Trying libv4l2 wrapper" ); + use_libv4l2( p_sys ); + #endif + if( FindMainDevice( p_this, p_sys, false ) == VLC_SUCCESS ) ++ { ++ if( p_sys->io == IO_METHOD_READ ) ++ { ++ ACCESS_SET_CALLBACKS( AccessReadStream, NULL, AccessControl, NULL ); ++ } ++ else ++ { ++ ACCESS_SET_CALLBACKS( NULL, AccessRead, AccessControl, NULL ); ++ } + return VLC_SUCCESS; ++ } + + AccessClose( p_this ); + return VLC_EGENERIC; +@@ -1199,6 +1261,46 @@ static block_t *AccessRead( access_t * p_access ) + return NULL; + } + ++static ssize_t AccessReadStream( access_t * p_access, uint8_t * p_buffer, size_t i_len ) ++{ ++ demux_sys_t *p_sys = (demux_sys_t *) p_access->p_sys; ++ struct pollfd ufd; ++ int i_ret; ++ ++ ufd.fd = p_sys->i_fd; ++ ufd.events = POLLIN; ++ ++ if( p_access->info.b_eof ) ++ return 0; ++ ++ do ++ { ++ if( !vlc_object_alive (p_access) ) ++ return 0; ++ ++ ufd.revents = 0; ++ } ++ while( ( i_ret = poll( &ufd, 1, 500 ) ) == 0 ); ++ ++ if( i_ret < 0 ) ++ { ++ msg_Err( p_access, "Polling error (%m)." ); ++ return -1; ++ } ++ ++ i_ret = v4l2_read( p_sys->i_fd, p_buffer, i_len ); ++ if( i_ret == 0 ) ++ { ++ p_access->info.b_eof = true; ++ } ++ else if( i_ret > 0 ) ++ { ++ p_access->info.i_pos += i_ret; ++ } ++ ++ return i_ret; ++} ++ + /***************************************************************************** + * Demux: Processes the audio or video frame + *****************************************************************************/ +@@ -1357,6 +1459,8 @@ static block_t* GrabVideo( vlc_object_t *p_demux, demux_sys_t *p_sys ) + + break; + ++ default: ++ break; + } + + /* Timestamp */ +@@ -1843,6 +1947,7 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + msg_Err( p_obj, "device does not support read i/o" ); + goto open_failed; + } ++ msg_Dbg( p_obj, "using read i/o" ); + break; + + case IO_METHOD_MMAP: +@@ -1852,6 +1957,10 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + msg_Err( p_obj, "device does not support streaming i/o" ); + goto open_failed; + } ++ if( p_sys->io == IO_METHOD_MMAP ) ++ msg_Dbg( p_obj, "using streaming i/o (mmap)" ); ++ else ++ msg_Dbg( p_obj, "using streaming i/o (userptr)" ); + break; + + default: +@@ -1866,16 +1975,19 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + { + crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + crop.c = cropcap.defrect; /* reset to default */ +- if( v4l2_ioctl( i_fd, VIDIOC_S_CROP, &crop ) < 0 ) ++ if( crop.c.width > 0 && crop.c.height > 0 ) /* Fix for fm tuners */ + { +- switch( errno ) ++ if( v4l2_ioctl( i_fd, VIDIOC_S_CROP, &crop ) < 0 ) + { +- case EINVAL: +- /* Cropping not supported. */ +- break; +- default: +- /* Errors ignored. */ +- break; ++ switch( errno ) ++ { ++ case EINVAL: ++ /* Cropping not supported. */ ++ break; ++ default: ++ /* Errors ignored. */ ++ break; ++ } + } + } + } +@@ -1911,8 +2023,8 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + msg_Dbg( p_obj, "trying specified size %dx%d", p_sys->i_width, p_sys->i_height ); + } + +- fmt.fmt.pix.width = p_sys->i_width; +- fmt.fmt.pix.height = p_sys->i_height; ++ fmt.fmt.pix.width = __MAX(0, p_sys->i_width); ++ fmt.fmt.pix.height = __MAX(0, p_sys->i_height); + fmt.fmt.pix.field = V4L2_FIELD_NONE; + + if (b_demux) +@@ -2129,7 +2241,8 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + switch( p_sys->io ) + { + case IO_METHOD_READ: +- if( InitRead( p_obj, p_sys, fmt.fmt.pix.sizeimage ) != VLC_SUCCESS ) goto open_failed; ++ if( b_demux ) ++ if( InitRead( p_obj, p_sys, fmt.fmt.pix.sizeimage ) != VLC_SUCCESS ) goto open_failed; + break; + + case IO_METHOD_MMAP: +@@ -2140,15 +2253,20 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + if( InitUserP( p_obj, p_sys, i_fd, fmt.fmt.pix.sizeimage ) != VLC_SUCCESS ) goto open_failed; + break; + ++ default: ++ goto open_failed; ++ break; + } + +- /* Add */ +- es_fmt.video.i_width = p_sys->i_width; +- es_fmt.video.i_height = p_sys->i_height; +- es_fmt.video.i_aspect = 4 * VOUT_ASPECT_FACTOR / 3; +- + if( b_demux ) + { ++ /* Add */ ++ es_fmt.video.i_width = p_sys->i_width; ++ es_fmt.video.i_height = p_sys->i_height; ++ ++ /* Get aspect-ratio */ ++ es_fmt.video.i_aspect = p_sys->i_aspect; ++ + demux_t *p_demux = (demux_t *) p_obj; + msg_Dbg( p_demux, "added new video es %4.4s %dx%d", + (char*)&es_fmt.i_codec, es_fmt.video.i_width, es_fmt.video.i_height ); +@@ -2216,6 +2334,10 @@ static int OpenVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, bool b_demux ) + } + + break; ++ ++ default: ++ goto open_failed; ++ break; + } + + /* report fps */ +@@ -2283,10 +2405,12 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + + msg_Dbg( p_obj, "the device has the capabilities: (%c) Video Capure, " + "(%c) Audio, " +- "(%c) Tuner", ++ "(%c) Tuner, " ++ "(%c) Radio", + ( p_sys->dev_cap.capabilities & V4L2_CAP_VIDEO_CAPTURE ? 'X':' '), + ( p_sys->dev_cap.capabilities & V4L2_CAP_AUDIO ? 'X':' '), +- ( p_sys->dev_cap.capabilities & V4L2_CAP_TUNER ? 'X':' ') ); ++ ( p_sys->dev_cap.capabilities & V4L2_CAP_TUNER ? 'X':' '), ++ ( p_sys->dev_cap.capabilities & V4L2_CAP_RADIO ? 'X':' ') ); + + msg_Dbg( p_obj, "supported I/O methods are: (%c) Read/Write, " + "(%c) Streaming, " +@@ -2295,6 +2419,30 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + ( p_sys->dev_cap.capabilities & V4L2_CAP_STREAMING ? 'X':' ' ), + ( p_sys->dev_cap.capabilities & V4L2_CAP_ASYNCIO ? 'X':' ' ) ); + ++ if( p_sys->io == IO_METHOD_AUTO ) ++ { ++ if( p_sys->dev_cap.capabilities & V4L2_CAP_STREAMING ) ++ p_sys->io = IO_METHOD_MMAP; ++ else if( p_sys->dev_cap.capabilities & V4L2_CAP_READWRITE ) ++ p_sys->io = IO_METHOD_READ; ++ else ++ msg_Err( p_obj, "No known I/O method supported" ); ++ } ++ ++ if( p_sys->dev_cap.capabilities & V4L2_CAP_RDS_CAPTURE ) ++ msg_Dbg( p_obj, "device supports RDS" ); ++ ++#ifdef V4L2_CAP_HW_FREQ_SEEK ++ if( p_sys->dev_cap.capabilities & V4L2_CAP_HW_FREQ_SEEK ) ++ msg_Dbg( p_obj, "device supports hardware frequency seeking" ); ++#endif ++ ++ if( p_sys->dev_cap.capabilities & V4L2_CAP_VBI_CAPTURE ) ++ msg_Dbg( p_obj, "device support raw VBI capture" ); ++ ++ if( p_sys->dev_cap.capabilities & V4L2_CAP_SLICED_VBI_CAPTURE ) ++ msg_Dbg( p_obj, "device support sliced VBI capture" ); ++ + /* Now, enumerate all the video inputs. This is useless at the moment + since we have no way to present that info to the user except with + debug messages */ +@@ -2303,12 +2451,14 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + { + struct v4l2_input t_input; + memset( &t_input, 0, sizeof(t_input) ); ++ p_sys->i_input = 0; + while( v4l2_ioctl( i_fd, VIDIOC_ENUMINPUT, &t_input ) >= 0 ) + { + p_sys->i_input++; + t_input.index = p_sys->i_input; + } + ++ free( p_sys->p_inputs ); + p_sys->p_inputs = calloc( 1, p_sys->i_input * sizeof( struct v4l2_input ) ); + if( !p_sys->p_inputs ) goto open_failed; + +@@ -2344,6 +2494,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + t_standards.index = p_sys->i_standard; + } + ++ free( p_sys->p_standards ); + p_sys->p_standards = calloc( 1, p_sys->i_standard * sizeof( struct v4l2_standard ) ); + if( !p_sys->p_standards ) goto open_failed; + +@@ -2409,6 +2560,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + tuner.index = p_sys->i_tuner; + } + ++ free( p_sys->p_tuners ); + p_sys->p_tuners = calloc( 1, p_sys->i_tuner * sizeof( struct v4l2_tuner ) ); + if( !p_sys->p_tuners ) goto open_failed; + +@@ -2472,6 +2624,7 @@ static bool ProbeVideoDev( vlc_object_t *p_obj, demux_sys_t *p_sys, + + p_sys->i_codec = i_index; + ++ free( p_sys->p_codecs ); + p_sys->p_codecs = calloc( 1, p_sys->i_codec * sizeof( struct v4l2_fmtdesc ) ); + + for( i_index = 0; i_index < p_sys->i_codec; i_index++ ) +diff --git a/modules/codec/faad.c b/modules/codec/faad.c +index e050a94..ae44675 100644 +--- a/modules/codec/faad.c ++++ b/modules/codec/faad.c +@@ -233,8 +233,17 @@ static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) + /* Append the block to the temporary buffer */ + if( p_sys->i_buffer_size < p_sys->i_buffer + p_block->i_buffer ) + { +- p_sys->i_buffer_size = p_sys->i_buffer + p_block->i_buffer; +- p_sys->p_buffer = realloc( p_sys->p_buffer, p_sys->i_buffer_size ); ++ size_t i_buffer_size = p_sys->i_buffer + p_block->i_buffer; ++ uint8_t *p_buffer = realloc( p_sys->p_buffer, i_buffer_size ); ++ if( p_buffer ) ++ { ++ p_sys->i_buffer_size = i_buffer_size; ++ p_sys->p_buffer = p_buffer; ++ } ++ else ++ { ++ p_block->i_buffer = 0; ++ } + } + + if( p_block->i_buffer > 0 ) +diff --git a/modules/codec/kate.c b/modules/codec/kate.c +index a6d8ef4..9fe0af9 100644 +--- a/modules/codec/kate.c ++++ b/modules/codec/kate.c +@@ -864,7 +864,7 @@ static void PostprocessTigerImage( plane_t *p_plane, unsigned int i_width ) + if( a ) + { + #ifdef WORDS_BIGENDIAN +- uint8_t tmp = pixel[2]; ++ uint8_t tmp = p_pixel[2]; + p_pixel[0] = p_pixel[3] * 255 / a; + p_pixel[3] = a; + p_pixel[2] = p_pixel[1] * 255 / a; +diff --git a/modules/codec/subtitles/t140.c b/modules/codec/subtitles/t140.c +index 5e0c25a..2b89199 100644 +--- a/modules/codec/subtitles/t140.c ++++ b/modules/codec/subtitles/t140.c +@@ -101,5 +101,9 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu ) + p_block = block_New( p_enc, len ); + memcpy( p_block->p_buffer, p_region->psz_text, len ); + ++ p_block->i_pts = p_block->i_dts = p_spu->i_start; ++ if( !p_spu->b_ephemer && ( p_spu->i_stop > p_spu->i_start ) ) ++ p_block->i_length = p_spu->i_stop - p_spu->i_start; ++ + return p_block; + } +diff --git a/modules/codec/x264.c b/modules/codec/x264.c +index e76ac3b..243bcba 100644 +--- a/modules/codec/x264.c ++++ b/modules/codec/x264.c +@@ -1359,6 +1359,21 @@ static int Open ( vlc_object_t *p_this ) + p_enc->fmt_out.i_extra = 0; + p_enc->fmt_out.p_extra = NULL; + ++#if X264_BUILD >= 76 ++ p_enc->fmt_out.i_extra = x264_encoder_headers( p_sys->h, &nal, &i_nal ); ++ p_enc->fmt_out.p_extra = malloc( p_enc->fmt_out.i_extra ); ++ if( !p_enc->fmt_out.p_extra ) ++ { ++ Close( VLC_OBJECT(p_enc) ); ++ return VLC_ENOMEM; ++ } ++ void *p_tmp = p_enc->fmt_out.p_extra; ++ for( i = 0; i < i_nal; i++ ) ++ { ++ memcpy( p_tmp, nal[i].p_payload, nal[i].i_payload ); ++ p_tmp += nal[i].i_payload; ++ } ++#else + x264_encoder_headers( p_sys->h, &nal, &i_nal ); + for( i = 0; i < i_nal; i++ ) + { +@@ -1380,6 +1395,7 @@ static int Open ( vlc_object_t *p_this ) + + p_enc->fmt_out.i_extra += i_size; + } ++#endif + + return VLC_SUCCESS; + } +@@ -1416,10 +1432,15 @@ static block_t *Encode( encoder_t *p_enc, picture_t *p_pict ) + + for( i = 0, i_out = 0; i < i_nal; i++ ) + { ++#if X264_BUILD >= 76 ++ memcpy( p_sys->p_buffer + i_out, nal[i].p_payload, nal[i].i_payload ); ++ i_out += nal[i].i_payload; ++#else + int i_size = p_sys->i_buffer - i_out; + x264_nal_encode( p_sys->p_buffer + i_out, &i_size, 1, &nal[i] ); + + i_out += i_size; ++#endif + } + + p_block = block_New( p_enc, i_out ); +diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c +index 4fe88b4..47a97e4 100644 +--- a/modules/demux/avi/avi.c ++++ b/modules/demux/avi/avi.c +@@ -672,7 +672,18 @@ aviindex: + + /* *** movie length in sec *** */ + p_sys->i_length = AVI_MovieGetLength( p_demux ); +- if( p_sys->i_length < (mtime_t)p_avih->i_totalframes * ++ ++ /* Check the index completeness */ ++ unsigned int i_idx_totalframes = 0; ++ for( unsigned int i = 0; i < p_sys->i_track; i++ ) ++ { ++ const avi_track_t *tk = p_sys->track[i]; ++ if( tk->i_cat == VIDEO_ES && tk->p_index ) ++ i_idx_totalframes = __MAX(i_idx_totalframes, tk->i_idxnb); ++ continue; ++ } ++ if( i_idx_totalframes != p_avih->i_totalframes && ++ p_sys->i_length < (mtime_t)p_avih->i_totalframes * + (mtime_t)p_avih->i_microsecperframe / + (mtime_t)1000000 ) + { +diff --git a/modules/demux/playlist/m3u.c b/modules/demux/playlist/m3u.c +index 9770b29..f727c87 100644 +--- a/modules/demux/playlist/m3u.c ++++ b/modules/demux/playlist/m3u.c +@@ -114,28 +114,6 @@ void Close_M3U( vlc_object_t *p_this ) + } + + +-/* Gruik! */ +-static inline char *MaybeFromLocaleDup (const char *str) +-{ +- if (str == NULL) +- return NULL; +- +- return IsUTF8 (str) ? strdup (str) : FromLocaleDup (str); +-} +- +- +-static inline void MaybeFromLocaleRep (char **str) +-{ +- char *const orig_str = *str; +- +- if ((orig_str != NULL) && !IsUTF8 (orig_str)) +- { +- *str = FromLocaleDup (orig_str); +- free (orig_str); +- } +-} +- +- + static int Demux( demux_t *p_demux ) + { + char *psz_line; +@@ -178,9 +156,9 @@ static int Demux( demux_t *p_demux ) + if( i_parsed_duration >= 0 ) + i_duration = i_parsed_duration * INT64_C(1000000); + if( psz_name ) +- psz_name = strdup( psz_name ); ++ psz_name = FromLocaleDup( psz_name ); + if( psz_artist ) +- psz_artist = strdup( psz_artist ); ++ psz_artist = FromLocaleDup( psz_artist ); + } + else if( !strncasecmp( psz_parse, "EXTVLCOPT:", + sizeof("EXTVLCOPT:") -1 ) ) +@@ -190,7 +168,7 @@ static int Demux( demux_t *p_demux ) + psz_parse += sizeof("EXTVLCOPT:") -1; + if( !*psz_parse ) goto error; + +- psz_option = MaybeFromLocaleDup( psz_parse ); ++ psz_option = FromLocaleDup( psz_parse ); + if( psz_option ) + INSERT_ELEM( ppsz_options, i_options, i_options, + psz_option ); +@@ -203,14 +181,13 @@ static int Demux( demux_t *p_demux ) + else if( *psz_parse ) + { + char *psz_mrl; +- if( !psz_name || !*psz_name ) +- { ++ ++ psz_parse = FromLocale( psz_parse ); ++ if( !psz_name && psz_parse ) + /* Use filename as name for relative entries */ +- psz_name = MaybeFromLocaleDup( psz_parse ); +- } ++ psz_name = strdup( psz_parse ); + + psz_mrl = ProcessMRL( psz_parse, p_demux->p_sys->psz_prefix ); +- MaybeFromLocaleRep( &psz_mrl ); + + b_cleanup = true; + if( !psz_mrl ) goto error; +@@ -218,12 +195,14 @@ static int Demux( demux_t *p_demux ) + p_input = input_item_NewExt( p_demux, psz_mrl, psz_name, + i_options, ppsz_options, 0, i_duration ); + ++ LocaleFree( psz_parse ); ++ free( psz_mrl ); ++ + if ( psz_artist && *psz_artist ) + input_item_SetArtist( p_input, psz_artist ); + + input_item_AddSubItem( p_current_input, p_input ); + vlc_gc_decref( p_input ); +- free( psz_mrl ); + } + + error: +diff --git a/modules/demux/ts.c b/modules/demux/ts.c +index 514096b..b36dc4f 100644 +--- a/modules/demux/ts.c ++++ b/modules/demux/ts.c +@@ -2083,6 +2083,9 @@ static int PIDFillFormat( ts_pid_t *pid, int i_stream_type ) + case 0x85: /* DTS (audio) */ + es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'd', 't', 's', ' ' ) ); + break; ++ case 0x87: /* E-AC3 */ ++ es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'e', 'a', 'c', '3' ) ); ++ break; + + case 0x91: /* A52 vls (audio) */ + es_format_Init( fmt, AUDIO_ES, VLC_FOURCC( 'a', '5', '2', 'b' ) ); +@@ -3671,7 +3674,6 @@ static void PMTSetupEsHDMV( demux_t *p_demux, ts_pid_t *pid, + break; + + case 0x84: /* E-AC3 */ +- case 0x87: /* E-AC3 */ + case 0xA1: /* Secondary E-AC3 */ + p_fmt->i_cat = AUDIO_ES; + p_fmt->i_codec = VLC_FOURCC( 'e', 'a', 'c', '3' ); +diff --git a/modules/gui/qt4/components/playlist/playlist_item.cpp b/modules/gui/qt4/components/playlist/playlist_item.cpp +index b0436f0..0edde6a 100644 +--- a/modules/gui/qt4/components/playlist/playlist_item.cpp ++++ b/modules/gui/qt4/components/playlist/playlist_item.cpp +@@ -48,7 +48,7 @@ + */ + + +-void PLItem::init( int _i_id, int _i_input_id, bool _is_node, PLItem *parent, PLModel *m, QSettings *settings ) ++void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m, QSettings *settings ) + { + parentItem = parent; /* Can be NULL, but only for the rootItem */ + i_id = _i_id; /* Playlist item specific id */ +@@ -56,7 +56,6 @@ void PLItem::init( int _i_id, int _i_input_id, bool _is_node, PLItem *parent, PL + model = m; /* PLModel (QAbsmodel) */ + i_type = -1; /* Item type - Avoid segfault */ + b_current = false; /* Is the item the current Item or not */ +- b_is_node = _is_node; + + assert( model ); /* We need a model */ + +@@ -92,21 +91,19 @@ void PLItem::init( int _i_id, int _i_input_id, bool _is_node, PLItem *parent, PL + Call the above function init + So far the first constructor isn't used... + */ +-PLItem::PLItem( int _i_id, int _i_input_id, bool _is_node, PLItem *parent, PLModel *m ) ++PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m ) + { +- init( _i_id, _i_input_id, _is_node, parent, m, NULL ); ++ init( _i_id, _i_input_id, parent, m, NULL ); + } + + PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m ) + { +- init( p_item->i_id, p_item->p_input->i_id, p_item->i_children > -1, +- parent, m, NULL ); ++ init( p_item->i_id, p_item->p_input->i_id, parent, m, NULL ); + } + + PLItem::PLItem( playlist_item_t * p_item, QSettings *settings, PLModel *m ) + { +- init( p_item->i_id, p_item->p_input->i_id, p_item->i_children > -1, +- NULL, m, settings ); ++ init( p_item->i_id, p_item->p_input->i_id, NULL, m, settings ); + } + + PLItem::~PLItem() +@@ -177,7 +174,6 @@ void PLItem::update( playlist_item_t *p_item, bool iscurrent ) + /* Useful for the model */ + i_type = p_item->p_input->i_type; + b_current = iscurrent; +- b_is_node = p_item->i_children > -1; + + item_col_strings.clear(); + +diff --git a/modules/gui/qt4/components/playlist/playlist_item.hpp b/modules/gui/qt4/components/playlist/playlist_item.hpp +index c9d186b..26ce13c 100644 +--- a/modules/gui/qt4/components/playlist/playlist_item.hpp ++++ b/modules/gui/qt4/components/playlist/playlist_item.hpp +@@ -40,7 +40,7 @@ class PLItem + { + friend class PLModel; + public: +- PLItem( int, int, bool, PLItem *parent , PLModel * ); ++ PLItem( int, int, PLItem *parent , PLModel * ); + PLItem( playlist_item_t *, PLItem *parent, PLModel * ); + PLItem( playlist_item_t *, QSettings *, PLModel * ); + ~PLItem(); +@@ -72,10 +72,9 @@ protected: + int i_id; + int i_input_id; + int i_showflags; +- bool b_is_node; + + private: +- void init( int, int, bool, PLItem *, PLModel *, QSettings * ); ++ void init( int, int, PLItem *, PLModel *, QSettings * ); + void updateColumnHeaders(); + PLItem *parentItem; + PLModel *model; +diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp +index 9a28d42..add3ddc 100644 +--- a/modules/gui/qt4/components/playlist/playlist_model.cpp ++++ b/modules/gui/qt4/components/playlist/playlist_model.cpp +@@ -119,12 +119,7 @@ Qt::ItemFlags PLModel::flags( const QModelIndex &index ) const + { + Qt::ItemFlags defaultFlags = QAbstractItemModel::flags( index ); + if( index.isValid() ) +- { +- PLItem *item = static_cast( index.internalPointer() ); +- if ( item->b_is_node ) +- defaultFlags |= Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; +- else defaultFlags |= Qt::ItemIsDragEnabled; +- } ++ return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; + else if ( rootItem->i_id != p_playlist->p_root_onelevel->i_id + && rootItem->i_id != p_playlist->p_root_category->i_id ) + defaultFlags |= Qt::ItemIsDropEnabled; +diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp +index c9e5550..ca421c6 100644 +--- a/modules/gui/qt4/components/playlist/standardpanel.cpp ++++ b/modules/gui/qt4/components/playlist/standardpanel.cpp +@@ -87,15 +87,11 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, + view->header()->resizeSection( 0, 200 ); + view->header()->resizeSection( 1, 80 ); + } ++ view->header()->setSortIndicatorShown( true ); + view->header()->setClickable( true ); + view->header()->setContextMenuPolicy( Qt::CustomContextMenu ); + getSettings()->endGroup(); + +- /* Set sorting enable by hand, so it doesn't run sort on start */ +- view->header()->setSortIndicator( -1, Qt::AscendingOrder ); +- view->header()->setSortIndicatorShown( true ); +- CONNECT( view->header(), sortIndicatorChanged( int, Qt::SortOrder ), +- view, sortByColumn( int ) ); + /* Connections for the TreeView */ + CONNECT( view, activated( const QModelIndex& ) , + model,activateItem( const QModelIndex& ) ); +diff --git a/modules/gui/qt4/dialogs_provider.cpp b/modules/gui/qt4/dialogs_provider.cpp +index 0c4da89..c39bb2f 100644 +--- a/modules/gui/qt4/dialogs_provider.cpp ++++ b/modules/gui/qt4/dialogs_provider.cpp +@@ -532,7 +532,7 @@ void DialogsProvider::saveAPlaylist() + char filter[24]; + char module[12]; + } types[] = { +- { N_("XSPF playlist (*.xpsf)"), "export-xspf", }, ++ { N_("XSPF playlist (*.xspf)"), "export-xspf", }, + { N_("M3U playlist (*.m3u)"), "export-m3u", }, + { N_("HTML playlist (*.html)"), "export-html", }, + }; +diff --git a/modules/gui/qt4/main_interface.hpp b/modules/gui/qt4/main_interface.hpp +index d352fae..c9af6ef 100644 +--- a/modules/gui/qt4/main_interface.hpp ++++ b/modules/gui/qt4/main_interface.hpp +@@ -180,7 +180,7 @@ private slots: + void showCryptedLabel( bool ); + signals: + void askGetVideo( WId *p_id, vout_thread_t *, int *pi_x, int *pi_y, +- unsigned int *pi_width, unsigned int *pi_height ); ++ unsigned *pi_width, unsigned *pi_height ); + void askReleaseVideo( ); + void askVideoToResize( unsigned int, unsigned int ); + void askUpdate(); +diff --git a/modules/stream_filter/rar.c b/modules/stream_filter/rar.c +index a5fd829..f828058 100644 +--- a/modules/stream_filter/rar.c ++++ b/modules/stream_filter/rar.c +@@ -525,7 +525,7 @@ static int SkipFile( stream_t *s,const rar_block_t *p_hdr ) + rar_file_chunk_t *p_chunk = malloc( sizeof( *p_chunk ) ); + if( p_chunk ) + { +- p_chunk->i_offset = stream_Tell( s->p_source ); ++ p_chunk->i_offset = stream_Tell( s->p_source ) + p_hdr->i_size; + p_chunk->i_size = p_hdr->i_add_size; + p_chunk->i_cummulated_size = 0; + if( p_current->i_chunk > 0 ) +diff --git a/modules/video_filter/canvas.c b/modules/video_filter/canvas.c +index e6c79cd..f2074e5 100644 +--- a/modules/video_filter/canvas.c ++++ b/modules/video_filter/canvas.c +@@ -102,6 +102,7 @@ static int alloc_init( filter_t *, void * ); + * Module descriptor + *****************************************************************************/ + vlc_module_begin () ++ set_shortname( N_("Canvas") ) + set_description( N_("Automatically resize and pad a video") ) + set_capability( "video filter2", 0 ) + set_callbacks( Activate, Destroy ) +diff --git a/modules/video_filter/croppadd.c b/modules/video_filter/croppadd.c +index 63b5341..887e6e5 100644 +--- a/modules/video_filter/croppadd.c ++++ b/modules/video_filter/croppadd.c +@@ -76,6 +76,7 @@ static picture_t *Filter( filter_t *, picture_t * ); + * Module descriptor + *****************************************************************************/ + vlc_module_begin () ++ set_shortname( N_("Cropadd") ) + set_description( N_("Video scaling filter") ) + set_capability( "video filter2", 0 ) + set_callbacks( OpenFilter, CloseFilter ) +diff --git a/share/lua/playlist/appletrailers.lua b/share/lua/playlist/appletrailers.lua +index 7544255..3e2688d 100644 +--- a/share/lua/playlist/appletrailers.lua ++++ b/share/lua/playlist/appletrailers.lua +@@ -53,7 +53,7 @@ function parse() + else + extraname = "" + end +- table.insert( p, { path = path; name = title..extraname; description = description; url = vlc.path } ) ++ table.insert( p, { path = path; name = title..extraname; description = description; url = vlc.path; options = ":http-user-agent=\"QuickTime vlc lua edition\"" } ) + end + if string.match( line, "" ) + then +diff --git a/src/misc/update.c b/src/misc/update.c +index a0f4334..d7e6179 100644 +--- a/src/misc/update.c ++++ b/src/misc/update.c +@@ -1081,12 +1081,12 @@ void update_Delete( update_t *p_update ) + + if( p_update->p_check ) + { +- assert( !p_update->p_download ); + vlc_object_kill( p_update->p_check ); + vlc_thread_join( p_update->p_check ); + vlc_object_release( p_update->p_check ); + } +- else if( p_update->p_download ) ++ ++ if( p_update->p_download ) + { + vlc_object_kill( p_update->p_download ); + vlc_thread_join( p_update->p_download ); +@@ -1613,9 +1613,9 @@ static void* update_DownloadReal( vlc_object_t *p_this ) + psz_downloaded = size_str( l_downloaded ); + f_progress = (float)l_downloaded/(float)l_size; + +- if( asprintf( &psz_status, _( "%s\nDownloading... %s/%s %.1f%% done" ), ++ if( asprintf( &psz_status, _( "%s\nDownloading... %s/%s - %.1f%% done" ), + p_update->release.psz_url, psz_downloaded, psz_size, +- f_progress ) != -1 ) ++ f_progress*100 ) != -1 ) + { + dialog_ProgressSet( p_progress, psz_status, f_progress ); + free( psz_status ); +@@ -1735,9 +1735,6 @@ end: + free( p_buffer ); + free( psz_size ); + +- p_udt->p_update->p_download = NULL; +- +- vlc_object_release( p_udt ); + vlc_restorecancel( canc ); + return NULL; + } diff --git a/vlc.spec b/vlc.spec index dea9279..7a4689e 100644 --- a/vlc.spec +++ b/vlc.spec @@ -8,7 +8,7 @@ Summary: Multi-platform MPEG, DVD, and DivX player Name: vlc Version: 1.0.2 -Release: 1%{?dist}.2 +Release: 2%{?dist} License: GPLv2+ Group: Applications/Multimedia URL: http://www.videolan.org @@ -22,6 +22,7 @@ Patch1: 0001-Default-libv4l2-to-true.patch Patch2: 0002-Default-aout-for-pulse.patch Patch3: 300_all_pic.patch Patch4: 310_all_mmx_pic.patch +Patch5: vlc-1.0-bugfix-20091016.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: desktop-file-utils @@ -238,6 +239,7 @@ VLC plugin for libdc1394 %patch3 -p1 -b .dmo_pic sed -i.dmo_pic -e 's/fno-PIC/fPIC/' libs/loader/Makefile.in %patch4 -p1 -b .mmx_pic +%patch5 -p1 -b .bf rm modules/access/videodev2.h ln -sf %{_includedir}/linux/videodev2.h modules/access/videodev2.h @@ -547,6 +549,10 @@ fi || : %changelog +* Thu Oct 16 2009 kwizart < kwizart at gmail.com > - 1.0.2-2 +- Update to 1.0-bugfix 20091016 +- Rebuild for x264/ffmpeg + * Sun Sep 27 2009 kwizart < kwizart at gmail.com > - 1.0.2-1.2 - Disable the workaround for the compiler bug. (rhbz#524439) - Resync with the fonts requirement.