Update of /cvsroot/freevo/kaa/xine/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10159/src

Modified Files:
        __init__.py post.c post_in.c post_out.c video_port.c 
        video_port.h xine.c xine.h 
Added Files:
        vo_driver.c vo_driver.h 
Log Message:
New VODriver class; add load_video_output_plugin (requires patch to xine-lib);
reimplement open_video_driver() to use load_video_output_plugin() and
VODriver.get_port(); refactor type initialization in xine.c; reimplement
buffer driver to use a video driver instead of video port; implement RLE
overlay blending in buffer driver (code ripped from xine-lib); buffer driver
seems to actually work now.  kaaplayer.py is a mess. :)


--- NEW FILE: vo_driver.c ---
#include "xine.h"
#include "post.h"
#include "post_in.h"
#include "post_out.h"
#include "stream.h"
#include "vo_driver.h"
#include "video_port.h"
#include "structmember.h"

// Owner must be a Xine or VideoPort object
Xine_VO_Driver_PyObject *
pyxine_new_vo_driver_pyobject(PyObject *owner_pyobject, vo_driver_t *driver, 
int owner)
{
    Xine_VO_Driver_PyObject *o = (Xine_VO_Driver_PyObject 
*)xine_object_to_pyobject_find(driver);
    if (o) {
        Py_INCREF(o);
        return o;
    }

    o = (Xine_VO_Driver_PyObject *)
        Xine_VO_Driver_PyObject__new(&Xine_VO_Driver_PyObject_Type, NULL, NULL);
    if (!o)
        return NULL;

    if (Xine_PyObject_Check(owner_pyobject))
        o->xine = ((Xine_PyObject *)owner_pyobject)->xine;
    else if (Xine_Video_Port_PyObject_Check(owner_pyobject))
        o->xine = ((Xine_Video_Port_PyObject *)owner_pyobject)->xine;
    else
        PyErr_Format(xine_error, "Unsupported owner for VideoPort object");

    o->owner_pyobject = owner_pyobject;
    Py_INCREF(owner_pyobject);

    o->driver = driver;
    o->xine_object_owner = owner;
    xine_object_to_pyobject_register(driver, (PyObject *)o);
    return o;
}



static int
Xine_VO_Driver_PyObject__clear(Xine_VO_Driver_PyObject * self)
{
    PyObject **list[] = {&self->owner_pyobject,  NULL};
    return pyxine_gc_helper_clear(list);
}

static int
Xine_VO_Driver_PyObject__traverse(Xine_VO_Driver_PyObject * self,
                                   visitproc visit, void *arg)
{
    PyObject **list[] = {&self->owner_pyobject,  NULL};
    return pyxine_gc_helper_traverse(list, visit, arg);
}

PyObject *
Xine_VO_Driver_PyObject__new(PyTypeObject * type, PyObject * args,
                              PyObject * kwargs)
{
    Xine_VO_Driver_PyObject *self;

    if (args) {
        PyErr_SetString(xine_error, "Don't call me directly");
        return NULL;
    }

    self = (Xine_VO_Driver_PyObject *) type->tp_alloc(type, 0);
    self->driver = NULL;
    self->xine = NULL;
    self->owner_pyobject = NULL;
    self->wrapper = Py_None;
    Py_INCREF(Py_None);
    return (PyObject *) self;
}

static int
Xine_VO_Driver_PyObject__init(Xine_VO_Driver_PyObject * self,
                               PyObject * args, PyObject * kwds)
{
    return 0;
}

static PyMemberDef Xine_VO_Driver_PyObject_members[] = {
    {"owner", T_OBJECT_EX, offsetof(Xine_VO_Driver_PyObject, owner_pyobject), 
0, "Owner"},
    {"wrapper", T_OBJECT_EX, offsetof(Xine_VO_Driver_PyObject, wrapper), 0, 
"Wrapper object"},
    {NULL}
};


void
Xine_VO_Driver_PyObject__dealloc(Xine_VO_Driver_PyObject * self)
{
    printf("DEalloc VO Driver: %x\n", self->driver);
    if (self->driver && self->xine_object_owner) {
        Py_BEGIN_ALLOW_THREADS
        self->driver->dispose(self->driver);
        Py_END_ALLOW_THREADS
    }
    Py_DECREF(self->wrapper);
    Xine_VO_Driver_PyObject__clear(self);
    xine_object_to_pyobject_unregister(self->driver);

    if (self->dealloc_cb)
        self->dealloc_cb(self->dealloc_data);

    self->ob_type->tp_free((PyObject *) self);
}

