vrijdag 30 oktober 2009

GStreamer, Python, Qt, Mac OSX

I would like to develop a cross platform streaming-media application. We use:
  • Gstreamer, for its advanced pipeline features and active community;
  • Python, for its agility;
  • Qt, for its native feel on different platforms and
  • Mac OSX, to start with, because of its usability.
This seems to be a non-trivial combination. Acknowleding the call by Jono Bacon, I try to put my findings online so anyone using Google should be able to find it.

To start, I tried to show test video as a QWidget on Mac OS X. First I tried to adapt the example PyGST video player to receive an NSView. Unfortunately, using playbin, this is currently impossible. So, I had to just connect a videotestsrc to an osxvideosink. An extension to PyQt had to be made, to enable retrieving the NSView reference. Phil Thompson was so kind as to add this on 2009/10/10, which is now included in PyQt4 4.6.1. I submitted a patch to MacPorts to incorporate this upgrade, so you can now just install port py26-pyqt4@4.6.1.

A simple demonstration:

'''

Author: Sjoerd Op 't Land

Date: 30 October 2009

Sources:

http://ooboontoo.blogspot.com/2008/03/gstreamer-with-python-in-qt-learning-by.html

http://faq.pygtk.org/index.py?req=show&file=faq23.038.htp

http://doc.trolltech.com/4.5/qmaccocoaviewcontainer.html#details

Prerequisites (MacPort ports):

gstreamer

gst-plugins-base

gst-plugins-good

python_select (use to select Python 2.6 with "sudo python_select python26")

py26-pyqt4

py26-gst-python

gst-plugins-ugly

py26-pyobjc2-cocoa

'''


from PyQt4 import QtCore, QtGui # Qt bindings

import sys

import gst # gstreamer bindings

import Foundation # PyObjC bindings for Foundations framework


class TestMonitor(QtGui.QDialog):

def __init__(self, parent=None):

super(TestMonitor, self).__init__(parent)

layout = QtGui.QVBoxLayout(self)

self.label = QtGui.QLabel()

self.label.setText("SMPTE Color Bars with snow")

layout.addWidget(self.label)

self.player = gst.Pipeline("player")

self.source = gst.element_factory_make("videotestsrc","testsrc")

self.sink = gst.element_factory_make("osxvideosink","videosink")

self.player.add(self.source,self.sink)

gst.element_link_many(self.source,self.sink)


bus = gst.Pipeline.get_bus(self.player)

self.player.set_state(gst.STATE_PLAYING)

self.nsview = None

while self.nsview == None:

messagePoll = bus.poll(gst.MESSAGE_ANY,1000000000)

if messagePoll:

if messagePoll.structure and messagePoll.structure.has_key("nsview"):

print messagePoll.structure["nsview"]

# use a dirty hack to obtain the address of this gpointer

#TODO: make sure this also works on 64-bit systems

pointerAddress = int(str(messagePoll.structure["nsview"])[13:-1],16)

self.nsview = pointerAddress

# Pushing an NSAutoreleasePool on the stack is necessary to suppress

# leakage error messages. However, I'm not convinces that leakage is

# really avoided, this way.

#TODO: check for memory leaks

pool = Foundation.NSAutoreleasePool.alloc().init()

self.viewer = QtGui.QMacCocoaViewContainer(self.nsview,self)

del pool

self.viewer.setMinimumSize(320,240)

layout.addWidget(self.viewer)


if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

testmonitor = TestMonitor()

testmonitor.show()

app.exec_()




Some important things still are to be done:
  • Make this cross-platform
  • Check for memory leaks
  • Do this in a threaded way
Suggestions, comments and insults are welcome!

dinsdag 20 oktober 2009

Vrouwenhand

Afgelopen weekend is er een hele club NSU'ers naar Parijs komen liften, op initiatief van Hilde, en waaronder ook mijn zusje. Ik heb mij bij deze gezellige groep Nederlanders gevoegd voor de duur van het weekend.

Op zaterdag zijn we Centre Pompidou in geweest, met een spannende tentoonstelling over surrealisme. Zoals de naam belooft, vaak heel vervreemdend. Kunstwerk dat bij mij bleef hangen: een levensgroot nooduitgang-bordje, zodanig dat het witte mannetje in een oneindige lus rondloopt.

's Avonds hebben we gegeten bij Chartier, goed te betalen (EUR 20 voor drie gangen) maar je moet wel meteen weg als je het op hebt en reserveren is verplicht.


