summaryrefslogtreecommitdiff
path: root/plugins/aac
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-03-21 22:05:01 +0100
committerGravatar waker <wakeroid@gmail.com>2011-03-21 22:05:01 +0100
commit63d20539742a50dee44f13325825ee72efd284cb (patch)
treed0852a81ba8bc8fc6ce885ac0d48bb789c86657e /plugins/aac
parentb4d4b4d333359091e4b056d8a3fc48448fb60104 (diff)
fixed downsampled aac duration / seeking
Diffstat (limited to 'plugins/aac')
-rw-r--r--plugins/aac/aac.c28
-rw-r--r--plugins/aac/aac_parser.c3
2 files changed, 20 insertions, 11 deletions
diff --git a/plugins/aac/aac.c b/plugins/aac/aac.c
index 332870e0..903b189e 100644
--- a/plugins/aac/aac.c
+++ b/plugins/aac/aac.c
@@ -229,6 +229,7 @@ parse_aac_stream(DB_FILE *fp, int *psamplerate, int *pchannels, float *pduration
}
*psamplerate = stream_sr;
+
*pchannels = stream_ch;
if (ptotalsamples) {
@@ -243,6 +244,10 @@ parse_aac_stream(DB_FILE *fp, int *psamplerate, int *pchannels, float *pduration
trace ("aac: duration=%f (%d samples @ %d Hz), fsize=%d\n", *pduration, totalsamples, stream_sr, fsize);
}
+ if (*psamplerate <= 24000) {
+ *psamplerate *= 2;
+ *ptotalsamples *= 2;
+ }
return firstframepos;
}
@@ -675,6 +680,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
if (info->currentsample + size / samplesize > info->endsample) {
size = (info->endsample - info->currentsample + 1) * samplesize;
if (size <= 0) {
+ trace ("aac_read: eof");
return 0;
}
}
@@ -870,13 +876,6 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
// returns -1 on error, 0 on success
int
seek_raw_aac (aac_info_t *info, int sample) {
- deadbeef->rewind (info->file);
- int skip = deadbeef->junk_get_leading_size (info->file);
- if (skip >= 0) {
- deadbeef->fseek (info->file, skip, SEEK_SET);
- }
-
- int offs = deadbeef->ftell (info->file);
uint8_t buf[ADTS_HEADER_SIZE*8];
int nsamples = 0;
@@ -909,7 +908,7 @@ seek_raw_aac (aac_info_t *info, int sample) {
continue;
}
else {
- //trace ("aac: frame #%d sync: %d %d %d %d %d\n", frame, channels, samplerate, bitrate, samples, size);
+ //trace ("aac: frame #%d(%d/%d) sync: %d %d %d %d %d\n", frame, curr_sample, sample, channels, samplerate, bitrate, frame_samples, size);
frame++;
if (deadbeef->fseek (info->file, size-sizeof(buf), SEEK_CUR) == -1) {
trace ("seek_raw_aac: invalid seek %d\n", size-sizeof(buf));
@@ -917,6 +916,9 @@ seek_raw_aac (aac_info_t *info, int sample) {
}
bufsize = 0;
}
+ if (samplerate <= 24000) {
+ frame_samples *= 2;
+ }
} while (curr_sample + frame_samples < sample);
if (curr_sample + frame_samples < sample) {
@@ -936,6 +938,16 @@ aac_seek_sample (DB_fileinfo_t *_info, int sample) {
info->skipsamples = sample - info->mp4sample * (info->mp4framesize-1);
}
else {
+ if (sample < info->currentsample, 1) {
+ int skip = deadbeef->junk_get_leading_size (info->file);
+ if (skip >= 0) {
+ deadbeef->fseek (info->file, skip, SEEK_SET);
+ }
+ else {
+ deadbeef->fseek (info->file, 0, SEEK_SET);
+ }
+ }
+
int res = seek_raw_aac (info, sample);
if (res < 0) {
return -1;
diff --git a/plugins/aac/aac_parser.c b/plugins/aac/aac_parser.c
index 7ab63d42..07c1ca6a 100644
--- a/plugins/aac/aac_parser.c
+++ b/plugins/aac/aac_parser.c
@@ -93,9 +93,6 @@ aac_sync(const uint8_t *buf, int *channels, int *sample_rate, int *bit_rate, int
*channels = aac_channels[channel_conf];
*sample_rate = aac_sample_rates[sample_freq_index];
- if (*sample_rate <= 24000) {
- *sample_rate *= 2;
- }
*samples = rdb * 1024;
if (*channels <= 0 || *sample_rate <= 0 || *samples <= 0) {
return 0;