Author: ArcRiley
Date: 2007-07-07 01:17:33 -0400 (Sat, 07 Jul 2007)
New Revision: 395
Modified:
trunk/pysoy/src/transports/Transport.pxi
trunk/pysoy/src/transports/soy.transports.pxd
trunk/pysoy/tests/vid_canvas.py
Log:
Ticket #263 - we seem to be demuxing Ogg now
Modified: trunk/pysoy/src/transports/Transport.pxi
===================================================================
--- trunk/pysoy/src/transports/Transport.pxi 2007-07-07 03:07:00 UTC (rev
394)
+++ trunk/pysoy/src/transports/Transport.pxi 2007-07-07 05:17:33 UTC (rev
395)
@@ -27,8 +27,9 @@
def __init__(self, path, *args, **keywords) :
cdef char _magic[4]
cdef soy._internals.Children _transports
- self._objs = {}
- self._snos = {}
+ self._objs = <Stored *> py.PyMem_Malloc(sizeof(Stored) * 4)
+ self._mobj = 4
+ self._dict = {}
if self._open(path) :
if self._read(_magic,4) == 0 :
self._vers = -1
@@ -37,6 +38,7 @@
self._headOgg()
#elif _magic == 'Soy0' :
else :
+ self._vers = -10
raise TypeError('unsupported file type')
# Yes, this is a level 5 sin.
@@ -48,13 +50,57 @@
_transports.unlock()
+ def __dealloc__(self) :
+ cdef soy._internals.Children _transports
+ if self._vers > -10 :
+ _transports = <soy._internals.Children> \
+ py.PyCObject_AsVoidPtr(__import__('soy._core', [], [],
+ ['_Transports']).__dict__['_Transports']())
+ _transports.lock()
+ _transports.remove(<void *> self)
+ _transports.unlock()
+ py.PyMem_Free(self._objs)
+
+
# This is called by _coreLoop()
cdef void _process(self) :
if self._mode == 1 :
if self._vers == 0 :
- self._loadOgg()
+ self._loadOgg()
+ cdef int _initObjt(self, int _serialno, object _name, object _object) :
+ cdef int i
+ if self._mobj <= self._nobj :
+ self._mobj = self._mobj + 4
+ self._objs = <Stored *> py.PyMem_Realloc(self._objs,
+ sizeof(Stored) * self._mobj)
+ self._objs[self._nobj].serialno = _serialno
+ for i from 0 <= i < len(_name) :
+ self._objs[self._nobj].name[i] = ord(_name[i])
+ self._objs[self._nobj].namelen = len(_name)
+ self._objs[self._nobj].object = <void *> _object
+ self._dict[_name] = _object
+ self._nobj = self._nobj + 1
+ return self._nobj-1
+
+ cdef int _findName(self, char *_name, unsigned char _namelen) :
+ cdef int i
+ for i from 0 <= i < self._nobj :
+ if _namelen == self._objs[i].namelen and \
+ _name[:_namelen] == self._objs[i].name[:_namelen] :
+ return i
+ return -1
+
+
+ cdef int _findSrno(self, int _serialno) :
+ cdef int i
+ for i from 0 <= i < self._nobj :
+ if _serialno == self._objs[i].serialno :
+ return i
+ return -1
+
+
############################################################################
# Transport-specific functions
#
@@ -94,7 +140,7 @@
# Ogg functions
#
cdef void _headOgg(self) :
- cdef int _sn
+ cdef int i, _sn
cdef unsigned int m
cdef char *_magic
cdef ogg.ogg_page _page
@@ -110,7 +156,9 @@
ogg.ogg_sync_wrote(&self._sync, 4)
while self._readOggPage(&_page) :
if not ogg.ogg_page_bos(&_page) :
- (<soy._internals.Loadable> self._objs['video'])._load(&_page)
+ i = self._findSrno(ogg.ogg_page_serialno(&_page))
+ if i >= 0 :
+ (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
break
_sn = ogg.ogg_page_serialno(&_page)
ogg.ogg_stream_init(&_testStream, _sn)
@@ -118,10 +166,9 @@
ogg.ogg_stream_packetout(&_testStream, &_packet)
ogg.oggpackB_readinit(&_buffer, _packet.packet, _packet.bytes)
m = ogg.oggpackB_read(&_buffer, 32)
- if m == 2155112549L and not self._objs.has_key('video') :
- self._objs['video'] = soy.textures.Video()
- self._snos[_sn] = 'video'
- (<soy._internals.Loadable> self._objs['video'])._load(&_page)
+ if m == 2155112549L :
+ i = self._initObjt(_sn, 'video', soy.textures.Video())
+ (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
# 24538994 = vorbis
# 7828073 = writ
# 1399874917L = speex
@@ -132,22 +179,23 @@
if not self._readOggPage(&_page) :
break
_sn = ogg.ogg_page_serialno(&_page)
- if self._snos.has_key(_sn) :
- (<soy._internals.Loadable> self._objs[self._snos[_sn]])._load(&_page)
+ i = self._findSrno(_sn)
+ if i >= 0 :
+ (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
self._vers = 0 # Ogg
self._mode = 1 # Loading
cdef void _loadOgg(self) :
- cdef int _sn
- cdef ogg.ogg_page _page
+ cdef int i, _sn
+ cdef ogg.ogg_page _page
if self._readOggPage(&_page) :
_sn = ogg.ogg_page_serialno(&_page)
- stdio.printf('processed %d:%d\n', _sn, ogg.ogg_page_pageno(&_page))
- if self._snos.has_key(_sn) :
- (<soy._internals.Loadable> self._objs[self._snos[_sn]])._load(&_page)
+ i = self._findSrno(_sn)
+ if i >= 0 :
+ (<soy._internals.Loadable> self._objs[i].object)._load(&_page)
+
-
cdef int _readOggPage(self, ogg.ogg_page *_oggPage) :
cdef char *_buffer
cdef int _bytes
@@ -180,16 +228,16 @@
# Python methods
#
def __getitem__(self, key) :
- return self._objs[key]
+ return self._dict[key]
def __repr__(self) :
- return self._objs.__repr__()
+ return self._dict.__repr__()
def __str__(self) :
- return self._objs.__str__()
+ return self._dict.__str__()
def __len__(self) :
- return self._objs.__len__()
+ return self._dict.__len__()
Modified: trunk/pysoy/src/transports/soy.transports.pxd
===================================================================
--- trunk/pysoy/src/transports/soy.transports.pxd 2007-07-07 03:07:00 UTC
(rev 394)
+++ trunk/pysoy/src/transports/soy.transports.pxd 2007-07-07 05:17:33 UTC
(rev 395)
@@ -22,15 +22,28 @@
cimport stdio
cimport soy._internals
+
+cdef struct Stored :
+ int serialno
+ char name[256]
+ unsigned char namelen
+ void *object
+
+
cdef class Transport :
- cdef object _objs # OBJectS
- cdef object _snos
- cdef int _vers # -1 = empty, 0 = ogg, 1 = soy
+ cdef Stored *_objs
+ cdef object _dict
+ cdef int _mobj
+ cdef int _nobj
+ cdef int _vers # <-9=error, -1=empty, 0=ogg, >0=soy
cdef int _mode # 0 = idle, 1 = load, 2 = save
cdef ogg.ogg_sync_state _sync
#
# General Functions
cdef void _process(self)
+ cdef int _initObjt(self, int, object, object)
+ cdef int _findName(self, char*, unsigned char)
+ cdef int _findSrno(self, int)
#
# Transport-specific functions
cdef int _open (self, path)
Modified: trunk/pysoy/tests/vid_canvas.py
===================================================================
--- trunk/pysoy/tests/vid_canvas.py 2007-07-07 03:07:00 UTC (rev 394)
+++ trunk/pysoy/tests/vid_canvas.py 2007-07-07 05:17:33 UTC (rev 395)
@@ -3,7 +3,8 @@
import soy
from time import sleep
-vid = soy.transports.File('changeworld.ogg')['video']
+ogg = soy.transports.File('changeworld.ogg')
+vid = ogg['video']
scr = soy.Screen()
win = soy.Window(scr, 'Video Canvas')
_______________________________________________
PySoy-SVN mailing list
[email protected]
http://www.pysoy.org/mailman/listinfo/pysoy-svn