Update of /cvsroot/freevo/kaa/xine/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32510/src
Modified Files:
__init__.py xine.c xine.h
Added Files:
constants.py
Log Message:
Add logging functions. Add XINE_ constants and a script gen_constants.py
to automatically generate that from xine.h
--- NEW FILE: constants.py ---
VISUAL_TYPE_NONE = 0
VISUAL_TYPE_X11 = 1
VISUAL_TYPE_AA = 2
VISUAL_TYPE_FB = 3
VISUAL_TYPE_GTK = 4
VISUAL_TYPE_DFB = 5
VISUAL_TYPE_PM = 6 # used by the OS/2 port
VISUAL_TYPE_DIRECTX = 7 # used by the win32/msvc port
VISUAL_TYPE_CACA = 8
VISUAL_TYPE_MACOSX = 9
MASTER_SLAVE_PLAY = (1<<0)
MASTER_SLAVE_STOP = (1<<1)
MASTER_SLAVE_SPEED = (1<<2)
TRICK_MODE_OFF = 0
TRICK_MODE_SEEK_TO_POSITION = 1
TRICK_MODE_SEEK_TO_TIME = 2
TRICK_MODE_FAST_FORWARD = 3
TRICK_MODE_FAST_REWIND = 4
ENGINE_PARAM_VERBOSITY = 1
PARAM_SPEED = 1 # see below
PARAM_AV_OFFSET = 2 # unit: 1/90000 sec
PARAM_AUDIO_CHANNEL_LOGICAL = 3 # -1 => auto, -2 => off
PARAM_SPU_CHANNEL = 4
PARAM_VIDEO_CHANNEL = 5
PARAM_AUDIO_VOLUME = 6 # 0..100
PARAM_AUDIO_MUTE = 7 # 1=>mute, 0=>unmute
PARAM_AUDIO_COMPR_LEVEL = 8 # <100=>off, % compress otherw
PARAM_AUDIO_AMP_LEVEL = 9 # 0..200, 100=>100% (default)
PARAM_AUDIO_REPORT_LEVEL = 10 # 1=>send events, 0=> don't
PARAM_VERBOSITY = 11 # control console output
PARAM_SPU_OFFSET = 12 # unit: 1/90000 sec
PARAM_IGNORE_VIDEO = 13 # disable video decoding
PARAM_IGNORE_AUDIO = 14 # disable audio decoding
PARAM_IGNORE_SPU = 15 # disable spu decoding
PARAM_BROADCASTER_PORT = 16 # 0: disable, x: server port
PARAM_METRONOM_PREBUFFER = 17 # unit: 1/90000 sec
PARAM_EQ_30HZ = 18 # equalizer gains -100..100
PARAM_EQ_60HZ = 19 # equalizer gains -100..100
PARAM_EQ_125HZ = 20 # equalizer gains -100..100
PARAM_EQ_250HZ = 21 # equalizer gains -100..100
PARAM_EQ_500HZ = 22 # equalizer gains -100..100
PARAM_EQ_1000HZ = 23 # equalizer gains -100..100
PARAM_EQ_2000HZ = 24 # equalizer gains -100..100
PARAM_EQ_4000HZ = 25 # equalizer gains -100..100
PARAM_EQ_8000HZ = 26 # equalizer gains -100..100
PARAM_EQ_16000HZ = 27 # equalizer gains -100..100
PARAM_AUDIO_CLOSE_DEVICE = 28 # force closing audio device
PARAM_AUDIO_AMP_MUTE = 29 # 1=>mute, 0=>unmute
PARAM_FINE_SPEED = 30 # 1.000.000 => normal speed
SPEED_PAUSE = 0
SPEED_SLOW_4 = 1
SPEED_SLOW_2 = 2
SPEED_NORMAL = 4
SPEED_FAST_2 = 8
SPEED_FAST_4 = 16
FINE_SPEED_NORMAL = 1000000
PARAM_VO_DEINTERLACE = 0x01000000 # bool
PARAM_VO_ASPECT_RATIO = 0x01000001 # see below
PARAM_VO_HUE = 0x01000002 # 0..65535
PARAM_VO_SATURATION = 0x01000003 # 0..65535
PARAM_VO_CONTRAST = 0x01000004 # 0..65535
PARAM_VO_BRIGHTNESS = 0x01000005 # 0..65535
PARAM_VO_ZOOM_X = 0x01000008 # percent
PARAM_VO_ZOOM_Y = 0x0100000d # percent
PARAM_VO_PAN_SCAN = 0x01000009 # bool
PARAM_VO_TVMODE = 0x0100000a # ???
PARAM_VO_CROP_LEFT = 0x01000020 # crop frame pixels
PARAM_VO_CROP_RIGHT = 0x01000021 # crop frame pixels
PARAM_VO_CROP_TOP = 0x01000022 # crop frame pixels
PARAM_VO_CROP_BOTTOM = 0x01000023 # crop frame pixels
VO_ZOOM_STEP = 100
VO_ZOOM_MAX = 400
VO_ZOOM_MIN = -85
VO_ASPECT_AUTO = 0
VO_ASPECT_SQUARE = 1 # 1:1
VO_ASPECT_4_3 = 2 # 4:3
VO_ASPECT_ANAMORPHIC = 3 # 16:9
VO_ASPECT_DVB = 4 # 2.11:1
VO_ASPECT_NUM_RATIOS = 5
VO_ASPECT_PAN_SCAN = 41
VO_ASPECT_DONT_TOUCH = 42
DEMUX_DEFAULT_STRATEGY = 0
DEMUX_REVERT_STRATEGY = 1
DEMUX_CONTENT_STRATEGY = 2
DEMUX_EXTENSION_STRATEGY = 3
VERBOSITY_NONE = 0
VERBOSITY_LOG = 1
VERBOSITY_DEBUG = 2
IMGFMT_YV12 = ((50<<24)|(49<<16)|(86<<8)|89)
IMGFMT_YUY2 = ((50<<24)|(89<<16)|(85<<8)|89)
IMGFMT_XVMC = ((67<<24)|(77<<16)|(118<<8)|88)
IMGFMT_XXMC = ((67<<24)|(77<<16)|(120<<8)|88)
POST_TYPE_VIDEO_FILTER = 0x010000
POST_TYPE_VIDEO_VISUALIZATION = 0x010001
POST_TYPE_VIDEO_COMPOSE = 0x010002
POST_TYPE_AUDIO_FILTER = 0x020000
POST_TYPE_AUDIO_VISUALIZATION = 0x020001
POST_DATA_VIDEO = 0
POST_DATA_AUDIO = 1
POST_DATA_INT = 3
POST_DATA_DOUBLE = 4
POST_DATA_PARAMETERS = 5
STATUS_IDLE = 0 # no mrl assigned
STATUS_STOP = 1
STATUS_PLAY = 2
STATUS_QUIT = 3
ERROR_NONE = 0
ERROR_NO_INPUT_PLUGIN = 1
ERROR_NO_DEMUX_PLUGIN = 2
ERROR_DEMUX_FAILED = 3
ERROR_MALFORMED_MRL = 4
ERROR_INPUT_FAILED = 5
LANG_MAX = 32
STREAM_INFO_BITRATE = 0
STREAM_INFO_SEEKABLE = 1
STREAM_INFO_VIDEO_WIDTH = 2
STREAM_INFO_VIDEO_HEIGHT = 3
STREAM_INFO_VIDEO_RATIO = 4 # *10000
STREAM_INFO_VIDEO_CHANNELS = 5
STREAM_INFO_VIDEO_STREAMS = 6
STREAM_INFO_VIDEO_BITRATE = 7
STREAM_INFO_VIDEO_FOURCC = 8
STREAM_INFO_VIDEO_HANDLED = 9 # codec available?
STREAM_INFO_FRAME_DURATION = 10 # 1/90000 sec
STREAM_INFO_AUDIO_CHANNELS = 11
STREAM_INFO_AUDIO_BITS = 12
STREAM_INFO_AUDIO_SAMPLERATE = 13
STREAM_INFO_AUDIO_BITRATE = 14
STREAM_INFO_AUDIO_FOURCC = 15
STREAM_INFO_AUDIO_HANDLED = 16 # codec available?
STREAM_INFO_HAS_CHAPTERS = 17
STREAM_INFO_HAS_VIDEO = 18
STREAM_INFO_HAS_AUDIO = 19
STREAM_INFO_IGNORE_VIDEO = 20
STREAM_INFO_IGNORE_AUDIO = 21
STREAM_INFO_IGNORE_SPU = 22
STREAM_INFO_VIDEO_HAS_STILL = 23
STREAM_INFO_MAX_AUDIO_CHANNEL = 24
STREAM_INFO_MAX_SPU_CHANNEL = 25
STREAM_INFO_AUDIO_MODE = 26
STREAM_INFO_SKIPPED_FRAMES = 27 # for 1000 frames delivered
STREAM_INFO_DISCARDED_FRAMES = 28 # for 1000 frames delivered
META_INFO_TITLE = 0
META_INFO_COMMENT = 1
META_INFO_ARTIST = 2
META_INFO_GENRE = 3
META_INFO_ALBUM = 4
META_INFO_YEAR = 5
META_INFO_VIDEOCODEC = 6
META_INFO_AUDIOCODEC = 7
META_INFO_SYSTEMLAYER = 8
META_INFO_INPUT_PLUGIN = 9
META_INFO_CDINDEX_DISCID = 10
META_INFO_TRACK_NUMBER = 11
MRL_TYPE_unknown = (0 << 0)
MRL_TYPE_dvd = (1 << 0)
MRL_TYPE_vcd = (1 << 1)
MRL_TYPE_net = (1 << 2)
MRL_TYPE_rtp = (1 << 3)
MRL_TYPE_stdin = (1 << 4)
MRL_TYPE_cda = (1 << 5)
MRL_TYPE_file = (1 << 6)
MRL_TYPE_file_fifo = (1 << 7)
MRL_TYPE_file_chardev = (1 << 8)
MRL_TYPE_file_directory = (1 << 9)
MRL_TYPE_file_blockdev = (1 << 10)
MRL_TYPE_file_normal = (1 << 11)
MRL_TYPE_file_symlink = (1 << 12)
MRL_TYPE_file_sock = (1 << 13)
MRL_TYPE_file_exec = (1 << 14)
MRL_TYPE_file_backup = (1 << 15)
MRL_TYPE_file_hidden = (1 << 16)
GUI_SEND_COMPLETION_EVENT = 1 # DEPRECATED
GUI_SEND_DRAWABLE_CHANGED = 2
GUI_SEND_EXPOSE_EVENT = 3
GUI_SEND_TRANSLATE_GUI_TO_VIDEO = 4
GUI_SEND_VIDEOWIN_VISIBLE = 5
GUI_SEND_SELECT_VISUAL = 8
GUI_SEND_WILL_DESTROY_DRAWABLE = 9
HEALTH_CHECK_OK = 0
HEALTH_CHECK_FAIL = 1
HEALTH_CHECK_UNSUPPORTED = 2
HEALTH_CHECK_NO_SUCH_CHECK = 3
CONFIG_TYPE_UNKNOWN = 0
CONFIG_TYPE_RANGE = 1
CONFIG_TYPE_STRING = 2
CONFIG_TYPE_ENUM = 3
CONFIG_TYPE_NUM = 4
CONFIG_TYPE_BOOL = 5
EVENT_UI_PLAYBACK_FINISHED = 1 # frontend can e.g. move on to
next playlist entry
EVENT_UI_CHANNELS_CHANGED = 2 # inform ui that new channel info
is available
EVENT_UI_SET_TITLE = 3 # request title display change in
ui
EVENT_UI_MESSAGE = 4 # message (dialog) for the ui to
display
EVENT_FRAME_FORMAT_CHANGE = 5 # e.g. aspect ratio change during
dvd playback
EVENT_AUDIO_LEVEL = 6 # report current audio level
(l/r/mute)
EVENT_QUIT = 7 # last event sent when stream is
disposed
EVENT_PROGRESS = 8 # index creation/network
connections
EVENT_MRL_REFERENCE = 9 # demuxer->frontend: MRL
reference(s) for the real stream
EVENT_UI_NUM_BUTTONS = 10 # number of buttons for
interactive menus
EVENT_SPU_BUTTON = 11 # the mouse pointer enter/leave a
button
EVENT_DROPPED_FRAMES = 12 # number of dropped frames is too
high
EVENT_INPUT_MOUSE_BUTTON = 101
EVENT_INPUT_MOUSE_MOVE = 102
EVENT_INPUT_MENU1 = 103
EVENT_INPUT_MENU2 = 104
EVENT_INPUT_MENU3 = 105
EVENT_INPUT_MENU4 = 106
EVENT_INPUT_MENU5 = 107
EVENT_INPUT_MENU6 = 108
EVENT_INPUT_MENU7 = 109
EVENT_INPUT_UP = 110
EVENT_INPUT_DOWN = 111
EVENT_INPUT_LEFT = 112
EVENT_INPUT_RIGHT = 113
EVENT_INPUT_SELECT = 114
EVENT_INPUT_NEXT = 115
EVENT_INPUT_PREVIOUS = 116
EVENT_INPUT_ANGLE_NEXT = 117
EVENT_INPUT_ANGLE_PREVIOUS = 118
EVENT_INPUT_BUTTON_FORCE = 119
EVENT_INPUT_NUMBER_0 = 120
EVENT_INPUT_NUMBER_1 = 121
EVENT_INPUT_NUMBER_2 = 122
EVENT_INPUT_NUMBER_3 = 123
EVENT_INPUT_NUMBER_4 = 124
EVENT_INPUT_NUMBER_5 = 125
EVENT_INPUT_NUMBER_6 = 126
EVENT_INPUT_NUMBER_7 = 127
EVENT_INPUT_NUMBER_8 = 128
EVENT_INPUT_NUMBER_9 = 129
EVENT_INPUT_NUMBER_10_ADD = 130
EVENT_SET_V4L2 = 200
EVENT_PVR_SAVE = 201
EVENT_PVR_REPORT_NAME = 202
EVENT_PVR_REALTIME = 203
EVENT_PVR_PAUSE = 204
EVENT_SET_MPEG_DATA = 205
EVENT_VDR_RED = 300
EVENT_VDR_GREEN = 301
EVENT_VDR_YELLOW = 302
EVENT_VDR_BLUE = 303
EVENT_VDR_PLAY = 304
EVENT_VDR_PAUSE = 305
EVENT_VDR_STOP = 306
EVENT_VDR_RECORD = 307
EVENT_VDR_FASTFWD = 308
EVENT_VDR_FASTREW = 309
EVENT_VDR_POWER = 310
EVENT_VDR_CHANNELPLUS = 311
EVENT_VDR_CHANNELMINUS = 312
EVENT_VDR_SCHEDULE = 313
EVENT_VDR_CHANNELS = 314
EVENT_VDR_TIMERS = 315
EVENT_VDR_RECORDINGS = 316
EVENT_VDR_SETUP = 317
EVENT_VDR_COMMANDS = 318
EVENT_VDR_BACK = 319
EVENT_VDR_USER1 = 320
EVENT_VDR_USER2 = 321
EVENT_VDR_USER3 = 322
EVENT_VDR_USER4 = 323
EVENT_VDR_USER5 = 324
EVENT_VDR_USER6 = 325
EVENT_VDR_USER7 = 326
EVENT_VDR_USER8 = 327
EVENT_VDR_USER9 = 328
EVENT_VDR_VOLPLUS = 329
EVENT_VDR_VOLMINUS = 330
EVENT_VDR_MUTE = 331
EVENT_VDR_AUDIO = 332
EVENT_VDR_SETVIDEOWINDOW = 350
EVENT_VDR_FRAMESIZECHANGED = 351
MSG_NO_ERROR = 0 # (messages to UI)
MSG_GENERAL_WARNING = 1 # (warning message)
MSG_UNKNOWN_HOST = 2 # (host name)
MSG_UNKNOWN_DEVICE = 3 # (device name)
MSG_NETWORK_UNREACHABLE = 4 # none
MSG_CONNECTION_REFUSED = 5 # (host name)
MSG_FILE_NOT_FOUND = 6 # (file name or mrl)
MSG_READ_ERROR = 7 # (device/file/mrl)
MSG_LIBRARY_LOAD_ERROR = 8 # (library/decoder)
MSG_ENCRYPTED_SOURCE = 9 # none
MSG_SECURITY = 10 # (security message)
MSG_AUDIO_OUT_UNAVAILABLE = 11 # none
MSG_PERMISSION_ERROR = 12 # (file name or mrl)
TEXT_PALETTE_SIZE = 11
OSD_TEXT1 = (0 * TEXT_PALETTE_SIZE)
OSD_TEXT2 = (1 * TEXT_PALETTE_SIZE)
OSD_TEXT3 = (2 * TEXT_PALETTE_SIZE)
OSD_TEXT4 = (3 * TEXT_PALETTE_SIZE)
OSD_TEXT5 = (4 * TEXT_PALETTE_SIZE)
OSD_TEXT6 = (5 * TEXT_PALETTE_SIZE)
OSD_TEXT7 = (6 * TEXT_PALETTE_SIZE)
OSD_TEXT8 = (7 * TEXT_PALETTE_SIZE)
OSD_TEXT9 = (8 * TEXT_PALETTE_SIZE)
OSD_TEXT10 = (9 * TEXT_PALETTE_SIZE)
TEXTPALETTE_WHITE_BLACK_TRANSPARENT = 0
TEXTPALETTE_WHITE_NONE_TRANSPARENT = 1
TEXTPALETTE_WHITE_NONE_TRANSLUCID = 2
TEXTPALETTE_YELLOW_BLACK_TRANSPARENT = 3
OSD_CAP_FREETYPE2 = 0x0001 # freetype2 support compiled
in
OSD_CAP_UNSCALED = 0x0002 # unscaled overlays supp. by
vo drv
Index: __init__.py
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/__init__.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** __init__.py 19 Jul 2005 02:07:24 -0000 1.4
--- __init__.py 19 Jul 2005 04:17:08 -0000 1.5
***************
*** 2,8 ****
--- 2,13 ----
import _xine
from kaa import display, notifier
+ from kaa.base.version import Version
+ from constants import *
XineError = _xine.XineError
+ def get_version():
+ return Version(_xine.get_version())
+
def _wrap_xine_object(obj):
if obj.wrapper and obj.wrapper():
***************
*** 29,32 ****
--- 34,41 ----
def __init__(self):
self._xine = _xine.Xine()
+ self._xine.log_callback = self._log_callback
+ self.signals = {
+ "log": notifier.Signal()
+ }
def _default_frame_output_cb(self, width, height, aspect, window):
***************
*** 96,99 ****
--- 105,129 ----
return _wrap_xine_object(post)
+ def get_log_names(self):
+ return self._xine.get_log_names()
+
+ def _resolve_log_section_name(self, section):
+ return section
+
+ def get_log(self, section):
+ if type(section) == str:
+ sections = self.get_log_names()
+ if section not in sections:
+ raise XineError, "Unknown log section: " + section
+ section = sections.index(section)
+ return self._xine.get_log(section)
+
+
+ def _log_callback(self, section):
+ sections = self.get_log_names()
+ section = sections[section]
+ print "LOG", section
+ self.signals["log"].emit(section)
+
class VideoPort(object):
Index: xine.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/xine.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** xine.c 19 Jul 2005 02:07:24 -0000 1.4
--- xine.c 19 Jul 2005 04:17:08 -0000 1.5
***************
*** 55,58 ****
--- 55,72 ----
///
+ void
+ _xine_log_callback(void *xine_pyobject, int section)
+ {
+ PyObject *args, *result;
+ Xine_PyObject *xine = (Xine_PyObject *)xine_pyobject;
+
+ if (xine->log_callback != Py_None) {
+ args = Py_BuildValue("(i)", section);
+ result = PyEval_CallObject(xine->log_callback, args);
+ Py_DECREF(args);
+ Py_DECREF(result);
+ }
+ }
+
static int
***************
*** 65,68 ****
--- 79,87 ----
Py_DECREF(tmp);
}
+ if (self->log_callback) {
+ tmp = self->log_callback;
+ self->log_callback = 0;
+ Py_DECREF(tmp);
+ }
return 0;
}
***************
*** 76,79 ****
--- 95,103 ----
return ret;
}
+ if (self->log_callback) {
+ int ret = visit(self->log_callback, arg);
+ if (ret != 0)
+ return ret;
+ }
return 0;
}
***************
*** 87,90 ****
--- 111,116 ----
self->dependencies = PyList_New(0);
self->wrapper = Py_None;
+ self->log_callback = Py_None;
+ Py_INCREF(Py_None);
Py_INCREF(Py_None);
return (PyObject *)self;
***************
*** 112,115 ****
--- 138,145 ----
self->xine = xine;
xine_object_to_pyobject_register(xine, (PyObject *)self);
+
+ // This isn't implemented in xine yet.
+ //xine_register_log_cb(xine, _xine_log_callback, self);
+
return 0;
}
***************
*** 118,121 ****
--- 148,152 ----
{"dependencies", T_OBJECT_EX, offsetof(Xine_PyObject, dependencies), 0,
"Dependencies"},
{"wrapper", T_OBJECT_EX, offsetof(Xine_PyObject, wrapper), 0, "Wrapper
object"},
+ {"log_callback", T_OBJECT_EX, offsetof(Xine_PyObject, log_callback), 0,
"Log Callback"},
{NULL}
};
***************
*** 276,279 ****
--- 307,351 ----
}
+
+ PyObject *
+ Xine_PyObject_get_log_names(Xine_PyObject *self, PyObject *args, PyObject
*kwargs)
+ {
+ const char *const *list;
+ PyObject *pylist = NULL;
+ int i;
+
+ list = xine_get_log_names(self->xine);
+ pylist = PyList_New(0);
+ for (i = 0; list[i] != 0; i++) {
+ PyObject *str = PyString_FromString(list[i]);
+ PyList_Append(pylist, str);
+ Py_DECREF(str);
+ }
+ return pylist;
+ }
+
+ PyObject *
+ Xine_PyObject_get_log(Xine_PyObject *self, PyObject *args, PyObject *kwargs)
+ {
+ char *type;
+ const char *const *list;
+ PyObject *pylist = NULL;
+ int i, section;
+
+ if (!PyArg_ParseTuple(args, "i", §ion))
+ return NULL;
+ list = xine_get_log(self->xine, section);
+ pylist = PyList_New(0);
+ for (i = 0; list && list[i] != 0; i++) {
+ if (!list[i] || *list[i] == 0)
+ continue;
+ PyObject *str = PyString_FromString(list[i]);
+ PyList_Append(pylist, str);
+ Py_DECREF(str);
+ }
+ return pylist;
+ }
+
+
PyMethodDef Xine_PyObject_methods[] = {
{"list_plugins", (PyCFunction) Xine_PyObject_list_plugins, METH_VARARGS |
METH_KEYWORDS},
***************
*** 282,285 ****
--- 354,359 ----
{"stream_new", (PyCFunction) Xine_PyObject_stream_new, METH_VARARGS |
METH_KEYWORDS},
{"post_init", (PyCFunction) Xine_PyObject_post_init, METH_VARARGS |
METH_KEYWORDS},
+ {"get_log_names", (PyCFunction) Xine_PyObject_get_log_names, METH_VARARGS
| METH_KEYWORDS},
+ {"get_log", (PyCFunction) Xine_PyObject_get_log, METH_VARARGS |
METH_KEYWORDS},
{NULL, NULL}
};
***************
*** 335,339 ****
--- 409,420 ----
+ PyObject *
+ Xine_get_version(PyObject *module, PyObject *args, PyObject *kwargs)
+ {
+ return PyString_FromString(xine_get_version_string());
+ }
+
PyMethodDef xine_methods[] = {
+ {"get_version", (PyCFunction) Xine_get_version, METH_VARARGS |
METH_KEYWORDS},
{NULL}
};
Index: xine.h
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/xine.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** xine.h 18 Jul 2005 03:40:21 -0000 1.2
--- xine.h 19 Jul 2005 04:17:08 -0000 1.3
***************
*** 13,17 ****
PyObject_HEAD
xine_t *xine;
! PyObject *dependencies, *wrapper;
} Xine_PyObject;
--- 13,17 ----
PyObject_HEAD
xine_t *xine;
! PyObject *dependencies, *wrapper, *log_callback;
} Xine_PyObject;
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog