* NAME: free_bitrate() * DESCRIPTION: attempt to discover the bitstream's free bitrate */
| 232 | * DESCRIPTION: attempt to discover the bitstream's free bitrate |
| 233 | */ |
| 234 | static |
| 235 | int 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 |
no test coverage detected