De volgende dag zijn Sifra en Hilde met mij mee geweest naar de kerk. Daarna hebben ze bij mij geluncht. Toen ze binnenkwamen zag ik al meteen aan hun gezicht 'wat saai, echt een jongûskamer'. Enfin, terwijl ik kookte hebben zij mijn kamer heringedeeld en een stuk gezelliger gemaakt. (Niet op de foto: kerstlichtjes, metrokaart boven mijn bureau, was in de badkamer i.p.v. naast de kast, koffer op 'zolder'.) Dit is toch een verklaarbare maar toch telkens fascinerende vrouwenneiging om het overal gezellig te willen maken. Hoe dan ook, ik leef nu in een gezelliger kamer: bedankt dames!


Zondag zijn we naar Parc de la Vilette en Cité des sciences et de l'industrie geweest. Dat laatste is een wetenschapsmuseum, echt gaaf hoe ze niet alleen natuurkundige, maar bijvoorbeeld ook wiskundige principes zichtbaar maken. Hieronder bijvoorbeeld de demonstratie van de centrale limietstelling. Van bovenaf valt een knikkertje op een serie spijkers, waar de kans om links of rechts te vallen ongeveer gelijk is. De som van acht van deze Bernouilli-experimentjes (niet normaal verdeeld), begint toch verdacht normaal verdeeld te lijken!




zaterdag 10 oktober 2009

Uitvaart

Gisteravond kwam ik in de kerk voor de koorrepetitie, maar meteen merkte ik dat er een vreemde sfeer hing. Op de vraag of er vanavond repetitie was, kreeg ik 'pas exactement'. De vader van één van de koorleden bleek overleden met vanavond de gedenkdienst. Dat betekent dat we in één uur in sneltreinvaart alle liederen hebben doorgenomen, waaronder 'Au dernier jour' ('Oh when the saints').

De man in kwestie was Congolees, dus de gedenkdienst was nog Congoleser dan katholiek. Het lichaam was overigens al gevlogen: naar Congo inderdaad. Het schijnt vrij gebruikelijk te zijn voor deze mensen (welke groep precies?) om in hun vaderland begraven te willen worden. En inderdaad, alle vooroordelen kloppen: de dienst was gepland van 22h00 tot 23h00, gerealiseerd van 22h30 tot 0h00. Maar ook: de voorbeden gingen in vraag- en antwoord-zang. De voorzanger liep een beetje rond en gebruikte zijn adempauzes (wanneer de gemeente hem nazong) om bij mensen te informeren of hij nog moest bidden voor die-of-die. Geniaal.

dinsdag 6 oktober 2009

ElBas-versterker

Vandaag weer eens iets geheel voor het eerst gedaan: solderen onder een stereoscoop. De loep was mij al bekend (erg fijn), maar met 10x vergroting en echte diepte, gaat er al een heel nieuwe wereld voor je open. Waar je bij goed licht nog net de drie cijfertjes op een 0603 weerstand kunt lezen, daar zie je nu het reliëf van de opdruk. Van een draadje dat je buigt, kun je nu zien dat 'ie tordeert als een tuinslang, de harskern in het soldeer kun je nu zien borrelen. Geweldig!


Enfin, wat was het doel? In een poging om een differentieel signaal te maken met een regelbare fasedraaiing tussen de common-mode en de differential-mode spanning, had ik een regelbare attenuator nodig. Op normale frequenties volstaat hiervoor een potmeter, maar die heeft, zoals bekend, geen constante uitgangsweerstand en al helemaal geen 50 ohm. Daarvoor was een buffertrap nodig en met mijn laatste restje ElBas kennis en het compendium elektrotechniek (toch niet voor niets meegenomen) is het gelukt. De kenner ziet ogenblikkelijk welk component ervoor zorgt dat we de 1 GHz niet gaan halen, maar 1-100 MHz (-1 dB bandbreedte) vond ik lang niet slecht.

zaterdag 26 september 2009

l'Equipe

Vandaag nam mede-stagaire Adeline afscheid van ons. Een goede gelegenheid voor een groepsfoto. Niet iedereen staat erop (vooral een aantal Certificatie-mensen ontbreken), en stiekem was er ook wat secretariaat op de taart afgekomen, dus die belandden ook op de foto.



Geheel links Fréderic, mijn officiële begeleider, tevens teamleider van Innovatie. Op de stoel vooraan Younes, die mij zoals gezegd heeft rondgeleid, daarachter Adeline. De meest Amerikaans ogende man met blauwe polo is Imad, waar ik inhoudelijk zowel als persoonlijk veel aan heb. De lege stoel was een mooie plaats geweest voor François, maar die krijg ik nog wel te pakken. Voor nu blijft 'ie voor Elia.

zondag 20 september 2009

Rencontrez Rob, rencontrez Paris

