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

📄 cavlc.c

📁 T264是中国的视频编码自由组织合力开发的264编解码程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                        T264_predict_mv(t, 0, luma_index[4 * i + 3], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 3]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 3]].y - vec.y);
                        break;
                    }
                }
                break;
            default:
                break;
            }
        }
        else
        {
            switch (t->mb.mb_part)
            {
            case MB_16x16:
                 if (t->mb.is_copy != 1)
                 {
                    switch (t->mb.mb_part2[0])
                    {
                    case B_L0_16x16:
                        eg_write_ue(t->bs, 1);
                        if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                        {
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                        }
                        vec = t->mb.vec[0][0];
                        T264_predict_mv(t, 0, 0, 4, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
                        break;
                    case B_L1_16x16:
                        eg_write_ue(t->bs, 2);
                        if (t->ps.num_ref_idx_l1_active_minus1 > 0)
                        {
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
                        }
                        vec = t->mb.vec[1][0];
                        T264_predict_mv(t, 1, 0, 4, &vec);
                        eg_write_se(t->bs, t->mb.vec[1][0].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[1][0].y - vec.y);
                        break;
                    case B_Bi_16x16:
                        eg_write_ue(t->bs, 3);
                        if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                        {
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                        }
                        if (t->ps.num_ref_idx_l1_active_minus1 > 0)
                        {
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
                        }
                        vec = t->mb.vec[0][0];
                        T264_predict_mv(t, 0, 0, 4, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
                        vec = t->mb.vec[1][0];
                        T264_predict_mv(t, 1, 0, 4, &vec);
                        eg_write_se(t->bs, t->mb.vec[1][0].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[1][0].y - vec.y);
                        break;
                    }
                }
                else
                {
                    eg_write_ue(t->bs, 0);
                }
                break;
            case MB_16x8:
                {
                    static int8_t mode_16x8[3][3] = 
                    {
                        B_L0_L0_16x8, B_L0_L1_16x8, B_L0_Bi_16x8,
                        B_L1_L0_16x8, B_L1_L1_16x8, B_L1_Bi_16x8,
                        B_Bi_L0_16x8, B_Bi_L1_16x8, B_Bi_Bi_16x8
                    };
                    eg_write_ue(t->bs, mode_16x8[t->mb.mb_part2[0] - B_L0_16x8][t->mb.mb_part2[1] - B_L0_16x8]);
                    if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                    {
                        if (t->mb.mb_part2[0] != B_L1_16x8)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                        if (t->mb.mb_part2[1] != B_L1_16x8)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][8].refno);
                    }
                    if (t->ps.num_ref_idx_l1_active_minus1 > 0)
                    {
                        if (t->mb.mb_part2[0] != B_L0_16x8)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
                        if (t->mb.mb_part2[1] != B_L0_16x8)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][8].refno);
                    }
                    // l0
                    for (i = 0 ; i < 2 ; i ++)
                    {
                        switch(t->mb.mb_part2[i]) 
                        {
                        case B_L0_16x8:
                            vec = t->mb.vec[0][8 * i];
                            T264_predict_mv(t, 0, luma_index[8 * i], 4, &vec);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].y - vec.y);
                            break;
                        case B_Bi_16x8:
                            vec = t->mb.vec[0][luma_index[8 * i]];
                            T264_predict_mv(t, 0, luma_index[8 * i], 4, &vec);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].y - vec.y);
                        }
                    }
                    for (i = 0 ; i < 2 ; i ++)
                    {
                        switch(t->mb.mb_part2[i]) 
                        {
                        case B_L1_16x8:
                            vec = t->mb.vec[1][luma_index[8 * i]];
                            T264_predict_mv(t, 1, luma_index[8 * i], 4, &vec);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].y - vec.y);
                            break;
                        case B_Bi_16x8:
                            vec = t->mb.vec[1][luma_index[8 * i]];
                            T264_predict_mv(t, 1, luma_index[8 * i], 4, &vec);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].y - vec.y);
                            break;
                        }
                    }
                }
                break;
            case MB_8x16:
                {
                    static int8_t mode_8x16[3][3] = 
                    {
                        B_L0_L0_8x16, B_L0_L1_8x16, B_L0_Bi_8x16,
                        B_L1_L0_8x16, B_L1_L1_8x16, B_L1_Bi_8x16,
                        B_Bi_L0_8x16, B_Bi_L1_8x16, B_Bi_Bi_8x16
                    };
                    eg_write_ue(t->bs, mode_8x16[t->mb.mb_part2[0] - B_L0_8x16][t->mb.mb_part2[1] - B_L0_8x16]);
                    if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                    {
                        if (t->mb.mb_part2[0] != B_L1_8x16)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                        if (t->mb.mb_part2[1] != B_L1_8x16)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][2].refno);
                    }
                    if (t->ps.num_ref_idx_l1_active_minus1 > 0)
                    {
                        if (t->mb.mb_part2[0] != B_L0_8x16)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
                        if (t->mb.mb_part2[1] != B_L0_8x16)
                            eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][2].refno);
                    }
                    // l0
                    for (i = 0 ; i < 2 ; i ++)
                    {
                        switch(t->mb.mb_part2[i]) 
                        {
                        case B_L0_8x16:
                            vec = t->mb.vec[0][2 * i];
                            T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[0][2 * i].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[0][2 * i].y - vec.y);
                            break;
                        case B_Bi_8x16:
                            vec = t->mb.vec[0][2 * i];
                            T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[0][2 * i].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[0][2 * i].y - vec.y);
                        }
                    }
                    for (i = 0 ; i < 2 ; i ++)
                    {
                        switch(t->mb.mb_part2[i]) 
                        {
                        case B_L1_8x16:
                            vec = t->mb.vec[1][2 * i];
                            T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[1][2 * i].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[1][2 * i].y - vec.y);
                            break;
                        case B_Bi_8x16:
                            vec = t->mb.vec[1][2 * i];
                            T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[1][2 * i].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[1][2 * i].y - vec.y);
                            break;
                        }
                    }
                }
                break;
            case MB_8x8:
                {
                    eg_write_ue(t->bs, 22);
                    for (i = 0 ; i < 4 ; i ++)
                    {
                        if (t->mb.sub_is_copy[i] != 1)
                        {
                            switch (t->mb.submb_part[luma_index[4 * i]]) 
                            {
                            case B_L0_8x8:
                                eg_write_ue(t->bs, 1);
                                break;
                            case B_L1_8x8:
                                eg_write_ue(t->bs, 2);
                                break;
                            case B_Bi_8x8:
                                eg_write_ue(t->bs, 3);
                                break;
                            default:
                                assert(0);
                                break;
                            }
                        }
                        else
                        {
                            eg_write_ue(t->bs, 0);
                            break;
                        }
                    }
                    if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                    {
                        for (i = 0 ; i < 4 ; i ++)
                        {
                            if (t->mb.submb_part[luma_index[4 * i]] != 2 && t->mb.submb_part[luma_index[4 * i]] != 0)
                                eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][4 * i].refno);
                        }
                    }
                    if (t->ps.num_ref_idx_l1_active_minus1 > 0)
                    {
                        for (i = 0 ; i < 4 ; i ++)
                        {
                            if (t->mb.submb_part[luma_index[4 * i]] != 1 && t->mb.submb_part[luma_index[4 * i]] != 0)
                                eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][4 * i].refno);
                        }
                    }
                    // l0
                    for (i = 0 ; i < 4 ; i ++)
                    {
                        switch(t->mb.submb_part[luma_index[4 * i]]) 
                        {
                        case B_L0_8x8:
                        case B_Bi_8x8:
                            vec = t->mb.vec[0][luma_index[4 * i]];
                            T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
                            break;
                        }
                    }
                    for (i = 0 ; i < 4 ; i ++)
                    {
                        switch(t->mb.submb_part[luma_index[4 * i]]) 
                        {
                        case B_L1_8x8:
                        case B_Bi_8x8:
                            vec = t->mb.vec[1][luma_index[4 * i]];
                            T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[4 * i]].x - vec.x);
                            eg_write_se(t->bs, t->mb.vec[1][luma_index[4 * i]].y - vec.y);
                            break;
                        }
                    }
                }
                break;
            }
        }
        eg_write_ue(t->bs, inter_cbp_to_golomb[(t->mb.cbp_c << 4)| t->mb.cbp_y]);
        //delta_qp
        if (t->mb.cbp_y > 0 || t->mb.cbp_c > 0)
        {
            eg_write_se(t->bs, t->mb.mb_qp_delta);	/* 0 = no change on qp */

            for (i = 0; i < 16 ; i ++)
            {
                if(t->mb.cbp_y & (1 << ( i / 4 )))
                {
                    block_residual_write_cavlc(t, i, t->mb.dct_y_z[i], 16);
                }
            }
        }
    }

    if (t->mb.cbp_c != 0)
    {
        block_residual_write_cavlc(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[0], 4);
        block_residual_write_cavlc(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[1], 4);
        if (t->mb.cbp_c & 0x2)
        {
            for(i = 0 ; i < 8 ; i ++)
            {
                block_residual_write_cavlc(t, 16 + i, &(t->mb.dct_uv_z[i / 4][i % 4][1]), 15);
            }
        }
    }
}

⌨️ 快捷键说明

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