Mercurial > audlegacy
annotate Plugins/Input/aac/src/libmp4.c @ 982:287d4eb3ca27 trunk
[svn] - Let's not leave mp4 files open after reading their tags :P
author | nhjm449 |
---|---|
date | Fri, 28 Apr 2006 22:43:09 -0700 |
parents | 21305191ca03 |
children | e4089d6b0fcf |
rev | line source |
---|---|
61 | 1 /* |
2 * MP4/AAC decoder for xmms | |
3 * | |
4 * This decoding source code is completly independent of the faad2 | |
5 * package. | |
6 * This package exist for people who don't want to install | |
7 * faad2 and mpeg4ip project files. | |
8 * | |
9 * OPTIONNAL need | |
10 * -------------- | |
11 * libid3 (3.8.x - www.id3.org) | |
12 */ | |
13 | |
339 | 14 #include <glib.h> |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
15 #include <glib/gi18n.h> |
61 | 16 #include <gtk/gtk.h> |
339 | 17 #include <string.h> |
18 #include <stdlib.h> | |
61 | 19 #include "faad.h" |
20 #include "mp4.h" | |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
21 #include "tagging.h" |
61 | 22 |
23 #include <audacious/plugin.h> | |
346
430658951e30
[svn] Use produce_audio() to pass the audio through the new audacious filterchain stuff. (EQ support!!!)
nenolod
parents:
345
diff
changeset
|
24 #include <audacious/output.h> |
61 | 25 #include <libaudacious/util.h> |
26 #include <libaudacious/titlestring.h> | |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
27 #include <libaudacious/vfs.h> |
61 | 28 |
199
0a2ad94e8607
[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents:
61
diff
changeset
|
29 #define MP4_VERSION "ver.- 15 December 2004" |
0a2ad94e8607
[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents:
61
diff
changeset
|
30 #define LIBMP4V2_VERSION "1.2.0" |
61 | 31 #define MP4_ABOUT "Written by ciberfred" |
32 #define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64 | |
33 | |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
34 const char *audmp4_id3_genres[GENRE_MAX] = { |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
35 N_("Blues"), N_("Classic Rock"), N_("Country"), N_("Dance"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
36 N_("Disco"), N_("Funk"), N_("Grunge"), N_("Hip-Hop"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
37 N_("Jazz"), N_("Metal"), N_("New Age"), N_("Oldies"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
38 N_("Other"), N_("Pop"), N_("R&B"), N_("Rap"), N_("Reggae"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
39 N_("Rock"), N_("Techno"), N_("Industrial"), N_("Alternative"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
40 N_("Ska"), N_("Death Metal"), N_("Pranks"), N_("Soundtrack"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
41 N_("Euro-Techno"), N_("Ambient"), N_("Trip-Hop"), N_("Vocal"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
42 N_("Jazz+Funk"), N_("Fusion"), N_("Trance"), N_("Classical"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
43 N_("Instrumental"), N_("Acid"), N_("House"), N_("Game"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
44 N_("Sound Clip"), N_("Gospel"), N_("Noise"), N_("AlternRock"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
45 N_("Bass"), N_("Soul"), N_("Punk"), N_("Space"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
46 N_("Meditative"), N_("Instrumental Pop"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
47 N_("Instrumental Rock"), N_("Ethnic"), N_("Gothic"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
48 N_("Darkwave"), N_("Techno-Industrial"), N_("Electronic"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
49 N_("Pop-Folk"), N_("Eurodance"), N_("Dream"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
50 N_("Southern Rock"), N_("Comedy"), N_("Cult"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
51 N_("Gangsta Rap"), N_("Top 40"), N_("Christian Rap"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
52 N_("Pop/Funk"), N_("Jungle"), N_("Native American"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
53 N_("Cabaret"), N_("New Wave"), N_("Psychedelic"), N_("Rave"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
54 N_("Showtunes"), N_("Trailer"), N_("Lo-Fi"), N_("Tribal"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
55 N_("Acid Punk"), N_("Acid Jazz"), N_("Polka"), N_("Retro"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
56 N_("Musical"), N_("Rock & Roll"), N_("Hard Rock"), N_("Folk"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
57 N_("Folk/Rock"), N_("National Folk"), N_("Swing"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
58 N_("Fast-Fusion"), N_("Bebob"), N_("Latin"), N_("Revival"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
59 N_("Celtic"), N_("Bluegrass"), N_("Avantgarde"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
60 N_("Gothic Rock"), N_("Progressive Rock"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
61 N_("Psychedelic Rock"), N_("Symphonic Rock"), N_("Slow Rock"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
62 N_("Big Band"), N_("Chorus"), N_("Easy Listening"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
63 N_("Acoustic"), N_("Humour"), N_("Speech"), N_("Chanson"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
64 N_("Opera"), N_("Chamber Music"), N_("Sonata"), N_("Symphony"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
65 N_("Booty Bass"), N_("Primus"), N_("Porn Groove"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
66 N_("Satire"), N_("Slow Jam"), N_("Club"), N_("Tango"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
67 N_("Samba"), N_("Folklore"), N_("Ballad"), N_("Power Ballad"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
68 N_("Rhythmic Soul"), N_("Freestyle"), N_("Duet"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
69 N_("Punk Rock"), N_("Drum Solo"), N_("A Cappella"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
70 N_("Euro-House"), N_("Dance Hall"), N_("Goa"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
71 N_("Drum & Bass"), N_("Club-House"), N_("Hardcore"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
72 N_("Terror"), N_("Indie"), N_("BritPop"), N_("Negerpunk"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
73 N_("Polsk Punk"), N_("Beat"), N_("Christian Gangsta Rap"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
74 N_("Heavy Metal"), N_("Black Metal"), N_("Crossover"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
75 N_("Contemporary Christian"), N_("Christian Rock"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
76 N_("Merengue"), N_("Salsa"), N_("Thrash Metal"), |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
77 N_("Anime"), N_("JPop"), N_("Synthpop") |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
78 }; |
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
79 |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
80 #define AAC_MAGIC (unsigned char [4]) { 0xFF, 0xF9, 0x5C, 0x80 } |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
81 |
61 | 82 static void mp4_init(void); |
83 static void mp4_about(void); | |
84 static void mp4_play(char *); | |
85 static void mp4_stop(void); | |
86 static void mp4_pause(short); | |
87 static void mp4_seek(int); | |
88 static int mp4_getTime(void); | |
89 static void mp4_cleanup(void); | |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
90 static int mp4_IsOurFile(char *); |
339 | 91 static void mp4_getSongTitle(char *filename, char **, int *); |
61 | 92 static void* mp4Decode(void *); |
93 | |
346
430658951e30
[svn] Use produce_audio() to pass the audio through the new audacious filterchain stuff. (EQ support!!!)
nenolod
parents:
345
diff
changeset
|
94 void audmp4_file_info_box(gchar *); |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
95 gboolean buffer_playing; |
346
430658951e30
[svn] Use produce_audio() to pass the audio through the new audacious filterchain stuff. (EQ support!!!)
nenolod
parents:
345
diff
changeset
|
96 |
61 | 97 InputPlugin mp4_ip = |
98 { | |
99 0, // handle | |
100 0, // filename | |
344
a98a7f2dfc84
[svn] Display the MP4/AAC+ bitrate, instead of "VBR".
nenolod
parents:
342
diff
changeset
|
101 "MP4 Audio Plugin", |
61 | 102 mp4_init, |
103 mp4_about, | |
104 0, // configuration | |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
105 mp4_IsOurFile, |
61 | 106 0, //scandir |
107 mp4_play, | |
108 mp4_stop, | |
109 mp4_pause, | |
110 mp4_seek, | |
111 0, // set equalizer | |
112 mp4_getTime, | |
113 0, // get volume | |
114 0, | |
115 mp4_cleanup, | |
116 0, // obsolete | |
117 0, // send visualisation data | |
118 0, // set player window info | |
119 0, // set song title text | |
339 | 120 mp4_getSongTitle, // get song title text |
342
320f0205ad45
[svn] Initial fileinfo box, loosely based around the mpg123-clone one.
nenolod
parents:
340
diff
changeset
|
121 audmp4_file_info_box, // info box |
61 | 122 0, // to output plugin |
123 }; | |
124 | |
125 typedef struct _mp4cfg{ | |
126 gshort file_type; | |
127 #define FILE_UNKNOW 0 | |
128 #define FILE_MP4 1 | |
129 #define FILE_AAC 2 | |
130 } Mp4Config; | |
131 | |
132 static Mp4Config mp4cfg; | |
200
094ef8a0a9fd
[svn] GThreadify plugin. Adds a return statement and removes a pragma statement to please GCC.
chainsaw
parents:
199
diff
changeset
|
133 static GThread *decodeThread; |
094ef8a0a9fd
[svn] GThreadify plugin. Adds a return statement and removes a pragma statement to please GCC.
chainsaw
parents:
199
diff
changeset
|
134 GStaticMutex mutex = G_STATIC_MUTEX_INIT; |
61 | 135 static int seekPosition = -1; |
136 | |
199
0a2ad94e8607
[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents:
61
diff
changeset
|
137 void getMP4info(char*); |
0a2ad94e8607
[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents:
61
diff
changeset
|
138 int getAACTrack(MP4FileHandle); |
0a2ad94e8607
[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents:
61
diff
changeset
|
139 |
339 | 140 /* |
141 * Function extname (filename) | |
142 * | |
143 * Return pointer within filename to its extenstion, or NULL if | |
144 * filename has no extension. | |
145 * | |
146 */ | |
147 static gchar * | |
148 extname(const char *filename) | |
149 { | |
150 gchar *ext = strrchr(filename, '.'); | |
151 | |
152 if (ext != NULL) | |
153 ++ext; | |
154 | |
155 return ext; | |
156 } | |
61 | 157 |
158 InputPlugin *get_iplugin_info(void) | |
159 { | |
160 return(&mp4_ip); | |
161 } | |
162 | |
163 static void mp4_init(void) | |
164 { | |
165 mp4cfg.file_type = FILE_UNKNOW; | |
166 seekPosition = -1; | |
167 return; | |
168 } | |
169 | |
170 static void mp4_play(char *filename) | |
171 { | |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
172 buffer_playing = TRUE; |
200
094ef8a0a9fd
[svn] GThreadify plugin. Adds a return statement and removes a pragma statement to please GCC.
chainsaw
parents:
199
diff
changeset
|
173 decodeThread = g_thread_create((GThreadFunc)mp4Decode, g_strdup(filename), TRUE, NULL); |
61 | 174 return; |
175 } | |
176 | |
177 static void mp4_stop(void) | |
178 { | |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
179 if(buffer_playing){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
180 buffer_playing = FALSE; |
200
094ef8a0a9fd
[svn] GThreadify plugin. Adds a return statement and removes a pragma statement to please GCC.
chainsaw
parents:
199
diff
changeset
|
181 g_thread_join(decodeThread); |
61 | 182 mp4_ip.output->close_audio(); |
183 } | |
184 } | |
185 | |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
186 static int mp4_IsOurFile(char *filename) |
61 | 187 { |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
188 VFSFile *file; |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
189 gchar* extension; |
911
8513cbe2ba33
[svn] Use a single 8-byte read instead of two 4-byte ones. The common path would nearly always result in two reads, so this should be faster.
chainsaw
parents:
862
diff
changeset
|
190 gchar magic[8]; |
61 | 191 |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
192 extension = strrchr(filename, '.'); |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
193 if ((file = vfs_fopen(filename, "rb"))) { |
911
8513cbe2ba33
[svn] Use a single 8-byte read instead of two 4-byte ones. The common path would nearly always result in two reads, so this should be faster.
chainsaw
parents:
862
diff
changeset
|
194 vfs_fread(magic, 1, 8, file); |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
195 if (!memcmp(magic, AAC_MAGIC, 4)) { |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
196 vfs_fclose(file); |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
197 return 1; |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
198 } |
862 | 199 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
200 vfs_fclose(file); |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
201 if (extension &&( |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
202 !strcasecmp(extension, ".mp4") || // official extension |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
203 !strcasecmp(extension, ".m4a") || // Apple mp4 extension |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
204 !strcasecmp(extension, ".aac") // old MPEG2/4-AAC extension |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
205 )) |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
206 return 1; |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
207 else |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
208 return 0; |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
209 } |
911
8513cbe2ba33
[svn] Use a single 8-byte read instead of two 4-byte ones. The common path would nearly always result in two reads, so this should be faster.
chainsaw
parents:
862
diff
changeset
|
210 if (!memcmp(&magic[4], "ftyp", 4)) { |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
211 vfs_fclose(file); |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
212 return 1; |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
213 } |
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
214 vfs_fclose(file); |
61 | 215 } |
842
3b2b0d68960c
[svn] Use magic bytes to identify AAC and MP4 as the decoder insists on reading the entire file before making a decision. This can be upsetting to users of large playlists, so reduce that to two 4-byte reads. Extension checking still needed for files that have been butchered by bad taggers, sorry.
chainsaw
parents:
832
diff
changeset
|
216 return 0; |
61 | 217 } |
218 | |
219 static void mp4_about(void) | |
220 { | |
221 static GtkWidget *aboutbox; | |
222 | |
223 if(aboutbox!=NULL) | |
224 return; | |
225 aboutbox = xmms_show_message("About MP4 AAC player plugin", | |
226 "libfaad2-" FAAD2_VERSION "\n" | |
227 "libmp4v2-" LIBMP4V2_VERSION "\n" | |
228 "plugin version: " MP4_VERSION "\n" | |
229 MP4_ABOUT, | |
230 "Ok", FALSE, NULL, NULL); | |
231 gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy", | |
232 GTK_SIGNAL_FUNC(gtk_widget_destroyed), | |
233 &aboutbox); | |
234 } | |
235 | |
236 static void mp4_pause(short flag) | |
237 { | |
238 mp4_ip.output->pause(flag); | |
239 } | |
240 | |
241 static void mp4_seek(int time) | |
242 { | |
243 seekPosition = time; | |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
244 while(buffer_playing && seekPosition!=-1) |
61 | 245 xmms_usleep(10000); |
246 } | |
247 | |
248 static int mp4_getTime(void) | |
249 { | |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
250 if(!buffer_playing) |
61 | 251 return (-1); |
252 else | |
253 return (mp4_ip.output->output_time()); | |
254 } | |
255 | |
256 static void mp4_cleanup(void) | |
257 { | |
258 } | |
259 | |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
260 #if 0 |
61 | 261 static void mp4_getSongInfo(char *filename) |
262 { | |
263 if(mp4cfg.file_type == FILE_MP4) | |
264 getMP4info(filename); | |
265 else if(mp4cfg.file_type == FILE_AAC) | |
266 ; | |
267 } | |
387
7f0e78f42032
[svn] Disable adplug if the includes are missing (or in a very lame place). Stop blowing holes in my ship.
chainsaw
parents:
346
diff
changeset
|
268 #endif |
61 | 269 |
339 | 270 static gchar *mp4_get_song_title(char *filename) |
271 { | |
272 MP4FileHandle mp4file; | |
273 gchar *title = NULL; | |
274 | |
275 if (!(mp4file = MP4Read(filename, 0))) { | |
276 MP4Close(mp4file); | |
277 } else { | |
278 TitleInput *input; | |
279 gchar *tmpval; | |
280 | |
281 input = bmp_title_input_new(); | |
282 | |
283 MP4GetMetadataName(mp4file, &input->track_name); | |
284 MP4GetMetadataAlbum(mp4file, &input->album_name); | |
285 MP4GetMetadataArtist(mp4file, &input->performer); | |
286 MP4GetMetadataYear(mp4file, &tmpval); | |
287 MP4GetMetadataGenre(mp4file, &input->genre); | |
288 | |
340 | 289 if (tmpval) |
793 | 290 { |
340 | 291 input->year = atoi(tmpval); |
793 | 292 free(tmpval); |
293 } | |
339 | 294 |
295 input->file_name = g_path_get_basename(filename); | |
296 input->file_path = g_path_get_dirname(filename); | |
297 input->file_ext = extname(filename); | |
298 | |
299 title = xmms_get_titlestring(xmms_get_gentitle_format(), input); | |
300 | |
793 | 301 free (input->track_name); |
302 free (input->album_name); | |
303 free (input->performer); | |
304 free (input->genre); | |
339 | 305 free (input->file_name); |
306 free (input->file_path); | |
307 free (input); | |
982
287d4eb3ca27
[svn] - Let's not leave mp4 files open after reading their tags :P
nhjm449
parents:
935
diff
changeset
|
308 |
287d4eb3ca27
[svn] - Let's not leave mp4 files open after reading their tags :P
nhjm449
parents:
935
diff
changeset
|
309 MP4Close(mp4file); |
339 | 310 } |
311 | |
312 if (!title) | |
313 { | |
314 title = g_path_get_basename(filename); | |
315 if (extname(title)) | |
316 *(extname(title) - 1) = '\0'; | |
317 } | |
318 | |
319 return title; | |
320 } | |
321 | |
322 static void mp4_getSongTitle(char *filename, char **title_real, int *len_real) | |
323 { | |
324 (*title_real) = mp4_get_song_title(filename); | |
325 (*len_real) = -1; | |
326 } | |
327 | |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
328 static int my_decode_mp4( char *filename, MP4FileHandle mp4file ) |
61 | 329 { |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
330 // We are reading a MP4 file |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
331 gint mp4track= getAACTrack(mp4file); |
61 | 332 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
333 if ( mp4track < 0 ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
334 //TODO: check here for others Audio format..... |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
335 g_print("Unsupported Audio track type\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
336 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
337 else { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
338 faacDecHandle decoder; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
339 unsigned char *buffer = NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
340 guint bufferSize = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
341 gulong samplerate; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
342 guchar channels; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
343 //guint avgBitrate; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
344 MP4Duration duration; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
345 gulong msDuration; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
346 MP4SampleId numSamples; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
347 MP4SampleId sampleID = 1; |
61 | 348 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
349 TitleInput *input; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
350 gchar *xmmstitle = NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
351 XMMS_NEW_TITLEINPUT(input); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
352 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
353 gchar *ext = strrchr(filename, '.'); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
354 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
355 input->file_name = g_filename_display_basename(filename); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
356 input->file_ext = ext ? ext+1 : NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
357 input->file_path = filename; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
358 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
359 MP4GetMetadataName(mp4file, &input->track_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
360 MP4GetMetadataArtist(mp4file, &input->performer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
361 MP4GetMetadataAlbum(mp4file, &input->album_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
362 /*MP4GetMetadataTrack(mp4file, &input->track_number, NULL);*/ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
363 MP4GetMetadataGenre(mp4file, &input->genre); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
364 MP4GetMetadataComment(mp4file, &input->comment); |
61 | 365 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
366 xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
367 input); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
368 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
369 mp4_ip.set_info(xmmstitle, -1, -1, samplerate, channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
370 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
371 if(xmmstitle == NULL) |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
372 xmmstitle = g_strdup(input->file_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
373 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
374 decoder = faacDecOpen(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
375 MP4GetTrackESConfiguration(mp4file, mp4track, &buffer, &bufferSize); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
376 if ( !buffer ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
377 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
378 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
379 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
380 if ( faacDecInit2(decoder, buffer, bufferSize, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
381 &samplerate, &channels) < 0 ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
382 faacDecClose(decoder); |
61 | 383 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
384 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
385 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
386 g_free(buffer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
387 if( !channels ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
388 g_print("Number of Channels not supported\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
389 faacDecClose(decoder); |
61 | 390 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
391 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
392 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
393 duration= MP4GetTrackDuration(mp4file, mp4track); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
394 msDuration= MP4ConvertFromTrackDuration(mp4file, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
395 mp4track, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
396 duration, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
397 MP4_MSECS_TIME_SCALE); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
398 numSamples = MP4GetTrackNumberOfSamples(mp4file, mp4track); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
399 mp4_ip.output->open_audio(FMT_S16_NE, samplerate, channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
400 mp4_ip.output->flush(0); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
401 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
402 mp4_ip.set_info(xmmstitle, msDuration, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
403 MP4GetTrackBitRate( mp4file, mp4track ), |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
404 samplerate,channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
405 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
406 while ( buffer_playing ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
407 void* sampleBuffer; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
408 faacDecFrameInfo frameInfo; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
409 gint rc; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
410 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
411 /* Seek if seek position has changed */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
412 if ( seekPosition!=-1 ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
413 duration= MP4ConvertToTrackDuration(mp4file, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
414 mp4track, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
415 seekPosition*1000, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
416 MP4_MSECS_TIME_SCALE); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
417 sampleID= MP4GetSampleIdFromTime(mp4file, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
418 mp4track, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
419 duration, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
420 0); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
421 mp4_ip.output->flush(seekPosition*1000); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
422 seekPosition = -1; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
423 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
424 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
425 /* Otherwise continue playing */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
426 buffer=NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
427 bufferSize=0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
428 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
429 /* If we've run to the end of the file, we're done. */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
430 if(sampleID > numSamples){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
431 /* Finish playing before we close the |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
432 output. */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
433 while ( mp4_ip.output->buffer_playing() ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
434 xmms_usleep(10000); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
435 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
436 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
437 mp4_ip.output->flush(seekPosition*1000); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
438 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
439 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
440 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
441 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
442 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
443 rc= MP4ReadSample(mp4file, mp4track, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
444 sampleID++, &buffer, &bufferSize, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
445 NULL, NULL, NULL, NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
446 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
447 /*g_print(":: %d/%d\n", sampleID-1, numSamples);*/ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
448 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
449 /* If we can't read the file, we're done. */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
450 if((!rc) || (buffer== NULL)){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
451 g_print("MP4: read error\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
452 sampleBuffer = NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
453 sampleID=0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
454 mp4_ip.output->buffer_free(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
455 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
456 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
457 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
458 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
459 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
460 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
461 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
462 sampleBuffer= faacDecDecode(decoder, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
463 &frameInfo, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
464 buffer, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
465 bufferSize); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
466 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
467 /* If there was an error decoding, we're done. */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
468 if(frameInfo.error > 0){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
469 g_print("MP4: %s\n", |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
470 faacDecGetErrorMessage(frameInfo.error)); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
471 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
472 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
473 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
474 return FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
475 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
476 if(buffer){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
477 g_free(buffer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
478 buffer=NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
479 bufferSize=0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
480 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
481 produce_audio(mp4_ip.output->written_time(), |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
482 FMT_S16_NE, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
483 channels, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
484 frameInfo.samples<<1, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
485 sampleBuffer, &buffer_playing); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
486 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
487 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
488 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
489 faacDecClose(decoder); |
61 | 490 } |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
491 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
492 return TRUE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
493 } |
61 | 494 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
495 static void my_decode_aac( char *filename ) |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
496 { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
497 // WE ARE READING AN AAC FILE |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
498 VFSFile *file = NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
499 faacDecHandle decoder = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
500 guchar *buffer = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
501 gulong bufferconsumed = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
502 gulong samplerate = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
503 guchar channels; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
504 gulong buffervalid = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
505 TitleInput* input; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
506 gchar *temp = g_strdup(filename); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
507 gchar *ext = strrchr(temp, '.'); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
508 gchar *xmmstitle = NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
509 faacDecConfigurationPtr config; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
510 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
511 if((file = vfs_fopen(filename, "rb")) == 0){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
512 g_print("AAC: can't find file %s\n", filename); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
513 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
514 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
515 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
516 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
517 if((decoder = faacDecOpen()) == NULL){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
518 g_print("AAC: Open Decoder Error\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
519 vfs_fclose(file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
520 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
521 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
522 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
523 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
524 config = faacDecGetCurrentConfiguration(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
525 config->useOldADTSFormat = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
526 faacDecSetConfiguration(decoder, config); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
527 if((buffer = g_malloc(BUFFER_SIZE)) == NULL){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
528 g_print("AAC: error g_malloc\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
529 vfs_fclose(file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
530 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
531 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
532 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
533 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
534 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
535 if((buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file))==0){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
536 g_print("AAC: Error reading file\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
537 g_free(buffer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
538 vfs_fclose(file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
539 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
540 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
541 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
542 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
543 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
544 XMMS_NEW_TITLEINPUT(input); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
545 input->file_name = (char*)g_basename(temp); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
546 input->file_ext = ext ? ext+1 : NULL; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
547 input->file_path = temp; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
548 if(!strncmp(buffer, "ID3", 3)){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
549 gint size = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
550 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
551 vfs_fseek(file, 0, SEEK_SET); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
552 size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9]; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
553 size+=10; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
554 vfs_fread(buffer, 1, size, file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
555 buffervalid = vfs_fread(buffer, 1, BUFFER_SIZE, file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
556 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
557 xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), input); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
558 if(xmmstitle == NULL) |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
559 xmmstitle = g_strdup(input->file_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
560 if(temp) g_free(temp); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
561 if(input->performer) g_free(input->performer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
562 if(input->album_name) g_free(input->album_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
563 if(input->track_name) g_free(input->track_name); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
564 if(input->genre) g_free(input->genre); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
565 g_free(input); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
566 bufferconsumed = faacDecInit(decoder, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
567 buffer, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
568 buffervalid, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
569 &samplerate, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
570 &channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
571 if(mp4_ip.output->open_audio(FMT_S16_NE,samplerate,channels) == FALSE){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
572 g_print("AAC: Output Error\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
573 g_free(buffer); buffer=0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
574 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
575 vfs_fclose(file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
576 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
577 g_free(xmmstitle); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
578 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
579 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
580 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
581 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
582 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
583 mp4_ip.set_info(xmmstitle, -1, -1, samplerate, channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
584 mp4_ip.output->flush(0); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
585 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
586 while(buffer_playing && buffervalid > 0){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
587 faacDecFrameInfo finfo; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
588 unsigned long samplesdecoded; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
589 char* sample_buffer = NULL; |
61 | 590 |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
591 if(bufferconsumed > 0){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
592 memmove(buffer, &buffer[bufferconsumed], buffervalid-bufferconsumed); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
593 buffervalid -= bufferconsumed; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
594 buffervalid += vfs_fread(&buffer[buffervalid], 1, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
595 BUFFER_SIZE-buffervalid, file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
596 bufferconsumed = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
597 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
598 sample_buffer = faacDecDecode(decoder, &finfo, buffer, buffervalid); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
599 if(finfo.error){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
600 config = faacDecGetCurrentConfiguration(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
601 if(config->useOldADTSFormat != 1){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
602 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
603 decoder = faacDecOpen(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
604 config = faacDecGetCurrentConfiguration(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
605 config->useOldADTSFormat = 1; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
606 faacDecSetConfiguration(decoder, config); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
607 finfo.bytesconsumed=0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
608 finfo.samples = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
609 faacDecInit(decoder, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
610 buffer, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
611 buffervalid, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
612 &samplerate, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
613 &channels); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
614 }else{ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
615 g_print("FAAD2 Warning %s\n", faacDecGetErrorMessage(finfo.error)); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
616 buffervalid = 0; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
617 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
618 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
619 bufferconsumed += finfo.bytesconsumed; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
620 samplesdecoded = finfo.samples; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
621 if((samplesdecoded<=0) && !sample_buffer){ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
622 g_print("AAC: error sample decoding\n"); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
623 continue; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
624 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
625 produce_audio(mp4_ip.output->written_time(), |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
626 FMT_S16_LE, channels, |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
627 samplesdecoded<<1, sample_buffer, &buffer_playing); |
61 | 628 } |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
629 mp4_ip.output->buffer_free(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
630 mp4_ip.output->close_audio(); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
631 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
632 g_free(buffer); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
633 faacDecClose(decoder); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
634 g_free(xmmstitle); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
635 vfs_fclose(file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
636 seekPosition = -1; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
637 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
638 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
639 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
640 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
641 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
642 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
643 static void *mp4Decode( void *args ) |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
644 { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
645 MP4FileHandle mp4file; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
646 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
647 char* url= (char*)args; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
648 char filename[255]; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
649 memset( filename, '\0', 255 ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
650 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
651 #if 0 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
652 /* If we have a URL-style string, de-URLise it... */ |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
653 if ( !strncmp( url, "file://", 7 ) ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
654 char *output= curl_unescape( url, 0 ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
655 char *tmp= output+7; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
656 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
657 strncpy( filename, tmp, 254 ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
658 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
659 curl_free( output ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
660 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
661 else { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
662 strncpy( filename, url, 254 ); |
61 | 663 } |
932
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
664 #endif |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
665 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
666 strncpy( filename, url, 254 ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
667 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
668 g_static_mutex_lock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
669 seekPosition= -1; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
670 buffer_playing= TRUE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
671 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
672 mp4file= MP4Read(filename, 0); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
673 if( !mp4file ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
674 mp4cfg.file_type = FILE_AAC; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
675 MP4Close(mp4file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
676 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
677 else { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
678 mp4cfg.file_type = FILE_MP4; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
679 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
680 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
681 if ( mp4cfg.file_type == FILE_MP4 ) { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
682 my_decode_mp4( filename, mp4file ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
683 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
684 g_free(args); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
685 MP4Close(mp4file); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
686 buffer_playing = FALSE; |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
687 g_static_mutex_unlock(&mutex); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
688 g_thread_exit(NULL); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
689 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
690 else { |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
691 my_decode_aac( filename ); |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
692 } |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
693 |
2fc785535aad
[svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents:
911
diff
changeset
|
694 return NULL; |
61 | 695 } |