Re: [Muine] m4a support (try #2)
- From: Peter Johanson <latexer gentoo org>
- To: muine-list gnome org
- Subject: Re: [Muine] m4a support (try #2)
- Date: Tue, 18 Jan 2005 06:50:38 -0800
On Sun, Jan 16, 2005 at 07:21:59PM -0800, Peter Johanson wrote:
> Hey all,
>
> ok, here's a reworking of the patch using the GPled faad and mp4ff
> libraries. Anybody who's more C proficient, checking to make sure I
> don't leak memory like a sieve would be nice.
oh, and i forgot to mention that currently most faad2 distributions are
stupid, and forget to put mp4ff_int_types.h anywhere, which is needed by
mp4ff.h. I'm not sure if you're suppod to use it locally to define
things, or what. Best bet is to take the mp4ff_int_types.h from
common/mp4ff/mp4ff_int_types.h and putting it in /usr/local/include. Not
sure how this should be handled, or if we should put that in the local
muine sources or what. Thoughts?
-pete
PS - I have one report of this also working with the xine backend, so
yay.
>
> Again, basic metadata support is there, but finding the peak, or trying
> to pull the cover art metadata is not yet supported. I don't yet know if
> any of the m4a files i have even *has* cover art metadata, but at some
> point i'll fiddle and see if I can get it working. Anyone who has a file
> with such metadata who can send it my way, it would be much appreciated.
>
> Feedback?
>
> -pete
>
> --
> Peter Johanson
> <latexer gentoo org>
> Index: configure.in
> ===================================================================
> RCS file: /cvs/gnome/muine/configure.in,v
> retrieving revision 1.102
> diff -a -u -r1.102 configure.in
> --- configure.in 10 Jan 2005 17:59:26 -0000 1.102
> +++ configure.in 17 Jan 2005 03:17:02 -0000
> @@ -97,6 +97,19 @@
> AC_CHECK_HEADER(FLAC/all.h, FLAC_LIBS="-lFLAC", AC_MSG_ERROR(You need FLAC))
> AC_SUBST(FLAC_LIBS)
>
> +dnl Check for FAAD
> +AC_ARG_ENABLE(faad2, [ --disable-faad2 Disable faad2 library support],,have_faad2=yes)
> +
> +if test x$have_faad2 = xyes; then
> + AC_CHECK_HEADER(mp4ff.h, FAAD_LIBS="-lmp4ff -lfaad", AC_MSG_ERROR(faad2 library not found))
> + AC_DEFINE(HAVE_FAAD, 1, faad2 support)
> +else
> + AC_DEFINE(HAVE_FAAD, 0, faad2 support)
> +fi
> +
> +AM_CONDITIONAL(HAVE_FAAD, test "x$have_faad2" = "xyes")
> +AC_SUBST(FAAD_LIBS)
> +
> dnl Check for Mono
> AC_PATH_PROG(MCS, mcs)
> AC_PATH_PROG(MONO, mono)
> Index: libmuine/Makefile.am
> ===================================================================
> RCS file: /cvs/gnome/muine/libmuine/Makefile.am,v
> retrieving revision 1.16
> diff -a -u -r1.16 Makefile.am
> --- libmuine/Makefile.am 14 Jan 2005 23:33:45 -0000 1.16
> +++ libmuine/Makefile.am 17 Jan 2005 03:17:02 -0000
> @@ -52,4 +52,4 @@
> mm-keys.c \
> mm-keys.h
>
> -libmuine_la_LIBADD = id3-vfs/libid3-vfs.la egg/libegg.la $(MUINE_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(GDBM_LIBS) $(ID3TAG_LIBS) $(FLAC_LIBS)
> +libmuine_la_LIBADD = id3-vfs/libid3-vfs.la egg/libegg.la $(MUINE_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(GDBM_LIBS) $(ID3TAG_LIBS) $(FLAC_LIBS) $(FAAD_LIBS)
> Index: libmuine/metadata.c
> ===================================================================
> RCS file: /cvs/gnome/muine/libmuine/metadata.c,v
> retrieving revision 1.14
> diff -a -u -r1.14 metadata.c
> --- libmuine/metadata.c 26 Dec 2004 11:00:28 -0000 1.14
> +++ libmuine/metadata.c 17 Jan 2005 03:17:03 -0000
> @@ -26,11 +26,17 @@
> #include <stdlib.h>
> #include <string.h>
> #include <math.h>
> +#include <config.h>
>
> #include "id3-vfs/id3-vfs.h"
> #include "ogg-helper.h"
> #include "metadata.h"
>
> +#if HAVE_FAAD
> +#include <faad.h>
> +#include <mp4ff.h>
> +#endif /* HAVE_FAAD */
> +
> struct _Metadata {
> char *title;
>
> @@ -373,6 +379,125 @@
> return metadata;
> }
>
> +#if HAVE_FAAD
> +
> +uint32_t mp4_read_callback(void *user_data, void *buffer, uint32_t length);
> +uint32_t mp4_seek_callback(void *user_data, uint64_t position);
> +
> +uint32_t mp4_read_callback(void *user_data, void *buffer, uint32_t length) {
> + GnomeVFSFileSize read;
> + gnome_vfs_read((GnomeVFSHandle*)user_data, (gpointer *)buffer, length, &read);
> + return (uint32_t)read;
> +}
> +
> +uint32_t mp4_seek_callback(void *user_data, uint64_t position) {
> + return (uint32_t) gnome_vfs_seek ((GnomeVFSHandle*) user_data, GNOME_VFS_SEEK_START, position);
> +}
> +
> +static Metadata *
> +assign_metadata_mp4 (const char *filename,
> + char **error_message_return)
> +{
> + Metadata *m = NULL;
> + GnomeVFSHandle *fh;
> + mp4ff_t *mp4f;
> + mp4ff_callback_t *mp4cb = (mp4ff_callback_t*) malloc (sizeof(mp4ff_callback_t));
> + gchar *value;
> + unsigned char *buff = NULL;
> + int buff_size = 0;
> + mp4AudioSpecificConfig mp4ASC;
> + long samples;
> + float f = 1024.0;
> +
> + if (gnome_vfs_open (&fh, filename, GNOME_VFS_OPEN_READ) != GNOME_VFS_OK) {
> + *error_message_return = g_strdup ("Failed to open file for reading");
> + return NULL;
> + }
> +
> + mp4cb->read = mp4_read_callback;
> + mp4cb->seek = mp4_seek_callback;
> + mp4cb->user_data = fh;
> +
> + mp4f = mp4ff_open_read (mp4cb);
> +
> + if (!mp4f)
> + {
> + *error_message_return = g_strdup ("Unable to open the AAC file");
> + return NULL;
> + }
> +
> + if (mp4ff_total_tracks (mp4f) > 1)
> + {
> + *error_message_return = g_strdup("Multi-track AAC files not supported");
> + return NULL;
> + }
> +
> + m = g_new0 (Metadata, 1);
> +
> + if (mp4ff_meta_get_artist (mp4f, &value) && value != NULL)
> + {
> + if(g_utf8_validate (value, -1, NULL))
> + {
> + m->artists = g_new (char *, 2);
> + m->artists[0] = g_strdup (value);
> + m->artists[1] = NULL;
> + m->artists_count = 1;
> + }
> + g_free(value);
> + }
> + if (mp4ff_meta_get_title (mp4f, &value) && value != NULL)
> + {
> + if(g_utf8_validate (value, -1, NULL))
> + m->title = g_strdup (value);
> + g_free(value);
> + }
> + if (mp4ff_meta_get_album (mp4f, &value) && value != NULL)
> + {
> + if(g_utf8_validate (value, -1, NULL))
> + m->album = g_strdup (value);
> + g_free(value);
> + }
> + if (mp4ff_meta_get_track (mp4f, &value) && value != NULL)
> + {
> + m->track_number = atoi (value);
> + g_free (value);
> + }
> + if (mp4ff_meta_get_disc (mp4f, &value) && value != NULL)
> + {
> + m->disc_number = atoi (value);
> + g_free (value);
> + }
> +
> + /*
> + * duration code shameless based on code from frontend/main.c in faad2
> + */
> +
> + samples = mp4ff_num_samples (mp4f, 0);
> + mp4ff_get_decoder_config (mp4f, 0, &buff, &buff_size);
> +
> + if (buff)
> + {
> + if (AudioSpecificConfig (buff, buff_size, &mp4ASC) >= 0)
> + {
> + free (buff);
> + if (mp4ASC.sbr_present_flag == 1)
> + {
> + f = f * 2.0;
> + }
> +
> + m->duration = (float) samples * (float) (f-1.0)/(float) mp4ASC.samplingFrequency;
> + }
> + }
> +
> + mp4ff_close (mp4f);
> + free (mp4cb);
> + gnome_vfs_close (fh);
> +
> + return m;
> +}
> +
> +#endif /* HAVE_FAAD */
> +
> static ov_callbacks file_info_callbacks =
> {
> ogg_helper_read,
> @@ -693,6 +818,11 @@
> else if (!strcmp (info->mime_type, "application/x-flac") ||
> !strcmp (info->mime_type, "audio/x-flac"))
> m = assign_metadata_flac (escaped, error_message_return);
> +#if HAVE_FAAD
> + else if (!strcmp (info->mime_type, "application/x-m4a") ||
> + !strcmp (info->mime_type, "audio/x-m4a"))
> + m = assign_metadata_mp4 (filename, error_message_return);
> +#endif /* HAVE_FAAD */
> else
> *error_message_return = g_strdup ("Unknown format");
>
> _______________________________________________
> muine-list mailing list
> muine-list gnome org
> http://mail.gnome.org/mailman/listinfo/muine-list
--
Peter Johanson
<latexer gentoo org>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]