Thursday, May 22, 2014

A Tribute to Qt Portability :-)

The new ports of Qt to mobile systems like Android, iOS and WinRT are getting more and more reliable. I just wanted to have a look at the current stage of development and I therefore wrote a sample app. This is the result:
This is a quick app to test the portability of Qt on desktop, mobile and embedded.
The video shows client/server code, communicating via WebSockets (using the new WebSockets module in Qt), with a server in Qt/C++ running on Pi and with a fluid hardware accelerated interface in C++/QML running on Raspberry Pi, Mac OS X Maverick, Android Phone and Tablet, Windows 8 (Modern UI), Windows Phone 8, iOS and Linux Kubuntu. The server (on Raspberry Pi) stores information about tasks and the client provides a remote interface to manage. A client written using HTML5 canvas and WebSockets from the browser is also shown.
Unfortunately I don't own iOS and Winphone ARM devices, otherwise I'd add those as well :-) Good start anyway: this is really "write once, deploy anywhere".

Using the ports is simple: configure Qt Creator with the correct Qt build, setup the toolchain to use, qmake and build (for iOS and WinRT I preferred Xcode and Visual Studio respectively yet). Your done!
Pretty cool! Bye! ;-)

Tuesday, May 6, 2014

FFmpeg gstreamer plugin on Ubuntu 14.04

EDIT 02.25.2015: It seems to be missing even in Ubuntu 14.10. But probably the quickest way to install is:

sudo add-apt-repository ppa:mc3man/gstffmpeg-keep
sudo apt-get update
sudo apt-get install gstreamer0.10-ffmpeg


END EDIT

I was trying to develop an application that uses gstreamer 0.10 on Ubuntu 14.04 and I noticed this runtime error message:

"No decoder available for type 'video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)3, profile=(string)main, codec_data=(buffer)014d401effe10015274d401ea9181b07bcde00d4040406db0ad7bdf01001000428de09c8, width=(int)854, height=(int)480, framerate=(fraction)24/1, pixel-aspect-ratio=(fraction)1/1, parsed=(boolean)true'."

This is because it seems that the gstreamer 0.10 ffmpeg plugin is missing in 14.04. This also makes my Qt code fail it seems, as it uses 0.10 for the Qt Multimedia module. It used to be sufficient to install ubuntu-restricted-extras until 13.10, but it seems something has changed in 14.04. I really couldn't find that plugin anywhere soI simply built that from the sources here. Luckily it also contains the ffmpeg sources and builds those statically it seems.
Download the package, extract and:

./configure make make install

You'll probably need to install the usual build-essentials, gstreamer0.10, libgstreamer0.10, libgstreamer-plugins-base0.10-dev etc... It may fail with an error on a macro like this:

./libavcodec/get_bits.h: In function 'skip_bits': ./libavcodec/get_bits.h:387:1: warning: variable 're_cache' set but not used [-Wunused-but-set-variable] libavcodec/x86/h264_qpel_mmx.c: Assembler messages: libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp' libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp' make[1]: *** [libavcodec/x86/dsputil_mmx.o] Error 1

If that happens just apply the patch here. Place the plugin libgstffmpeg.so into /usr/lib/x86_64-linux-gnu/gstreamer-0.10, or wherever you have your gstreamer plugins and you're done. Bye! ;-)