bug which might have been the cause of crashes.
* ./plugins/filter/crop.c: attempt at an automatic border cropping filter,
using "--filter crop --autocrop".
* ./vlc.spec: added missing filters to the RPM generation.
* ./src/misc/objects.c: commented all functions.
* ./src/misc/objects.c: implemented vlc_object_find( , , FIND_ANYWHERE).
* ./src/misc/objects.c: renamed vlc_object_unlink to vlc_object_detach.
HEAD
+ * ./src/misc/objects.c: commented all functions.
+ * ./src/misc/objects.c: implemented vlc_object_find( , , FIND_ANYWHERE).
+ * ./src/misc/objects.c: renamed vlc_object_unlink to vlc_object_detach.
+ * ALL: got rid of p_object->p_this which is now useless.
* ./include/main.h, ./plugins/beos/intf_beos.cpp: BeOS compilation fixes.
* ./bootstrap.sh, ./src/libvlc.h, ./po/*: fixed bootstrap.sh so that it does
not include CVS Id lines in automatically created files.
0.4.1
+ * ./src/video_output/video_output.c: fixed the "picture has invalid status"
+ bug which might have been the cause of crashes.
+ * ./plugins/filter/crop.c: attempt at an automatic border cropping filter,
+ using "--filter crop --autocrop".
+ * ./vlc.spec: added missing filters to the RPM generation.
+ * ./plugins/macosx/*: channel change support on Mac OS X.
+ * ./extras/MacOSX/Resources/vlc.icns: new OS X icon, courtesy of Benjamin
+ Mironer <bmironer@noos.fr>.
+ * ./plugins/filter/crop.c: crop filter. Usage examples:
+ --filter crop --crop-geometry 640x480
+ --filter crop --crop-geometry 320x200+10+10
+ * ./plugins/macosx/intf_vlc_wrapper.m: fixed a bug in the chapter handling.
+ * ./plugins/macosx/vout_vlc_wrapper.m: more keystrokes.
* ./plugins/chroma/i420_yuy2.h: simplified the chroma code. Please test
under BeOS and QNX.
* ./plugins/macosx/intf_vlc_wrapper.m: fix for non-ASCII filenames in the
fb/fb \
ffmpeg/ffmpeg \
filter/filter_clone \
+ filter/filter_crop \
filter/filter_deinterlace \
filter/filter_distort \
filter/filter_invert \
esac
BUILTINS="${BUILTINS} idct idctclassic motion imdct downmix mpeg_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} dummy null rc logger mpeg_es mpeg_audio mpeg_ps mpeg_ts file udp http ipv4 memcpy lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort filter_clone fx_scope chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga"
+PLUGINS="${PLUGINS} dummy null rc logger mpeg_es mpeg_audio mpeg_ps mpeg_ts file udp http ipv4 memcpy lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort filter_clone filter_crop fx_scope chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga"
MMX_MODULES="memcpymmx idctmmx motionmmx chroma_i420_rgb_mmx chroma_i420_yuy2_mmx chroma_i422_yuy2_mmx chroma_i420_ymga_mmx"
MMXEXT_MODULES="memcpymmxext idctmmxext motionmmxext"
dnl default modules
dnl
BUILTINS="${BUILTINS} idct idctclassic motion imdct downmix mpeg_adec ac3_adec mpeg_vdec"
-PLUGINS="${PLUGINS} dummy null rc logger mpeg_es mpeg_audio mpeg_ps mpeg_ts file udp http ipv4 memcpy lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort filter_clone fx_scope chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga"
+PLUGINS="${PLUGINS} dummy null rc logger mpeg_es mpeg_audio mpeg_ps mpeg_ts file udp http ipv4 memcpy lpcm_adec ac3_spdif spudec filter_deinterlace filter_invert filter_wall filter_transform filter_distort filter_clone filter_crop fx_scope chroma_i420_rgb chroma_i420_yuy2 chroma_i422_yuy2 chroma_i420_ymga"
dnl
dnl Accelerated modules
/* Maximal size of the message queue - in case of overflow, all messages in the
* queue are printed, but not sent to the threads */
#define VLC_MSG_QSIZE 256
+
+/* Maximal depth of the object tree output by vlc_dumpstructure */
+#define MAX_DUMPSTRUCTURE_DEPTH 100
* vlc_objects.h: vlc_object_t definition.
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: vlc_objects.h,v 1.1 2002/06/01 12:31:58 sam Exp $
+ * $Id: vlc_objects.h,v 1.2 2002/06/02 09:03:53 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
VLC_EXPORT( void *, __vlc_object_find, ( vlc_object_t *, int, int ) );
VLC_EXPORT( void, __vlc_object_yield, ( vlc_object_t * ) );
VLC_EXPORT( void, __vlc_object_release, ( vlc_object_t * ) );
-VLC_EXPORT( void, __vlc_object_unlink, ( vlc_object_t *, vlc_object_t * ) );
-VLC_EXPORT( void, __vlc_object_unlink_all, ( vlc_object_t * ) );
+VLC_EXPORT( void, __vlc_object_detach, ( vlc_object_t *, vlc_object_t * ) );
+VLC_EXPORT( void, __vlc_object_detach_all, ( vlc_object_t * ) );
VLC_EXPORT( void, __vlc_object_attach, ( vlc_object_t *, vlc_object_t * ) );
#if 0
//VLC_EXPORT( void, __vlc_object_setchild, ( vlc_object_t *, vlc_object_t * ) );
#define vlc_object_release(a) \
__vlc_object_release( CAST_TO_VLC_OBJECT(a) )
-#define vlc_object_unlink(a,b) \
- __vlc_object_unlink( CAST_TO_VLC_OBJECT(a), CAST_TO_VLC_OBJECT(b) )
+#define vlc_object_detach(a,b) \
+ __vlc_object_detach( CAST_TO_VLC_OBJECT(a), CAST_TO_VLC_OBJECT(b) )
-#define vlc_object_unlink_all(a) \
- __vlc_object_unlink_all( CAST_TO_VLC_OBJECT(a) )
+#define vlc_object_detach_all(a) \
+ __vlc_object_detach_all( CAST_TO_VLC_OBJECT(a) )
#define vlc_object_attach(a,b) \
__vlc_object_attach( CAST_TO_VLC_OBJECT(a), CAST_TO_VLC_OBJECT(b) )
void * (* __vlc_object_find_inner) ( vlc_object_t *, int, int ) ;
void (* __vlc_object_yield_inner) ( vlc_object_t * ) ;
void (* __vlc_object_release_inner) ( vlc_object_t * ) ;
- void (* __vlc_object_unlink_inner) ( vlc_object_t *, vlc_object_t * ) ;
- void (* __vlc_object_unlink_all_inner) ( vlc_object_t * ) ;
+ void (* __vlc_object_detach_inner) ( vlc_object_t *, vlc_object_t * ) ;
+ void (* __vlc_object_detach_all_inner) ( vlc_object_t * ) ;
void (* __vlc_object_attach_inner) ( vlc_object_t *, vlc_object_t * ) ;
void (* __vlc_dumpstructure_inner) ( vlc_object_t * ) ;
};
# define __vlc_object_find p_symbols->__vlc_object_find_inner
# define __vlc_object_yield p_symbols->__vlc_object_yield_inner
# define __vlc_object_release p_symbols->__vlc_object_release_inner
-# define __vlc_object_unlink p_symbols->__vlc_object_unlink_inner
-# define __vlc_object_unlink_all p_symbols->__vlc_object_unlink_all_inner
+# define __vlc_object_detach p_symbols->__vlc_object_detach_inner
+# define __vlc_object_detach_all p_symbols->__vlc_object_detach_all_inner
# define __vlc_object_attach p_symbols->__vlc_object_attach_inner
# define __vlc_dumpstructure p_symbols->__vlc_dumpstructure_inner
#endif /* __PLUGIN__ */
* vout_aa.c: Aa video output display method for testing purposes
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: aa.c,v 1.5 2002/06/01 12:31:58 sam Exp $
+ * $Id: aa.c,v 1.6 2002/06/02 09:03:53 sam Exp $
*
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
*
if ( b & AA_BUTTON3 )
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc, VLC_OBJECT_INTF,
- FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF, FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
* aout_directx.c: Windows DirectX audio output method
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: aout_directx.c,v 1.23 2002/06/01 16:45:34 sam Exp $
+ * $Id: aout_directx.c,v 1.24 2002/06/02 09:03:54 sam Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
msg_Dbg( p_aout, "aout_Close" );
/* kill the position notification thread, if any */
- vlc_object_unlink_all( p_aout->p_sys->p_notif );
+ vlc_object_detach_all( p_aout->p_sys->p_notif );
if( p_aout->p_sys->p_notif->b_thread )
{
p_aout->p_sys->p_notif->b_die = 1;
* vout_directx.c: Windows DirectX video output display method
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: vout_directx.c,v 1.38 2002/06/01 16:45:34 sam Exp $
+ * $Id: vout_directx.c,v 1.39 2002/06/02 09:03:54 sam Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
DirectXCloseDisplay( p_vout );
DirectXCloseDDraw( p_vout );
- vlc_object_unlink_all( p_vout->p_sys->p_event );
+ vlc_object_detach_all( p_vout->p_sys->p_event );
/* Kill DirectXEventThread */
p_vout->p_sys->p_event->b_die = 1;
* vout_events.c: Windows DirectX video output events handler
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: vout_events.c,v 1.21 2002/06/01 18:04:48 sam Exp $
+ * $Id: vout_events.c,v 1.22 2002/06/02 09:03:54 sam Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
*
case WM_RBUTTONUP:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_event->p_vlc, VLC_OBJECT_INTF,
- FIND_CHILD );
+ p_intf = vlc_object_find( p_event, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
filter_distort_SOURCES = distort.c
filter_wall_SOURCES = wall.c
filter_clone_SOURCES = clone.c
+filter_crop_SOURCES = crop.c
--- /dev/null
+/*****************************************************************************
+ * crop.c : Crop video plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2002 VideoLAN
+ * $Id: crop.c,v 1.2 2002/06/02 09:03:54 sam Exp $
+ *
+ * Authors: Samuel Hocevar <sam@zoy.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
+#include <errno.h>
+#include <stdlib.h> /* malloc(), free() */
+#include <string.h>
+
+#include <vlc/vlc.h>
+#include <vlc/vout.h>
+
+#include "filter_common.h"
+
+/*****************************************************************************
+ * Capabilities defined in the other files.
+ *****************************************************************************/
+static void vout_getfunctions( function_list_t * p_function_list );
+
+/*****************************************************************************
+ * Build configuration tree.
+ *****************************************************************************/
+MODULE_CONFIG_START
+ADD_CATEGORY_HINT( N_("Miscellaneous"), NULL )
+ADD_STRING ( "crop-geometry", NULL, NULL, N_("Crop geometry"), N_("Set the geometry of the zone to crop") )
+ADD_BOOL ( "autocrop", 0, NULL, N_("Automatic cropping"), N_("Activate automatic black border cropping") )
+MODULE_CONFIG_STOP
+
+MODULE_INIT_START
+ SET_DESCRIPTION( _("image crop video module") )
+ /* Capability score set to 0 because we don't want to be spawned
+ * as a video output unless explicitly requested to */
+ ADD_CAPABILITY( VOUT, 0 )
+ ADD_SHORTCUT( "crop" )
+MODULE_INIT_STOP
+
+MODULE_ACTIVATE_START
+ vout_getfunctions( &p_module->p_functions->vout );
+MODULE_ACTIVATE_STOP
+
+MODULE_DEACTIVATE_START
+MODULE_DEACTIVATE_STOP
+
+/*****************************************************************************
+ * vout_sys_t: Crop video output method descriptor
+ *****************************************************************************
+ * This structure is part of the video output thread descriptor.
+ * It describes the Crop specific properties of an output thread.
+ *****************************************************************************/
+struct vout_sys_s
+{
+ vout_thread_t *p_vout;
+
+ unsigned int i_x, i_y;
+ unsigned int i_width, i_height, i_aspect;
+
+ vlc_bool_t b_autocrop;
+
+ /* Autocrop specific variables */
+ unsigned int i_lastchange;
+ vlc_bool_t b_changed;
+};
+
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
+static int vout_Create ( vout_thread_t * );
+static int vout_Init ( vout_thread_t * );
+static void vout_End ( vout_thread_t * );
+static void vout_Destroy ( vout_thread_t * );
+static int vout_Manage ( vout_thread_t * );
+static void vout_Render ( vout_thread_t *, picture_t * );
+static void vout_Display ( vout_thread_t *, picture_t * );
+
+static void UpdateStats ( vout_thread_t *, picture_t * );
+
+/*****************************************************************************
+ * Functions exported as capabilities. They are declared as static so that
+ * we don't pollute the namespace too much.
+ *****************************************************************************/
+static void vout_getfunctions( function_list_t * p_function_list )
+{
+ p_function_list->functions.vout.pf_create = vout_Create;
+ p_function_list->functions.vout.pf_init = vout_Init;
+ p_function_list->functions.vout.pf_end = vout_End;
+ p_function_list->functions.vout.pf_destroy = vout_Destroy;
+ p_function_list->functions.vout.pf_manage = vout_Manage;
+ p_function_list->functions.vout.pf_render = vout_Render;
+ p_function_list->functions.vout.pf_display = vout_Display;
+}
+
+/*****************************************************************************
+ * vout_Create: allocates Crop video thread output method
+ *****************************************************************************
+ * This function allocates and initializes a Crop vout method.
+ *****************************************************************************/
+static int vout_Create( vout_thread_t *p_vout )
+{
+ /* Allocate structure */
+ p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
+ if( p_vout->p_sys == NULL )
+ {
+ msg_Err( p_vout, "out of memory" );
+ return 1;
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+ * vout_Init: initialize Crop video thread output method
+ *****************************************************************************/
+static int vout_Init( vout_thread_t *p_vout )
+{
+ int i_index;
+ char *psz_var;
+ picture_t *p_pic;
+
+ I_OUTPUTPICTURES = 0;
+
+ p_vout->p_sys->i_lastchange = 0;
+ p_vout->p_sys->b_changed = 0;
+
+ /* Initialize the output structure */
+ p_vout->output.i_chroma = p_vout->render.i_chroma;
+ p_vout->output.i_width = p_vout->render.i_width;
+ p_vout->output.i_height = p_vout->render.i_height;
+ p_vout->output.i_aspect = p_vout->render.i_aspect;
+
+ /* Shall we use autocrop ? */
+ p_vout->p_sys->b_autocrop = config_GetInt( p_vout, "autocrop" );
+
+ /* Get geometry value from the user */
+ psz_var = config_GetPsz( p_vout, "crop-geometry" );
+ if( psz_var )
+ {
+ char *psz_parser, *psz_tmp;
+
+ psz_parser = psz_tmp = psz_var;
+ while( *psz_tmp && *psz_tmp != 'x' ) psz_tmp++;
+
+ if( *psz_tmp )
+ {
+ psz_tmp[0] = '\0';
+ p_vout->p_sys->i_width = atoi( psz_parser );
+
+ psz_parser = ++psz_tmp;
+ while( *psz_tmp && *psz_tmp != '+' ) psz_tmp++;
+
+ if( *psz_tmp )
+ {
+ psz_tmp[0] = '\0';
+ p_vout->p_sys->i_height = atoi( psz_parser );
+
+ psz_parser = ++psz_tmp;
+ while( *psz_tmp && *psz_tmp != '+' ) psz_tmp++;
+
+ if( *psz_tmp )
+ {
+ psz_tmp[0] = '\0';
+ p_vout->p_sys->i_x = atoi( psz_parser );
+ p_vout->p_sys->i_y = atoi( ++psz_tmp );
+ }
+ else
+ {
+ p_vout->p_sys->i_x = atoi( psz_parser );
+ p_vout->p_sys->i_y =
+ ( p_vout->output.i_height - p_vout->p_sys->i_height ) / 2;
+ }
+ }
+ else
+ {
+ p_vout->p_sys->i_height = atoi( psz_parser );
+ p_vout->p_sys->i_x =
+ ( p_vout->output.i_width - p_vout->p_sys->i_width ) / 2;
+ p_vout->p_sys->i_y =
+ ( p_vout->output.i_height - p_vout->p_sys->i_height ) / 2;
+ }
+ }
+ else
+ {
+ p_vout->p_sys->i_width = atoi( psz_parser );
+ p_vout->p_sys->i_height = p_vout->output.i_height;
+ p_vout->p_sys->i_x =
+ ( p_vout->output.i_width - p_vout->p_sys->i_width ) / 2;
+ p_vout->p_sys->i_y =
+ ( p_vout->output.i_height - p_vout->p_sys->i_height ) / 2;
+ }
+
+ /* Check for validity */
+ if( p_vout->p_sys->i_x + p_vout->p_sys->i_width
+ > p_vout->output.i_width )
+ {
+ p_vout->p_sys->i_x = 0;
+ if( p_vout->p_sys->i_width > p_vout->output.i_width )
+ {
+ p_vout->p_sys->i_width = p_vout->output.i_width;
+ }
+ }
+
+ if( p_vout->p_sys->i_y + p_vout->p_sys->i_height
+ > p_vout->output.i_height )
+ {
+ p_vout->p_sys->i_y = 0;
+ if( p_vout->p_sys->i_height > p_vout->output.i_height )
+ {
+ p_vout->p_sys->i_height = p_vout->output.i_height;
+ }
+ }
+
+ free( psz_var );
+ }
+ else
+ {
+ p_vout->p_sys->i_width = p_vout->output.i_width;
+ p_vout->p_sys->i_height = p_vout->output.i_height;
+ p_vout->p_sys->i_x = p_vout->p_sys->i_y = 0;
+ }
+
+ /* Pheeew. Parsing done. */
+ msg_Dbg( p_vout, "cropping at %ix%i+%i+%i, %sautocropping",
+ p_vout->p_sys->i_width, p_vout->p_sys->i_height,
+ p_vout->p_sys->i_x, p_vout->p_sys->i_y,
+ p_vout->p_sys->b_autocrop ? "" : "not " );
+
+ /* Set current output image properties */
+ p_vout->p_sys->i_aspect = p_vout->output.i_aspect
+ * p_vout->output.i_height / p_vout->p_sys->i_height
+ * p_vout->p_sys->i_width / p_vout->output.i_width;
+
+ /* Try to open the real video output */
+ psz_var = config_GetPsz( p_vout, "filter" );
+ config_PutPsz( p_vout, "filter", NULL );
+
+ p_vout->p_sys->p_vout =
+ vout_CreateThread( p_vout,
+ p_vout->p_sys->i_width, p_vout->p_sys->i_height,
+ p_vout->render.i_chroma, p_vout->p_sys->i_aspect );
+ if( p_vout->p_sys->p_vout == NULL )
+ {
+ msg_Err( p_vout, "failed to create vout" );
+ config_PutPsz( p_vout, "filter", psz_var );
+ if( psz_var ) free( psz_var );
+ return 0;
+ }
+
+ config_PutPsz( p_vout, "filter", psz_var );
+ if( psz_var ) free( psz_var );
+
+ ALLOCATE_DIRECTBUFFERS( VOUT_MAX_PICTURES );
+
+ return 0;
+}
+
+/*****************************************************************************
+ * vout_End: terminate Crop video thread output method
+ *****************************************************************************/
+static void vout_End( vout_thread_t *p_vout )
+{
+ int i_index;
+
+ /* Free the fake output buffers we allocated */
+ for( i_index = I_OUTPUTPICTURES ; i_index ; )
+ {
+ i_index--;
+ free( PP_OUTPUTPICTURE[ i_index ]->p_data_orig );
+ }
+}
+
+/*****************************************************************************
+ * vout_Destroy: destroy Crop video thread output method
+ *****************************************************************************
+ * Terminate an output method created by CropCreateOutputMethod
+ *****************************************************************************/
+static void vout_Destroy( vout_thread_t *p_vout )
+{
+ vout_DestroyThread( p_vout->p_sys->p_vout );
+ free( p_vout->p_sys );
+}
+
+/*****************************************************************************
+ * vout_Manage: handle Crop events
+ *****************************************************************************
+ * This function should be called regularly by video output thread. It manages
+ * console events. It returns a non null value on error.
+ *****************************************************************************/
+static int vout_Manage( vout_thread_t *p_vout )
+{
+ if( !p_vout->p_sys->b_changed )
+ {
+ return 0;
+ }
+
+ vout_DestroyThread( p_vout->p_sys->p_vout );
+
+ p_vout->p_sys->p_vout =
+ vout_CreateThread( p_vout,
+ p_vout->p_sys->i_width, p_vout->p_sys->i_height,
+ p_vout->render.i_chroma, p_vout->p_sys->i_aspect );
+ if( p_vout->p_sys->p_vout == NULL )
+ {
+ msg_Err( p_vout, "failed to create vout" );
+ return 1;
+ }
+
+ p_vout->p_sys->b_changed = 0;
+ p_vout->p_sys->i_lastchange = 0;
+
+ return 0;
+}
+
+/*****************************************************************************
+ * vout_Render: display previously rendered output
+ *****************************************************************************
+ * This function sends the currently rendered image to Crop image, waits
+ * until it is displayed and switches the two rendering buffers, preparing next
+ * frame.
+ *****************************************************************************/
+static void vout_Render( vout_thread_t *p_vout, picture_t *p_pic )
+{
+ picture_t *p_outpic = NULL;
+ int i_plane;
+
+ if( p_vout->p_sys->b_changed )
+ {
+ return;
+ }
+
+ while( ( p_outpic =
+ vout_CreatePicture( p_vout->p_sys->p_vout, 0, 0, 0 )
+ ) == NULL )
+ {
+ if( p_vout->b_die || p_vout->b_error )
+ {
+ vout_DestroyPicture( p_vout->p_sys->p_vout, p_outpic );
+ return;
+ }
+
+ msleep( VOUT_OUTMEM_SLEEP );
+ }
+
+ vout_DatePicture( p_vout->p_sys->p_vout, p_outpic, p_pic->date );
+ vout_LinkPicture( p_vout->p_sys->p_vout, p_outpic );
+
+ for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )
+ {
+ u8 *p_in, *p_out, *p_out_end;
+ int i_in_pitch = p_pic->p[i_plane].i_pitch;
+ const int i_out_pitch = p_outpic->p[i_plane].i_pitch;
+
+ p_in = p_pic->p[i_plane].p_pixels
+ /* Skip the right amount of lines */
+ + i_in_pitch * ( p_pic->p[i_plane].i_lines * p_vout->p_sys->i_y
+ / p_vout->output.i_height )
+ /* Skip the right amount of columns */
+ + i_in_pitch * p_vout->p_sys->i_x / p_vout->output.i_width;
+
+ p_out = p_outpic->p[i_plane].p_pixels;
+ p_out_end = p_out + i_out_pitch * p_outpic->p[i_plane].i_lines;
+
+ while( p_out < p_out_end )
+ {
+ p_vout->p_vlc->pf_memcpy( p_out, p_in, i_out_pitch );
+ p_in += i_in_pitch;
+ p_out += i_out_pitch;
+ }
+ }
+
+ vout_UnlinkPicture( p_vout->p_sys->p_vout, p_outpic );
+ vout_DisplayPicture( p_vout->p_sys->p_vout, p_outpic );
+
+ /* The source image may still be in the cache ... parse it! */
+ if( !p_vout->p_sys->b_autocrop )
+ {
+ return;
+ }
+
+ UpdateStats( p_vout, p_pic );
+}
+
+/*****************************************************************************
+ * vout_Display: displays previously rendered output
+ *****************************************************************************
+ * This function send the currently rendered image to Invert image, waits
+ * until it is displayed and switch the two rendering buffers, preparing next
+ * frame.
+ *****************************************************************************/
+static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
+{
+ ;
+}
+
+static void UpdateStats( vout_thread_t *p_vout, picture_t *p_pic )
+{
+ u8 *p_in = p_pic->p[0].p_pixels;
+ int i_pitch = p_pic->p[0].i_pitch;
+ int i_lines = p_pic->p[0].i_lines;
+ int i_firstwhite = -1, i_lastwhite = -1, i;
+
+ /* Determine where black borders are */
+ switch( p_vout->output.i_chroma )
+ {
+ case FOURCC_I420:
+ /* XXX: Do not laugh ! I know this is very naive. But it's just a
+ * proof of concept code snippet... */
+ for( i = i_lines ; i-- ; )
+ {
+ const int i_col = i * i_pitch / i_lines;
+
+ if( p_in[i_col/2] > 40
+ && p_in[i_pitch / 2] > 40
+ && p_in[i_pitch/2 + i_col/2] > 40 )
+ {
+ if( i_lastwhite == -1 )
+ {
+ i_lastwhite = i;
+ }
+ i_firstwhite = i;
+ }
+ p_in += i_pitch;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ /* Decide whether it's worth changing the size */
+ if( i_lastwhite == -1 )
+ {
+ p_vout->p_sys->i_lastchange = 0;
+ return;
+ }
+
+ if( i_lastwhite - i_firstwhite < p_vout->p_sys->i_height / 2 )
+ {
+ p_vout->p_sys->i_lastchange = 0;
+ return;
+ }
+
+ if( i_lastwhite - i_firstwhite < p_vout->p_sys->i_height + 16
+ && i_lastwhite - i_firstwhite + 16 > p_vout->p_sys->i_height )
+ {
+ p_vout->p_sys->i_lastchange = 0;
+ return;
+ }
+
+ /* We need at least 25 images to make up our mind */
+ p_vout->p_sys->i_lastchange++;
+ if( p_vout->p_sys->i_lastchange < 25 )
+ {
+ return;
+ }
+
+ /* Tune a few values */
+ if( i_firstwhite & 1 )
+ {
+ i_firstwhite--;
+ }
+
+ if( !(i_lastwhite & 1) )
+ {
+ i_lastwhite++;
+ }
+
+ /* Change size */
+ p_vout->p_sys->i_y = i_firstwhite;
+ p_vout->p_sys->i_height = i_lastwhite - i_firstwhite + 1;
+
+ p_vout->p_sys->i_aspect = p_vout->output.i_aspect
+ * p_vout->output.i_height / p_vout->p_sys->i_height
+ * p_vout->p_sys->i_width / p_vout->output.i_width;
+
+ p_vout->p_sys->b_changed = 1;
+}
+
* ggi.c : GGI plugin for vlc
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: ggi.c,v 1.21 2002/06/01 12:31:59 sam Exp $
+ * $Id: ggi.c,v 1.22 2002/06/02 09:03:54 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
case GII_PBUTTON_RIGHT:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc,
- VLC_OBJECT_INTF, FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
* gnome.c : Gnome plugin for vlc
*****************************************************************************
* Copyright (C) 2000 VideoLAN
- * $Id: gnome.c,v 1.25 2002/06/01 18:04:48 sam Exp $
+ * $Id: gnome.c,v 1.26 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
if( p_intf->p_sys->p_input == NULL )
{
- p_intf->p_sys->p_input = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_INPUT, FIND_CHILD );
+ p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT,
+ FIND_ANYWHERE );
}
if( p_intf->p_sys->p_input )
* gtk.c : Gtk+ plugin for vlc
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: gtk.c,v 1.25 2002/06/01 18:04:48 sam Exp $
+ * $Id: gtk.c,v 1.26 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
if( p_intf->p_sys->p_input == NULL )
{
- p_intf->p_sys->p_input = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_INPUT, FIND_CHILD );
+ p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT,
+ FIND_ANYWHERE );
}
if( p_intf->p_sys->p_input )
* gtk_control.c : functions to handle stream control buttons.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_control.c,v 1.10 2002/06/01 12:31:59 sam Exp $
+ * $Id: gtk_control.c,v 1.11 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist )
{
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist )
{
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist )
{
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
#if 0
if( p_playlist )
intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
#if 0
if( p_playlist )
* gtk_display.c: Gtk+ tools for main interface
*****************************************************************************
* Copyright (C) 1999, 2000 VideoLAN
- * $Id: gtk_display.c,v 1.23 2002/06/01 12:31:59 sam Exp $
+ * $Id: gtk_display.c,v 1.24 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
*****************************************************************************/
void GtkHideTooltips( vlc_object_t *p_this )
{
- intf_thread_t *p_intf = vlc_object_find( p_this->p_vlc,
- VLC_OBJECT_INTF, FIND_CHILD );
+ intf_thread_t *p_intf = vlc_object_find( p_this, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( !p_intf )
{
GtkToolbarStyle style;
GtkToolbar * p_toolbar;
- intf_thread_t *p_intf = vlc_object_find( p_this->p_vlc,
- VLC_OBJECT_INTF, FIND_CHILD );
+ intf_thread_t *p_intf = vlc_object_find( p_this, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( !p_intf )
{
* gtk_open.c : functions to handle file/disc/network open widgets.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
- * $Id: gtk_open.c,v 1.26 2002/06/01 18:04:48 sam Exp $
+ * $Id: gtk_open.c,v 1.27 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Stéphane Borel <stef@via.ecp.fr>
GtkWidget * p_filesel;
gchar * psz_filename;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist == NULL )
{
return;
char * psz_device, *psz_source, *psz_method;
int i_title, i_chapter;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist == NULL )
{
return;
unsigned int i_port;
vlc_bool_t b_channel;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist == NULL )
{
return;
int i_fec;
vlc_bool_t b_pol;
- p_playlist = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_PLAYLIST, FIND_CHILD );
+ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist == NULL )
{
return;
* video_parser.c : video parser thread
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: video_parser.c,v 1.22 2002/06/01 13:52:24 sam Exp $
+ * $Id: video_parser.c,v 1.23 2002/06/02 09:03:54 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Samuel Hocevar <sam@via.ecp.fr>
}
/* We are about to die. Reattach video output to p_vlc. */
- vlc_object_unlink( p_vpar->p_vout, p_vpar->p_fifo );
+ vlc_object_detach( p_vpar->p_vout, p_vpar->p_fifo );
vlc_object_attach( p_vpar->p_vout, p_vpar->p_fifo->p_vlc );
msg_Dbg( p_vpar->p_fifo, "%d loops among %d sequence(s)",
* vpar_headers.c : headers parsing
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: vpar_headers.c,v 1.25 2002/06/01 18:04:49 sam Exp $
+ * $Id: vpar_headers.c,v 1.26 2002/06/02 09:03:54 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Stéphane Borel <stef@via.ecp.fr>
/* Spawn a video output if there is none */
- p_vpar->p_vout = vlc_object_find( p_vpar->p_fifo->p_vlc, VLC_OBJECT_VOUT,
- FIND_CHILD );
+ p_vpar->p_vout = vlc_object_find( p_vpar->p_fifo, VLC_OBJECT_VOUT,
+ FIND_ANYWHERE );
if( p_vpar->p_vout )
{
|| p_vpar->p_vout->render.i_aspect != p_vpar->sequence.i_aspect )
{
/* We are not interested in this format, close this vout */
- vlc_object_unlink_all( p_vpar->p_vout );
+ vlc_object_detach_all( p_vpar->p_vout );
vlc_object_release( p_vpar->p_vout );
vout_DestroyThread( p_vpar->p_vout );
p_vpar->p_vout = NULL;
else
{
/* This video output is cool! Hijack it. */
- vlc_object_unlink_all( p_vpar->p_vout );
+ vlc_object_detach_all( p_vpar->p_vout );
vlc_object_attach( p_vpar->p_vout, p_vpar->p_fifo );
vlc_object_release( p_vpar->p_vout );
}
* vpar_pool.c : management of the pool of decoder threads
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: vpar_pool.c,v 1.10 2002/06/01 13:52:24 sam Exp $
+ * $Id: vpar_pool.c,v 1.11 2002/06/02 09:03:54 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
{
int j;
- vlc_object_unlink_all( p_vpar->pool.pp_vdec[i] );
+ vlc_object_detach_all( p_vpar->pool.pp_vdec[i] );
vdec_DestroyThread( p_vpar->pool.pp_vdec[i] );
for( j = 0; j < 12; j++ )
{
int j;
- vlc_object_unlink_all( p_vpar->pool.pp_vdec[i] );
+ vlc_object_detach_all( p_vpar->pool.pp_vdec[i] );
vdec_DestroyThread( p_vpar->pool.pp_vdec[i] );
for( j = 0; j < 12; j++ )
}
/* Free fake video decoder (used when parser == decoder). */
- vlc_object_unlink_all( p_vpar->pool.p_vdec );
+ vlc_object_detach_all( p_vpar->pool.p_vdec );
vdec_EndThread( p_vpar->pool.p_vdec );
vlc_object_destroy( p_vpar->pool.p_vdec );
* vout_sdl.c: SDL video output display method
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: vout_sdl.c,v 1.93 2002/06/01 18:04:49 sam Exp $
+ * $Id: vout_sdl.c,v 1.94 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Pierre Baillet <oct@zoy.org>
case SDL_BUTTON_RIGHT:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc, VLC_OBJECT_INTF,
- FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
case SDLK_MENU:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc, VLC_OBJECT_INTF,
- FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
* rc.c : remote control stdin/stdout plugin for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: rc.c,v 1.16 2002/06/01 18:04:49 sam Exp $
+ * $Id: rc.c,v 1.17 2002/06/02 09:03:54 sam Exp $
*
* Authors: Peter Surda <shurdeek@panorama.sth.ac.at>
*
}
/* Manage the input part */
- p_input = vlc_object_find( p_intf->p_vlc,
- VLC_OBJECT_INPUT, FIND_CHILD );
+ p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE );
if( p_input )
{
* xcommon.c: Functions common to the X11 and XVideo plugins
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: xcommon.c,v 1.37 2002/06/01 18:04:49 sam Exp $
+ * $Id: xcommon.c,v 1.38 2002/06/02 09:03:54 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
case XK_Menu:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc, VLC_OBJECT_INTF,
- FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
case Button3:
{
intf_thread_t *p_intf;
- p_intf = vlc_object_find( p_vout->p_vlc,
- VLC_OBJECT_INTF, FIND_CHILD );
+ p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
if( p_intf )
{
p_intf->b_menu_change = 1;
msgid ""
msgstr ""
"Project-Id-Version: vlc 0.73.3\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-04-18 23:38+0100\n"
"Last-Translator: Thomas Graf <tgr@reeler.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-04-22 09:56+0200\n"
"Last-Translator: Samuel Hocevar <sam@zoy.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2001-12-10 13:32+0100\n"
"Last-Translator: Samuel Hocevar <sam@zoy.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgstr "activer l'audio"
#: src/libvlc.h:66
-#, fuzzy
msgid ""
"You can completely disable the audio output. In this case the audio decoding "
"stage won't be done, and it will save some processing power."
msgstr ""
"Cette option désactive complètement la sortie audio. Le décodage des pistes "
-"audio ne sera pas non plus fait, afin d'économiser du temps processeur."
+"audio ne sera pas effectué, afin d'économiser du temps processeur."
#: src/libvlc.h:69
msgid "force mono audio"
"disponible."
#: src/libvlc.h:106
-#, fuzzy
msgid "enable video"
-msgstr "désactiver la vidéo"
+msgstr "activer la vidéo"
#: src/libvlc.h:108
-#, fuzzy
msgid ""
"You can completely disable the video output. In this case the video decoding "
"stage won't be done, which will save some processing power."
msgstr ""
-"Cette option désactive complètement la sortie audio. Le décodage des pistes "
-"audio ne sera pas non plus fait, afin d'économiser du temps processeur."
+"Cette option désactive complètement la sortie vidéo. Le décodage des pistes "
+"vidéo ne sera pas effectué, afin d'économiser du temps processeur."
#: src/libvlc.h:111
msgid "display identifier"
msgstr "sortie vidéo en niveaux de gris"
#: src/libvlc.h:132
-#, fuzzy
msgid ""
"When enabled, the color information from the video won't be decoded (this "
"can also allow you to save some processing power)."
"plein écran."
#: src/libvlc.h:140
-#, fuzzy
msgid "overlay video output"
msgstr "sortie vidéo en overlay"
#: src/libvlc.h:142
-#, fuzzy
msgid ""
"If enabled, vlc will try to take advantage of the overlay capabilities of "
"you graphics card."
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-04-02 03:22+0900\n"
"Last-Translator: Fumio Nakayama <endymion@ca2.so-net.ne.jp>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-04-20 16:58GMT\n"
"Last-Translator: Jean-Paul Saman <jpsaman@wxs.nl>\n"
"Language-Team: Nederlands <nl@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: vlc-cvs\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-28-02 23.35+0100\n"
"Last-Translator: Sigmund Augdal <sigmunau@idi.ntnu.no>.\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: vlc\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2002-05-26 18:31+0200\n"
"Last-Translator: Arkadiusz Lipiec <alipiec@elka.pw.edu.pl>\n"
"Language-Team: polish <pl@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: gnome-vlc\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: 2001-02-19 19:58+03:00\n"
"Last-Translator: Valek Filippov <frob@df.ru>\n"
"Language-Team: Russian <ru@li.org>\n"
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-06-01 19:57+0200\n"
+"POT-Creation-Date: 2002-06-02 10:58+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
* aout_ext-dec.c : exported fifo management functions
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: aout_ext-dec.c,v 1.17 2002/06/01 18:04:49 sam Exp $
+ * $Id: aout_ext-dec.c,v 1.18 2002/06/02 09:03:54 sam Exp $
*
* Authors: Michel Kaempf <maxx@via.ecp.fr>
* Cyril Deguet <asmax@via.ecp.fr>
int i_index;
/* Spawn an audio output if there is none */
- p_aout = vlc_object_find( p_this->p_vlc, VLC_OBJECT_AOUT, FIND_CHILD );
+ p_aout = vlc_object_find( p_this, VLC_OBJECT_AOUT, FIND_ANYWHERE );
if( p_aout )
{
if( p_aout->fifo[0].i_format != i_format )
{
msg_Dbg( p_this, "changing aout type" );
- vlc_object_unlink_all( p_aout );
+ vlc_object_detach_all( p_aout );
vlc_object_release( p_aout );
aout_DestroyThread( p_aout );
p_aout = NULL;
* input_dec.c: Functions for the management of decoders
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.37 2002/06/01 12:32:01 sam Exp $
+ * $Id: input_dec.c,v 1.38 2002/06/02 09:03:54 sam Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
*****************************************************************************/
static void DeleteDecoderFifo( decoder_fifo_t * p_fifo )
{
- vlc_object_unlink_all( p_fifo );
+ vlc_object_detach_all( p_fifo );
msg_Dbg( p_fifo, "killing decoder for 0x%x, type 0x%x, %d PES in FIFO",
p_fifo->i_id, p_fifo->i_type, p_fifo->i_depth );
* and spawns threads.
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
- * $Id: libvlc.c,v 1.4 2002/06/01 18:04:49 sam Exp $
+ * $Id: libvlc.c,v 1.5 2002/06/02 09:03:54 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
while( (p_intf = vlc_object_find( p_vlc, VLC_OBJECT_INTF, FIND_CHILD )) )
{
intf_StopThread( p_intf );
- vlc_object_unlink_all( p_intf );
+ vlc_object_detach_all( p_intf );
vlc_object_release( p_intf );
intf_Destroy( p_intf );
}
while( (p_playlist = vlc_object_find( p_vlc, VLC_OBJECT_PLAYLIST,
FIND_CHILD )) )
{
- vlc_object_unlink_all( p_playlist );
+ vlc_object_detach_all( p_playlist );
vlc_object_release( p_playlist );
playlist_Destroy( p_playlist );
}
msg_Dbg( p_vlc, "removing all video outputs" );
while( (p_vout = vlc_object_find( p_vlc, VLC_OBJECT_VOUT, FIND_CHILD )) )
{
- vlc_object_unlink_all( p_vout );
+ vlc_object_detach_all( p_vout );
vlc_object_release( p_vout );
vout_DestroyThread( p_vout );
}
msg_Dbg( p_vlc, "removing all audio outputs" );
while( (p_aout = vlc_object_find( p_vlc, VLC_OBJECT_AOUT, FIND_CHILD )) )
{
- vlc_object_unlink_all( p_aout );
+ vlc_object_detach_all( p_aout );
vlc_object_release( p_aout );
aout_DestroyThread( p_aout );
}
* beos_init.cpp: Initialization for BeOS specific features
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: beos_specific.cpp,v 1.21 2002/06/01 14:31:32 sam Exp $
+ * $Id: beos_specific.cpp,v 1.22 2002/06/02 09:03:54 sam Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
*
vlc_object_attach( p_this, p_this->p_vlc );
BeApp->p_this = p_this;
BeApp->Run();
- vlc_object_unlink_all( p_this );
+ vlc_object_detach_all( p_this );
delete BeApp;
}
* modules.c : Builtin and plugin modules management functions
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: modules.c,v 1.64 2002/06/01 18:04:49 sam Exp $
+ * $Id: modules.c,v 1.65 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
* Ethan C. Baldridge <BaldridgeE@cadmus.com>
return -1;
}
- vlc_object_attach( p_module, p_this );
-
/* We need to fill these since they may be needed by CallSymbol() */
p_module->is.plugin.psz_filename = psz_filename;
p_module->is.plugin.handle = handle;
msg_Dbg( p_this, "plugin `%s', %s",
p_module->psz_object_name, p_module->psz_longname );
+ vlc_object_attach( p_module, p_this );
+
return 0;
}
#endif /* HAVE_DYNAMIC_PLUGINS */
}
#endif
- vlc_object_unlink_all( p_module );
+ vlc_object_detach_all( p_module );
/* Unlink the module from the linked list. */
if( p_module->prev != NULL )
(p_symbols)->__vlc_object_find_inner = __vlc_object_find; \
(p_symbols)->__vlc_object_yield_inner = __vlc_object_yield; \
(p_symbols)->__vlc_object_release_inner = __vlc_object_release; \
- (p_symbols)->__vlc_object_unlink_inner = __vlc_object_unlink; \
- (p_symbols)->__vlc_object_unlink_all_inner = __vlc_object_unlink_all; \
+ (p_symbols)->__vlc_object_detach_inner = __vlc_object_detach; \
+ (p_symbols)->__vlc_object_detach_all_inner = __vlc_object_detach_all; \
(p_symbols)->__vlc_object_attach_inner = __vlc_object_attach; \
(p_symbols)->__vlc_dumpstructure_inner = __vlc_dumpstructure; \
* objects.c: vlc_object_t handling
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: objects.c,v 1.3 2002/06/01 18:04:49 sam Exp $
+ * $Id: objects.c,v 1.4 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
+/*****************************************************************************
+ * Preamble
+ *****************************************************************************/
#include <vlc/vlc.h>
#ifdef HAVE_STDLIB_H
#include "playlist.h"
#include "interface.h"
-static void vlc_dumpstructure_inner( vlc_object_t *, int, char * );
+/*****************************************************************************
+ * Local prototypes
+ *****************************************************************************/
static vlc_object_t * vlc_object_find_inner( vlc_object_t *, int, int );
-static void vlc_object_unlink_inner( vlc_object_t *, vlc_object_t * );
-
-#define MAX_TREE_DEPTH 100
-
-void __vlc_dumpstructure( vlc_object_t *p_this )
-{
- char psz_foo[2 * MAX_TREE_DEPTH + 1];
-
- vlc_mutex_lock( &p_this->p_vlc->structure_lock );
- psz_foo[0] = '|';
- vlc_dumpstructure_inner( p_this, 0, psz_foo );
- vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
-}
-
-static void vlc_dumpstructure_inner( vlc_object_t *p_this,
- int i_level, char *psz_foo )
-{
- int i;
- char i_back = psz_foo[i_level];
- char psz_children[20], psz_refcount[20], psz_thread[20], psz_name[50];
-
- psz_name[0] = '\0';
- if( p_this->psz_object_name )
- {
- snprintf( psz_name, 50, " \"%s\"", p_this->psz_object_name );
- psz_name[48] = '\"';
- psz_name[49] = '\0';
- }
-
- psz_children[0] = '\0';
- switch( p_this->i_children )
- {
- case 0:
- break;
- case 1:
- strcpy( psz_children, ", 1 child" );
- break;
- default:
- snprintf( psz_children, 20, ", %i children", p_this->i_children );
- psz_children[19] = '\0';
- break;
- }
-
- psz_refcount[0] = '\0';
- if( p_this->i_refcount )
- {
- snprintf( psz_refcount, 20, ", refcount %i", p_this->i_refcount );
- psz_refcount[19] = '\0';
- }
-
- psz_thread[0] = '\0';
- if( p_this->b_thread )
- {
- snprintf( psz_thread, 20, " (thread %d)", p_this->i_thread );
- psz_thread[19] = '\0';
- }
-
- psz_foo[i_level] = '\0';
- msg_Info( p_this, "%so %s %p%s%s%s%s", psz_foo, p_this->psz_object_type,
- p_this, psz_name, psz_thread, psz_refcount, psz_children );
- psz_foo[i_level] = i_back;
-
- if( i_level / 2 >= MAX_TREE_DEPTH )
- {
- msg_Warn( p_this, "structure tree is too deep" );
- return;
- }
-
- for( i = 0 ; i < p_this->i_children ; i++ )
- {
- if( i_level )
- {
- psz_foo[i_level-1] = ' ';
-
- if( psz_foo[i_level-2] == '`' )
- {
- psz_foo[i_level-2] = ' ';
- }
- }
-
- if( i == p_this->i_children - 1 )
- {
- psz_foo[i_level] = '`';
- }
- else
- {
- psz_foo[i_level] = '|';
- }
-
- psz_foo[i_level+1] = '-';
- psz_foo[i_level+2] = '\0';
-
- vlc_dumpstructure_inner( p_this->pp_children[i], i_level + 2, psz_foo );
- }
-}
+static void vlc_object_detach_inner( vlc_object_t *, vlc_object_t * );
+static void vlc_dumpstructure_inner( vlc_object_t *, int, char * );
-/* vlc_object_create: initialize a vlc object */
+/*****************************************************************************
+ * vlc_object_create: initialize a vlc object
+ *****************************************************************************
+ * This function allocates memory for a vlc object and initializes it. If
+ * i_type is not a known value such as VLC_OBJECT_ROOT, VLC_OBJECT_VOUT and
+ * so on, vlc_object_create will use its value for the object size.
+ *****************************************************************************/
void * __vlc_object_create( vlc_object_t *p_this, int i_type )
{
vlc_object_t * p_new;
return p_new;
}
-/* vlc_object_destroy: initialize a vlc object and set its parent */
+/*****************************************************************************
+ * vlc_object_destroy: destroy a vlc object
+ *****************************************************************************
+ * This function destroys an object that has been previously allocated with
+ * vlc_object_create. The object's refcount must be zero and it must not be
+ * attached to other objects in any way.
+ *****************************************************************************/
void __vlc_object_destroy( vlc_object_t *p_this )
{
if( p_this->i_refcount )
free( p_this );
}
-/* vlc_object_find: find a typed object and increment its refcount */
+/*****************************************************************************
+ * vlc_object_find: find a typed object and increment its refcount
+ *****************************************************************************
+ * This function recursively looks for a given object type. i_mode can be one
+ * of FIND_PARENT, FIND_CHILD or FIND_ANYWHERE.
+ *****************************************************************************/
void * __vlc_object_find( vlc_object_t *p_this, int i_type, int i_mode )
{
vlc_object_t *p_found;
}
/* Otherwise, recursively look for the object */
- p_found = vlc_object_find_inner( p_this, i_type, i_mode );
+ if( (i_mode & 0x000f) == FIND_ANYWHERE )
+ {
+ p_found = vlc_object_find_inner( CAST_TO_VLC_OBJECT(p_this->p_vlc),
+ i_type,
+ (i_mode & ~0x000f) | FIND_CHILD );
+ }
+ else
+ {
+ p_found = vlc_object_find_inner( p_this, i_type, i_mode );
+ }
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
break;
case FIND_ANYWHERE:
- /* FIXME: unimplemented */
+ /* Handled in vlc_object_find */
break;
}
return NULL;
}
-/* vlc_object_yield: increment an object refcount */
+/*****************************************************************************
+ * vlc_object_yield: increment an object refcount
+ *****************************************************************************/
void __vlc_object_yield( vlc_object_t *p_this )
{
vlc_mutex_lock( &p_this->p_vlc->structure_lock );
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
}
-/* vlc_object_release: decrement an object refcount */
+/*****************************************************************************
+ * vlc_object_release: decrement an object refcount
+ *****************************************************************************/
void __vlc_object_release( vlc_object_t *p_this )
{
vlc_mutex_lock( &p_this->p_vlc->structure_lock );
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
}
-/* vlc_object_unlink: detach object from its parents */
-void __vlc_object_unlink_all( vlc_object_t *p_this )
+/*****************************************************************************
+ * vlc_object_attach: attach object to a parent object
+ *****************************************************************************
+ * This function sets p_this as a child of p_parent, and p_parent as a parent
+ * of p_this. This link can be undone using vlc_object_detach.
+ *****************************************************************************/
+void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent )
+{
+ vlc_mutex_lock( &p_this->p_vlc->structure_lock );
+
+ p_this->i_parents++;
+ p_this->pp_parents = (vlc_object_t **)realloc( p_this->pp_parents,
+ p_this->i_parents * sizeof(vlc_object_t *) );
+ p_this->pp_parents[p_this->i_parents - 1] = p_parent;
+
+ p_parent->i_children++;
+ p_parent->pp_children = (vlc_object_t **)realloc( p_parent->pp_children,
+ p_parent->i_children * sizeof(vlc_object_t *) );
+ p_parent->pp_children[p_parent->i_children - 1] = p_this;
+
+ vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
+}
+
+#if 0 /* UNUSED */
+/* vlc_object_setchild: attach a child object */
+void __vlc_object_setchild( vlc_object_t *p_this, vlc_object_t *p_child )
+{
+ vlc_mutex_lock( &p_this->p_vlc->structure_lock );
+
+ p_this->i_children++;
+ p_this->pp_children = (vlc_object_t **)realloc( p_this->pp_children,
+ p_this->i_children * sizeof(vlc_object_t *) );
+ p_this->pp_children[p_this->i_children - 1] = p_child;
+
+ p_child->i_parents++;
+ p_child->pp_parents = (vlc_object_t **)realloc( p_child->pp_parents,
+ p_child->i_parents * sizeof(vlc_object_t *) );
+ p_child->pp_parents[p_child->i_parents - 1] = p_this;
+
+ vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
+}
+#endif
+
+/*****************************************************************************
+ * vlc_object_detach_all: detach object from its parents
+ *****************************************************************************
+ * This function unlinks an object from all its parents. It is up to the
+ * object to get rid of its children, so this function doesn't do anything
+ * with them.
+ *****************************************************************************/
+void __vlc_object_detach_all( vlc_object_t *p_this )
{
vlc_mutex_lock( &p_this->p_vlc->structure_lock );
/* Not very effective because we know the index, but we'd have to
* parse p_parent->pp_children anyway. Plus, we remove duplicates
* by not using the object's index */
- vlc_object_unlink_inner( p_this, p_this->pp_parents[0] );
+ vlc_object_detach_inner( p_this, p_this->pp_parents[0] );
}
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
}
-/* vlc_object_unlink: remove a parent/child link */
-void __vlc_object_unlink( vlc_object_t *p_this, vlc_object_t *p_parent )
+/*****************************************************************************
+ * vlc_object_detach: remove a parent/child link
+ *****************************************************************************
+ * This function removes all links between an object and a given parent.
+ *****************************************************************************/
+void __vlc_object_detach( vlc_object_t *p_this, vlc_object_t *p_parent )
{
vlc_mutex_lock( &p_this->p_vlc->structure_lock );
- vlc_object_unlink_inner( p_this, p_parent );
+ vlc_object_detach_inner( p_this, p_parent );
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
}
-static void vlc_object_unlink_inner( vlc_object_t *p_this,
+static void vlc_object_detach_inner( vlc_object_t *p_this,
vlc_object_t *p_parent )
{
int i_index, i;
}
}
-/* vlc_object_attach: attach object to a parent object */
-void __vlc_object_attach( vlc_object_t *p_this, vlc_object_t *p_parent )
+/*****************************************************************************
+ * vlc_dumpstructure: print the current vlc structure
+ *****************************************************************************
+ * This function prints an ASCII tree showing the connections between vlc
+ * objects, and additional information such as their refcount, thread ID,
+ * address, etc.
+ *****************************************************************************/
+void __vlc_dumpstructure( vlc_object_t *p_this )
{
- vlc_mutex_lock( &p_this->p_vlc->structure_lock );
-
- p_this->i_parents++;
- p_this->pp_parents = (vlc_object_t **)realloc( p_this->pp_parents,
- p_this->i_parents * sizeof(vlc_object_t *) );
- p_this->pp_parents[p_this->i_parents - 1] = p_parent;
-
- p_parent->i_children++;
- p_parent->pp_children = (vlc_object_t **)realloc( p_parent->pp_children,
- p_parent->i_children * sizeof(vlc_object_t *) );
- p_parent->pp_children[p_parent->i_children - 1] = p_this;
+ char psz_foo[2 * MAX_DUMPSTRUCTURE_DEPTH + 1];
+ vlc_mutex_lock( &p_this->p_vlc->structure_lock );
+ psz_foo[0] = '|';
+ vlc_dumpstructure_inner( p_this, 0, psz_foo );
vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
}
-#if 0 /* UNUSED */
-/* vlc_object_setchild: attach a child object */
-void __vlc_object_setchild( vlc_object_t *p_this, vlc_object_t *p_child )
+static void vlc_dumpstructure_inner( vlc_object_t *p_this,
+ int i_level, char *psz_foo )
{
- vlc_mutex_lock( &p_this->p_vlc->structure_lock );
+ int i;
+ char i_back = psz_foo[i_level];
+ char psz_children[20], psz_refcount[20], psz_thread[20], psz_name[50];
- p_this->i_children++;
- p_this->pp_children = (vlc_object_t **)realloc( p_this->pp_children,
- p_this->i_children * sizeof(vlc_object_t *) );
- p_this->pp_children[p_this->i_children - 1] = p_child;
+ psz_name[0] = '\0';
+ if( p_this->psz_object_name )
+ {
+ snprintf( psz_name, 50, " \"%s\"", p_this->psz_object_name );
+ psz_name[48] = '\"';
+ psz_name[49] = '\0';
+ }
- p_child->i_parents++;
- p_child->pp_parents = (vlc_object_t **)realloc( p_child->pp_parents,
- p_child->i_parents * sizeof(vlc_object_t *) );
- p_child->pp_parents[p_child->i_parents - 1] = p_this;
+ psz_children[0] = '\0';
+ switch( p_this->i_children )
+ {
+ case 0:
+ break;
+ case 1:
+ strcpy( psz_children, ", 1 child" );
+ break;
+ default:
+ snprintf( psz_children, 20, ", %i children", p_this->i_children );
+ psz_children[19] = '\0';
+ break;
+ }
- vlc_mutex_unlock( &p_this->p_vlc->structure_lock );
+ psz_refcount[0] = '\0';
+ if( p_this->i_refcount )
+ {
+ snprintf( psz_refcount, 20, ", refcount %i", p_this->i_refcount );
+ psz_refcount[19] = '\0';
+ }
+
+ psz_thread[0] = '\0';
+ if( p_this->b_thread )
+ {
+ snprintf( psz_thread, 20, " (thread %d)", p_this->i_thread );
+ psz_thread[19] = '\0';
+ }
+
+ psz_foo[i_level] = '\0';
+ msg_Info( p_this, "%so %s %p%s%s%s%s", psz_foo, p_this->psz_object_type,
+ p_this, psz_name, psz_thread, psz_refcount, psz_children );
+ psz_foo[i_level] = i_back;
+
+ if( i_level / 2 >= MAX_DUMPSTRUCTURE_DEPTH )
+ {
+ msg_Warn( p_this, "structure tree is too deep" );
+ return;
+ }
+
+ for( i = 0 ; i < p_this->i_children ; i++ )
+ {
+ if( i_level )
+ {
+ psz_foo[i_level-1] = ' ';
+
+ if( psz_foo[i_level-2] == '`' )
+ {
+ psz_foo[i_level-2] = ' ';
+ }
+ }
+
+ if( i == p_this->i_children - 1 )
+ {
+ psz_foo[i_level] = '`';
+ }
+ else
+ {
+ psz_foo[i_level] = '|';
+ }
+
+ psz_foo[i_level+1] = '-';
+ psz_foo[i_level+2] = '\0';
+
+ vlc_dumpstructure_inner( p_this->pp_children[i], i_level + 2, psz_foo );
+ }
}
-#endif
* playlist.c : Playlist management functions
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: playlist.c,v 1.2 2002/06/01 18:04:49 sam Exp $
+ * $Id: playlist.c,v 1.3 2002/06/02 09:03:54 sam Exp $
*
* Authors: Samuel Hocevar <sam@zoy.org>
*
{
msg_Err( p_playlist, "cannot spawn playlist thread" );
vlc_mutex_destroy( &p_playlist->change_lock );
- vlc_object_unlink_all( p_playlist );
+ vlc_object_detach_all( p_playlist );
vlc_object_destroy( p_playlist );
return NULL;
}
{
playlist_t *p_playlist;
- p_playlist = vlc_object_find( p_this->p_vlc, VLC_OBJECT_PLAYLIST,
- FIND_CHILD );
+ p_playlist = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist == NULL )
{
vlc_mutex_unlock( &p_playlist->change_lock );
/* Destroy input */
- vlc_object_unlink_all( p_input );
+ vlc_object_detach_all( p_input );
vlc_object_release( p_input );
input_DestroyThread( p_input );
}
vlc_mutex_unlock( &p_playlist->change_lock );
/* Destroy input */
- vlc_object_unlink_all( p_input );
+ vlc_object_detach_all( p_input );
vlc_object_release( p_input );
input_DestroyThread( p_input );
}
* thread, and destroy a previously oppened video output thread.
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.182 2002/06/01 18:04:49 sam Exp $
+ * $Id: video_output.c,v 1.183 2002/06/02 09:03:54 sam Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
void vout_DestroyThread( vout_thread_t *p_vout )
{
/* Unlink object */
- vlc_object_unlink_all( p_vout );
+ vlc_object_detach_all( p_vout );
/* Request thread destruction */
p_vout->b_die = 1;
p_vout->i_heap_size--;
}
vlc_mutex_unlock( &p_vout->picture_lock );
+ p_last_picture = NULL;
}
/* Compute FPS rate */
%{_libdir}/vlc/dvd.so
%{_libdir}/vlc/fb.so
%{_libdir}/vlc/file.so
+%{_libdir}/vlc/filter_clone.so
+%{_libdir}/vlc/filter_crop.so
%{_libdir}/vlc/filter_deinterlace.so
%{_libdir}/vlc/filter_distort.so
%{_libdir}/vlc/filter_invert.so