*** ./configure.ac.orig	2012-12-30 21:20:47.000000000 +0100
--- configure.ac	2012-12-30 21:21:17.000000000 +0100
***************
*** 30,36 ****
  
  AC_PREREQ(2.61)
  AC_INIT([MediaTomb], [0.12.1], [jin@mediatomb.cc])
! AM_CONFIG_HEADER([autoconfig.h tombupnp/upnp/inc/upnpconfig.h])
  AC_CONFIG_AUX_DIR(configure_aux)
  AC_CONFIG_SRCDIR([src/common.h])
  AM_INIT_AUTOMAKE([1.9 -Wall])
--- 30,36 ----
  
  AC_PREREQ(2.61)
  AC_INIT([MediaTomb], [0.12.1], [jin@mediatomb.cc])
! AC_CONFIG_HEADERS([autoconfig.h tombupnp/upnp/inc/upnpconfig.h])
  AC_CONFIG_AUX_DIR(configure_aux)
  AC_CONFIG_SRCDIR([src/common.h])
  AM_INIT_AUTOMAKE([1.9 -Wall])
*** src/metadata/ffmpeg_handler.cc.orig	2012-12-30 21:30:34.000000000 +0100
--- src/metadata/ffmpeg_handler.cc	2012-12-30 21:29:41.000000000 +0100
***************
*** 89,94 ****
--- 89,121 ----
  
  	Ref<StringConverter> sc = StringConverter::m2i();
      
+ 	/* Tabs are 4 characters here */
+ 	typedef struct {const char *avname; metadata_fields_t field;} mapping_t;
+ 	static const mapping_t mapping[] =
+ 	{
+ 		{"title",   M_TITLE},
+ 		{"artist",  M_ARTIST},
+ 		{"album",   M_ALBUM},
+ 		{"date",    M_DATE},
+ 		{"genre",   M_GENRE},
+ 		{"comment", M_DESCRIPTION},
+ 		{"track",   M_TRACKNUMBER},
+ 		{NULL,      M_MAX},
+ 	};
+ 
+ 	if (!pFormatCtx->metadata)
+ 		return;
+ 	for (const mapping_t *m = mapping; m->avname != NULL; m++)
+ 	{
+ 		AVDictionaryEntry *tag = NULL;
+ 		tag = av_dict_get(pFormatCtx->metadata, m->avname, NULL, 0);
+ 		if (tag && tag->value && tag->value[0])
+ 		{
+ 			log_debug("Added metadata %s: %s\n", m->avname, tag->value);
+ 			item->setMetadata(MT_KEYS[m->field].upnp, sc->convert(tag->value));
+ 		}
+ 	}
+ 	/* Old algorithm (doesn't work with libav >= 0.7)
  	if (strlen(pFormatCtx->title) > 0) 
      {
  	    log_debug("Added metadata title: %s\n", pFormatCtx->title);
***************
*** 131,136 ****
--- 158,164 ----
          item->setMetadata(MT_KEYS[M_TRACKNUMBER].upnp, 
                            sc->convert(String::from(pFormatCtx->track)));
  	}
+ 	*/
  }
  
  // ffmpeg library calls
***************
*** 178,184 ****
  	for(i=0; i<pFormatCtx->nb_streams; i++) 
      {
  		AVStream *st = pFormatCtx->streams[i];
! 		if((st != NULL) && (videoset == false) && (st->codec->codec_type == CODEC_TYPE_VIDEO))
          {
              if (st->codec->codec_tag > 0)
              {
--- 206,212 ----
  	for(i=0; i<pFormatCtx->nb_streams; i++) 
      {
  		AVStream *st = pFormatCtx->streams[i];
! 		if((st != NULL) && (videoset == false) && (st->codec->codec_type == AVMEDIA_TYPE_VIDEO))
          {
              if (st->codec->codec_tag > 0)
              {
***************
*** 209,215 ****
                  *y = st->codec->height;
  			}
  		} 
! 		if(st->codec->codec_type == CODEC_TYPE_AUDIO) 
          {
  			// Increase number of audiochannels
  			audioch++;
--- 237,243 ----
                  *y = st->codec->height;
  			}
  		} 
! 		if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO) 
          {
  			// Increase number of audiochannels
  			audioch++;
***************
*** 251,257 ****
      int x = 0;
      int y = 0;
  
! 	AVFormatContext *pFormatCtx;
  	
  	// Suppress all log messages
  	av_log_set_callback(FfmpegNoOutputStub);
--- 279,285 ----
      int x = 0;
      int y = 0;
  
! 	AVFormatContext *pFormatCtx = avformat_alloc_context();
  	
  	// Suppress all log messages
  	av_log_set_callback(FfmpegNoOutputStub);
***************
*** 259,273 ****
  	// Register all formats and codecs
      av_register_all();
  
!     // Open video file
!     if (av_open_input_file(&pFormatCtx, 
!                           item->getLocation().c_str(), NULL, 0, NULL) != 0)
          return; // Couldn't open file
  
      // Retrieve stream information
!     if (av_find_stream_info(pFormatCtx) < 0)
      {
!         av_close_input_file(pFormatCtx);
          return; // Couldn't find stream information
      }   
  	// Add metadata using ffmpeg library calls
--- 287,301 ----
  	// Register all formats and codecs
      av_register_all();
  
! 	// Open video file
!     if (avformat_open_input(&pFormatCtx, 
!                           item->getLocation().c_str(), NULL, NULL) != 0)
          return; // Couldn't open file
  
      // Retrieve stream information
!     if (avformat_find_stream_info(pFormatCtx,NULL) < 0)
      {
!         avformat_close_input(&pFormatCtx);
          return; // Couldn't find stream information
      }   
  	// Add metadata using ffmpeg library calls
***************
*** 276,282 ****
  	addFfmpegResourceFields(item, pFormatCtx, &x, &y);
  	
      // Close the video file
!     av_close_input_file(pFormatCtx);
  }
  
  Ref<IOHandler> FfmpegHandler::serveContent(Ref<CdsItem> item, int resNum, off_t *data_size)
--- 304,310 ----
  	addFfmpegResourceFields(item, pFormatCtx, &x, &y);
  	
      // Close the video file
!     avformat_close_input(&pFormatCtx);
  }
  
  Ref<IOHandler> FfmpegHandler::serveContent(Ref<CdsItem> item, int resNum, off_t *data_size)
