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

📄 dec_cavlc.c

📁 经过开源的H.264压缩算法代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        table = coeff1_1;
        code = (code >> 8) - 4;
    }
    else if (code >= 128)
    {
        table = coeff1_2;
        code = (code >> 5) - 4;
    }
    else if (code >= 64)
    {
        table = coeff1_3;
        code = (code >> 3) - 8;
    }
    else if (code >= 32)
    {
        table = coeff1_4;
        code = (code >> 2) - 8;
    }
    else if (code >= 16)
    {
        table = coeff1_5;
        code = (code >> 1) - 8;
    }
    else
    {
        table = coeff1_6;
    }

    *trailing_ones = table[code].trailing_ones;
    *total_coff = table[code].total_coeff;
    eg_read_skip(t->bs, table[code].len);
}

/* 2 > nC >= 0 */
void
T264dec_mb_read_coff_token_t0(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff)
{
    int32_t code;
    const vlc_coeff_token_t* table;

    code = eg_show(t->bs, 16);
    if (code >= 8192)
    {
        table = coeff0_5;
        code >>= 13;
    }
    else if (code >= 4096)
    {
        table = coeff0_4;
        code = (code >> 10) - 4;
    }
    else if (code >= 1024)
    {
        table = coeff0_3;
        code = (code >> 8) - 4;
    }
    else if (code >= 128)
    {
        table = coeff0_2;
        code = (code >> 5) - 4;
    }
    else if (code >= 64)
    {
        table = coeff0_1;
        code = (code >> 3) - 8;
    }
    else
    {
        table = coeff0_0;
    }

    *trailing_ones = table[code].trailing_ones;
    *total_coff = table[code].total_coeff;
    eg_read_skip(t->bs, table[code].len);
}

uint8_t
T264dec_mb_read_level_prefix(T264_t* t)
{
    uint8_t prefix;
    int32_t code;

    code = eg_show(t->bs, 16);
    if (code >= 4096)
    {
        prefix = prefix_table0[code >> 12];
    }
    else if (code >= 256)
    {
        prefix = prefix_table1[code >> 8];
    }
    else if (code >= 16)
    {
        prefix = prefix_table2[code >> 4];
    }
    else
    {
        prefix = prefix_table3[code];
    }

    eg_read_skip(t->bs, prefix + 1);

    return prefix;
}

