summaryrefslogtreecommitdiff
blob: 6aae0d7793e2c6905f0e2c80e3ca5334699dc7e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
http://bugs.gentoo.org/397575
https://sourceforge.net/tracker/?func=detail&aid=3476707&group_id=704&atid=100704

--- configure.in
+++ configure.in
@@ -33,8 +33,8 @@ AC_CHECK_LIB(gnugetopt, getopt_long)
 AM_CONDITIONAL(WITH_MP4V2, false)
 AM_CONDITIONAL(WITH_EXTERNAL_MP4V2, false)
 
-AC_CHECK_DECLS([MP4Create, MP4MetadataDelete],
-               AC_CHECK_LIB(mp4v2, MP4MetadataDelete, external_mp4v2=yes,
+AC_CHECK_DECLS([MP4Create],
+               AC_CHECK_LIB(mp4v2, MP4Create, external_mp4v2=yes,
                             external_mp4v2=no, -lstdc++),
                external_mp4v2=no, [#include <mp4v2/mp4v2.h>])
 
@@ -42,6 +42,7 @@ if test x$external_mp4v2 = xyes; then
   AC_MSG_NOTICE([*** Building with external mp4v2 ***])
   MY_DEFINE(HAVE_EXTERNAL_LIBMP4V2)
   AM_CONDITIONAL(WITH_EXTERNAL_MP4V2, true)
+  AC_CHECK_DECLS([MP4TagsAlloc], [], [], [#include <mp4v2/mp4v2.h>])
 else
   if test x$WITHMP4V2 = xyes; then
      AC_MSG_NOTICE([*** Building with internal mp4v2 ***])
--- frontend/main.c
+++ frontend/main.c
@@ -873,8 +873,12 @@ int main(int argc, char *argv[])
     if (!faacEncSetConfiguration(hEncoder, myFormat)) {
         fprintf(stderr, "Unsupported output format!\n");
 #ifdef HAVE_LIBMP4V2
+#ifdef MP4_CLOSE_DO_NOT_COMPUTE_BITRATE /* r479 fix */
+        if (container == MP4_CONTAINER) MP4Close(MP4hFile, 0);
+#else
         if (container == MP4_CONTAINER) MP4Close(MP4hFile);
 #endif
+#endif
         return 1;
     }
 
@@ -885,12 +889,10 @@ int main(int argc, char *argv[])
         unsigned long ASCLength = 0;
     char *version_string;
 
-#ifdef MP4_CREATE_EXTENSIBLE_FORMAT
-    /* hack to compile against libmp4v2 >= 1.0RC3
-     * why is there no version identifier in mp4.h? */
+#ifdef MP4_DETAILS_ERROR /* r453 fix */
         MP4hFile = MP4Create(aacFileName, MP4_DETAILS_ERROR, 0);
 #else
-    MP4hFile = MP4Create(aacFileName, MP4_DETAILS_ERROR, 0, 0);
+        MP4hFile = MP4Create(aacFileName, 0);
 #endif
         if (!MP4_IS_VALID_FILE_HANDLE(MP4hFile)) {
             fprintf(stderr, "Couldn't create output file %s\n", aacFileName);
@@ -905,12 +907,22 @@ int main(int argc, char *argv[])
     free(ASC);
 
     /* set metadata */
+#if HAVE_DECL_MP4TAGSALLOC
+    const MP4Tags* tags;
+    tags = MP4TagsAlloc();
+    MP4TagsFetch( tags, MP4hFile );
+#endif
     version_string = malloc(strlen(faac_id_string) + 6);
     strcpy(version_string, "FAAC ");
     strcpy(version_string + 5, faac_id_string);
+#if !HAVE_DECL_MP4TAGSALLOC
     MP4SetMetadataTool(MP4hFile, version_string);
+#else
+    MP4TagsSetEncodingTool(tags, version_string);
+#endif
     free(version_string);
 
+#if !HAVE_DECL_MP4TAGSALLOC
     if (artist) MP4SetMetadataArtist(MP4hFile, artist);
     if (writer) MP4SetMetadataWriter(MP4hFile, writer);
     if (title) MP4SetMetadataName(MP4hFile, title);
@@ -923,8 +935,40 @@ int main(int argc, char *argv[])
     if (comment) MP4SetMetadataComment(MP4hFile, comment);
         if (artSize) {
         MP4SetMetadataCoverArt(MP4hFile, art, artSize);
+#else
+    if (artist) MP4TagsSetArtist(tags, artist);
+    if (writer) MP4TagsSetComposer(tags, writer);
+    if (title) MP4TagsSetName(tags, title);
+    if (album) MP4TagsSetAlbum(tags, album);
+    if (trackno > 0) {
+        MP4TagTrack tt;
+        tt.index = trackno;
+        tt.total = ntracks;
+        MP4TagsSetTrack(tags, &tt);
+    }
+    if (discno > 0) {
+        MP4TagDisk td;
+        td.index = discno;
+        td.total = ndiscs;
+        MP4TagsSetDisk(tags, &td);
+    }
+    if (compilation) MP4TagsSetCompilation(tags, compilation);
+    if (year) MP4TagsSetReleaseDate(tags, year);
+    if (genre) MP4TagsSetGenre(tags, genre);
+    if (comment) MP4TagsSetComments(tags, comment);
+    if (artSize) {
+        MP4TagArtwork mp4art;
+        mp4art.data = art;
+        mp4art.size = artSize;
+        mp4art.type = MP4_ART_UNDEFINED; // delegate typing to libmp4v2
+        MP4TagsAddArtwork( tags, &mp4art );
+#endif
         free(art);
     }
+#if HAVE_DECL_MP4TAGSALLOC
+    MP4TagsStore( tags, MP4hFile );
+    MP4TagsFree( tags );
+#endif
     }
     else
     {
@@ -1141,11 +1185,19 @@ int main(int argc, char *argv[])
         /* clean up */
         if (container == MP4_CONTAINER)
         {
+#ifdef MP4_CLOSE_DO_NOT_COMPUTE_BITRATE /* r479 fix */
+            MP4Close(MP4hFile, 0);
+#else
             MP4Close(MP4hFile);
+#endif
             if (optimizeFlag == 1)
             {
                 fprintf(stderr, "\n\nMP4 format optimization... ");
+#ifdef MP4_DETAILS_ERROR /* r453 fix */
                 MP4Optimize(aacFileName, NULL, 0);
+#else
+                MP4Optimize(aacFileName, NULL);
+#endif
                 fprintf(stderr, "Done!");
             }
         } else