summaryrefslogtreecommitdiff
path: root/plugins/aac
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-08-22 21:57:07 +0200
committerGravatar waker <wakeroid@gmail.com>2011-08-22 21:57:07 +0200
commit9ae071efe4653a8b78aeca172b26af68a8ab4c6f (patch)
treedf51d9980e600f55649b108afa081f5ecb59ebaa /plugins/aac
parent9cbd09b81028679a507f751c206e8f6769fd450c (diff)
few minor improvements in raw aac code
Diffstat (limited to 'plugins/aac')
-rw-r--r--plugins/aac/aac.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/plugins/aac/aac.c b/plugins/aac/aac.c
index 6f3e4273..21384c2e 100644
--- a/plugins/aac/aac.c
+++ b/plugins/aac/aac.c
@@ -407,8 +407,8 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
int totalsamples = -1;
int offs = -1;
+ int skip = deadbeef->junk_get_leading_size (info->file);
if (!info->file->vfs->is_streaming ()) {
- int skip = deadbeef->junk_get_leading_size (info->file);
if (skip >= 0) {
deadbeef->fseek (info->file, skip, SEEK_SET);
}
@@ -565,14 +565,23 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
if (!info->mp4file) {
trace ("mp4 track not found, looking for aac stream...\n");
- // not an mp4, try raw aac
- deadbeef->rewind (info->file);
+ if (skip >= 0) {
+ deadbeef->fseek (info->file, skip, SEEK_SET);
+ }
+ else {
+ deadbeef->rewind (info->file);
+ }
if (parse_aac_stream (info->file, &samplerate, &channels, &duration, &totalsamples) == -1) {
trace ("aac stream not found\n");
return -1;
}
- deadbeef->rewind (info->file);
- trace ("found aac stream\n");
+ if (skip >= 0) {
+ deadbeef->fseek (info->file, skip, SEEK_SET);
+ }
+ else {
+ deadbeef->rewind (info->file);
+ }
+ trace ("found aac stream (junk: %d, offs: %d)\n", skip, offs);
}
_info->fmt.channels = channels;
@@ -607,6 +616,7 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("NeAACDecOpen\n");
info->dec = NeAACDecOpen ();
+ trace ("prepare for NeAACDecInit: fread %d from offs %lld\n", AAC_BUFFER_SIZE, deadbeef->ftell (info->file));
info->remaining = deadbeef->fread (info->buffer, 1, AAC_BUFFER_SIZE, info->file);
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (info->dec);
@@ -614,9 +624,9 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
NeAACDecSetConfiguration (info->dec, conf);
unsigned long srate;
unsigned char ch;
- trace ("NeAACDecInit\n");
+ trace ("NeAACDecInit (%d bytes)\n", info->remaining);
int consumed = NeAACDecInit (info->dec, info->buffer, info->remaining, &srate, &ch);
- trace ("NeAACDecInit returned samplerate=%d, channels=%d\n", (int)srate, (int)ch);
+ trace ("NeAACDecInit returned samplerate=%d, channels=%d, consumed: %d\n", (int)srate, (int)ch, consumed);
if (consumed < 0) {
trace ("NeAACDecInit returned %d\n", consumed);
return -1;
@@ -841,22 +851,37 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
}
else {
if (info->remaining < AAC_BUFFER_SIZE) {
+ trace ("fread from offs %lld\n", deadbeef->ftell (info->file));
size_t res = deadbeef->fread (info->buffer + info->remaining, 1, AAC_BUFFER_SIZE-info->remaining, info->file);
if (res == 0) {
eof = 1;
}
info->remaining += res;
+ if (!info->remaining) {
+ break;
+ }
}
+ trace ("NeAACDecDecode %d bytes\n", info->remaining)
samples = NeAACDecDecode (info->dec, &info->frame_info, info->buffer, info->remaining);
if (!samples) {
- trace ("NeAACDecDecode failed, consumed=%d\n", info->frame_info.bytesconsumed);
+ trace ("NeAACDecDecode failed with error %s (%d), consumed=%d\n", NeAACDecGetErrorMessage(info->frame_info.error), (int)info->frame_info.error, info->frame_info.bytesconsumed);
+
if (info->num_errors > 10) {
trace ("NeAACDecDecode failed %d times, interrupting\n", info->num_errors);
break;
}
info->num_errors++;
- info->remaining = 0;
+ int s = 0;
+ while (!s && info->remaining > 0) {
+ int ch, sr, br, sm;
+ s = aac_sync (info->buffer, &ch, &sr, &br, &sm);
+ if (s == 0) {
+ memmove (info->buffer, info->buffer+1, info->remaining-1);
+ info->remaining--;
+ }
+ }
+// info->remaining = 0;
continue;
}
info->num_errors=0;
@@ -881,6 +906,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
}
info->currentsample += (initsize-size) / samplesize;
+ trace ("aac_read return: %d\n", initsize-size);
return initsize-size;
}
@@ -1164,6 +1190,11 @@ aac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
trace ("not found\n");
return NULL;
}
+ int skip = deadbeef->junk_get_leading_size (fp);
+ if (skip > 0) {
+ trace ("mpgmad: skipping %d bytes (tag)\n", skip);
+ deadbeef->fseek(fp, skip, SEEK_SET);
+ }
const char *ftype = NULL;
float duration = -1;