Esas pequeñas cosas…

El otro día estaba contento.

Estaba contento porque no me cobraron peaje. Porque estaban arreglando la autopista. Y porque tardé casi una hora en hacer un tramo que no demora mas de veinte minutos en un dia normal.

El domingo necesitaba aire fresco para poder pensar tranquilo y me fui caminando hasta Los Talas… Qué lindo tener el campo cerca, sentir el olor a eucalipto quemado, tener verde donde quiera que mires.

On GStreamer performance with multiple sources.

I’ve made a couple of experiments with Tetra. Right now the code that manages disconnection of live sources (say, someone pulls the cable and walks away with one of our cameras) kind of works, it certainly does on my system but with differnet sets of libraries sometimes the main gst pipeline just hangs there and it really bothers me that I’m unable to get it right.

So I decided to really split it on a core that does the mixing (either manually or automatic) and different pipelines that feed it. Previously I had success using the inter elements (with interaudiosrc hacked so its latency is acceptable) to have another pipeline with video from a file mixed with live content.

Using the inter elements and a dedicated pipeline for each camera worked fine, the camera pipeline could die or dissapear and the mixing pipeline churned happily. The only downside is that it puts some requirements on the audio and video formats.

Something that I wasn’t expecting was that cpu utilization lowered, before I had two threads using 100% and 30% (and many others below 10%) of cpu time and both cores on average at 80% load. With different pipelines linked with inter elements I had two threads, one at 55% and a couple of others near 10%; both cores a tad below 70%.

Using shmsrc / shmsink yielded similar performance results but as a downside it behaved just like the original regarding the sources being disconnected, so for now I’m not considering them to ingest video. On the other hand latency was imperceptible as expected.

Think in English

– “I think we sholud mate”

– mmm’kay , pero es medio tarde y casi no queda yerba.

– “Precisely”. [smooch…]

– tee hee…

y después suena el despertador. La que lo tiró, ya no se puede soñar tranquilo.

Cosas que se al pedo

-(oído al pasar) ¿ Cuál es esa función que crece muy rápido?

– (me meto donde no me llaman) Ackermann…

– Esa misma , gracias.

 

En media hora de ver un documental reconocí dos temas de Moloko (no precisamente muy famosos) y uno de Piero Umiliani.

Todos estaban enfocados en la muchacha sin ropa y yo viendo el rig de la iluminación en el reflejo de los ojos.

El título vino gracias a, como no podía ser de otra forma, http://www.cosasquesealpedo.com.ar/

Hace frío…

El otro día llegué exhausto a casa. Me voy a acostar y la pucha que hace frío. Me pongo una camiseta térmica y mejora un poquito, solo un poquito. Terminé durmiendo con joguineta, remera térmica y un canguro. Soñe que cenaba camarones con Rita Cortese.

Cuando me levanto a la mañana me doy cuenta que tenía media ventana abierta.

Using the Gstreamer Controller subsystem from Python.

This is more or less a direct translation of the examples found at gstreamer/tests/examples/controller/*.c to their equivalents using the gi bindings for Gstreamer under Python. The documentation can be found here. Reading the source also helps a lot.

The basic premise is that you can attach a controller to almost any property of an object, set an interpolation function and give it pairs of (time, value) so they are smoothly changed. I’m using a pad as a target instead of an element just because it fits my immediate needs but it really can be any Element.

First you need to import Gstreamer and initialize it:

#!/usr/bin/python
import gi
import sys
from gi.repository import GObject
gi.require_version('Gst', '1.0')
from gi.repository import Gst
from gi.repository import GstController
from gi.repository import Gtk
from gi.repository import GLib

GObject.threads_init()
Gst.init(sys.argv)

Then create your elements. This is by no means the best way but lets me cut a bit on all the boilerplate.


p = Gst.parse_launch ("""videomixer name=mix ! videoconvert ! xvimagesink
videotestsrc pattern="snow" ! videoconvert ! mix.sink_0
videotestsrc ! videoconvert ! mix.sink_1
""")

m = p.get_by_name ("mix")
s0 = [pad for pad in m.pads if pad.name == 'sink_0'][0]
s0.set_property ("xpos", 100)

Here I created two test sources, one with bars and another with static that also has an horizontal offset. If we were to start the pipeline right now ( p.set_state (Gst.State.PLAYING) ) we would see something like this:

captura_testinterpolation

So far it works. Now I’d like to animate the alpha property of s0 (the sink pads of a videomixer have interesting properties like alpha, zorder, xpos and ypos). First we create a control source and set the interpolation mode:

cs = GstController.InterpolationControlSource()
cs.set_property('mode', GstController.InterpolationMode.LINEAR)

Then we create a control binding for the property we want to animate and add it to our element:

cb = GstController.DirectControlBinding.new(s0, 'alpha', cs)
s0.add_control_binding(cb)

It is worth noting that the same control source can be used with more than one control binding.

Now we just need to add a couple of points and play:

cs.set(0*Gst.SECOND, 1)
cs.set(4*Gst.SECOND, 0.5)
p.set_state (Gst.State.PLAYING)

If you are not running this from the interpreter remember to add GObject.MainLoop().run() , otherwise the script will end instead of keep playing. Here I’ve used absolute times, to animate in the middle of a playing state you need to get the current time and set the points accordingly, something like this will do most of the cases:


start = p.get_clock().get_time() # XXX: you better check for errors
end = start + endtime*Gst.SECOND

Avoiding too much bookkeeping

You can get the controller and control source of an element with:

control_binding = element.get_control_binding('property')
if control_binding:
    control_source = control_binding.get_property('control_source')

Late movies

I started again to go outside to watch some instead of staying warm at home. Some were at the Cine Freak Show, some with friends (ok, not outside but not my home either).

Like Someone in Love: It was nice and touching but even after three times I still feel like I’m missing something.

Lesson of the Evil: It took away every bit of me that wanted to visit Japan. Had very funny scenes.

Combat Girls: (Kriegerin) I watched this for the first time last year. Mixed feeling about this one. I found it a bit like This is England but relocated. Oh nuts, the same reference is at the ‘pedia.