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.