MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / free_bitrate

Function free_bitrate

modules/data/mp3/libmad/frame.c:234–290  ·  view source on GitHub ↗

* NAME: free_bitrate() * DESCRIPTION: attempt to discover the bitstream's free bitrate */

Source from the content-addressed store, hash-verified

232 * DESCRIPTION: attempt to discover the bitstream's free bitrate
233 */
234static
235int free_bitrate(struct mad_stream *stream, struct mad_header const *header)
236{
237 struct mad_bitptr keep_ptr;
238 unsigned long rate = 0;
239 unsigned int pad_slot, slots_per_frame;
240 unsigned char const *ptr = 0;
241
242 keep_ptr = stream->ptr;
243
244 pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0;
245 slots_per_frame = (header->layer == MAD_LAYER_III &&
246 (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144;
247
248 while (mad_stream_sync(stream) == 0) {
249 struct mad_stream peek_stream;
250 struct mad_header peek_header;
251
252 peek_stream = *stream;
253 peek_header = *header;
254
255 if (decode_header(&peek_header, &peek_stream) == 0 &&
256 peek_header.layer == header->layer &&
257 peek_header.samplerate == header->samplerate) {
258 unsigned int N;
259
260 ptr = mad_bit_nextbyte(&stream->ptr);
261
262 N = ptr - stream->this_frame;
263
264 if (header->layer == MAD_LAYER_I) {
265 rate = (unsigned long) header->samplerate *
266 (N - 4 * pad_slot + 4) / 48 / 1000;
267 }
268 else {
269 rate = (unsigned long) header->samplerate *
270 (N - pad_slot + 1) / slots_per_frame / 1000;
271 }
272
273 if (rate >= 8)
274 break;
275 }
276
277 mad_bit_skip(&stream->ptr, 8);
278 }
279
280 stream->ptr = keep_ptr;
281
282 if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) {
283 stream->error = MAD_ERROR_LOSTSYNC;
284 return -1;
285 }
286
287 stream->freerate = rate * 1000;
288
289 return 0;
290}
291

Callers 1

mad_header_decodeFunction · 0.85

Calls 4

mad_stream_syncFunction · 0.85
decode_headerFunction · 0.85
mad_bit_nextbyteFunction · 0.85
mad_bit_skipFunction · 0.85

Tested by

no test coverage detected