Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Codecs: mp4: Reuse lookup_table index from seek in m4a_check_sample_offset

Change-Id: If2fc3038ce8db8ddf2991406a5cce294a857eadc

authored by

roman.artiukhin and committed by
Solomon Peachy
001a338e ef7d6009

+12 -10
+2 -3
lib/rbcodec/codecs/aac.c
··· 138 138 * upsampling files the resulting sound_samples_done must be expanded 139 139 * by a factor of 2. This is done via using sbr_fac. */ 140 140 if (m4a_seek_raw(&demux_res, &input_stream, file_offset, 141 - &sound_samples_done, (int*) &i)) { 141 + &sound_samples_done, (int*) &i, &seek_idx)) { 142 142 sound_samples_done *= sbr_fac; 143 143 } else { 144 144 sound_samples_done = 0; ··· 173 173 * by a factor 2. This is done via using sbr_fac. */ 174 174 if (m4a_seek(&demux_res, &input_stream, 175 175 (uint64_t) param * ci->id3->frequency / sbr_fac / 1000ULL, 176 - &sound_samples_done, (int*) &i)) { 176 + &sound_samples_done, (int*) &i, &seek_idx)) { 177 177 sound_samples_done *= sbr_fac; 178 178 elapsed_time = sound_samples_done * 1000LL / ci->id3->frequency; 179 179 ci->set_elapsed(elapsed_time); 180 - seek_idx = 0; 181 180 182 181 if (i == 0) 183 182 {
+4 -3
lib/rbcodec/codecs/alac.c
··· 64 64 unsigned long resume_time; 65 65 uint32_t resume_offset; 66 66 unsigned int did_resume; 67 + int lookup_table_idx = 0; 67 68 68 69 /* Clean and initialize decoder structures */ 69 70 memset(&demux_res , 0, sizeof(demux_res)); ··· 96 97 if (resume_time) 97 98 did_resume = m4a_seek(&demux_res, &input_stream, 98 99 (uint64_t)resume_time * ci->id3->frequency / 1000ULL, 99 - &samplesdone, (int *) &i); 100 + &samplesdone, (int *) &i, &lookup_table_idx); 100 101 else if (resume_offset) 101 102 did_resume = m4a_seek_raw(&demux_res, &input_stream, resume_offset, 102 - &samplesdone, (int *) &i); 103 + &samplesdone, (int *) &i, &lookup_table_idx); 103 104 else 104 105 did_resume = 0; 105 106 ··· 122 123 if (action == CODEC_ACTION_SEEK_TIME) { 123 124 if (m4a_seek(&demux_res, &input_stream, 124 125 (uint64_t)param * ci->id3->frequency / 1000ULL, 125 - &samplesdone, (int *) &i)) 126 + &samplesdone, (int *) &i, &lookup_table_idx)) 126 127 set_elapsed_samples(samplesdone); 127 128 128 129 ci->seek_complete();
+4 -2
lib/rbcodec/codecs/libm4a/m4a.c
··· 141 141 * sound_samples_done and current_sample), 0 if failed. */ 142 142 unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream, 143 143 uint64_t sound_sample_loc, uint64_t* sound_samples_done, 144 - int* current_sample) 144 + int* current_sample, int* lookup_table_idx) 145 145 { 146 146 uint32_t i, sample_i; 147 147 uint32_t time, time_cnt, time_dur; ··· 189 189 190 190 /* The preceding chunk is the one that contains 'sample_i'. */ 191 191 chunk--; 192 + *lookup_table_idx = chunk; 192 193 chunk_first_sample = tco_tab[chunk].sample; 193 194 offset = tco_tab[chunk].offset; 194 195 ··· 265 266 */ 266 267 unsigned int m4a_seek_raw(demux_res_t* demux_res, stream_t* stream, 267 268 uint32_t file_loc, uint64_t* sound_samples_done, 268 - int* current_sample) 269 + int* current_sample, int* lookup_table_idx) 269 270 { 270 271 uint32_t i; 271 272 uint32_t chunk_sample = 0; ··· 283 284 break; 284 285 } 285 286 i = (i>0) ? i-1 : 0; /* We want the last chunk _before_ file_loc. */ 287 + *lookup_table_idx = i; 286 288 chunk_sample = demux_res->lookup_table[i].sample; 287 289 new_pos = demux_res->lookup_table[i].offset; 288 290
+2 -2
lib/rbcodec/codecs/libm4a/m4a.h
··· 131 131 unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample); 132 132 unsigned int m4a_seek (demux_res_t* demux_res, stream_t* stream, 133 133 uint64_t sound_sample_loc, uint64_t* sound_samples_done, 134 - int* current_sample); 134 + int* current_sample, int* lookup_table_idx); 135 135 unsigned int m4a_seek_raw (demux_res_t* demux_res, stream_t* stream, 136 - uint32_t file_loc, uint64_t* sound_samples_done, int* current_sample); 136 + uint32_t file_loc, uint64_t* sound_samples_done, int* current_sample, int* lookup_table_idx); 137 137 int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start); 138 138 139 139 #endif /* STREAM_H */