uint8_t
T264dec_mb_read_total_zero1(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 9);
    if (code >= 32)
    {
        code >>= 4;
        total_zero = total_zero_table1_1[code].num;
        eg_read_skip(t->bs, total_zero_table1_1[code].len);
    }
    else
    {
        total_zero = total_zero_table1_0[code].num;
        eg_read_skip(t->bs, total_zero_table1_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero2(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 2;
        total_zero = total_zero_table2_1[code].num;
        eg_read_skip(t->bs, total_zero_table2_1[code].len);
    }
    else
    {
        total_zero = total_zero_table2_0[code].num;
        eg_read_skip(t->bs, total_zero_table2_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero3(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 2;
        total_zero = total_zero_table3_1[code].num;
        eg_read_skip(t->bs, total_zero_table3_1[code].len);
    }
    else
    {
        total_zero = total_zero_table3_0[code].num;
        eg_read_skip(t->bs, total_zero_table3_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero6(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 3;
        total_zero = total_zero_table6_1[code].num;
        eg_read_skip(t->bs, total_zero_table6_1[code].len);
    }
    else
    {
        total_zero = total_zero_table6_0[code].num;
        eg_read_skip(t->bs, total_zero_table6_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero7(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 3;
        total_zero = total_zero_table7_1[code].num;
        eg_read_skip(t->bs, total_zero_table7_1[code].len);
    }
    else
    {
        total_zero = total_zero_table7_0[code].num;
        eg_read_skip(t->bs, total_zero_table7_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero8(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 3;
        total_zero = total_zero_table8_1[code].num;
        eg_read_skip(t->bs, total_zero_table8_1[code].len);
    }
    else
    {
        total_zero = total_zero_table8_0[code].num;
        eg_read_skip(t->bs, total_zero_table8_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero9(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 6);
    if (code >= 8)
    {
        code >>= 3;
        total_zero = total_zero_table9_1[code].num;
        eg_read_skip(t->bs, total_zero_table9_1[code].len);
    }
    else
    {
        total_zero = total_zero_table9_0[code].num;
        eg_read_skip(t->bs, total_zero_table9_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero4(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 5);
    if (code >= 16)
    {
        code = (code >> 2) - 4;
        total_zero = total_zero_table4_1[code].num;
        eg_read_skip(t->bs, total_zero_table4_1[code].len);
    }
    else
    {
        total_zero = total_zero_table4_0[code].num;
        eg_read_skip(t->bs, total_zero_table4_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero5(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 5);
    if (code >= 16)
    {
        code = (code >> 2) - 4;
        total_zero = total_zero_table5_1[code].num;
        eg_read_skip(t->bs, total_zero_table5_1[code].len);
    }
    else
    {
        total_zero = total_zero_table5_0[code].num;
        eg_read_skip(t->bs, total_zero_table5_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero10(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 5);
    if (code >= 4)
    {
        code >>= 2;
        total_zero = total_zero_table10_1[code].num;
        eg_read_skip(t->bs, total_zero_table10_1[code].len);
    }
    else
    {
        total_zero = total_zero_table10_0[code].num;
        eg_read_skip(t->bs, total_zero_table10_0[code].len);
    }

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero11(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 4);
    total_zero = total_zero_table11_0[code].num;
    eg_read_skip(t->bs, total_zero_table11_0[code].len);

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero12(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 4);
    total_zero = total_zero_table12_0[code].num;
    eg_read_skip(t->bs, total_zero_table12_0[code].len);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero13(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 3);
    total_zero = total_zero_table13_0[code].num;
    eg_read_skip(t->bs, total_zero_table13_0[code].len);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero14(T264_t* t)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 2);
    total_zero = total_zero_table14_0[code].num;
    eg_read_skip(t->bs, total_zero_table14_0[code].len);

    return total_zero;
}

uint8_t
T264dec_mb_read_total_zero15(T264_t* t)
{
    return eg_read_direct1(t->bs);
}

uint8_t
T264dec_mb_read_total_zero_chroma(T264_t* t, uint8_t total_coeff)
{
    uint8_t total_zero;
    int32_t code;

    code = eg_show(t->bs, 3);
    total_zero = total_zero_table_chroma[total_coeff - 1][code].num;
    eg_read_skip(t->bs, total_zero_table_chroma[total_coeff - 1][code].len);

    assert(total_zero != 255);

    return total_zero;
}

uint8_t
T264dec_mb_read_run_before(T264_t* t, uint8_t zero_left)
{
    int32_t code;
    uint8_t run_before;

    assert(zero_left != 255);

    code = eg_show(t->bs, 3);
    if (zero_left <= 6)
    {
        run_before = run_before_table_0[zero_left - 1][code].num;
        eg_read_skip(t->bs, run_before_table_0[zero_left - 1][code].len);
    }
    else
    {
        eg_read_skip(t->bs, 3);
        if (code > 0)
        {
            run_before = run_before_table_0[6][code].num;
        }
        else
        {
            code = eg_show(t->bs, 4);
            if (code > 0)
            {
                run_before = run_before_table_1[code];
                eg_read_skip(t->bs, run_before - 6);
            }
            else
            {
                eg_read_skip(t->bs, 4);
                code = eg_show(t->bs, 4);
                run_before = run_before_table_2[code];
                eg_read_skip(t->bs, run_before - 10);
            }
        }
    }

    assert(run_before >= 0 && run_before <= 14);

    return run_before;
}

void
T264dec_mb_read_cavlc_residual(T264_t* t, int32_t idx, int16_t* z, int32_t count)
{
    uint8_t trailing_ones, total_coeff;
    int32_t i, j;
    int32_t zero_left = 0;
    int16_t level[16];
    uint8_t run[16];
    int32_t x, y;

    if(idx == BLOCK_INDEX_CHROMA_DC)
    {
        T264dec_mb_read_coff_token_t4(t, &trailing_ones, &total_coeff);
    }
    else
    {
        /* T264_mb_predict_non_zero_code return 0 <-> (16+16+1)>>1 = 16 */
        int32_t nC = 0;
        typedef void (*T264dec_mb_read_coff_token_t)(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff);
        static const T264dec_mb_read_coff_token_t read_coeff[17] = 
        {
            T264dec_mb_read_coff_token_t0, T264dec_mb_read_coff_token_t0,
            T264dec_mb_read_coff_token_t1, T264dec_mb_read_coff_token_t1,

⌨️ 快捷键说明

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