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! ;-)

Tuesday, April 15, 2014

Updates on Hardware Accelerated Qt Multimedia Backend on Raspberry Pi (4.15.2014)

For those of you still working on this exciting subject, I did some new changes to PiOmxTextures and it still works pretty good. To have more information on PiOmxTextures refer to this older article. PiOmxTextures is the code behind the creation of a Qt Multimedia backend to provide hardware accelerated video (and software-decoded audio using ffmpeg) decoding and rendering from/in QML scenes on Raspberry Pi. PiOmxPlayer leverages the code from omxplayer. These are the new additions:

  1. Imported code from omxplayer to revision 9b0793faf2c12f49b743ae3778ece03e31ed1538.
  2. Now using ffmpeg 2.2.
  3. Now it can be built using gcc 4.8 using the recent Raspberry Pi Linaro toolchain released in 2014.
  4. Tested using Qt 5.3.0 beta.
  5. Tested on the most recent Raspberry Pi firmware: it seems Broadcom has made some changes (fixes?) to the egl_render component. Use the new patch to Qt Multimedia and rebuild. The hack I was forced to add to compensate is no more needed.

Everything seems to keep working correctly, both in 1080p and 720p. Enjoy: https://github.com/carlonluca/pi. Bye! ;-)

Friday, March 21, 2014

Installing Meld on Mac OS X

I really don't like FileMerge.app: I've always been feeling that Mac OS was missing a good tool like meld. Actually this turns out to be simply false: installing meld on Mac OS is pretty simple. Here are the steps:
  • Install the great macports.
  • Install meld. This will take some time. Keep in mind that at the time of writing, because of a bug, it is necessary to install rarian first:

    sudo port install rarian
    sudo port install meld
  • Start the dbus service and make it start at boot:

    sudo launchctl load -w /Library/LaunchDaemons/org.freedesktop.dbus-system.plist
    launchctl load -w /Library/LaunchAgents/org.freedesktop.dbus-session.plist
  • Define the LC_ALL variable to your locale (i.e.):

    export LC_ALL=en_US
  • Run meld (i.e.):

    /opt/local/bin/meld
Pretty simple! Bye! ;-)

Comfortable Logcat Output on Linux and Mac OS

Android's logcat is really a brilliant tool for analysis and debugging. Unfortunately I really don't like using it from Eclipse and using from the shell is not entirely comfortable, being it completely uniform. logcat-colorize is a great tool to colorize logcat output and make it really clear. Many thanks to the author! Unfortunately it was not working on Mac OS, so I forked and fixed; everything seems pretty OK: you can find the final fix in my fork at the moment.

How to Build

Follow the readme for building on Mac OS. The project depends on boost, so install it through macports and simply make. Assuming the boost libs are in system paths or default macports paths you should be good to go

Download the Binary

If you prefer, I also built a static version that you can download and use right away on Mac OS 10.9. This version does not require boost or macports to be installed.

Bye! ;-)

Saturday, December 14, 2013

Export ratings to mp3 from the iTunes database with Qt and taglib

I recently had some issues with iTunes and lost a few of the entries in the database. Maybe some little bug in iTunes, I don't precisely know. Anyway, this led to some data loss: some of my ratings were lost. I knew it would happen, it was only a matter of time, but this made me think it was time to look for a possible solution: embedding ratings into the mp3 itself.

I wasn't able to find a good tool to do this, even though I'm sure some exist, but I noticed it was pretty simple to implement that myself. So I wrote this little tool you might find useful as well: https://github.com/carlonluca/ITunesEmbed.

The tool will parse the library, extract ratings and play counts and embed those values into the popularimeter frame of the ID3v2 tags of the mp3s in your collection.

How to Build

Building the tool is simple: you just need Qt 4 (Qt 5 should be ok as well, I don't think many changes are needed), taglib and LightLogger. You can install taglib using macports, aptitude or whatever you want.

How to Use

The tool is a command line tool. Run the application without params and the help will be shown. You'll need to export your library to XML using iTunes. Then, provide the absolute file path of the library XML and an email that you want to associate to the data (multiple popularimeter frames can be embedded into the mp3). Beware that all the popularimeter frames associated to the same email address will be removed.

Of course this is just a draft. So look at the code, check what it does and backup your library entirely before starting to do anything. I don't want to be responsible of course if you burn it :-)
Bye!