Categories
ffmpeg graphics gui linux programming qt video

Showing video with Qt toolbox and ffmpeg libraries

I recently had to build a demo client that shows short video messages for Ubuntu environment.
After checking out GTK+ I decided to go with the more natively OOP Qt toolbox (GTKmm didn’t look right to me), and I think i made the right choice.
So anyway, I have my video files encoded in some unknown format and I need my program to show them in a some widget. I went around looking for an exiting example, but i couldn’t find anything concrete, except for a good tip here that led me here for an example of using ffmpeg’s libavformat and libavcodec, but no end-to-end example including the Qt code.
The ffmpeg example was simple enough to just copy-paste into my project, but the whole painting over the widget’s canvas was not covered. Turns out painting video is not as simple as overriding paintEvent()…
Firstly, you need a separate thread for grabbing frames from the video file, because you won’t let the GUI event thread do that.
That makes sense, but when the frame-grabbing thread (I called VideoThread) actually grabbed a frame and inserted it somewhere in the memory, I needed to tell the GUI thread to take that buffered pixels and paint them over the widget’s canvas.
This is the moment where I praise Qt’s excellent Signals/Slots mechanism. So I’ll have my VideoThread emit a signal notifying some external entity that a new frame is in the buffer.
Here’s a little code:

Categories
comics

Thinking of new services…

Categories
comics

Take that – Toyota Prius!

Inspired by this article in the Telegraph.

Categories
programming

The strange case of the BackgroundWorker and the disappearing exception

I was recently building a simple GUI in .NET to operate an algorithm as part of a school project, and I encountered a weird problem using BackgroundWorkers. I spent a lot of time debugging it, mainly because the code seemed to be perfect (which was true) but the run-time behavior was so strange…
Anyway, to make my algorithm as weakly-coupled as possible decided not to use BackgroundWorker.ReportProgress‘, because then my algorithm will have to know what a BackgroundWorker is…
I decided to actually fire my own event whenever I wanted to report on the algorithm progress (which is rather lenghty). So I defined my delegate and event inside my one-function class that runs the algorithm:

Categories
graphics

DIY: Cow skin pattern for your GIMPed cows

I wanted to share with you a (very simple and short) method for creating cow-skin patterns, totally random each time, for your GIMPin needs.
This can actually work the exact same way in GIMP, PS or Paint.NET.
I will demonstrate with GIMP, but it is so simple you can do it in any of the aforementioned programs.
So here goes:

Categories
comics

Honest typo

Categories
comics

Where all the babes hang

* Made with Paint.NET

Categories
graphics

Paint.NET is cool

Today I stumbled upon Paint.NET.
It seems like an awesome tool for quickly drawing stuff.

I also read that some compare it to The GIMP (which I adore…). I found Paint.NET is easier for simpler tasks that the GIMP can drive you nuts while trying to do them.
In the GIMP i find myself using the select tool A LOT. You want to draw a circle? select and fill. You want a simple rectangle? select and fill…
Sometimes I wish GIMP was more like plain ol’ Paint…

Here I think Paint.NET really excels. It keeps the simplicity of Paint, but adding the open-sourceness and variety of GIMP.

Categories
comics

Driving calmly

Hebrew version:

Categories
comics

Slave-co software

Recruitment process in Slave-co