/** * Unpack an RFC4867 speech frame into the AMR frame mode and parameters. * * The order of speech bits is specified by 3GPP TS 26.101. * * @param p the context * @param buf pointer to the input buffer * @param buf_size size of the input buffer * * @return the frame mode */ static enum Mode unpack_bitstream(AMRContext *p, const uint8_t *buf, int buf_size) { enum Mode mode; // Decode the first octet. mode = buf[0] >> 3 & 0x0F; // frame type p->bad_frame_indicator = (buf[0] & 0x4) != 0x4; // quality bit if (mode >= N_MODES || buf_size < frame_sizes_nb[mode] + 1) { return NO_DATA; } if (mode < MODE_DTX) ff_amr_bit_reorder((uint16_t *) &p->frame, sizeof(AMRNBFrame), buf + 1, amr_unpacking_bitmaps_per_mode[mode]); return mode; }
/** * Unpack an RFC4867 speech frame into the AMR frame mode and parameters. * * The order of speech bits is specified by 3GPP TS 26.101. * * @param p the context * @param buf pointer to the input buffer * @param buf_size size of the input buffer * * @return the frame mode */ static enum Mode unpack_bitstream(AMRContext *p, const uint8_t *buf, int buf_size) { GetBitContext gb; enum Mode mode; init_get_bits(&gb, buf, buf_size * 8); // Decode the first octet. skip_bits(&gb, 1); // padding bit mode = get_bits(&gb, 4); // frame type p->bad_frame_indicator = !get_bits1(&gb); // quality bit skip_bits(&gb, 2); // two padding bits if (mode < MODE_DTX) ff_amr_bit_reorder((uint16_t *) &p->frame, sizeof(AMRNBFrame), buf + 1, amr_unpacking_bitmaps_per_mode[mode]); return mode; }