PyObject *
Xine_VO_Driver_PyObject_get_port(Xine_VO_Driver_PyObject *self, PyObject *args, 
PyObject *kwargs)
{
    xine_video_port_t *vo_port;
    Xine_Video_Port_PyObject *vo;

    if (Xine_Video_Port_PyObject_Check(self->owner_pyobject)) {
        Py_INCREF(self->owner_pyobject);
        return self->owner_pyobject;
    }

    vo_port = _x_vo_new_port(self->xine, self->driver, 0);
    vo = pyxine_new_video_port_pyobject(self->owner_pyobject, vo_port, 
(PyObject *)self, 1);

    // VideoPort object assumes ownership of us.
    Py_DECREF(self->owner_pyobject);
    self->owner_pyobject = (PyObject *)vo;
    Py_INCREF(vo);
    self->xine_object_owner = 0;

    return (PyObject *)vo;
}



PyMethodDef Xine_VO_Driver_PyObject_methods[] = {
    {"get_port", (PyCFunction) Xine_VO_Driver_PyObject_get_port, METH_VARARGS },
    {NULL, NULL}
};

PyTypeObject Xine_VO_Driver_PyObject_Type = {
    PyObject_HEAD_INIT(NULL) 
    0,                          /* ob_size */
    "_xine.VODriver",               /* tp_name */
    sizeof(Xine_VO_Driver_PyObject),      /* tp_basicsize */
    0,                          /* tp_itemsize */
    (destructor) Xine_VO_Driver_PyObject__dealloc,        /* tp_dealloc */
    0,                          /* tp_print */
    0,                          /* tp_getattr */
    0,                          /* tp_setattr */
    0,                          /* tp_compare */
    0,                          /* tp_repr */
    0,                          /* tp_as_number */
    0,                          /* tp_as_sequence */
    0,                          /* tp_as_mapping */
    0,                          /* tp_hash */
    0,                          /* tp_call */
    0,                          /* tp_str */
    PyObject_GenericGetAttr,    /* tp_getattro */
    PyObject_GenericSetAttr,    /* tp_setattro */
    0,                          /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags 
*/
    "Xine VO Driver Object",               /* tp_doc */
    (traverseproc)Xine_VO_Driver_PyObject__traverse,   /* tp_traverse */
    (inquiry)Xine_VO_Driver_PyObject__clear,           /* tp_clear */
    0,                         /* tp_richcompare */
    0,                         /* tp_weaklistoffset */
    0,                         /* tp_iter */
    0,                         /* tp_iternext */
    Xine_VO_Driver_PyObject_methods,     /* tp_methods */
    Xine_VO_Driver_PyObject_members,     /* tp_members */
    0,                         /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
    (initproc)Xine_VO_Driver_PyObject__init, /* tp_init */
    0,                         /* tp_alloc */
    Xine_VO_Driver_PyObject__new,        /* tp_new */
};



Index: post.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/post.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** post.c      23 Jul 2005 13:33:51 -0000      1.7
--- post.c      30 Jul 2005 20:55:15 -0000      1.8
***************
*** 60,64 ****
  Xine_Post_PyObject__clear(Xine_Post_PyObject *self)
  {
!     PyObject **list[] = {&self->owner_pyobject, &self->inputs, 
&self->outputs, NULL };
      return pyxine_gc_helper_clear(list);
  }
--- 60,64 ----
  Xine_Post_PyObject__clear(Xine_Post_PyObject *self)
  {
!     PyObject **list[] = {&self->inputs, &self->outputs, NULL };
      return pyxine_gc_helper_clear(list);
  }
