⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qdm2.c

📁 现在关于h.264的源码很多
💻 C
📖 第 1 页 / 共 5 页
字号:
                            if (sb >= 2) {                                if (coding_method[ch][sb][j] < 16)                                    coding_method[ch][sb][j] = 16;                            } else {                                if (coding_method[ch][sb][j] < 30)                                    coding_method[ch][sb][j] = 30;                            }                        }    } else { // superblocktype_2_3 != 0        for (ch = 0; ch < nb_channels; ch++)            for (sb = 0; sb < 30; sb++)                for (j = 0; j < 64; j++)                    coding_method[ch][sb][j] = coding_method_table[cm_table_select][sb];    }    return;}/** * * Called by process_subpacket_11 to process more data from subpacket 11 with sb 0-8 * Called by process_subpacket_12 to process data from subpacket 12 with sb 8-sb_used * * @param q         context * @param gb        bitreader context * @param length    packet length in bits * @param sb_min    lower subband processed (sb_min included) * @param sb_max    higher subband processed (sb_max excluded) */static void synthfilt_build_sb_samples (QDM2Context *q, GetBitContext *gb, int length, int sb_min, int sb_max){    int sb, j, k, n, ch, run, channels;    int joined_stereo, zero_encoding, chs;    int type34_first;    float type34_div = 0;    float type34_predictor;    float samples[10], sign_bits[16];    if (length == 0) {        // If no data use noise        for (sb=sb_min; sb < sb_max; sb++)            build_sb_samples_from_noise (q, sb);        return;    }    for (sb = sb_min; sb < sb_max; sb++) {        FIX_NOISE_IDX(q->noise_idx);        channels = q->nb_channels;        if (q->nb_channels <= 1 || sb < 12)            joined_stereo = 0;        else if (sb >= 24)            joined_stereo = 1;        else            joined_stereo = (BITS_LEFT(length,gb) >= 1) ? get_bits1 (gb) : 0;        if (joined_stereo) {            if (BITS_LEFT(length,gb) >= 16)                for (j = 0; j < 16; j++)                    sign_bits[j] = get_bits1 (gb);            for (j = 0; j < 64; j++)                if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])                    q->coding_method[0][sb][j] = q->coding_method[1][sb][j];            fix_coding_method_array(sb, q->nb_channels, q->coding_method);            channels = 1;        }        for (ch = 0; ch < channels; ch++) {            zero_encoding = (BITS_LEFT(length,gb) >= 1) ? get_bits1(gb) : 0;            type34_predictor = 0.0;            type34_first = 1;            for (j = 0; j < 128; ) {                switch (q->coding_method[ch][sb][j / 2]) {                    case 8:                        if (BITS_LEFT(length,gb) >= 10) {                            if (zero_encoding) {                                for (k = 0; k < 5; k++) {                                    if ((j + 2 * k) >= 128)                                        break;                                    samples[2 * k] = get_bits1(gb) ? dequant_1bit[joined_stereo][2 * get_bits1(gb)] : 0;                                }                            } else {                                n = get_bits(gb, 8);                                for (k = 0; k < 5; k++)                                    samples[2 * k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];                            }                            for (k = 0; k < 5; k++)                                samples[2 * k + 1] = SB_DITHERING_NOISE(sb,q->noise_idx);                        } else {                            for (k = 0; k < 10; k++)                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);                        }                        run = 10;                        break;                    case 10:                        if (BITS_LEFT(length,gb) >= 1) {                            float f = 0.81;                            if (get_bits1(gb))                                f = -f;                            f -= noise_samples[((sb + 1) * (j +5 * ch + 1)) & 127] * 9.0 / 40.0;                            samples[0] = f;                        } else {                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);                        }                        run = 1;                        break;                    case 16:                        if (BITS_LEFT(length,gb) >= 10) {                            if (zero_encoding) {                                for (k = 0; k < 5; k++) {                                    if ((j + k) >= 128)                                        break;                                    samples[k] = (get_bits1(gb) == 0) ? 0 : dequant_1bit[joined_stereo][2 * get_bits1(gb)];                                }                            } else {                                n = get_bits (gb, 8);                                for (k = 0; k < 5; k++)                                    samples[k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];                            }                        } else {                            for (k = 0; k < 5; k++)                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);                        }                        run = 5;                        break;                    case 24:                        if (BITS_LEFT(length,gb) >= 7) {                            n = get_bits(gb, 7);                            for (k = 0; k < 3; k++)                                samples[k] = (random_dequant_type24[n][k] - 2.0) * 0.5;                        } else {                            for (k = 0; k < 3; k++)                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);                        }                        run = 3;                        break;                    case 30:                        if (BITS_LEFT(length,gb) >= 4)                            samples[0] = type30_dequant[qdm2_get_vlc(gb, &vlc_tab_type30, 0, 1)];                        else                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);                        run = 1;                        break;                    case 34:                        if (BITS_LEFT(length,gb) >= 7) {                            if (type34_first) {                                type34_div = (float)(1 << get_bits(gb, 2));                                samples[0] = ((float)get_bits(gb, 5) - 16.0) / 15.0;                                type34_predictor = samples[0];                                type34_first = 0;                            } else {                                samples[0] = type34_delta[qdm2_get_vlc(gb, &vlc_tab_type34, 0, 1)] / type34_div + type34_predictor;                                type34_predictor = samples[0];                            }                        } else {                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);                        }                        run = 1;                        break;                    default:                        samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);                        run = 1;                        break;                }                if (joined_stereo) {                    float tmp[10][MPA_MAX_CHANNELS];                    for (k = 0; k < run; k++) {                        tmp[k][0] = samples[k];                        tmp[k][1] = (sign_bits[(j + k) / 8]) ? -samples[k] : samples[k];                    }                    for (chs = 0; chs < q->nb_channels; chs++)                        for (k = 0; k < run; k++)                            if ((j + k) < 128)                                q->sb_samples[chs][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[chs][sb][((j + k)/2)] * tmp[k][chs] + .5);                } else {                    for (k = 0; k < run; k++)                        if ((j + k) < 128)                            q->sb_samples[ch][j + k][sb] = (int32_t)(f2i_scale * q->tone_level[ch][sb][(j + k)/2] * samples[k] + .5);                }                j += run;            } // j loop        } // channel loop    } // subband loop}/** * Init the first element of a channel in quantized_coeffs with data from packet 10 (quantized_coeffs[ch][0]). * This is similar to process_subpacket_9, but for a single channel and for element [0] * same VLC tables as process_subpacket_9 are used. * * @param q         context * @param quantized_coeffs    pointer to quantized_coeffs[ch][0] * @param gb        bitreader context * @param length    packet length in bits */static void init_quantized_coeffs_elem0 (int8_t *quantized_coeffs, GetBitContext *gb, int length){    int i, k, run, level, diff;    if (BITS_LEFT(length,gb) < 16)        return;    level = qdm2_get_vlc(gb, &vlc_tab_level, 0, 2);    quantized_coeffs[0] = level;    for (i = 0; i < 7; ) {        if (BITS_LEFT(length,gb) < 16)            break;        run = qdm2_get_vlc(gb, &vlc_tab_run, 0, 1) + 1;        if (BITS_LEFT(length,gb) < 16)            break;        diff = qdm2_get_se_vlc(&vlc_tab_diff, gb, 2);        for (k = 1; k <= run; k++)            quantized_coeffs[i + k] = (level + ((k * diff) / run));        level += diff;        i += run;    }}/** * Related to synthesis filter, process data from packet 10 * Init part of quantized_coeffs via function init_quantized_coeffs_elem0 * Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with data from packet 10 * * @param q         context * @param gb        bitreader context * @param length    packet length in bits */static void init_tone_level_dequantization (QDM2Context *q, GetBitContext *gb, int length){    int sb, j, k, n, ch;    for (ch = 0; ch < q->nb_channels; ch++) {        init_quantized_coeffs_elem0(q->quantized_coeffs[ch][0], gb, length);        if (BITS_LEFT(length,gb) < 16) {            memset(q->quantized_coeffs[ch][0], 0, 8);            break;        }    }    n = q->sub_sampling + 1;    for (sb = 0; sb < n; sb++)        for (ch = 0; ch < q->nb_channels; ch++)            for (j = 0; j < 8; j++) {                if (BITS_LEFT(length,gb) < 1)                    break;                if (get_bits1(gb)) {                    for (k=0; k < 8; k++) {                        if (BITS_LEFT(length,gb) < 16)                            break;                        q->tone_level_idx_hi1[ch][sb][j][k] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi1, 0, 2);                    }                } else {                    for (k=0; k < 8; k++)                        q->tone_level_idx_hi1[ch][sb][j][k] = 0;                }            }    n = QDM2_SB_USED(q->sub_sampling) - 4;    for (sb = 0; sb < n; sb++)        for (ch = 0; ch < q->nb_channels; ch++) {            if (BITS_LEFT(length,gb) < 16)                break;            q->tone_level_idx_hi2[ch][sb] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi2, 0, 2);            if (sb > 19)                q->tone_level_idx_hi2[ch][sb] -= 16;            else                for (j = 0; j < 8; j++)                    q->tone_level_idx_mid[ch][sb][j] = -16;        }    n = QDM2_SB_USED(q->sub_sampling) - 5;    for (sb = 0; sb < n; sb++)        for (ch = 0; ch < q->nb_channels; ch++)            for (j = 0; j < 8; j++) {                if (BITS_LEFT(length,gb) < 16)                    break;                q->tone_level_idx_mid[ch][sb][j] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_mid, 0, 2) - 32;            }}/** * Process subpacket 9, init quantized_coeffs with data from it * * @param q       context * @param node    pointer to node with packet */static void process_subpacket_9 (QDM2Context *q, QDM2SubPNode *node){    GetBitContext gb;    int i, j, k, n, ch, run, level, diff;    init_get_bits(&gb, node->packet->data, node->packet->size*8);    n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1; // same as averagesomething function    for (i = 1; i < n; i++)        for (ch=0; ch < q->nb_channels; ch++) {            level = qdm2_get_vlc(&gb, &vlc_tab_level, 0, 2);            q->quantized_coeffs[ch][i][0] = level;            for (j = 0; j < (8 - 1); ) {                run = qdm2_get_vlc(&gb, &vlc_tab_run, 0, 1) + 1;                diff = qdm2_get_se_vlc(&vlc_tab_diff, &gb, 2);                for (k = 1; k <= run; k++)                    q->quantized_coeffs[ch][i][j + k] = (level + ((k*diff) / run));                level += diff;                j += run;            }        }    for (ch = 0; ch < q->nb_channels; ch++)        for (i = 0; i < 8; i++)            q->quantized_coeffs[ch][0][i] = 0;}/** * Process subpacket 10 if not null, else * * @param q         context * @param node      pointer to node with packet * @param length    packet length in bits */static void process_subpacket_10 (QDM2Context *q, QDM2SubPNode *node, int length){    GetBitContext gb;    init_get_bits(&gb, ((node == NULL) ? empty_buffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));    if (length != 0) {        init_tone_level_dequantization(q, &gb, length);        fill_tone_level_array(q, 1);    } else {        fill_tone_level_array(q, 0);    }}/** * Process subpacket 11 * * @param q         context * @param node      pointer to node with packet * @param length    packet length in bit */static void process_subpacket_11 (QDM2Context *q, QDM2SubPNode *node, int length){    GetBitContext gb;    init_get_bits(&gb, ((node == NULL) ? empty_buffer : node->packet->data), ((node == NULL) ? 0 : node->packet->size*8));    if (length >= 32) {        int c = get_bits (&gb, 13);        if (c > 3)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -