Mercurial > audlegacy-plugins
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; |