Revision: 2356
http://gtkpod.svn.sourceforge.net/gtkpod/?rev=2356&view=rev
Author: sikon
Date: 2009-05-10 14:30:18 +0000 (Sun, 10 May 2009)
Log Message:
-----------
Support for dynamic libmp4v2 load
Modified Paths:
--------------
gtkpod/trunk/ChangeLog
gtkpod/trunk/configure.in
gtkpod/trunk/src/misc.c
gtkpod/trunk/src/mp4file.c
gtkpod/trunk/src/mp4file.h
Modified: gtkpod/trunk/ChangeLog
===================================================================
--- gtkpod/trunk/ChangeLog 2009-05-02 20:55:46 UTC (rev 2355)
+++ gtkpod/trunk/ChangeLog 2009-05-10 14:30:18 UTC (rev 2356)
@@ -1,3 +1,12 @@
+2009-05-10 Maia Kozheva <[email protected]>
+
+ * configure.in:
+ src/mp4file.c:
+ src/mp4file.h:
+ src/misc.c:
+
+ Detect and load libmp4v2 at runtime rather than compile time.
+
2009-04-20 Todd Zullinger <[email protected]>
* scripts/convert-2mp3.sh: Improve lame genre test
@@ -6,6 +15,14 @@
for $genre was also too lenient and matched more than it
should.
+2009-04-20 Todd Zullinger <[email protected]>
+
+ * scripts/convert-2mp3.sh: Improve lame genre test
+
+ Lame prints the output of --genre-list to stderr. The grep
+ for $genre was also too lenient and matched more than it
+ should.
+
2009-04-18 Jorg Schuler <jcsjcs at users.sourceforge.net>
* src/display.c
Modified: gtkpod/trunk/configure.in
===================================================================
--- gtkpod/trunk/configure.in 2009-05-02 20:55:46 UTC (rev 2355)
+++ gtkpod/trunk/configure.in 2009-05-10 14:30:18 UTC (rev 2356)
@@ -144,83 +144,6 @@
have_hal="*no -- will build without HAL support"
fi
-dnl Check for libmp4v2 (and mp4.h or mp4v2/mp4v2.h)
-AC_ARG_WITH(mp4v2, AC_HELP_STRING([--without-mp4v2], [Disable MP4/AAC
support]))
-if test "x$with_mp4v2" != "xno"; then
- have_mp4v2_2_header=no
- AC_SEARCH_LIBS(MP4GetMetadataGrouping,
- ["mp4v2" "mp4v2 -lstdc++" "mp4v2 -lz" "mp4v2 -lz -lstdc++"],
- [AC_CHECK_HEADER(mp4.h, have_mp4v2=yes, have_mp4v2_header=no)],
have_mp4v2=no)
- if test "x$have_mp4v2_header" = "xno"; then
- AC_CHECK_HEADER(mp4v2/mp4v2.h, [have_mp4v2_2_header=yes;
have_mp4v2_header=yes; have_mp4v2=yes], have_mp4v2_header=no)
- if test "x$have_mp4v2_2_header" = "xyes"; then
- AC_DEFINE(HAVE_LIBMP4V2_2, 1, [Define if you have the mp4v2
library version 2.0 or greater])
- fi
- fi
- if test "x$have_mp4v2_header" = "xno"; then
- have_mp4v2="no"
- AC_MSG_WARN([mp4.h and mp4v2/mp4v2.h cannot be found or is unusable.
Check your mp4v2 installation.])
- else
-dnl Check if MP4GetMetadataFreeForm() requires an extra argument
- if test "x$have_mp4v2_2_header" = "xyes"; then
- AC_TRY_COMPILE( [#include <mp4v2/mp4v2.h>],
- [bool TestMP4GetMetadataFreeForm(MP4FileHandle hFile, const
char *name,
- uint8_t** pValue, uint32_t* valueSize, const char *owner)
- {
- MP4GetMetadataFreeForm(hFile, name,pValue, valueSize,
owner);
- } ], freeform_accepts_extra_arg=yes)
- else
- AC_TRY_COMPILE( [#include <mp4.h>],
- [bool TestMP4GetMetadataFreeForm(MP4FileHandle hFile, const
char *name,
- u_int8_t** pValue, u_int32_t* valueSize, const char *owner)
- {
- MP4GetMetadataFreeForm(hFile, name,pValue, valueSize,
owner);
- } ], freeform_accepts_extra_arg=yes)
- fi
- if test "x$freeform_accepts_extra_arg" = "xyes"; then
- AC_DEFINE(FREEFORM_ACCEPTS_EXTRA_ARG, 1, [MP4GetMetadataFreeForm
- accepts an extra argument in libmp4v2 >= 1.6])
- fi
-dnl Check if MP4GetMetadataCoverArt() requires an extra argument
- if test "x$have_mp4v2_2_header" = "xyes"; then
- AC_TRY_COMPILE( [#include <mp4v2/mp4v2.h>],
- [bool TestMP4GetMetadataCoverArt(MP4FileHandle hFile,
- uint8_t **coverArt, uint32_t* size, uint32_t index)
- {
- MP4GetMetadataCoverArt(hFile, coverArt, size, index);
- }], coverart_accepts_extra_arg=yes)
- else
- AC_TRY_COMPILE( [#include <mp4.h>],
- [bool TestMP4GetMetadataCoverArt(MP4FileHandle hFile,
- u_int8_t **coverArt, u_int32_t* size, uint32_t index)
- {
- MP4GetMetadataCoverArt(hFile, coverArt, size, index);
- }], coverart_accepts_extra_arg=yes)
- fi
- if test "x$coverart_accepts_extra_arg" = "xyes"; then
- AC_DEFINE(COVERART_ACCEPTS_EXTRA_ARG, 1, [MP4GetMetadataCoverArt
- accepts an extra argument in libmp4v2 >= 1.6])
- fi
-dnl Check if MP4SetMetadataAlbumArtist() exists
- AC_SEARCH_LIBS([MP4SetMetadataAlbumArtist], [-lmp4v2],
- mp4_albumartist_exists=yes, mp4_albumartist_exists=no)
- if test "x$mp4_albumartist_exists" = "xyes"; then
- AC_DEFINE(MP4_ALBUMARTIST_EXISTS, 1, [MP4GetMetadataAlbumArtist
- requires libmp4v2 >= 1.6])
- fi
- fi
- if test "x$with_mp4v2" = "xyes" -a "x$have_mp4v2" = "xno"; then
- AC_MSG_ERROR([MP4/AAC support explicitly requested but libmp4v2
couldn't be found])
- fi
-fi
-AM_CONDITIONAL(HAVE_LIBMP4V2, test "x$have_mp4v2" = "xyes")
-if test "x$have_mp4v2" = "xyes"; then
- have_mp4v2="yes -- will build with aac support"
- AC_DEFINE(HAVE_LIBMP4V2, 1, [Define if you have the mp4v2 library])
-else
- have_mp4v2="*no -- will build without aac support"
-fi
-
dnl Check for libvorbisfile
AC_ARG_WITH(ogg, AC_HELP_STRING([--without-ogg], [Disable Ogg/Vorbis support]))
if test "x$with_ogg" != "xno"; then
@@ -319,7 +242,6 @@
gnome-vfs.............: $have_gnome_vfs
hal...................: $have_hal
libcurl ..............: $have_curl
- mp4v2 ................: $have_mp4v2
vorbisfile ...........: $have_ogg
FLAC .................: $have_flac
Preprocessor .........: $CC $CPPFLAGS
Modified: gtkpod/trunk/src/misc.c
===================================================================
--- gtkpod/trunk/src/misc.c 2009-05-02 20:55:46 UTC (rev 2355)
+++ gtkpod/trunk/src/misc.c 2009-05-10 14:30:18 UTC (rev 2356)
@@ -43,6 +43,7 @@
#include "clientserver.h"
#include "file_convert.h"
#include "misc.h"
+#include "mp4file.h"
#include "prefs.h"
#include "misc_track.h"
#include "display_photo.h"
@@ -1792,6 +1793,9 @@
printf ("Using local gtkpod.glade file since program was started from
source directory:\n%s\n", xml_file);
}
+ /* Attempt to load libmp4v2 */
+ mp4_init();
+
/* Initialisation of libxml */
LIBXML_TEST_VERSION;
@@ -1865,6 +1869,8 @@
xmlCleanupParser();
xmlMemoryDump();
+
+ mp4_close();
call_script ("gtkpod.out", NULL);
gtk_main_quit ();
Modified: gtkpod/trunk/src/mp4file.c
===================================================================
--- gtkpod/trunk/src/mp4file.c 2009-05-02 20:55:46 UTC (rev 2355)
+++ gtkpod/trunk/src/mp4file.c 2009-05-10 14:30:18 UTC (rev 2356)
@@ -121,8 +121,9 @@
------------------------------------------------------------ */
+#define HAVE_LIBMP4V2 1
+#define HAVE_LIBMP4V2_2 0
-
#ifdef HAVE_LIBMP4V2
/* Use mp4v2 from the mpeg4ip project to handle mp4 (m4a, m4p, m4b) files
(http://mpeg4ip.sourceforge.net/) */
@@ -137,26 +138,306 @@
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
-#ifdef HAVE_LIBMP4V2_2
-#include <mp4v2/mp4v2.h>
-#else
-#include <mp4.h>
-#endif
+#include <dlfcn.h>
-#ifndef FREEFORM_ACCEPTS_EXTRA_ARG
-/* Version 1.6 of libmp4v2 introduces an index argument for
MP4GetMetadataFreeForm. For C++ sources it defaults
- to 0, but in C we have to specify it on our own.
-*/
-#define MP4GetMetadataFreeForm(mp4File, name, pValue, pValueSize, owner)
MP4GetMetadataFreeForm(mp4File, name, pValue, pValueSize)
-#endif
+/* mp4v2 dynamic load declarations - library handle and required definitions
from mp4.h */
-#ifndef COVERART_ACCEPTS_EXTRA_ARG
-/* Version 1.6 of libmp4v2 introduces an index argument for
MP4GetMetadataCoverart. For C++ sources it defaults
- to NULL, but in C we have to specify it on our own.
-*/
-#define MP4GetMetadataCoverArt(hFile, coverArt, size, index)
MP4GetMetadataCoverArt(hFile, coverArt, size)
-#endif
+static void *mp4v2_handle = NULL;
+#define DEFAULT(x)
+
+typedef int bool;
+typedef void* MP4FileHandle;
+typedef u_int32_t MP4TrackId;
+typedef u_int32_t MP4SampleId;
+typedef u_int64_t MP4Timestamp;
+typedef u_int64_t MP4Duration;
+
+#define MP4_OD_TRACK_TYPE "odsm"
+#define MP4_AUDIO_TRACK_TYPE "soun"
+#define MP4_VIDEO_TRACK_TYPE "vide"
+#define MP4_INVALID_FILE_HANDLE ((MP4FileHandle)NULL)
+#define MP4_MILLISECONDS_TIME_SCALE 1000
+#define MP4_MSECS_TIME_SCALE MP4_MILLISECONDS_TIME_SCALE
+
+typedef MP4FileHandle (*MP4Read_t)(
+ const char* fileName,
+ u_int32_t verbosity DEFAULT(0));
+
+typedef u_int32_t (*MP4GetNumberOfTracks_t)(
+ MP4FileHandle hFile,
+ const char* type DEFAULT(NULL),
+ u_int8_t subType DEFAULT(0));
+
+typedef MP4TrackId (*MP4FindTrackId_t)(
+ MP4FileHandle hFile,
+ u_int16_t index,
+ const char* type DEFAULT(NULL),
+ u_int8_t subType DEFAULT(0));
+
+typedef const char* (*MP4GetTrackType_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef void (*MP4Close_t)(
+ MP4FileHandle hFile);
+
+typedef bool (*MP4ReadSample_t)(
+ /* input parameters */
+ MP4FileHandle hFile,
+ MP4TrackId trackId,
+ MP4SampleId sampleId,
+ /* input/output parameters */
+ u_int8_t** ppBytes,
+ u_int32_t* pNumBytes,
+ /* output parameters */
+ MP4Timestamp* pStartTime DEFAULT(NULL),
+ MP4Duration* pDuration DEFAULT(NULL),
+ MP4Duration* pRenderingOffset DEFAULT(NULL),
+ bool* pIsSyncSample DEFAULT(NULL));
+
+typedef u_int64_t (*MP4ConvertFromTrackTimestamp_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId,
+ MP4Timestamp timeStamp,
+ u_int32_t timeScale);
+
+typedef u_int64_t (*MP4ConvertFromTrackDuration_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId,
+ MP4Duration duration,
+ u_int32_t timeScale);
+
+typedef u_int32_t (*MP4GetTrackBitRate_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef u_int32_t (*MP4GetTrackTimeScale_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef u_int32_t (*MP4GetTrackMaxSampleSize_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef MP4SampleId (*MP4GetTrackNumberOfSamples_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef MP4Timestamp (*MP4GetSampleTime_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId,
+ MP4SampleId sampleId);
+
+typedef MP4Duration (*MP4GetTrackDuration_t)(
+ MP4FileHandle hFile,
+ MP4TrackId trackId);
+
+typedef bool (*MP4GetMetadataName_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataArtist_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataAlbumArtist_t)(MP4FileHandle hFile, char**
value);
+typedef bool (*MP4GetMetadataWriter_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataComment_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataYear_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataAlbum_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataTrack_t)(MP4FileHandle hFile,
+ u_int16_t* track, u_int16_t* totalTracks);
+typedef bool (*MP4GetMetadataDisk_t)(MP4FileHandle hFile,
+ u_int16_t* disk, u_int16_t* totalDisks);
+typedef bool (*MP4GetMetadataGrouping_t)(MP4FileHandle hFile, char **grouping);
+typedef bool (*MP4GetMetadataGenre_t)(MP4FileHandle hFile, char **genre);
+typedef bool (*MP4GetMetadataTempo_t)(MP4FileHandle hFile, u_int16_t* tempo);
+typedef bool (*MP4GetMetadataCoverArt_t)(MP4FileHandle hFile,
+ u_int8_t **coverArt, u_int32_t* size,
+ uint32_t index DEFAULT(0));
+typedef bool (*MP4GetMetadataCompilation_t)(MP4FileHandle hFile, u_int8_t*
cpl);
+typedef bool (*MP4GetMetadataTool_t)(MP4FileHandle hFile, char** value);
+typedef bool (*MP4GetMetadataFreeForm_t)(MP4FileHandle hFile, const char *name,
+ u_int8_t** pValue, u_int32_t* valueSize, const char
*owner DEFAULT(NULL));
+
+typedef bool (*MP4HaveAtom_t)(MP4FileHandle hFile,
+ const char *atomName);
+
+typedef bool (*MP4SetMetadataName_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataArtist_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataAlbumArtist_t)(MP4FileHandle hFile, const char*
value);
+typedef bool (*MP4SetMetadataWriter_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataComment_t)(MP4FileHandle hFile, const char*
value);
+typedef bool (*MP4SetMetadataYear_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataAlbum_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataTrack_t)(MP4FileHandle hFile,
+ u_int16_t track, u_int16_t totalTracks);
+typedef bool (*MP4SetMetadataDisk_t)(MP4FileHandle hFile,
+ u_int16_t disk, u_int16_t totalDisks);
+typedef bool (*MP4SetMetadataTempo_t)(MP4FileHandle hFile, u_int16_t tempo);
+typedef bool (*MP4SetMetadataGrouping_t)(MP4FileHandle hFile, const char
*grouping);
+typedef bool (*MP4SetMetadataGenre_t)(MP4FileHandle hFile, const char *genre);
+typedef bool (*MP4SetMetadataCompilation_t)(MP4FileHandle hFile, u_int8_t cpl);
+typedef bool (*MP4SetMetadataTool_t)(MP4FileHandle hFile, const char* value);
+typedef bool (*MP4SetMetadataCoverArt_t)(MP4FileHandle hFile,
+ u_int8_t *coverArt, u_int32_t size);
+
+typedef MP4FileHandle (*MP4Modify_t)(
+ const char* fileName,
+ u_int32_t verbosity DEFAULT(0),
+ u_int32_t flags DEFAULT(0));
+
+typedef bool (*MP4MetadataDelete_t)(MP4FileHandle hFile);
+
+static MP4Read_t MP4Read = NULL;
+static MP4GetNumberOfTracks_t MP4GetNumberOfTracks = NULL;
+static MP4FindTrackId_t MP4FindTrackId = NULL;
+static MP4GetTrackType_t MP4GetTrackType = NULL;
+static MP4Close_t MP4Close = NULL;
+static MP4ReadSample_t MP4ReadSample = NULL;
+static MP4ConvertFromTrackTimestamp_t MP4ConvertFromTrackTimestamp = NULL;
+static MP4ConvertFromTrackDuration_t MP4ConvertFromTrackDuration = NULL;
+static MP4GetTrackBitRate_t MP4GetTrackBitRate = NULL;
+static MP4GetTrackTimeScale_t MP4GetTrackTimeScale = NULL;
+static MP4GetTrackMaxSampleSize_t MP4GetTrackMaxSampleSize = NULL;
+static MP4GetTrackNumberOfSamples_t MP4GetTrackNumberOfSamples = NULL;
+static MP4GetSampleTime_t MP4GetSampleTime = NULL;
+static MP4GetTrackDuration_t MP4GetTrackDuration = NULL;
+static MP4GetMetadataName_t MP4GetMetadataName = NULL;
+static MP4GetMetadataArtist_t MP4GetMetadataArtist = NULL;
+static MP4GetMetadataAlbumArtist_t MP4GetMetadataAlbumArtist = NULL;
+static MP4GetMetadataWriter_t MP4GetMetadataWriter = NULL;
+static MP4GetMetadataComment_t MP4GetMetadataComment = NULL;
+static MP4GetMetadataYear_t MP4GetMetadataYear = NULL;
+static MP4GetMetadataAlbum_t MP4GetMetadataAlbum = NULL;
+static MP4GetMetadataTrack_t MP4GetMetadataTrack = NULL;
+static MP4GetMetadataDisk_t MP4GetMetadataDisk = NULL;
+static MP4GetMetadataGrouping_t MP4GetMetadataGrouping = NULL;
+static MP4GetMetadataGenre_t MP4GetMetadataGenre = NULL;
+static MP4GetMetadataTempo_t MP4GetMetadataTempo = NULL;
+static MP4GetMetadataCoverArt_t MP4GetMetadataCoverArt = NULL;
+static MP4GetMetadataCompilation_t MP4GetMetadataCompilation = NULL;
+static MP4GetMetadataTool_t MP4GetMetadataTool = NULL;
+static MP4GetMetadataFreeForm_t MP4GetMetadataFreeForm = NULL;
+static MP4HaveAtom_t MP4HaveAtom = NULL;
+static MP4SetMetadataName_t MP4SetMetadataName = NULL;
+static MP4SetMetadataArtist_t MP4SetMetadataArtist = NULL;
+static MP4SetMetadataAlbumArtist_t MP4SetMetadataAlbumArtist = NULL;
+static MP4SetMetadataWriter_t MP4SetMetadataWriter = NULL;
+static MP4SetMetadataComment_t MP4SetMetadataComment = NULL;
+static MP4SetMetadataYear_t MP4SetMetadataYear = NULL;
+static MP4SetMetadataAlbum_t MP4SetMetadataAlbum = NULL;
+static MP4SetMetadataTrack_t MP4SetMetadataTrack = NULL;
+static MP4SetMetadataDisk_t MP4SetMetadataDisk = NULL;
+static MP4SetMetadataTempo_t MP4SetMetadataTempo = NULL;
+static MP4SetMetadataGrouping_t MP4SetMetadataGrouping = NULL;
+static MP4SetMetadataGenre_t MP4SetMetadataGenre = NULL;
+static MP4SetMetadataCompilation_t MP4SetMetadataCompilation = NULL;
+static MP4SetMetadataTool_t MP4SetMetadataTool = NULL;
+static MP4SetMetadataCoverArt_t MP4SetMetadataCoverArt = NULL;
+static MP4Modify_t MP4Modify = NULL;
+static MP4MetadataDelete_t MP4MetadataDelete = NULL;
+
+/* end mp4v2 dynamic load declarations */
+
+/* mp4v2 initialization code */
+
+void mp4_init()
+{
+ mp4v2_handle = dlopen("libmp4v2.so.0", RTLD_LAZY);
+
+ if (!mp4v2_handle)
+ {
+ return;
+ }
+
+ MP4Read = (MP4Read_t) dlsym(mp4v2_handle, "MP4Read");
+ MP4GetNumberOfTracks = (MP4GetNumberOfTracks_t) dlsym(mp4v2_handle,
"MP4GetNumberOfTracks");
+ MP4FindTrackId = (MP4FindTrackId_t) dlsym(mp4v2_handle, "MP4FindTrackId");
+ MP4GetTrackType = (MP4GetTrackType_t) dlsym(mp4v2_handle,
"MP4GetTrackType");
+ MP4Close = (MP4Close_t) dlsym(mp4v2_handle, "MP4Close");
+ MP4ReadSample = (MP4ReadSample_t) dlsym(mp4v2_handle, "MP4ReadSample");
+ MP4ConvertFromTrackTimestamp = (MP4ConvertFromTrackTimestamp_t)
dlsym(mp4v2_handle, "MP4ConvertFromTrackTimestamp");
+ MP4ConvertFromTrackDuration = (MP4ConvertFromTrackDuration_t)
dlsym(mp4v2_handle, "MP4ConvertFromTrackDuration");
+ MP4GetTrackBitRate = (MP4GetTrackBitRate_t) dlsym(mp4v2_handle,
"MP4GetTrackBitRate");
+ MP4GetTrackTimeScale = (MP4GetTrackTimeScale_t) dlsym(mp4v2_handle,
"MP4GetTrackTimeScale");
+ MP4GetTrackMaxSampleSize = (MP4GetTrackMaxSampleSize_t)
dlsym(mp4v2_handle, "MP4GetTrackMaxSampleSize");
+ MP4GetTrackNumberOfSamples = (MP4GetTrackNumberOfSamples_t)
dlsym(mp4v2_handle, "MP4GetTrackNumberOfSamples");
+ MP4GetSampleTime = (MP4GetSampleTime_t) dlsym(mp4v2_handle,
"MP4GetSampleTime");
+ MP4GetTrackDuration = (MP4GetTrackDuration_t) dlsym(mp4v2_handle,
"MP4GetTrackDuration");
+ MP4GetMetadataName = (MP4GetMetadataName_t) dlsym(mp4v2_handle,
"MP4GetMetadataName");
+ MP4GetMetadataArtist = (MP4GetMetadataArtist_t) dlsym(mp4v2_handle,
"MP4GetMetadataArtist");
+ MP4GetMetadataAlbumArtist = (MP4GetMetadataAlbumArtist_t)
dlsym(mp4v2_handle, "MP4GetMetadataAlbumArtist");
+ MP4GetMetadataWriter = (MP4GetMetadataWriter_t) dlsym(mp4v2_handle,
"MP4GetMetadataWriter");
+ MP4GetMetadataComment = (MP4GetMetadataComment_t) dlsym(mp4v2_handle,
"MP4GetMetadataComment");
+ MP4GetMetadataYear = (MP4GetMetadataYear_t) dlsym(mp4v2_handle,
"MP4GetMetadataYear");
+ MP4GetMetadataAlbum = (MP4GetMetadataAlbum_t) dlsym(mp4v2_handle,
"MP4GetMetadataAlbum");
+ MP4GetMetadataTrack = (MP4GetMetadataTrack_t) dlsym(mp4v2_handle,
"MP4GetMetadataTrack");
+ MP4GetMetadataDisk = (MP4GetMetadataDisk_t) dlsym(mp4v2_handle,
"MP4GetMetadataDisk");
+ MP4GetMetadataGrouping = (MP4GetMetadataGrouping_t) dlsym(mp4v2_handle,
"MP4GetMetadataGrouping");
+ MP4GetMetadataGenre = (MP4GetMetadataGenre_t) dlsym(mp4v2_handle,
"MP4GetMetadataGenre");
+ MP4GetMetadataTempo = (MP4GetMetadataTempo_t) dlsym(mp4v2_handle,
"MP4GetMetadataTempo");
+ MP4GetMetadataCoverArt = (MP4GetMetadataCoverArt_t) dlsym(mp4v2_handle,
"MP4GetMetadataCoverArt");
+ MP4GetMetadataCompilation = (MP4GetMetadataCompilation_t)
dlsym(mp4v2_handle, "MP4GetMetadataCompilation");
+ MP4GetMetadataTool = (MP4GetMetadataTool_t) dlsym(mp4v2_handle,
"MP4GetMetadataTool");
+ MP4GetMetadataFreeForm = (MP4GetMetadataFreeForm_t) dlsym(mp4v2_handle,
"MP4GetMetadataFreeForm");
+ MP4HaveAtom = (MP4HaveAtom_t) dlsym(mp4v2_handle, "MP4HaveAtom");
+ MP4SetMetadataName = (MP4SetMetadataName_t) dlsym(mp4v2_handle,
"MP4SetMetadataName");
+ MP4SetMetadataArtist = (MP4SetMetadataArtist_t) dlsym(mp4v2_handle,
"MP4SetMetadataArtist");
+ MP4SetMetadataAlbumArtist = (MP4SetMetadataAlbumArtist_t)
dlsym(mp4v2_handle, "MP4SetMetadataAlbumArtist");
+ MP4SetMetadataWriter = (MP4SetMetadataWriter_t) dlsym(mp4v2_handle,
"MP4SetMetadataWriter");
+ MP4SetMetadataComment = (MP4SetMetadataComment_t) dlsym(mp4v2_handle,
"MP4SetMetadataComment");
+ MP4SetMetadataYear = (MP4SetMetadataYear_t) dlsym(mp4v2_handle,
"MP4SetMetadataYear");
+ MP4SetMetadataAlbum = (MP4SetMetadataAlbum_t) dlsym(mp4v2_handle,
"MP4SetMetadataAlbum");
+ MP4SetMetadataTrack = (MP4SetMetadataTrack_t) dlsym(mp4v2_handle,
"MP4SetMetadataTrack");
+ MP4SetMetadataDisk = (MP4SetMetadataDisk_t) dlsym(mp4v2_handle,
"MP4SetMetadataDisk");
+ MP4SetMetadataTempo = (MP4SetMetadataTempo_t) dlsym(mp4v2_handle,
"MP4SetMetadataTempo");
+ MP4SetMetadataGrouping = (MP4SetMetadataGrouping_t) dlsym(mp4v2_handle,
"MP4SetMetadataGrouping");
+ MP4SetMetadataGenre = (MP4SetMetadataGenre_t) dlsym(mp4v2_handle,
"MP4SetMetadataGenre");
+ MP4SetMetadataCompilation = (MP4SetMetadataCompilation_t)
dlsym(mp4v2_handle, "MP4SetMetadataCompilation");
+ MP4SetMetadataTool = (MP4SetMetadataTool_t) dlsym(mp4v2_handle,
"MP4SetMetadataTool");
+ MP4SetMetadataCoverArt = (MP4SetMetadataCoverArt_t) dlsym(mp4v2_handle,
"MP4SetMetadataCoverArt");
+ MP4Modify = (MP4Modify_t) dlsym(mp4v2_handle, "MP4Modify");
+ MP4MetadataDelete = (MP4MetadataDelete_t) dlsym(mp4v2_handle,
"MP4MetadataDelete");
+
+ /* alternate names for HAVE_LIBMP4V2_2 */
+
+ if(!MP4GetMetadataWriter)
+ {
+ MP4GetMetadataWriter = (MP4GetMetadataWriter_t) dlsym(mp4v2_handle,
"MP4GetMetadataComposer");
+ }
+
+ if(!MP4GetMetadataYear)
+ {
+ MP4GetMetadataYear = (MP4GetMetadataYear_t) dlsym(mp4v2_handle,
"MP4GetMetadataReleaseDate");
+ }
+
+ if(!MP4GetMetadataTempo)
+ {
+ MP4GetMetadataTempo = (MP4GetMetadataTempo_t) dlsym(mp4v2_handle,
"MP4GetMetadataBPM");
+ }
+
+ if(!MP4SetMetadataWriter)
+ {
+ MP4SetMetadataWriter = (MP4SetMetadataWriter_t) dlsym(mp4v2_handle,
"MP4SetMetadataComposer");
+ }
+
+ if(!MP4SetMetadataYear)
+ {
+ MP4SetMetadataYear = (MP4SetMetadataYear_t) dlsym(mp4v2_handle,
"MP4SetMetadataReleaseDate");
+ }
+
+ if(!MP4SetMetadataTempo)
+ {
+ MP4SetMetadataTempo = (MP4SetMetadataTempo_t) dlsym(mp4v2_handle,
"MP4SetMetadataYear");
+ }
+}
+
+void mp4_close()
+{
+ if (mp4v2_handle)
+ {
+ dlclose(mp4v2_handle);
+ }
+}
+
+/* end mp4v2 initialization code */
+
static gboolean mp4_scan_soundcheck (MP4FileHandle mp4File, Track *track)
{
gboolean success = FALSE;
@@ -208,6 +489,12 @@
gboolean mp4_read_soundcheck (gchar *mp4FileName, Track *track)
{
+ if (!mp4v2_handle)
+ {
+ gtkpod_warning (_("m4a/m4p/m4b soundcheck update for '%s' failed:
m4a/m4p/m4b not supported without the mp4v2 library. You must install the mp4v2
library.\n"), mp4FileName);
+ return FALSE;
+ }
+
gboolean success = FALSE;
MP4FileHandle mp4File;
@@ -266,6 +553,12 @@
Track *mp4_get_file_info (gchar *mp4FileName)
{
+ if (!mp4v2_handle)
+ {
+ gtkpod_warning (_("Import of '%s' failed: m4a/m4p/m4b not supported
without the mp4v2 library. You must install the mp4v2 library.\n"),
mp4FileName);
+ return NULL;
+ }
+
Track *track = NULL;
MP4FileHandle mp4File;
@@ -379,26 +672,27 @@
track->artist = charset_to_utf8 (value);
g_free(value);
}
-#if MP4_ALBUMARTIST_EXISTS
- if (!track->artist || !*track->artist)
- {
- g_free (track->artist);
- track->artist = NULL;
- if (MP4GetMetadataAlbumArtist(mp4File, &value) && value
!= NULL)
- {
- track->artist = charset_to_utf8 (value);
- }
- }
- else
- {
- if (MP4GetMetadataAlbumArtist(mp4File, &value) && value
!= NULL)
- {
- track->albumartist = charset_to_utf8 (value);
- }
- }
-#else
-#warning "Album Artist field not supported with this version of libmp4v2.
Album Artist support requires at least V1.6.0"
-#endif
+
+ if(MP4SetMetadataAlbumArtist)
+ {
+ if (!track->artist || !*track->artist)
+ {
+ g_free (track->artist);
+ track->artist = NULL;
+ if (MP4GetMetadataAlbumArtist(mp4File, &value) &&
value != NULL)
+ {
+ track->artist = charset_to_utf8 (value);
+ }
+ }
+ else
+ {
+ if (MP4GetMetadataAlbumArtist(mp4File, &value) &&
value != NULL)
+ {
+ track->albumartist = charset_to_utf8 (value);
+ }
+ }
+ }
+
#if HAVE_LIBMP4V2_2
if (MP4GetMetadataComposer(mp4File, &value) && value !=
NULL)
#else
@@ -509,6 +803,12 @@
gboolean mp4_write_file_info (gchar *mp4FileName, Track *track)
{
+ if (!mp4v2_handle)
+ {
+ gtkpod_warning (_("m4a/m4p/m4b metadata update for '%s' failed:
m4a/m4p/m4b not supported without the mp4v2 library. You must install the mp4v2
library.\n"), mp4FileName);
+ return FALSE;
+ }
+
gboolean result = TRUE;
MP4FileHandle mp4File = MP4Modify(mp4FileName, 0, FALSE);
@@ -537,7 +837,7 @@
guint16 m_tempo;
guint8 *m_covert = NULL, m_cpl;
guint32 m_size;
-/* gboolean has_track = MP4GetMetadataTrack (mp4File,
+ /* gboolean has_track = MP4GetMetadataTrack (mp4File,
&m_track, &m_tracks);
gboolean has_disk = MP4GetMetadataDisk (mp4File,
&m_disk, &m_disks);*/
@@ -550,22 +850,6 @@
#endif
gboolean has_compilation = MP4GetMetadataCompilation (mp4File,
&m_cpl);
-/* MP4GetMetadataName (mp4File, &m_name);
- MP4GetMetadataArtist (mp4File, &m_artist);
- MP4GetMetadataAlbumArtist (mp4File, &m_albumartist);
-#if HAVE_LIBMP4V2_2
- MP4GetMetadataComposer (mp4File, &m_writer);
-#else
- MP4GetMetadataWriter (mp4File, &m_writer);
-#endif
- MP4GetMetadataComment (mp4File, &m_comment);
-#if HAVE_LIBMP4V2_2
- MP4GetMetadataReleaseDate (mp4File, &m_year);
-#else
- MP4GetMetadataYear (mp4File, &m_year);
-#endif
- MP4GetMetadataAlbum (mp4File, &m_album);
- MP4GetMetadataGenre (mp4File, &m_genre);*/
MP4GetMetadataTool (mp4File, &m_tool);
MP4GetMetadataCoverArt (mp4File, &m_covert, &m_size, 0);
MP4MetadataDelete (mp4File);
@@ -578,11 +862,13 @@
MP4SetMetadataArtist (mp4File, value);
g_free (value);
-#if MP4_ALBUMARTIST_EXISTS
- value = charset_from_utf8 (track->albumartist);
- MP4SetMetadataAlbumArtist (mp4File, value);
- g_free (value);
-#endif
+ if(MP4SetMetadataAlbumArtist)
+ {
+ value = charset_from_utf8 (track->albumartist);
+ MP4SetMetadataAlbumArtist (mp4File, value);
+ g_free (value);
+ }
+
value = charset_from_utf8 (track->composer);
#if HAVE_LIBMP4V2_2
MP4SetMetadataComposer (mp4File, value);
@@ -633,15 +919,8 @@
#endif
if (has_compilation) MP4SetMetadataCompilation (mp4File, m_cpl);
if (m_tool) MP4SetMetadataTool (mp4File, m_tool);
- if (m_covert) MP4SetMetadataCoverArt (mp4File, m_covert, m_size);
-/* g_free (m_name);
- g_free (m_artist);
- g_free (m_albumartist);
- g_free (m_writer);
- g_free (m_comment);
- g_free (m_year);
- g_free (m_album);
- g_free (m_genre);*/
+ if (m_covert) MP4SetMetadataCoverArt (mp4File, m_covert, m_size);
+
g_free (m_tool);
g_free (m_covert);
#endif
Modified: gtkpod/trunk/src/mp4file.h
===================================================================
--- gtkpod/trunk/src/mp4file.h 2009-05-02 20:55:46 UTC (rev 2355)
+++ gtkpod/trunk/src/mp4file.h 2009-05-10 14:30:18 UTC (rev 2356)
@@ -32,6 +32,9 @@
#include "itdb.h"
+void mp4_init();
+void mp4_close();
+
gboolean mp4_write_file_info (gchar *filename, Track *track);
Track *mp4_get_file_info (gchar *name);
gboolean mp4_read_soundcheck (gchar *filename, Track *track);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2