***************
*** 110,120 ****
  Xine_Post_PyObject__dealloc(Xine_Post_PyObject *self)
  {
!     printf("DEalloc Post: %x\n", self->post);
      if (self->post && self->xine_object_owner) {
          // bug in xine: 
http://sourceforge.net/mailarchive/forum.php?thread_id=7753300&forum_id=7131
!         //xine_post_dispose(self->xine, self->post);
      }
      Py_DECREF(self->name);
      Py_DECREF(self->wrapper);
      Xine_Post_PyObject__clear(self);
      xine_object_to_pyobject_unregister(self->post);
--- 110,121 ----
  Xine_Post_PyObject__dealloc(Xine_Post_PyObject *self)
  {
!     printf("DEalloc Post: %x (%d)\n", self->post, self->xine_object_owner);
      if (self->post && self->xine_object_owner) {
          // bug in xine: 
http://sourceforge.net/mailarchive/forum.php?thread_id=7753300&forum_id=7131
!         xine_post_dispose(self->xine, self->post);
      }
      Py_DECREF(self->name);
      Py_DECREF(self->wrapper);
+     Py_DECREF(self->owner_pyobject);
      Xine_Post_PyObject__clear(self);
      xine_object_to_pyobject_unregister(self->post);

Index: post_out.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/post_out.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** post_out.c  23 Jul 2005 00:41:47 -0000      1.4
--- post_out.c  30 Jul 2005 20:55:15 -0000      1.5
***************
*** 46,50 ****
          if (post_out->data && *(void **)post_out->data) {
              xine_video_port_t *vo = *(xine_video_port_t **)post_out->data;
!             o->port = (PyObject *)pyxine_new_video_port_pyobject((PyObject 
*)o, vo, 0);
          }
      }
--- 46,50 ----
          if (post_out->data && *(void **)post_out->data) {
              xine_video_port_t *vo = *(xine_video_port_t **)post_out->data;
!             o->port = (PyObject *)pyxine_new_video_port_pyobject((PyObject 
*)o, vo, NULL, 0);
          }
      }

Index: xine.h
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/xine.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** xine.h      23 Jul 2005 00:41:47 -0000      1.6
--- xine.h      30 Jul 2005 20:55:15 -0000      1.7
***************
*** 5,8 ****
--- 5,9 ----
  #include <Python.h>
  #include <xine.h>
+ #include <xine/xine_internal.h>
  #include <assert.h>
  

Index: video_port.h
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/video_port.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** video_port.h        21 Jul 2005 18:32:11 -0000      1.5
--- video_port.h        30 Jul 2005 20:55:15 -0000      1.6
***************
*** 12,25 ****
      PyObject_HEAD
  
!     PyObject *owner_pyobject; // Post object or Xine object
      int xine_object_owner;
      xine_t *xine;
      xine_video_port_t *vo;
  
      PyObject *wrapper;
      PyObject *wire_object; // Wired object (PostOut/Stream source list or 
PostIn/Port target)
  
-     void (*driver_dealloc_cb)(void *);
-     void *driver_dealloc_data;
  } Xine_Video_Port_PyObject;
  
--- 12,24 ----
      PyObject_HEAD
  
!     PyObject *owner_pyobject; // Post In/Out, Xine, or Stream object
      int xine_object_owner;
      xine_t *xine;
      xine_video_port_t *vo;
  
+     PyObject *driver; // VODriver or None
      PyObject *wrapper;
      PyObject *wire_object; // Wired object (PostOut/Stream source list or 
PostIn/Port target)
  
  } Xine_Video_Port_PyObject;
  
***************
*** 27,31 ****
  
  PyObject *Xine_Video_Port_PyObject__new(PyTypeObject *, PyObject *, PyObject 
*);
! Xine_Video_Port_PyObject *pyxine_new_video_port_pyobject(PyObject *, 
xine_video_port_t *, int);
  
  
--- 26,30 ----
  
  PyObject *Xine_Video_Port_PyObject__new(PyTypeObject *, PyObject *, PyObject 
*);
! Xine_Video_Port_PyObject *pyxine_new_video_port_pyobject(PyObject *, 
xine_video_port_t *, PyObject *, int);
  
  

Index: post_in.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/post_in.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** post_in.c   23 Jul 2005 00:41:47 -0000      1.4
--- post_in.c   30 Jul 2005 20:55:15 -0000      1.5
***************
*** 36,40 ****
          if (post_in->data) {
              xine_video_port_t *vo = (xine_video_port_t *)post_in->data;
!             o->port = (PyObject *)pyxine_new_video_port_pyobject((PyObject 
*)o, vo, 0);
          }
      }
