diff options
-rw-r--r-- | plugins/aac/aac.c | 35 | ||||
-rw-r--r-- | plugins/libmp4ff/mp4atom.c | 3 | ||||
-rw-r--r-- | plugins/libmp4ff/mp4ff.c | 41 | ||||
-rw-r--r-- | plugins/libmp4ff/mp4ff.h | 2 |
4 files changed, 73 insertions, 8 deletions
diff --git a/plugins/aac/aac.c b/plugins/aac/aac.c index 076694b2..60479504 100644 --- a/plugins/aac/aac.c +++ b/plugins/aac/aac.c @@ -264,7 +264,7 @@ mp4_track_get_info(mp4ff_t *mp4, int track, float *duration, int *samplerate, in } if (totalsamples) { *totalsamples = total_dur * (*samplerate) / mp4ff_time_scale (mp4, track); - *mp4framesize = (*totalsamples) / i_sample; + *mp4framesize = (*totalsamples) / i_sample_count; } *duration = total_dur / (float)mp4ff_time_scale (mp4, track); @@ -529,6 +529,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) { while (size > 0) { if (info->skipsamples > 0 && info->out_remaining > 0) { int skip = min (info->out_remaining, info->skipsamples); +// trace ("skipping %d\n", skip); if (skip < info->out_remaining) { memmove (info->out_buffer, info->out_buffer + skip * samplesize, (info->out_remaining - skip) * samplesize); } @@ -669,7 +670,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) { samples = NeAACDecDecode (info->dec, &info->frame_info, info->buffer, info->remaining); trace ("samples =%p\n", samples); if (!samples) { - trace ("NeAACDecDecode failed with error %s (%d), consumed=%d\n", NeAACDecGetErrorMessage(info->frame_info.error), (int)info->frame_info.error, info->frame_info.bytesconsumed); + trace ("NeAACDecDecode failed with error %s (%d), consumed=%d\n", NeAACDecGetErrorMessage(info->frame_info.error), (int)info->frame_info.error, (int)info->frame_info.bytesconsumed); if (info->num_errors > 10) { trace ("NeAACDecDecode failed %d times, interrupting\n", info->num_errors); @@ -701,6 +702,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) { } info->currentsample += (initsize-size) / samplesize; + return initsize-size; } @@ -763,11 +765,32 @@ static int aac_seek_sample (DB_fileinfo_t *_info, int sample) { aac_info_t *info = (aac_info_t *)_info; + trace ("seek: start %d + %d\n", info->startsample, sample); + sample += info->startsample; if (info->mp4) { - int scale = info->mp4framesize; - info->mp4sample = sample / scale; - info->skipsamples = sample - info->mp4sample * scale; + int totalsamples = 0; + int i; + int num_sample_byte_sizes = mp4ff_get_num_sample_byte_sizes (info->mp4, info->mp4track); + int scale = _info->fmt.samplerate / mp4ff_time_scale (info->mp4, info->mp4track); + for (i = 0; i < num_sample_byte_sizes; i++) + { + unsigned int thissample_duration = 0; + unsigned int thissample_bytesize = 0; + + mp4ff_get_sample_info(info->mp4, info->mp4track, i, &thissample_duration, + &thissample_bytesize); + + if (totalsamples + thissample_duration > sample / scale) { + info->skipsamples = sample - totalsamples * scale; + break; + } + totalsamples += thissample_duration; + } +// i = sample / info->mp4framesize; +// info->skipsamples = sample - info->mp4sample * info->mp4framesize; + info->mp4sample = i; + trace ("seek res: frame %d (old: %d*%d), skip %d\n", info->mp4sample, sample / info->mp4framesize, info->mp4framesize, info->skipsamples); } else { int skip = deadbeef->junk_get_leading_size (info->file); @@ -1100,7 +1123,7 @@ aac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) { int i; for (i = 0; i < ntracks; i++) { if (mp4ff_get_track_type (mp4, i) != TRACK_AUDIO) { - trace ("aac: track %d is not audio\n"); + trace ("aac: track %d is not audio\n", i); continue; } int mp4framesize; diff --git a/plugins/libmp4ff/mp4atom.c b/plugins/libmp4ff/mp4atom.c index aa638c80..9776c17b 100644 --- a/plugins/libmp4ff/mp4atom.c +++ b/plugins/libmp4ff/mp4atom.c @@ -290,8 +290,7 @@ static int32_t mp4ff_read_stsz(mp4ff_t *f) if (f->track[f->total_tracks - 1]->stsz_sample_size == 0) { int32_t i; - f->track[f->total_tracks - 1]->stsz_table = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stsz_sample_count*sizeof(int32_t)); + f->track[f->total_tracks - 1]->stsz_table = (int32_t*)malloc(f->track[f->total_tracks - 1]->stsz_sample_count*sizeof(int32_t)); for (i = 0; i < f->track[f->total_tracks - 1]->stsz_sample_count; i++) { diff --git a/plugins/libmp4ff/mp4ff.c b/plugins/libmp4ff/mp4ff.c index 2b396ec0..4e116d8f 100644 --- a/plugins/libmp4ff/mp4ff.c +++ b/plugins/libmp4ff/mp4ff.c @@ -409,6 +409,47 @@ int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const i return (int32_t)(-1); } +int32_t mp4ff_get_num_sample_byte_sizes (const mp4ff_t *f, const int32_t track) { + return f->track[track]->stsz_sample_count; +} + +int32_t mp4ff_get_sample_info(const mp4ff_t *f, const int32_t track, const int32_t samplenum, uint32_t *sample_duration, uint32_t *sample_byte_size) { +// num_sample_byte_sizes --- stsz_sample_count +// num_time_to_samples --- stts_entry_count +// time_to_sample[i].sample_count --- p_track->stts_sample_count[i] +// time_to_sample[i].sample_duration --- p_track->stts_sample_delta[i] +// sample_byte_size[i] --- p_track->stsz_table[i] + unsigned int duration_index_accum = 0; + unsigned int duration_cur_index = 0; + + if (samplenum >= f->track[track]->stsz_sample_count) + { + fprintf(stderr, "sample %i does not exist\n", samplenum); + return 0; + } + + if (!f->track[track]->stts_entry_count) + { + fprintf(stderr, "no time to samples\n"); + return 0; + } + while ((f->track[track]->stts_sample_count[duration_cur_index] + duration_index_accum) <= samplenum) + { + duration_index_accum += f->track[track]->stts_sample_count[duration_cur_index]; + duration_cur_index++; + if (duration_cur_index >= f->track[track]->stts_entry_count) + { + fprintf(stderr, "sample %i does not have a duration\n", samplenum); + return 0; + } + } + + *sample_duration = f->track[track]->stts_sample_delta[duration_cur_index]; + *sample_byte_size = f->track[track]->stsz_table[samplenum]; + + return 1; +} + int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample) { int32_t i, co = 0; diff --git a/plugins/libmp4ff/mp4ff.h b/plugins/libmp4ff/mp4ff.h index b47bcb8e..3936ebb1 100644 --- a/plugins/libmp4ff/mp4ff.h +++ b/plugins/libmp4ff/mp4ff.h @@ -48,6 +48,8 @@ mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f); mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f); void mp4ff_close(mp4ff_t *f); int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_get_num_sample_byte_sizes (const mp4ff_t *f, const int32_t track); +int32_t mp4ff_get_sample_info(const mp4ff_t *f, const int32_t track, const int32_t samplenum, uint32_t *sample_duration, uint32_t *sample_byte_size); int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample); int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample); int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); |