static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
{
    GetBitContext gb;
    DssSpFrame *fparam = &p->fparam;
    int i;
    int subframe_idx;
    uint32_t combined_pitch;
    uint32_t tmp;
    uint32_t pitch_lag;

    for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
        p->bits[i]     = src[i + 1];
        p->bits[i + 1] = src[i];
    }

    init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);

    for (i = 0; i < 2; i++)
        fparam->filter_idx[i] = get_bits(&gb, 5);
    for (; i < 8; i++)
        fparam->filter_idx[i] = get_bits(&gb, 4);
    for (; i < 14; i++)
        fparam->filter_idx[i] = get_bits(&gb, 3);

    for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
        fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);

        fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);

        fparam->sf[subframe_idx].gain = get_bits(&gb, 6);

        for (i = 0; i < 7; i++)
            fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
    }

    for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
        unsigned int C72_binomials[PULSE_MAX] = {
            72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
            3379081753
        };
        unsigned int combined_pulse_pos =
            fparam->sf[subframe_idx].combined_pulse_pos;
        int index = 6;

        if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
            if (p->pulse_dec_mode) {
                int pulse, pulse_idx;
                pulse              = PULSE_MAX - 1;
                pulse_idx          = 71;
                combined_pulse_pos =
                    fparam->sf[subframe_idx].combined_pulse_pos;

                /* this part seems to be close to g723.1 gen_fcb_excitation()
                 * RATE_6300 */

                /* TODO: what is 7? size of subframe? */
                for (i = 0; i < 7; i++) {
                    for (;
                         combined_pulse_pos <
                         dss_sp_combinatorial_table[pulse][pulse_idx];
                         --pulse_idx)
                        ;
                    combined_pulse_pos -=
                        dss_sp_combinatorial_table[pulse][pulse_idx];
                    pulse--;
                    fparam->sf[subframe_idx].pulse_pos[i] = pulse_idx;
                }
            }
        } else {
            p->pulse_dec_mode = 0;

            /* why do we need this? */
            fparam->sf[subframe_idx].pulse_pos[6] = 0;

            for (i = 71; i >= 0; i--) {
                if (C72_binomials[index] <= combined_pulse_pos) {
                    combined_pulse_pos -= C72_binomials[index];

                    fparam->sf[subframe_idx].pulse_pos[6 - index] = i;

                    if (!index)
                        break;
                    --index;
                }
                --C72_binomials[0];
                if (index) {
                    int a;
                    for (a = 0; a < index; a++)
                        C72_binomials[a + 1] -= C72_binomials[a];
                }
            }
        }
    }

    combined_pitch = get_bits(&gb, 24);

    fparam->pitch_lag[0] = (combined_pitch % 151) + 36;

    combined_pitch /= 151;

    for (i = 1; i < SUBFRAMES - 1; i++) {
        fparam->pitch_lag[i] = combined_pitch % 48;
        combined_pitch      /= 48;
    }
    if (combined_pitch > 47) {
        av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
        combined_pitch = 0;
    }
    fparam->pitch_lag[i] = combined_pitch;

    pitch_lag = fparam->pitch_lag[0];
    for (i = 1; i < SUBFRAMES; i++) {
        if (pitch_lag > 162) {
            fparam->pitch_lag[i] += 162 - 23;
        } else {
            tmp = pitch_lag - 23;
            if (tmp < 36)
                tmp = 36;
            fparam->pitch_lag[i] += tmp;
        }
        pitch_lag = fparam->pitch_lag[i];
    }
}