Vanaf donderdag heeft Rob hier gelogeerd, die op de terugreis van een conferentie langs Parijs kwam, en de stad graag wilde leren kennen. Het weekend was ik ook vrij, zodat we samen de obligate en minder obligate plaatsen konden aandoen. Zo hebben we de gezelligheid op de bruggen rondom Île de la Cité genoten, en de Notre Dame bij nacht gezien (van buiten dus). Best een mooi gezicht allemaal.


Overdag hebben we ons ondergedompeld in de veelheid van indrukken van het Louvre. Er is daadwerkelijk gigantisch veel te zien. Meestal doen allerlei opgraafsels (uit Egypte, namelijk) mij niet zoveel, maar toen ik even de tijd had genomen om me te realiseren dat deze voorwerpen daadwerkelijk allemaal een keer gemaakt en gebruikt zijn, kwam het tot leven. Als ik de tijd nu zou terugspoelen, dan komt er echt een moment dat mensen hier wijn uit schenken of dit beeldje aanbidden. Curieus... Verder nog in de Notre Dame geweest (en ons ook verbaasd over het dynamisch bereik van onze ogen).


Mocht je ooit nog in Créteil willen uitgaan: slecht idee. Na een uur gedwaald te hebben, kwamen we toch weer bovenin het winkelcentrum. Te arren moede hebben we daar in een Union Bar-achtige setting een biertje gedronken, maar dit was natuurlijk niet het bruine café waarop we gehoopt hadden. Op advies van een collega hebben we in het straatje 'Butte aux Cailles' (metro Place d'Italie) een gezellige uitspanning gevonden. De foto is wat vaag, maar... dat waren wij toen inmiddels ook. (Daarvóór hadden wij ons geluk beproefd op Rue de la Lappe (metro Bastille), maar toen we op een gegeven moment meer ME dan burgers om ons heen zagen, hebben we maar rechtsomkeert gemaakt. Voor Scintilla's activiteit 'Rellen met de ME' hebben we ook altijd beleefd bedankt.) Een andere optie, misschien later nog, was Rue Mouffetard (metro Place Monge).

zaterdag 12 september 2009

Stage komt op gang

Leven zonder internet is echt goed voor je, zeg! Allerlei zaken waar ik anders geen tijd voor neem komen er ineens van (boekhouding, bijbelstudie, brieven schrijven). Tegelijk komen bepaalde 'eigenlijk...'-dingen er nog steeds niet van (vocabulaire stampen), waardoor blijkt dat ik ze echt niet zo belangrijk vind. En: ik lig er op tijd in.

Afgelopen weekend niet veel gedaan. Woensdag is de zelfverdediging er niet van gekomen (geen zin-tijd-energie).

Donderdag is mijn begeleider op het werk gekomen en daarmee het leven in de brouwerij. Hij heeft wel wat weg van Stramigioli qua beschikbare tijd, maar dus ook qua gevoel van importantie bij wat hij doet. Er komen nu echte discussies van de grond over de inhoud van mijn opdracht. En... ik heb de eerste vertrouwelijke ontwerpen gezien. Zijn humor en betrokkenheid bij de werknemers maakt de sfeer ineens heel wat losser; het is nu heel wat minder stil en daar ben ik erg blij mee.

Zondag wel naar de kerk geweest; St. Michel, hier vlak om de hoek. Ik was te laat, maar gelukkig was ik niet de enige. Grappig: een katholieke kerk qua muziek en liturgie, maar evangelisch van toon (de zendingsopdracht (geloof ik) staat op de muur, boekjes over bijbellezen en het geloof staan bij de ingang). Drie mensen hebben mij expliciet welkom geheten, waarvan er maar één volgens mij officieel die taak had (kan de PKN nog een puntje aan zuigen). Verder is de kerk overwegend zwart.

Vrijdagavond naar de koorrepetitie geweest. Geniaal! Marie-Claire was de enige aanwezige sopraan, maar is geweldig in solvège (maar dat vindt ze zelf niet). De koorleider Albert heeft een geweldig bereik, maar is iets minder goed in pianospelen. Ik begon bij de tenoren, maar werd al snel naar de bassen verplaatst. Naast mij zit Gilles, die geen noten kan lezen, maar erg leergierig is en onbegrijpelijke aantekeningen maakt om toch de melodie te onthouden (roerend).

Vandaag maar eens Parijs ingegaan, vooral met het doel het OV te gaan begrijpen en te weten wat er te doen is. De Notre Dame van buiten eens goed bekeken, straatartiesten bij het Centre Pompidou genoten, geluncht met een crêpe en daarna het winkelcentrum Les Halles doorgeslenterd.