summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroman.artiukhin <bahusdrive@gmail.com>2023-09-18 13:14:47 +0300
committerSolomon Peachy <pizza@shaftnet.org>2023-09-19 11:13:19 -0400
commit001a338e5126cbec422867481ef7485b1b3c8eea (patch)
tree6593e544ee074ca86f79df7d9f04814ce21c323d
parentef7d6009b4f8b2e64d6ced27bc97aad0b520271e (diff)
downloadrockbox-001a338e5126cbec422867481ef7485b1b3c8eea.tar.gz
rockbox-001a338e5126cbec422867481ef7485b1b3c8eea.zip
Codecs: mp4: Reuse lookup_table index from seek in m4a_check_sample_offset
Change-Id: If2fc3038ce8db8ddf2991406a5cce294a857eadc
-rw-r--r--lib/rbcodec/codecs/aac.c5
-rw-r--r--lib/rbcodec/codecs/alac.c7
-rw-r--r--lib/rbcodec/codecs/libm4a/m4a.c6
-rw-r--r--lib/rbcodec/codecs/libm4a/m4a.h4
4 files changed, 12 insertions, 10 deletions
diff --git a/lib/rbcodec/codecs/aac.c b/lib/rbcodec/codecs/aac.c
index 0a4313e69e..11a84cfa24 100644
--- a/lib/rbcodec/codecs/aac.c
+++ b/lib/rbcodec/codecs/aac.c
@@ -138,7 +138,7 @@ enum codec_status codec_run(void)
138 * upsampling files the resulting sound_samples_done must be expanded 138 * upsampling files the resulting sound_samples_done must be expanded
139 * by a factor of 2. This is done via using sbr_fac. */ 139 * by a factor of 2. This is done via using sbr_fac. */
140 if (m4a_seek_raw(&demux_res, &input_stream, file_offset, 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 sound_samples_done *= sbr_fac; 142 sound_samples_done *= sbr_fac;
143 } else { 143 } else {
144 sound_samples_done = 0; 144 sound_samples_done = 0;
@@ -173,11 +173,10 @@ enum codec_status codec_run(void)
173 * by a factor 2. This is done via using sbr_fac. */ 173 * by a factor 2. This is done via using sbr_fac. */
174 if (m4a_seek(&demux_res, &input_stream, 174 if (m4a_seek(&demux_res, &input_stream,
175 (uint64_t) param * ci->id3->frequency / sbr_fac / 1000ULL, 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 sound_samples_done *= sbr_fac; 177 sound_samples_done *= sbr_fac;
178 elapsed_time = sound_samples_done * 1000LL / ci->id3->frequency; 178 elapsed_time = sound_samples_done * 1000LL / ci->id3->frequency;
179 ci->set_elapsed(elapsed_time); 179 ci->set_elapsed(elapsed_time);
180 seek_idx = 0;
181 180
182 if (i == 0) 181 if (i == 0)
183 { 182 {
diff --git a/lib/rbcodec/codecs/alac.c b/lib/rbcodec/codecs/alac.c
index 141c5d6f91..7139b629b8 100644
--- a/lib/rbcodec/codecs/alac.c
+++ b/lib/rbcodec/codecs/alac.c
@@ -64,6 +64,7 @@ enum codec_status codec_run(void)
64 unsigned long resume_time; 64 unsigned long resume_time;
65 uint32_t resume_offset; 65 uint32_t resume_offset;
66 unsigned int did_resume; 66 unsigned int did_resume;
67 int lookup_table_idx = 0;
67 68
68 /* Clean and initialize decoder structures */ 69 /* Clean and initialize decoder structures */
69 memset(&demux_res , 0, sizeof(demux_res)); 70 memset(&demux_res , 0, sizeof(demux_res));
@@ -96,10 +97,10 @@ enum codec_status codec_run(void)
96 if (resume_time) 97 if (resume_time)
97 did_resume = m4a_seek(&demux_res, &input_stream, 98 did_resume = m4a_seek(&demux_res, &input_stream,
98 (uint64_t)resume_time * ci->id3->frequency / 1000ULL, 99 (uint64_t)resume_time * ci->id3->frequency / 1000ULL,
99 &samplesdone, (int *) &i); 100 &samplesdone, (int *) &i, &lookup_table_idx);
100 else if (resume_offset) 101 else if (resume_offset)
101 did_resume = m4a_seek_raw(&demux_res, &input_stream, resume_offset, 102 did_resume = m4a_seek_raw(&demux_res, &input_stream, resume_offset,
102 &samplesdone, (int *) &i); 103 &samplesdone, (int *) &i, &lookup_table_idx);
103 else 104 else
104 did_resume = 0; 105 did_resume = 0;
105 106
@@ -122,7 +123,7 @@ enum codec_status codec_run(void)
122 if (action == CODEC_ACTION_SEEK_TIME) { 123 if (action == CODEC_ACTION_SEEK_TIME) {
123 if (m4a_seek(&demux_res, &input_stream, 124 if (m4a_seek(&demux_res, &input_stream,
124 (uint64_t)param * ci->id3->frequency / 1000ULL, 125 (uint64_t)param * ci->id3->frequency / 1000ULL,
125 &samplesdone, (int *) &i)) 126 &samplesdone, (int *) &i, &lookup_table_idx))
126 set_elapsed_samples(samplesdone); 127 set_elapsed_samples(samplesdone);
127 128
128 ci->seek_complete(); 129 ci->seek_complete();
diff --git a/lib/rbcodec/codecs/libm4a/m4a.c b/lib/rbcodec/codecs/libm4a/m4a.c
index 958d0b1575..6adc58dab0 100644
--- a/lib/rbcodec/codecs/libm4a/m4a.c
+++ b/lib/rbcodec/codecs/libm4a/m4a.c
@@ -141,7 +141,7 @@ int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *st
141 * sound_samples_done and current_sample), 0 if failed. */ 141 * sound_samples_done and current_sample), 0 if failed. */
142unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream, 142unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream,
143 uint64_t sound_sample_loc, uint64_t* sound_samples_done, 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 uint32_t i, sample_i; 146 uint32_t i, sample_i;
147 uint32_t time, time_cnt, time_dur; 147 uint32_t time, time_cnt, time_dur;
@@ -189,6 +189,7 @@ unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream,
189 189
190 /* The preceding chunk is the one that contains 'sample_i'. */ 190 /* The preceding chunk is the one that contains 'sample_i'. */
191 chunk--; 191 chunk--;
192 *lookup_table_idx = chunk;
192 chunk_first_sample = tco_tab[chunk].sample; 193 chunk_first_sample = tco_tab[chunk].sample;
193 offset = tco_tab[chunk].offset; 194 offset = tco_tab[chunk].offset;
194 195
@@ -265,7 +266,7 @@ unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream,
265 */ 266 */
266unsigned int m4a_seek_raw(demux_res_t* demux_res, stream_t* stream, 267unsigned int m4a_seek_raw(demux_res_t* demux_res, stream_t* stream,
267 uint32_t file_loc, uint64_t* sound_samples_done, 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 uint32_t i; 271 uint32_t i;
271 uint32_t chunk_sample = 0; 272 uint32_t chunk_sample = 0;
@@ -283,6 +284,7 @@ unsigned int m4a_seek_raw(demux_res_t* demux_res, stream_t* stream,
283 break; 284 break;
284 } 285 }
285 i = (i>0) ? i-1 : 0; /* We want the last chunk _before_ file_loc. */ 286 i = (i>0) ? i-1 : 0; /* We want the last chunk _before_ file_loc. */
287 *lookup_table_idx = i;
286 chunk_sample = demux_res->lookup_table[i].sample; 288 chunk_sample = demux_res->lookup_table[i].sample;
287 new_pos = demux_res->lookup_table[i].offset; 289 new_pos = demux_res->lookup_table[i].offset;
288 290
diff --git a/lib/rbcodec/codecs/libm4a/m4a.h b/lib/rbcodec/codecs/libm4a/m4a.h
index 475773834c..bcc32f53bb 100644
--- a/lib/rbcodec/codecs/libm4a/m4a.h
+++ b/lib/rbcodec/codecs/libm4a/m4a.h
@@ -131,9 +131,9 @@ void stream_create(stream_t *stream,struct codec_api* ci);
131unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample); 131unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample);
132unsigned int m4a_seek (demux_res_t* demux_res, stream_t* stream, 132unsigned int m4a_seek (demux_res_t* demux_res, stream_t* stream,
133 uint64_t sound_sample_loc, uint64_t* sound_samples_done, 133 uint64_t sound_sample_loc, uint64_t* sound_samples_done,
134 int* current_sample); 134 int* current_sample, int* lookup_table_idx);
135unsigned int m4a_seek_raw (demux_res_t* demux_res, stream_t* stream, 135unsigned 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);
137int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start); 137int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start);
138 138
139#endif /* STREAM_H */ 139#endif /* STREAM_H */