--- 36,40 ----
          if (post_in->data) {
              xine_video_port_t *vo = (xine_video_port_t *)post_in->data;
!             o->port = (PyObject *)pyxine_new_video_port_pyobject((PyObject 
*)o, vo, NULL, 0);
          }
      }
***************
*** 128,132 ****
          if (self->post_in->data) {
              xine_video_port_t *vo = (xine_video_port_t *)self->post_in->data;
!             port = (PyObject 
*)pyxine_new_video_port_pyobject(self->owner_pyobject, vo, 0);
          }
      }
--- 128,132 ----
          if (self->post_in->data) {
              xine_video_port_t *vo = (xine_video_port_t *)self->post_in->data;
!             port = (PyObject 
*)pyxine_new_video_port_pyobject(self->owner_pyobject, vo, NULL, 0);
          }
      }

--- NEW FILE: vo_driver.h ---
#ifndef __VO_DRIVER_H_
#define __VO_DRIVER_H_
#include "config.h"

#include <Python.h>
#include <xine.h>
#include <xine/video_out.h>

#define Xine_VO_Driver_PyObject_Check(v) ((v)->ob_type == 
&Xine_VO_Driver_PyObject_Type)

typedef struct {
    PyObject_HEAD

    PyObject *owner_pyobject; // Xine or VideoPort object
    int xine_object_owner;
    xine_t *xine;
    vo_driver_t *driver;

    PyObject *wrapper;

    void (*dealloc_cb)(void *);
    void *dealloc_data;
} Xine_VO_Driver_PyObject;

extern PyTypeObject Xine_VO_Driver_PyObject_Type;

PyObject *Xine_VO_Driver_PyObject__new(PyTypeObject *, PyObject *, PyObject *);
Xine_VO_Driver_PyObject *pyxine_new_vo_driver_pyobject(PyObject *, vo_driver_t 
*, int);


#endif

Index: video_port.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/video_port.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** video_port.c        23 Jul 2005 00:41:47 -0000      1.8
--- video_port.c        30 Jul 2005 20:55:15 -0000      1.9
***************
*** 8,14 ****
  
  // Owner must be a Post In, Post Out, Xine, or Stream object
- // XXX: if Xine, must be driver -- owner param deprecated then?
  Xine_Video_Port_PyObject *
! pyxine_new_video_port_pyobject(PyObject *owner_pyobject, xine_video_port_t * 
vo, int owner)
  {
      Xine_Video_Port_PyObject *o = (Xine_Video_Port_PyObject 
*)xine_object_to_pyobject_find(vo);
--- 8,13 ----
  
  // Owner must be a Post In, Post Out, Xine, or Stream object
  Xine_Video_Port_PyObject *
! pyxine_new_video_port_pyobject(PyObject *owner_pyobject, xine_video_port_t * 
vo, PyObject *driver, int owner)
  {
      Xine_Video_Port_PyObject *o = (Xine_Video_Port_PyObject 
*)xine_object_to_pyobject_find(vo);
***************
*** 41,44 ****
--- 40,49 ----
      Py_INCREF(owner_pyobject);
  
+     if (driver)
+         o->driver = driver;
+     else
+         o->driver = Py_None;
+     Py_INCREF(o->driver);
+ 
      o->vo = vo;
      o->xine_object_owner = owner;
***************
*** 52,56 ****
  Xine_Video_Port_PyObject__clear(Xine_Video_Port_PyObject * self)
  {
!     PyObject **list[] = {&self->wire_object,  NULL};
      return pyxine_gc_helper_clear(list);
  }
--- 57,61 ----
  Xine_Video_Port_PyObject__clear(Xine_Video_Port_PyObject * self)
  {
!     PyObject **list[] = {&self->wire_object, NULL};
      return pyxine_gc_helper_clear(list);
  }
***************
*** 60,64 ****
                                     visitproc visit, void *arg)
  {
!     PyObject **list[] = {&self->owner_pyobject, &self->wire_object,  NULL};
      return pyxine_gc_helper_traverse(list, visit, arg);
  }
--- 65,69 ----
                                     visitproc visit, void *arg)
  {
!     PyObject **list[] = {&self->owner_pyobject, &self->wire_object, 
&self->driver, NULL};
      return pyxine_gc_helper_traverse(list, visit, arg);
  }
