summaryrefslogtreecommitdiff
path: root/plugins/aac/aac.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-12-04 12:33:20 +0100
committerGravatar waker <wakeroid@gmail.com>2011-12-04 12:33:20 +0100
commitf712c5859019ce3e9737981fb9733f65a2d21af1 (patch)
tree84e41248ae144652a26719ebd7da02fcecfa06cd /plugins/aac/aac.c
parent642d0cee5abbca27e4350a2d0c256551547d0c48 (diff)
aac: fixed seek and duration calc in mp4 aac code
Diffstat (limited to 'plugins/aac/aac.c')
-rw-r--r--plugins/aac/aac.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/plugins/aac/aac.c b/plugins/aac/aac.c
index 80132cc3..a4ab8f53 100644
--- a/plugins/aac/aac.c
+++ b/plugins/aac/aac.c
@@ -462,8 +462,6 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("mp4 track: %d\n", i);
int samples = mp4ff_num_samples(info->mp4file, i);
info->mp4samples = samples;
- trace ("mp4 mp4samples=%d, nsamples=%d, samplerate=%d\n", samples, samples * 1024, samplerate);
- totalsamples = samples;
info->mp4track = i;
// init mp4 decoding
@@ -476,6 +474,8 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
}
samplerate = srate;
channels = ch;
+ samples = (int64_t)samples * srate / mp4ff_time_scale (info->mp4file, i);
+ totalsamples = samples;
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (info->dec);
conf->dontUpSampleImplicitSBR = 1;
NeAACDecSetConfiguration (info->dec, conf);
@@ -658,6 +658,7 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->endsample = totalsamples-1;
}
}
+ trace ("totalsamples: %d, endsample: %d, samples-from-duration: %d\n", totalsamples-1, info->endsample, (int)deadbeef->pl_get_item_duration (it)*44100);
for (int i = 0; i < _info->fmt.channels; i++) {
_info->fmt.channelmask |= 1 << i;
@@ -702,7 +703,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");
+ trace ("aac_read: eof (current=%d, total=%d)\n", info->currentsample, info->endsample);
return 0;
}
}
@@ -903,7 +904,6 @@ 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;
}
@@ -968,8 +968,9 @@ aac_seek_sample (DB_fileinfo_t *_info, int sample) {
sample += info->startsample;
if (info->mp4file) {
- info->mp4sample = sample / (info->mp4framesize-1);
- info->skipsamples = sample - info->mp4sample * (info->mp4framesize-1);
+ int scale = _info->fmt.samplerate / mp4ff_time_scale (info->mp4file, info->mp4track) * info->mp4framesize;
+ info->mp4sample = sample / scale;
+ info->skipsamples = sample - info->mp4sample * scale;
}
else {
int skip = deadbeef->junk_get_leading_size (info->file);