diff options
author | roman.artiukhin <bahusdrive@gmail.com> | 2023-09-18 13:14:47 +0300 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2023-09-19 11:13:19 -0400 |
commit | 001a338e5126cbec422867481ef7485b1b3c8eea (patch) | |
tree | 6593e544ee074ca86f79df7d9f04814ce21c323d /lib | |
parent | ef7d6009b4f8b2e64d6ced27bc97aad0b520271e (diff) | |
download | rockbox-001a338e5126cbec422867481ef7485b1b3c8eea.tar.gz rockbox-001a338e5126cbec422867481ef7485b1b3c8eea.zip |
Codecs: mp4: Reuse lookup_table index from seek in m4a_check_sample_offset
Change-Id: If2fc3038ce8db8ddf2991406a5cce294a857eadc
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rbcodec/codecs/aac.c | 5 | ||||
-rw-r--r-- | lib/rbcodec/codecs/alac.c | 7 | ||||
-rw-r--r-- | lib/rbcodec/codecs/libm4a/m4a.c | 6 | ||||
-rw-r--r-- | lib/rbcodec/codecs/libm4a/m4a.h | 4 |
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. */ |
142 | unsigned int m4a_seek(demux_res_t* demux_res, stream_t* stream, | 142 | unsigned 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 | */ |
266 | unsigned int m4a_seek_raw(demux_res_t* demux_res, stream_t* stream, | 267 | unsigned 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); | |||
131 | unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample); | 131 | unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample); |
132 | unsigned int m4a_seek (demux_res_t* demux_res, stream_t* stream, | 132 | unsigned 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); |
135 | unsigned int m4a_seek_raw (demux_res_t* demux_res, stream_t* stream, | 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 | int m4a_check_sample_offset(demux_res_t *demux_res, uint32_t frame, uint32_t *start); | 137 | int 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 */ |