comparison src/aac/libmp4.c @ 1978:fa9f85cebade

s/vfs_/aud_vfs_/g
author William Pitcock <nenolod@atheme.org>
date Sun, 07 Oct 2007 00:25:33 -0500
parents 5fa26178eaef
children 839804c3b3a4
comparison
equal deleted inserted replaced
1977:5a6b60ceaa0f 1978:fa9f85cebade
14 #include <audacious/main.h> 14 #include <audacious/main.h>
15 15
16 #define MP4_VERSION VERSION 16 #define MP4_VERSION VERSION
17 #define SBR_DEC 17 #define SBR_DEC
18 18
19 extern VFSFile *vfs_buffered_file_new_from_uri(gchar *uri); 19 extern VFSFile *aud_vfs_buffered_file_new_from_uri(gchar *uri);
20 20
21 /* 21 /*
22 * BUFFER_SIZE is the highest amount of memory that can be pulled. 22 * BUFFER_SIZE is the highest amount of memory that can be pulled.
23 * We use this for sanity checks, among other things, as mp4ff needs 23 * We use this for sanity checks, among other things, as mp4ff needs
24 * a labotomy sometimes. 24 * a labotomy sometimes.
60 .seek = mp4_seek, 60 .seek = mp4_seek,
61 .cleanup = mp4_cleanup, 61 .cleanup = mp4_cleanup,
62 .get_song_info = mp4_get_song_title_len, 62 .get_song_info = mp4_get_song_title_len,
63 .get_song_tuple = mp4_get_song_tuple, 63 .get_song_tuple = mp4_get_song_tuple,
64 .is_our_file_from_vfs = mp4_is_our_fd, 64 .is_our_file_from_vfs = mp4_is_our_fd,
65 .vfs_extensions = fmts, 65 .aud_vfs_extensions = fmts,
66 }; 66 };
67 67
68 InputPlugin *mp4_iplist[] = { &mp4_ip, NULL }; 68 InputPlugin *mp4_iplist[] = { &mp4_ip, NULL };
69 69
70 DECLARE_PLUGIN(mp4, NULL, NULL, mp4_iplist, NULL, NULL, NULL, NULL, NULL); 70 DECLARE_PLUGIN(mp4, NULL, NULL, mp4_iplist, NULL, NULL, NULL, NULL, NULL);
88 static guint32 mp4_read_callback(void *data, void *buffer, guint32 len) 88 static guint32 mp4_read_callback(void *data, void *buffer, guint32 len)
89 { 89 {
90 if (data == NULL || buffer == NULL) 90 if (data == NULL || buffer == NULL)
91 return -1; 91 return -1;
92 92
93 return vfs_fread(buffer, 1, len, (VFSFile *) data); 93 return aud_vfs_fread(buffer, 1, len, (VFSFile *) data);
94 } 94 }
95 95
96 static guint32 mp4_seek_callback(void *data, guint64 pos) 96 static guint32 mp4_seek_callback(void *data, guint64 pos)
97 { 97 {
98 if (data == NULL) 98 if (data == NULL)
99 return -1; 99 return -1;
100 100
101 return vfs_fseek((VFSFile *) data, pos, SEEK_SET); 101 return aud_vfs_fseek((VFSFile *) data, pos, SEEK_SET);
102 } 102 }
103 103
104 static void mp4_init(void) 104 static void mp4_init(void)
105 { 105 {
106 mp4cfg.file_type = FILE_UNKNOWN; 106 mp4cfg.file_type = FILE_UNKNOWN;
160 { 160 {
161 int cnt = 0, c, len, srate, num; 161 int cnt = 0, c, len, srate, num;
162 off_t init, probed; 162 off_t init, probed;
163 static guchar buf[8]; 163 static guchar buf[8];
164 164
165 init = probed = vfs_ftell(stream); 165 init = probed = aud_vfs_ftell(stream);
166 while(probed-init <= 32768 && cnt < 8) 166 while(probed-init <= 32768 && cnt < 8)
167 { 167 {
168 c = 0; 168 c = 0;
169 while(probed-init <= 32768 && c != 0xFF) 169 while(probed-init <= 32768 && c != 0xFF)
170 { 170 {
171 c = vfs_getc(stream); 171 c = aud_vfs_getc(stream);
172 if(c < 0) 172 if(c < 0)
173 return FALSE; 173 return FALSE;
174 probed = vfs_ftell(stream); 174 probed = aud_vfs_ftell(stream);
175 } 175 }
176 buf[0] = 0xFF; 176 buf[0] = 0xFF;
177 if(vfs_fread(&(buf[1]), 1, 7, stream) < 7) 177 if(aud_vfs_fread(&(buf[1]), 1, 7, stream) < 7)
178 return FALSE; 178 return FALSE;
179 179
180 len = aac_parse_frame(buf, &srate, &num); 180 len = aac_parse_frame(buf, &srate, &num);
181 if(len > 0) 181 if(len > 0)
182 { 182 {
183 cnt++; 183 cnt++;
184 vfs_fseek(stream, len - 8, SEEK_CUR); 184 aud_vfs_fseek(stream, len - 8, SEEK_CUR);
185 } 185 }
186 probed = vfs_ftell(stream); 186 probed = aud_vfs_ftell(stream);
187 } 187 }
188 188
189 if(cnt < 8) 189 if(cnt < 8)
190 return FALSE; 190 return FALSE;
191 191
225 gchar magic[8]; 225 gchar magic[8];
226 226
227 memset(magic, '\0', 8); 227 memset(magic, '\0', 8);
228 228
229 extension = strrchr(filename, '.'); 229 extension = strrchr(filename, '.');
230 if ((file = vfs_fopen(filename, "rb"))) { 230 if ((file = aud_vfs_fopen(filename, "rb"))) {
231 vfs_fread(magic, 1, 8, file); 231 aud_vfs_fread(magic, 1, 8, file);
232 vfs_rewind(file); 232 aud_vfs_rewind(file);
233 if (parse_aac_stream(file) == TRUE) { 233 if (parse_aac_stream(file) == TRUE) {
234 vfs_fclose(file); 234 aud_vfs_fclose(file);
235 return TRUE; 235 return TRUE;
236 } 236 }
237 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes 237 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes
238 vfs_fclose(file); 238 aud_vfs_fclose(file);
239 if (extension &&( 239 if (extension &&(
240 !strcasecmp(extension, ".mp4") || // official extension 240 !strcasecmp(extension, ".mp4") || // official extension
241 !strcasecmp(extension, ".m4a") || // Apple mp4 extension 241 !strcasecmp(extension, ".m4a") || // Apple mp4 extension
242 !strcasecmp(extension, ".aac") // old MPEG2/4-AAC extension 242 !strcasecmp(extension, ".aac") // old MPEG2/4-AAC extension
243 )) 243 ))
244 return 1; 244 return 1;
245 else 245 else
246 return 0; 246 return 0;
247 } 247 }
248 if (!memcmp(&magic[4], "ftyp", 4)) { 248 if (!memcmp(&magic[4], "ftyp", 4)) {
249 vfs_fclose(file); 249 aud_vfs_fclose(file);
250 return 1; 250 return 1;
251 } 251 }
252 vfs_fclose(file); 252 aud_vfs_fclose(file);
253 } 253 }
254 return 0; 254 return 0;
255 } 255 }
256 256
257 static int mp4_is_our_fd(char *filename, VFSFile* file) 257 static int mp4_is_our_fd(char *filename, VFSFile* file)
258 { 258 {
259 gchar* extension; 259 gchar* extension;
260 gchar magic[8]; 260 gchar magic[8];
261 261
262 extension = strrchr(filename, '.'); 262 extension = strrchr(filename, '.');
263 vfs_fread(magic, 1, 8, file); 263 aud_vfs_fread(magic, 1, 8, file);
264 vfs_rewind(file); 264 aud_vfs_rewind(file);
265 if (parse_aac_stream(file) == TRUE) 265 if (parse_aac_stream(file) == TRUE)
266 return 1; 266 return 1;
267 if (!memcmp(&magic[4], "ftyp", 4)) 267 if (!memcmp(&magic[4], "ftyp", 4))
268 return 1; 268 return 1;
269 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes 269 if (!memcmp(magic, "ID3", 3)) { // ID3 tag bolted to the front, obfuscated magic bytes
323 /* check if this file is an ADTS stream, if so return a blank tuple */ 323 /* check if this file is an ADTS stream, if so return a blank tuple */
324 if (parse_aac_stream(mp4fh)) 324 if (parse_aac_stream(mp4fh))
325 { 325 {
326 g_free(mp4cb); 326 g_free(mp4cb);
327 327
328 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, vfs_get_metadata(mp4fh, "track-name")); 328 aud_tuple_associate_string(ti, FIELD_TITLE, NULL, aud_vfs_get_metadata(mp4fh, "track-name"));
329 aud_tuple_associate_string(ti, FIELD_ALBUM, NULL, vfs_get_metadata(mp4fh, "stream-name")); 329 aud_tuple_associate_string(ti, FIELD_ALBUM, NULL, aud_vfs_get_metadata(mp4fh, "stream-name"));
330 330
331 aud_tuple_associate_string(ti, FIELD_CODEC, NULL, "Advanced Audio Coding (AAC)"); 331 aud_tuple_associate_string(ti, FIELD_CODEC, NULL, "Advanced Audio Coding (AAC)");
332 aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy"); 332 aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy");
333 333
334 vfs_fclose(mp4fh); 334 aud_vfs_fclose(mp4fh);
335 return ti; 335 return ti;
336 } 336 }
337 337
338 vfs_rewind(mp4fh); 338 aud_vfs_rewind(mp4fh);
339 339
340 mp4cb->read = mp4_read_callback; 340 mp4cb->read = mp4_read_callback;
341 mp4cb->seek = mp4_seek_callback; 341 mp4cb->seek = mp4_seek_callback;
342 mp4cb->user_data = mp4fh; 342 mp4cb->user_data = mp4fh;
343 343
344 if (!(mp4file = mp4ff_open_read(mp4cb))) { 344 if (!(mp4file = mp4ff_open_read(mp4cb))) {
345 g_free(mp4cb); 345 g_free(mp4cb);
346 vfs_fclose(mp4fh); 346 aud_vfs_fclose(mp4fh);
347 } else { 347 } else {
348 gint mp4track= getAACTrack(mp4file); 348 gint mp4track= getAACTrack(mp4file);
349 gint numSamples = mp4ff_num_samples(mp4file, mp4track); 349 gint numSamples = mp4ff_num_samples(mp4file, mp4track);
350 guint framesize = 1024; 350 guint framesize = 1024;
351 guint samplerate = 0; 351 guint samplerate = 0;
424 424
425 aud_tuple_associate_string(ti, FIELD_CODEC, NULL, "Advanced Audio Coding (AAC)"); 425 aud_tuple_associate_string(ti, FIELD_CODEC, NULL, "Advanced Audio Coding (AAC)");
426 aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy"); 426 aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy");
427 427
428 free (mp4cb); 428 free (mp4cb);
429 vfs_fclose(mp4fh); 429 aud_vfs_fclose(mp4fh);
430 } 430 }
431 431
432 return ti; 432 return ti;
433 } 433 }
434 434
437 Tuple *tuple; 437 Tuple *tuple;
438 VFSFile *mp4fh; 438 VFSFile *mp4fh;
439 gboolean remote = str_has_prefix_nocase(filename, "http:") || 439 gboolean remote = str_has_prefix_nocase(filename, "http:") ||
440 str_has_prefix_nocase(filename, "https:"); 440 str_has_prefix_nocase(filename, "https:");
441 441
442 mp4fh = remote ? vfs_buffered_file_new_from_uri(filename) : vfs_fopen(filename, "rb"); 442 mp4fh = remote ? aud_vfs_buffered_file_new_from_uri(filename) : aud_vfs_fopen(filename, "rb");
443 443
444 tuple = mp4_get_song_aud_tuple_base(filename, mp4fh); 444 tuple = mp4_get_song_aud_tuple_base(filename, mp4fh);
445 445
446 return tuple; 446 return tuple;
447 } 447 }
627 gchar *temp = g_strdup(filename); 627 gchar *temp = g_strdup(filename);
628 gchar *xmmstitle = NULL; 628 gchar *xmmstitle = NULL;
629 gboolean remote = str_has_prefix_nocase(filename, "http:") || 629 gboolean remote = str_has_prefix_nocase(filename, "http:") ||
630 str_has_prefix_nocase(filename, "https:"); 630 str_has_prefix_nocase(filename, "https:");
631 631
632 vfs_rewind(file); 632 aud_vfs_rewind(file);
633 if((decoder = faacDecOpen()) == NULL){ 633 if((decoder = faacDecOpen()) == NULL){
634 g_print("AAC: Open Decoder Error\n"); 634 g_print("AAC: Open Decoder Error\n");
635 vfs_fclose(file); 635 aud_vfs_fclose(file);
636 buffer_playing = FALSE; 636 buffer_playing = FALSE;
637 playback->playing = 0; 637 playback->playing = 0;
638 g_static_mutex_unlock(&mutex); 638 g_static_mutex_unlock(&mutex);
639 return; 639 return;
640 } 640 }
641 if((buffervalid = vfs_fread(streambuffer, 1, BUFFER_SIZE, file))==0){ 641 if((buffervalid = aud_vfs_fread(streambuffer, 1, BUFFER_SIZE, file))==0){
642 g_print("AAC: Error reading file\n"); 642 g_print("AAC: Error reading file\n");
643 vfs_fclose(file); 643 aud_vfs_fclose(file);
644 buffer_playing = FALSE; 644 buffer_playing = FALSE;
645 playback->playing = 0; 645 playback->playing = 0;
646 faacDecClose(decoder); 646 faacDecClose(decoder);
647 g_static_mutex_unlock(&mutex); 647 g_static_mutex_unlock(&mutex);
648 return; 648 return;
649 } 649 }
650 if(!strncmp((char*)streambuffer, "ID3", 3)){ 650 if(!strncmp((char*)streambuffer, "ID3", 3)){
651 gint size = 0; 651 gint size = 0;
652 652
653 vfs_fseek(file, 0, SEEK_SET); 653 aud_vfs_fseek(file, 0, SEEK_SET);
654 size = (streambuffer[6]<<21) | (streambuffer[7]<<14) | 654 size = (streambuffer[6]<<21) | (streambuffer[7]<<14) |
655 (streambuffer[8]<<7) | streambuffer[9]; 655 (streambuffer[8]<<7) | streambuffer[9];
656 size+=10; 656 size+=10;
657 vfs_fread(streambuffer, 1, size, file); 657 aud_vfs_fread(streambuffer, 1, size, file);
658 buffervalid = vfs_fread(streambuffer, 1, BUFFER_SIZE, file); 658 buffervalid = aud_vfs_fread(streambuffer, 1, BUFFER_SIZE, file);
659 } 659 }
660 660
661 ttemp = vfs_get_metadata(file, "stream-name"); 661 ttemp = aud_vfs_get_metadata(file, "stream-name");
662 662
663 if (ttemp != NULL) 663 if (ttemp != NULL)
664 { 664 {
665 xmmstitle = g_strdup(ttemp); 665 xmmstitle = g_strdup(ttemp);
666 g_free(ttemp); 666 g_free(ttemp);
670 670
671 bufferconsumed = aac_probe(streambuffer, buffervalid); 671 bufferconsumed = aac_probe(streambuffer, buffervalid);
672 if(bufferconsumed) { 672 if(bufferconsumed) {
673 buffervalid -= bufferconsumed; 673 buffervalid -= bufferconsumed;
674 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); 674 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid);
675 buffervalid += vfs_fread(&streambuffer[buffervalid], 1, 675 buffervalid += aud_vfs_fread(&streambuffer[buffervalid], 1,
676 BUFFER_SIZE-buffervalid, file); 676 BUFFER_SIZE-buffervalid, file);
677 bufferconsumed = 0; 677 bufferconsumed = 0;
678 } 678 }
679 679
680 bufferconsumed = faacDecInit(decoder, 680 bufferconsumed = faacDecInit(decoder,
686 g_print("samplerate: %d, channels: %d\n", samplerate, channels); 686 g_print("samplerate: %d, channels: %d\n", samplerate, channels);
687 #endif 687 #endif
688 if(playback->output->open_audio(FMT_S16_NE,samplerate,channels) == FALSE){ 688 if(playback->output->open_audio(FMT_S16_NE,samplerate,channels) == FALSE){
689 g_print("AAC: Output Error\n"); 689 g_print("AAC: Output Error\n");
690 faacDecClose(decoder); 690 faacDecClose(decoder);
691 vfs_fclose(file); 691 aud_vfs_fclose(file);
692 playback->output->close_audio(); 692 playback->output->close_audio();
693 g_free(xmmstitle); 693 g_free(xmmstitle);
694 buffer_playing = FALSE; 694 buffer_playing = FALSE;
695 playback->playing = 0; 695 playback->playing = 0;
696 g_static_mutex_unlock(&mutex); 696 g_static_mutex_unlock(&mutex);
708 708
709 if(bufferconsumed > 0) 709 if(bufferconsumed > 0)
710 { 710 {
711 buffervalid -= bufferconsumed; 711 buffervalid -= bufferconsumed;
712 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); 712 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid);
713 buffervalid += vfs_fread(&streambuffer[buffervalid], 1, 713 buffervalid += aud_vfs_fread(&streambuffer[buffervalid], 1,
714 BUFFER_SIZE-buffervalid, file); 714 BUFFER_SIZE-buffervalid, file);
715 bufferconsumed = 0; 715 bufferconsumed = 0;
716 716
717 ttemp = vfs_get_metadata(file, "stream-name"); 717 ttemp = aud_vfs_get_metadata(file, "stream-name");
718 718
719 if (ttemp != NULL) 719 if (ttemp != NULL)
720 stemp = vfs_get_metadata(file, "track-name"); 720 stemp = aud_vfs_get_metadata(file, "track-name");
721 721
722 if (stemp != NULL) 722 if (stemp != NULL)
723 { 723 {
724 static gchar *ostmp = NULL; 724 static gchar *ostmp = NULL;
725 725
752 { 752 {
753 buffervalid--; 753 buffervalid--;
754 memmove(streambuffer, &streambuffer[1], buffervalid); 754 memmove(streambuffer, &streambuffer[1], buffervalid);
755 if(buffervalid < BUFFER_SIZE) { 755 if(buffervalid < BUFFER_SIZE) {
756 buffervalid += 756 buffervalid +=
757 vfs_fread(&streambuffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); 757 aud_vfs_fread(&streambuffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file);
758 } 758 }
759 bufferconsumed = aac_probe(streambuffer, buffervalid); 759 bufferconsumed = aac_probe(streambuffer, buffervalid);
760 if(bufferconsumed) { 760 if(bufferconsumed) {
761 buffervalid -= bufferconsumed; 761 buffervalid -= bufferconsumed;
762 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid); 762 memmove(streambuffer, &streambuffer[bufferconsumed], buffervalid);
780 playback->output->close_audio(); 780 playback->output->close_audio();
781 buffer_playing = FALSE; 781 buffer_playing = FALSE;
782 playback->playing = 0; 782 playback->playing = 0;
783 faacDecClose(decoder); 783 faacDecClose(decoder);
784 g_free(xmmstitle); 784 g_free(xmmstitle);
785 vfs_fclose(file); 785 aud_vfs_fclose(file);
786 seekPosition = -1; 786 seekPosition = -1;
787 787
788 buffer_playing = FALSE; 788 buffer_playing = FALSE;
789 playback->playing = 0; 789 playback->playing = 0;
790 g_static_mutex_unlock(&mutex); 790 g_static_mutex_unlock(&mutex);
798 gboolean ret; 798 gboolean ret;
799 799
800 InputPlayback *playback = args; 800 InputPlayback *playback = args;
801 char *filename = playback->filename; 801 char *filename = playback->filename;
802 802
803 mp4fh = vfs_buffered_file_new_from_uri(filename); 803 mp4fh = aud_vfs_buffered_file_new_from_uri(filename);
804 804
805 g_static_mutex_lock(&mutex); 805 g_static_mutex_lock(&mutex);
806 seekPosition= -1; 806 seekPosition= -1;
807 buffer_playing= TRUE; 807 buffer_playing= TRUE;
808 g_static_mutex_unlock(&mutex); 808 g_static_mutex_unlock(&mutex);
811 return NULL; 811 return NULL;
812 812
813 ret = parse_aac_stream(mp4fh); 813 ret = parse_aac_stream(mp4fh);
814 814
815 if( ret == TRUE ) 815 if( ret == TRUE )
816 vfs_fseek(mp4fh, 0, SEEK_SET); 816 aud_vfs_fseek(mp4fh, 0, SEEK_SET);
817 else { 817 else {
818 vfs_fclose(mp4fh); 818 aud_vfs_fclose(mp4fh);
819 mp4fh = vfs_fopen(filename, "rb"); 819 mp4fh = aud_vfs_fopen(filename, "rb");
820 } 820 }
821 821
822 mp4cb->read = mp4_read_callback; 822 mp4cb->read = mp4_read_callback;
823 mp4cb->seek = mp4_seek_callback; 823 mp4cb->seek = mp4_seek_callback;
824 mp4cb->user_data = mp4fh; 824 mp4cb->user_data = mp4fh;