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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2 * MP4/AAC decoder for xmms
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 * This decoding source code is completly independent of the faad2
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 * package.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 * This package exist for people who don't want to install
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 * faad2 and mpeg4ip project files.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 * OPTIONNAL need
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 * --------------
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11 * libid3 (3.8.x - www.id3.org)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16 #include <gtk/gtk.h>
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
17 #include <string.h>
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
18 #include <stdlib.h>
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 #include "faad.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25 #include <libaudacious/util.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31 #define MP4_ABOUT "Written by ciberfred"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32 #define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 static void mp4_init(void);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 static void mp4_about(void);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 static void mp4_play(char *);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 static void mp4_stop(void);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 static void mp4_pause(short);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 static void mp4_seek(int);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88 static int mp4_getTime(void);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
91 static void mp4_getSongTitle(char *filename, char **, int *);
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92 static void* mp4Decode(void *);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 InputPlugin mp4_ip =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99 0, // handle
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100 0, // filename
344
a98a7f2dfc84 [svn] Display the MP4/AAC+ bitrate, instead of "VBR".
nenolod
parents: 342
diff changeset
101 "MP4 Audio Plugin",
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102 mp4_init,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103 mp4_about,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106 0, //scandir
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 mp4_play,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 mp4_stop,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 mp4_pause,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110 mp4_seek,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 0, // set equalizer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112 mp4_getTime,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113 0, // get volume
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114 0,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 mp4_cleanup,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 0, // obsolete
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 0, // send visualisation data
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 0, // set player window info
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 0, // set song title text
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122 0, // to output plugin
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 typedef struct _mp4cfg{
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 gshort file_type;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 #define FILE_UNKNOW 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128 #define FILE_MP4 1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 #define FILE_AAC 2
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 } Mp4Config;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 static int seekPosition = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
140 /*
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
141 * Function extname (filename)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
142 *
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
143 * Return pointer within filename to its extenstion, or NULL if
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
144 * filename has no extension.
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
145 *
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
146 */
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
147 static gchar *
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
148 extname(const char *filename)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
149 {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
150 gchar *ext = strrchr(filename, '.');
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
151
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
152 if (ext != NULL)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
153 ++ext;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
154
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
155 return ext;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
156 }
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 InputPlugin *get_iplugin_info(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160 return(&mp4_ip);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 static void mp4_init(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165 mp4cfg.file_type = FILE_UNKNOW;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 seekPosition = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170 static void mp4_play(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 static void mp4_stop(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 mp4_ip.output->close_audio();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
5d3878484c4f [svn] memcmp since magic isn't a string
nemo
parents: 861
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
217 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
218
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
219 static void mp4_about(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
220 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
221 static GtkWidget *aboutbox;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
222
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
223 if(aboutbox!=NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
224 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
225 aboutbox = xmms_show_message("About MP4 AAC player plugin",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
226 "libfaad2-" FAAD2_VERSION "\n"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
227 "libmp4v2-" LIBMP4V2_VERSION "\n"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
228 "plugin version: " MP4_VERSION "\n"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
229 MP4_ABOUT,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
230 "Ok", FALSE, NULL, NULL);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
231 gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
232 GTK_SIGNAL_FUNC(gtk_widget_destroyed),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
233 &aboutbox);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
234 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
235
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
236 static void mp4_pause(short flag)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
237 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
238 mp4_ip.output->pause(flag);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
239 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
240
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
241 static void mp4_seek(int time)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
242 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
245 xmms_usleep(10000);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
246 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
247
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
248 static int mp4_getTime(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
249 {
932
2fc785535aad [svn] - new decode loop from updated BMP-MP4 plugin
nenolod
parents: 911
diff changeset
250 if(!buffer_playing)
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
251 return (-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
252 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
253 return (mp4_ip.output->output_time());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
254 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
255
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
256 static void mp4_cleanup(void)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
257 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
258 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
261 static void mp4_getSongInfo(char *filename)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
262 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
263 if(mp4cfg.file_type == FILE_MP4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
264 getMP4info(filename);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
265 else if(mp4cfg.file_type == FILE_AAC)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
266 ;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
269
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
270 static gchar *mp4_get_song_title(char *filename)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
271 {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
272 MP4FileHandle mp4file;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
273 gchar *title = NULL;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
274
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
275 if (!(mp4file = MP4Read(filename, 0))) {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
276 MP4Close(mp4file);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
277 } else {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
278 TitleInput *input;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
279 gchar *tmpval;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
280
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
281 input = bmp_title_input_new();
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
282
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
283 MP4GetMetadataName(mp4file, &input->track_name);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
284 MP4GetMetadataAlbum(mp4file, &input->album_name);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
285 MP4GetMetadataArtist(mp4file, &input->performer);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
286 MP4GetMetadataYear(mp4file, &tmpval);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
287 MP4GetMetadataGenre(mp4file, &input->genre);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
288
340
c7a67ac8e19c [svn] safety fix
nenolod
parents: 339
diff changeset
289 if (tmpval)
793
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
290 {
340
c7a67ac8e19c [svn] safety fix
nenolod
parents: 339
diff changeset
291 input->year = atoi(tmpval);
793
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
292 free(tmpval);
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
293 }
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
294
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
295 input->file_name = g_path_get_basename(filename);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
296 input->file_path = g_path_get_dirname(filename);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
297 input->file_ext = extname(filename);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
298
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
299 title = xmms_get_titlestring(xmms_get_gentitle_format(), input);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
300
793
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
301 free (input->track_name);
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
302 free (input->album_name);
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
303 free (input->performer);
3c4bcd9b8719 [svn] - leak fix
nenolod
parents: 407
diff changeset
304 free (input->genre);
339
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
305 free (input->file_name);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
306 free (input->file_path);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
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
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
310 }
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
311
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
312 if (!title)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
313 {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
314 title = g_path_get_basename(filename);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
315 if (extname(title))
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
316 *(extname(title) - 1) = '\0';
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
317 }
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
318
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
319 return title;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
320 }
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
321
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
322 static void mp4_getSongTitle(char *filename, char **title_real, int *len_real)
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
323 {
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
324 (*title_real) = mp4_get_song_title(filename);
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
325 (*len_real) = -1;
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
326 }
e1630c75175b [svn] MP4 metadata retrieval support.
nenolod
parents: 320
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
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
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
695 }