***************
*** 93,96 ****
--- 98,102 ----
  
  static PyMemberDef Xine_Video_Port_PyObject_members[] = {
+     {"driver", T_OBJECT_EX, offsetof(Xine_Video_Port_PyObject, driver), 0, 
"Video Driver object of this port"},
      {"wire_object", T_OBJECT_EX, offsetof(Xine_Video_Port_PyObject, 
wire_object), 0, "Object wired to"},
      {"owner", T_OBJECT_EX, offsetof(Xine_Video_Port_PyObject, 
owner_pyobject), 0, "Owner"},
***************
*** 103,107 ****
  Xine_Video_Port_PyObject__dealloc(Xine_Video_Port_PyObject * self)
  {
!     printf("DEalloc Video Port: %x, driver=%x\n", self->vo, 
((xine_video_port_t *)self->vo)->driver);
      if (self->vo && self->xine_object_owner) {
          Py_BEGIN_ALLOW_THREADS
--- 109,115 ----
  Xine_Video_Port_PyObject__dealloc(Xine_Video_Port_PyObject * self)
  {
!     printf("DEalloc Video Port: %x, driver=%x (%d) owner=%s \n", self->vo, 
!             ((xine_video_port_t *)self->vo)->driver, self->xine_object_owner,
!             self->owner_pyobject->ob_type->tp_name);
      if (self->vo && self->xine_object_owner) {
          Py_BEGIN_ALLOW_THREADS
***************
*** 109,112 ****
--- 117,121 ----
          Py_END_ALLOW_THREADS
      }
+     Py_DECREF(self->driver);
      Py_DECREF(self->wrapper);
      Xine_Video_Port_PyObject__clear(self);
***************
*** 114,120 ****
      xine_object_to_pyobject_unregister(self->vo);
  
-     if (self->driver_dealloc_cb)
-         self->driver_dealloc_cb(self->driver_dealloc_data);
- 
      self->ob_type->tp_free((PyObject *) self);
  }
--- 123,126 ----

Index: xine.c
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/xine.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** xine.c      25 Jul 2005 23:23:57 -0000      1.15
--- xine.c      30 Jul 2005 20:55:15 -0000      1.16
***************
*** 2,5 ****
--- 2,6 ----
  #include "structmember.h"
  #include "drivers/x11.h"
+ #include "vo_driver.h"
  #include "video_port.h"
  #include "audio_port.h"
***************
*** 34,38 ****
  Xine_PyObject__clear(Xine_PyObject *self)
  {
!     PyObject **list[] = {&self->dependencies, &self->log_callback, NULL};
      return pyxine_gc_helper_clear(list);
  }
--- 35,40 ----
  Xine_PyObject__clear(Xine_PyObject *self)
  {
!     PyObject **list[] = {&self->log_callback, NULL};
!     //printf("XINE CLEAR\n");
      return pyxine_gc_helper_clear(list);
  }
***************
*** 41,45 ****
  Xine_PyObject__traverse(Xine_PyObject *self, visitproc visit, void *arg)
  {
!     PyObject **list[] = {&self->dependencies, &self->log_callback, NULL};
      return pyxine_gc_helper_traverse(list, visit, arg);
  }
--- 43,48 ----
  Xine_PyObject__traverse(Xine_PyObject *self, visitproc visit, void *arg)
  {
!     PyObject **list[] = {/*&self->dependencies, */&self->log_callback, NULL};
!     //printf("XINE TRAV: %d\n", PySequence_Length(self->dependencies));
      return pyxine_gc_helper_traverse(list, visit, arg);
  }
***************
*** 98,107 ****
  {
      printf("DEalloc Xine: %x\n", self->xine);
-     if (self->xine) {
-         xine_exit(self->xine);
-     }
      Py_DECREF(self->wrapper);
      Xine_PyObject__clear(self);
      xine_object_to_pyobject_unregister(self->xine);
      self->ob_type->tp_free((PyObject*)self);
  }
--- 101,114 ----
  {
      printf("DEalloc Xine: %x\n", self->xine);
      Py_DECREF(self->wrapper);
+     Py_DECREF(self->dependencies);
      Xine_PyObject__clear(self);
      xine_object_to_pyobject_unregister(self->xine);
+ 
+     printf("XINE EXIT\n");
+     if (self->xine) {
+         xine_exit(self->xine);
+     }
+ 
      self->ob_type->tp_free((PyObject*)self);
  }
***************
*** 152,163 ****
  }
  
  PyObject *
! Xine_PyObject_open_video_driver(Xine_PyObject *self, PyObject *args, PyObject 
*kwargs)
  {
!     xine_video_port_t *vo_port = NULL;
!     Xine_Video_Port_PyObject *vo;
      char *driver;
      void *finalize_data = NULL;
-     int own = 1;
  
      if (!PyArg_ParseTuple(args, "s", &driver))
--- 159,170 ----
  }
  
+ 
  PyObject *
! Xine_PyObject_load_video_output_plugin(Xine_PyObject *self, PyObject *args, 
PyObject *kwargs)
  {
!     vo_driver_t *vo_driver;
!     Xine_VO_Driver_PyObject *vo_driver_pyobject;
      char *driver;
      void *finalize_data = NULL;
  
      if (!PyArg_ParseTuple(args, "s", &driver))
***************
*** 165,177 ****
  
      if (!strcmp(driver, "xv") || !strcmp(driver, "xshm") || !strcmp(driver, 
"auto")) {
!         vo_port = x11_open_video_driver(self, driver, kwargs, &finalize_data);
      } else if (!strcmp(driver, "none")) {
!         vo_port = xine_open_video_driver(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, 0);
      } else if (!strcmp(driver, "buffer")) {
!         vo_port = xine_open_video_driver(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, (void *)kwargs);
!         own = 1;
      }
          
!     if (!vo_port) {
          if (!PyErr_Occurred())
              PyErr_Format(xine_error, "Failed to open driver: %s", driver);
--- 172,185 ----
  
      if (!strcmp(driver, "xv") || !strcmp(driver, "xshm") || !strcmp(driver, 
"auto")) {
!         vo_driver = x11_open_video_driver(self, driver, kwargs, 
&finalize_data);
      } else if (!strcmp(driver, "none")) {
!         //vo_port = xine_open_video_driver(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, 0);
!         vo_driver = _x_load_video_output_plugin(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, 0);
      } else if (!strcmp(driver, "buffer")) {
!         //vo_port = xine_open_video_driver(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, (void *)kwargs);
!         vo_driver = _x_load_video_output_plugin(self->xine, driver, 
XINE_VISUAL_TYPE_NONE, (void *)kwargs);
      }
          
!     if (!vo_driver) {
          if (!PyErr_Occurred())
              PyErr_Format(xine_error, "Failed to open driver: %s", driver);
***************
*** 179,188 ****
      }
  
!     vo = pyxine_new_video_port_pyobject((PyObject *)self, vo_port, own);
  
      if (!strcmp(driver, "xv") || !strcmp(driver, "auto") || !strcmp(driver, 
"xshm")) {
!         x11_open_video_driver_finalize(vo, finalize_data);
      }
!     return (PyObject *)vo;
  }
  
--- 187,196 ----
      }
  
!     vo_driver_pyobject = pyxine_new_vo_driver_pyobject((PyObject *)self, 
vo_driver, 1);
  
      if (!strcmp(driver, "xv") || !strcmp(driver, "auto") || !strcmp(driver, 
"xshm")) {
!         x11_open_video_driver_finalize(vo_driver_pyobject, finalize_data);
      }
!     return (PyObject *)vo_driver_pyobject;
  }
  
***************
*** 445,449 ****
  PyMethodDef Xine_PyObject_methods[] = {
      {"list_plugins", (PyCFunction) Xine_PyObject_list_plugins, METH_VARARGS },
!     {"open_video_driver", (PyCFunction) Xine_PyObject_open_video_driver, 
METH_VARARGS | METH_KEYWORDS},
      {"open_audio_driver", (PyCFunction) Xine_PyObject_open_audio_driver, 
METH_VARARGS | METH_KEYWORDS},
      {"stream_new", (PyCFunction) Xine_PyObject_stream_new, METH_VARARGS },
--- 453,457 ----
  PyMethodDef Xine_PyObject_methods[] = {
      {"list_plugins", (PyCFunction) Xine_PyObject_list_plugins, METH_VARARGS },
!     {"load_video_output_plugin", (PyCFunction) 
Xine_PyObject_load_video_output_plugin, METH_VARARGS | METH_KEYWORDS},
      {"open_audio_driver", (PyCFunction) Xine_PyObject_open_audio_driver, 
METH_VARARGS | METH_KEYWORDS},
      {"stream_new", (PyCFunction) Xine_PyObject_stream_new, METH_VARARGS },
***************
*** 540,543 ****
--- 548,556 ----
  
  
+ #define INIT_XINE_TYPE(s, label) \
+     if (PyType_Ready(& s ## _PyObject_Type) < 0) return; \
+     Py_INCREF(& s ## _PyObject_Type); \
+     PyModule_AddObject(m, label, (PyObject *)& s ## _PyObject_Type)
+ 
  
  void
***************
*** 552,599 ****
      PyModule_AddObject(m, "XineError", xine_error);
  
!     if (PyType_Ready(&Xine_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_PyObject_Type);
!     PyModule_AddObject(m, "Xine", (PyObject *)&Xine_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Video_Port_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Video_Port_PyObject_Type);
!     PyModule_AddObject(m, "VideoPort", (PyObject 
*)&Xine_Video_Port_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Audio_Port_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Audio_Port_PyObject_Type);
!     PyModule_AddObject(m, "AudioPort", (PyObject 
*)&Xine_Audio_Port_PyObject_Type);
!     
!     if (PyType_Ready(&Xine_Stream_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Stream_PyObject_Type);
!     PyModule_AddObject(m, "Stream", (PyObject *)&Xine_Stream_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Post_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Post_PyObject_Type);
!     PyModule_AddObject(m, "Post", (PyObject *)&Xine_Post_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Post_Out_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Post_Out_PyObject_Type);
!     PyModule_AddObject(m, "PostOut", (PyObject 
*)&Xine_Post_Out_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Post_In_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Post_In_PyObject_Type);
!     PyModule_AddObject(m, "PostIn", (PyObject *)&Xine_Post_In_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Event_Queue_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Event_Queue_PyObject_Type);
!     PyModule_AddObject(m, "EventQueue", (PyObject 
*)&Xine_Event_Queue_PyObject_Type);
! 
!     if (PyType_Ready(&Xine_Event_PyObject_Type) < 0)
!         return;
!     Py_INCREF(&Xine_Event_PyObject_Type);
!     PyModule_AddObject(m, "Event", (PyObject *)&Xine_Event_PyObject_Type);
  
      if (xine_object_to_pyobject_dict == NULL)
--- 565,578 ----
      PyModule_AddObject(m, "XineError", xine_error);
  
!     INIT_XINE_TYPE(Xine, "Xine");
!     INIT_XINE_TYPE(Xine_VO_Driver, "VODriver");
!     INIT_XINE_TYPE(Xine_Video_Port, "VideoPort");
!     INIT_XINE_TYPE(Xine_Audio_Port, "AudioPort");
!     INIT_XINE_TYPE(Xine_Stream, "Stream");
!     INIT_XINE_TYPE(Xine_Post, "Post");
!     INIT_XINE_TYPE(Xine_Post_In, "PostIn");
!     INIT_XINE_TYPE(Xine_Post_Out, "PostOut");
!     INIT_XINE_TYPE(Xine_Event_Queue, "EventQueue");
!     INIT_XINE_TYPE(Xine_Event, "Event");
  
      if (xine_object_to_pyobject_dict == NULL)

Index: __init__.py
===================================================================
RCS file: /cvsroot/freevo/kaa/xine/src/__init__.py,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** __init__.py 25 Jul 2005 23:23:57 -0000      1.16
--- __init__.py 30 Jul 2005 20:55:15 -0000      1.17
***************
*** 23,26 ****
--- 23,28 ----
      if type(obj) == _xine.Xine:
          o = Xine(obj)
+     elif type(obj) == _xine.VODriver:
+         o = VODriver(obj)
      elif type(obj) == _xine.VideoPort:
          o = VideoPort(obj)
***************
*** 131,134 ****
--- 133,137 ----
  
      def _default_dest_size_cb(self, width, height, aspect, window):
+         #print "DEST SIZE CB", width, height, aspect, window
          if window:
              win_w, win_h = window.get_geometry()[1]
***************
*** 136,143 ****
              win_w, win_h = 640, 480
          movie_aspect = width / float(height)
!         window.aspect = movie_aspect * aspect
          return (win_w, win_h), 1
  
!     def open_video_driver(self, driver = "auto", **kwargs):
          if "window" in kwargs:
              window = kwargs["window"]
--- 139,149 ----
              win_w, win_h = 640, 480
          movie_aspect = width / float(height)
!         win_aspect = movie_aspect * aspect
!         if window.aspect != win_aspect:
!             window.aspect = win_aspect
!             window.signals["aspect_changed"].emit(win_aspect)
          return (win_w, win_h), 1
  
!     def load_video_output_plugin(self, driver = "auto", **kwargs):
          if "window" in kwargs:
              window = kwargs["window"]
***************
*** 151,165 ****
              window.aspect = -1 
              kwargs["window"] = window._window
!             self._xine.dependencies.append(window._window)
  
          if "passthrough" in kwargs:
!             assert(isinstance(kwargs["passthrough"], VideoPort))
!             kwargs["passthrough"] = kwargs["passthrough"]._port
          
!         vo = self._xine.open_video_driver(driver, **kwargs)
!         # This port is a driver, initialize wire_object to empty list.
!         vo.wire_object = []
!         return _wrap_xine_object(vo)
                      
  
  
--- 157,177 ----
              window.aspect = -1 
              kwargs["window"] = window._window
!             #print "SET DEPS", window._window
!             #self._xine.dependencies.append(window._window)
!             #self._xine.dependencies.append(window._display)
  
          if "passthrough" in kwargs:
!             vo = kwargs["passthrough"]
!             assert(isinstance(vo, VODriver))
!             assert(type(vo._driver.owner) == _xine.Xine)
!             kwargs["passthrough"] = vo._driver
          
!         driver = self._xine.load_video_output_plugin(driver, **kwargs)
!         return _wrap_xine_object(driver)
                      
+     def open_video_driver(self, driver = "auto", **kwargs):
+         driver = self.load_video_output_plugin(driver, **kwargs)
+         vo = driver.get_port()
+         return vo
  
  
***************
*** 219,222 ****
--- 231,240 ----
  
      def post_init(self, name, inputs = 0, audio_targets = [], video_targets = 
[]):
+         """
+         This method is deprecated.  Use new_post() instead.
+         """
+         return self.new_post(name, inputs, audio_targets, video_targets)
+ 
+     def new_post(self, name, inputs = 0, audio_targets = [], video_targets = 
[]):
          assert(type(audio_targets) in (list, tuple))
          assert(type(video_targets) in (list, tuple))
***************
*** 295,298 ****
--- 313,331 ----
          return types
  
+ 
+ class VODriver(object):
+     def __init__(self, driver):
+         self._driver = driver
+ 
+     def get_port(self):
+         # A new VODriver() is owned by a Xine object, but when get_port() is
+         # first called, the new VideoPort assumes ownership of us.
+         port = self._driver.get_port()
+         if port.wire_object == None:
+             # This port is a driver, initialize wire_object to empty list.
+             port.wire_object = []
+         return _wrap_xine_object(port)
+         
+ 
  class VideoPort(object):
      def __init__(self, vo):
***************
*** 303,306 ****
--- 336,341 ----
          return _wrap_xine_object(self._port.owner)
  
+     def get_driver(self):
+         return _wrap_xine_object(self._port.driver)
  
  class AudioPort(object):
***************
*** 462,466 ****
--- 497,508 ----
          for key, value in kwargs.items():
              assert(key in parms)
+             # Check enums for value
+             if value in parms[key]["enums"]:
+                 value = kwargs[key] = parms[key]["enums"].index(value)
+             elif parms[key]["enums"] and type(value) != parms[key]["type"]:
+                 raise XineError, "Value '%s' for parameter '%s' invalid." % 
(value, key)
+ 
              assert(type(value) == parms[key]["type"])
+             
  
          return self._post.set_parameters(kwargs)



-------------------------------------------------------
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

Reply via email to