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

📄 mp4einit.c

📁 Intel提供的在PCA(例如Sitsang开发板)使用IPP4.0库的MPEG-4编码源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    enc_state->new_pred            = 0;    enc_state->reduced_resolution  = 0;    enc_state->obmc_disabled       = 1;    enc_state->vop_coded           = 1;    enc_state->quater_sample       = 0;    enc_state->rounding            = 0;    enc_state->modulo_base_decd    = 0;    enc_state->modulo_base_disp    = 0;    enc_state->vop_indx            = 0;    /* determine the vop size */    enc_state->mb_per_row = (enc_state->vol_display_width  + 15)        / SAMPLE_VIDEO_MB_SIZE;    enc_state->mb_per_col = (enc_state->vol_display_height + 15)        / SAMPLE_VIDEO_MB_SIZE;        enc_state->frame_dimension.width  = (enc_state->mb_per_row        * SAMPLE_VIDEO_MB_SIZE);    enc_state->frame_dimension.height = (enc_state->mb_per_col        * SAMPLE_VIDEO_MB_SIZE);        enc_state->frame_step_set.y_step  = enc_state->frame_dimension.width        + 2 * SAMPLE_VIDEO_MB_SIZE;    enc_state->frame_step_set.cb_step = enc_state->frame_dimension.width / 2        + 2 * SAMPLE_VIDEO_BLOCK_SIZE;    enc_state->frame_step_set.cr_step = enc_state->frame_dimension.width / 2        + 2 * SAMPLE_VIDEO_BLOCK_SIZE;    /* allocate working buffer for encoder */        ret_code = get_working_buffer_mpeg4(enc_state);    if (SAMPLE_STATUS_NOERR != ret_code) {        encoder_free_mpeg4(enc_state);        return ret_code;    }    /* initialize the working buffer */    /* mv_buf[i] */    for (i = 0; i < (enc_state->mb_per_row + 2) * 4; i++) {        enc_state->mv_buf[i].dx = 0;        enc_state->mv_buf[i].dy = 0;    }    /* mv_plane[i] */    for (i = -4 - 4 * (enc_state->mb_per_row + 2); i <        (enc_state->mb_per_row + 2) * (enc_state->mb_per_col) * 4 - 4; i++) {        enc_state->mv_plane[i].dx = 0;        enc_state->mv_plane[i].dy = 0;    }    if (Q_MPEG4 == enc_state->quant_type) {        /* qmatrix_intra[i] */        for (i = 0; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) {            enc_state->qmatrix_intra[i] = (int)default_qmat_intra_tbl[i];            enc_state->qmatrix_intra[i + SAMPLE_VIDEO_BLOCK_SQUARE_SIZE]                = (int)((1 << 21) / default_qmat_intra_tbl[i] + 1);        }        enc_state->qmatrix_intra[SAMPLE_VIDEO_BLOCK_SQUARE_SIZE]            = (int)((1 << 21) / default_qmat_intra_tbl[0]);        /* qmatrix_inter[i] */        for(i = 0; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) {            enc_state->qmatrix_inter[i] = (int)default_qmat_inter_tbl[i];            enc_state->qmatrix_inter[i + SAMPLE_VIDEO_BLOCK_SQUARE_SIZE]                = (int)((1 << 21) / default_qmat_inter_tbl[i] + 1);        }        enc_state->qmatrix_inter[SAMPLE_VIDEO_BLOCK_SQUARE_SIZE]            = (int)((1 << 21) / default_qmat_inter_tbl[0]);    }    enc_state->info_pic->pic_plane[0] = enc_state->cur_frame.y_ptr;    enc_state->info_pic->pic_plane[1] = enc_state->cur_frame.cb_ptr;    enc_state->info_pic->pic_plane[2] = enc_state->cur_frame.cr_ptr;    enc_state->info_pic->pic_plane_step[0] = enc_state->frame_step_set.y_step;    enc_state->info_pic->pic_plane_step[1] = enc_state->frame_step_set.cb_step;    enc_state->info_pic->pic_plane_step[2] = enc_state->frame_step_set.cr_step;    enc_state->info_pic->pic_plane_num     = 3;    enc_state->info_pic->pic_channel_num   = 3;    enc_state->info_pic->pic_format        = enc_state->color_format;    enc_state->info_pic->pic_width         = enc_state->vol_display_width;    enc_state->info_pic->pic_height        = enc_state->vol_display_height;    return SAMPLE_STATUS_NOERR;}/******************************************************************************// Name:                encoder_free_mpeg4// Desicription://                      Free working buffer of the MPEG-4 encoder//  Input Arguments://      enc_state       Pointer to the general state struct of MPEG-4 encoder////  Output Arguments://      enc_state       Pointer to the updated state struct of MPEG-4 encoder////  Returns://      SAMPLE_STATUS_NOERR  If succeeds//  Note://******************************************************************************/sample_status encoder_free_mpeg4(mp4_enc_state *enc_state){        /* cur_frame.y_ptr */    if (enc_state->cur_frame.y_ptr) {        enc_state->cur_frame.y_ptr -= enc_state->frame_step_set.y_step            * SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;        free_align_mem_mpeg4((void*)&enc_state->cur_frame.y_ptr);    }    /* fwd_ref_frame.y_ptr */    if (enc_state->fwd_ref_frame.y_ptr) {        enc_state->fwd_ref_frame.y_ptr -= enc_state->frame_step_set.y_step            * SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_frame.y_ptr);    }    /* fwd_ref_rec_frame.y_ptr */    if (enc_state->fwd_ref_rec_frame.y_ptr) {        enc_state->fwd_ref_rec_frame.y_ptr -= enc_state->frame_step_set.y_step            * SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_rec_frame.y_ptr);    }    /* rec_frame.y_ptr */    if (enc_state->rec_frame.y_ptr) {        enc_state->rec_frame.y_ptr -= enc_state->frame_step_set.y_step            * SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;        free_align_mem_mpeg4((void*)&enc_state->rec_frame.y_ptr);    }    /* cur_frame.cb_ptr */    if (enc_state->cur_frame.cb_ptr) {        enc_state->cur_frame.cb_ptr -= enc_state->frame_step_set.cb_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->cur_frame.cb_ptr);    }    /* fwd_ref_frame.cb_ptr */    if (enc_state->fwd_ref_frame.cb_ptr) {        enc_state->fwd_ref_frame.cb_ptr -= enc_state->frame_step_set.cb_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_frame.cb_ptr);    }    /* fwd_ref_rec_frame.cb_ptr */    if (enc_state->fwd_ref_rec_frame.cb_ptr) {        enc_state->fwd_ref_rec_frame.cb_ptr -= enc_state->frame_step_set.cb_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_rec_frame.cb_ptr);    }    /* rec_frame.cb_ptr */    if (enc_state->rec_frame.cb_ptr) {        enc_state->rec_frame.cb_ptr -= enc_state->frame_step_set.cb_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->rec_frame.cb_ptr);    }    /* cur_frame.cr_ptr */    if (enc_state->cur_frame.cr_ptr) {        enc_state->cur_frame.cr_ptr -= enc_state->frame_step_set.cr_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->cur_frame.cr_ptr);    }    /* fwd_ref_frame.cr_ptr */    if (enc_state->fwd_ref_frame.cr_ptr) {        enc_state->fwd_ref_frame.cr_ptr -= enc_state->frame_step_set.cr_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_frame.cr_ptr);    }    /* fwd_ref_rec_frame.cr_ptr */    if (enc_state->fwd_ref_rec_frame.cr_ptr) {        enc_state->fwd_ref_rec_frame.cr_ptr -= enc_state->frame_step_set.cr_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->fwd_ref_rec_frame.cr_ptr);    }    /* rec_frame.cr_ptr */    if (enc_state->rec_frame.cr_ptr) {        enc_state->rec_frame.cr_ptr -= enc_state->frame_step_set.cr_step            * SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;        free_align_mem_mpeg4((void*)&enc_state->rec_frame.cr_ptr);    }    /* coef_buf_row.y_ptr */    if (enc_state->coef_buf_row.y_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_row.y_ptr);    }    /* coef_buf_col.y_ptr */    if (enc_state->coef_buf_row.y_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_col.y_ptr);    }    /* coef_buf_row.cb_ptr */    if (enc_state->coef_buf_row.cb_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_row.cb_ptr);    }    /* coef_buf_col.cb_ptr */    if (enc_state->coef_buf_col.cb_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_col.cb_ptr);    }    /* coef_buf_row.cr_ptr */    if (enc_state->coef_buf_row.cr_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_row.cr_ptr);    }    /* coef_buf_col.cr_ptr */    if (enc_state->coef_buf_col.cr_ptr) {        free_align_mem_mpeg4((void*)&enc_state->coef_buf_col.cr_ptr);    }    /* mv_buf */    if (enc_state->mv_buf) {        free_align_mem_mpeg4((void*)&enc_state->mv_buf);    }    /* tranp_buf */    if (enc_state->tranp_buf) {        free_align_mem_mpeg4((void*)&enc_state->tranp_buf);    }    /* qp_buf */    if (enc_state->qp_buf) {        free_align_mem_mpeg4((void*)&enc_state->qp_buf);    }    /* info_pic */    if (enc_state->info_pic) {        free_align_mem_mpeg4((void*)&enc_state->info_pic);    }    /* qmatrix_intra & qmatrix_inter */    if (Q_MPEG4 == enc_state->quant_type) {        if (enc_state->qmatrix_intra) {            free_align_mem_mpeg4((void*)&enc_state->qmatrix_intra);        }        if (enc_state->qmatrix_inter) {            free_align_mem_mpeg4((void*)&enc_state->qmatrix_inter);        }    }    /* mv_plane */    if (enc_state->mv_plane) {        enc_state->mv_plane -= 4 + (enc_state->mb_per_row + 2) * 4;        free_align_mem_mpeg4((void*)&enc_state->mv_plane);    }    /* mb_type_plane */    if (enc_state->mb_type_plane) {        free_align_mem_mpeg4((void*)&enc_state->mb_type_plane);    }        /* ysum_plane */    if (enc_state->ysum_plane) {        free_align_mem_mpeg4((void*)&enc_state->ysum_plane);    }    /* blk_ref_buf */    if (enc_state->blk_ref_buf) {        free_align_mem_mpeg4((void*)&enc_state->blk_ref_buf);    }        /* blk_coef_buf */    if (enc_state->blk_coef_buf) {        free_align_mem_mpeg4((void*)&enc_state->blk_coef_buf);    }        /* resid_buf */    if (enc_state->resid_buf) {        free_align_mem_mpeg4((void*)&enc_state->resid_buf);    }    /* rec_resid_buf */    if (enc_state->rec_resid_buf) {        free_align_mem_mpeg4((void*)&enc_state->rec_resid_buf);    }    return SAMPLE_STATUS_NOERR;}/******************************************************************************// Name:                init_vop_infor_enc_mpeg4// Desicription://                      Initialize VOP information struct at the beginning of//                      encoding each VOP//  Input Arguments://      enc_state       Pointer to the general state struct of MPEG-4 encoder//      vop_infor       Pointer to vop information struct of MPEG-4 encoder////  Output Arguments://      enc_state       Pointer to the updated state struct of MPEG-4 encoder//      vop_infor       Pointer to updated vop infor struct of MPEG-4 encoder////  Returns://      SAMPLE_STATUS_NOERR  If succeeds//  Note:  //  support I-VOP, P-VOP initialization******************************************************************************/sample_status init_vop_infor_enc_mpeg4 (mp4_enc_state     *enc_state,                                        mp4_enc_vop_infor *vop_infor){    int i = 0;    /* init mb index */    vop_infor->mb_indx   = 0;    /* init qp_buf ptr */    vop_infor->delta_qp  = 0;    vop_infor->cur_qp    = enc_state->vop_quant;    vop_infor->qp_buf    = enc_state->qp_buf;    vop_infor->qp_buf[0] = vop_infor->cur_qp;        /* init buffer ptrs: ac/dc prediction coefficient buffer */    vop_infor->coef_buf_row.y_ptr  = enc_state->coef_buf_row.y_ptr  + 16;    vop_infor->coef_buf_col.y_ptr  = enc_state->coef_buf_col.y_ptr;        vop_infor->coef_buf_row.cb_ptr = enc_state->coef_buf_row.cb_ptr + 8;    vop_infor->coef_buf_col.cb_ptr = enc_state->coef_buf_col.cb_ptr;        vop_infor->coef_buf_row.cr_ptr = enc_state->coef_buf_row.cr_ptr + 8;    vop_infor->coef_buf_col.cr_ptr = enc_state->coef_buf_col.cr_ptr;    /* init the dc coefficient on the upper border */	for(i = 0; i < enc_state->mb_per_row + 1 ; i++) {		enc_state->coef_buf_row.y_ptr [i*16]   = (Ipp16s) -1;		enc_state->coef_buf_row.y_ptr [i*16+8] = (Ipp16s) -1;        		enc_state->coef_buf_row.cb_ptr[i*8] = (Ipp16s) -1;		        enc_state->coef_buf_row.cr_ptr[i*8] = (Ipp16s) -1;	}    /* init the dc coefficient on the left border */    enc_state->coef_buf_col.y_ptr[0]  = (Ipp16s) -1;    enc_state->coef_buf_col.y_ptr[8]  = (Ipp16s) -1;    enc_state->coef_buf_col.cb_ptr[0] = (Ipp16s) -1;    enc_state->coef_buf_col.cr_ptr[0] = (Ipp16s) -1;    /* init buffer ptrs: position the 1st MB in current VOP plane */    vop_infor->cur_mb.y_ptr  = enc_state->cur_frame.y_ptr;    vop_infor->cur_mb.cb_ptr = enc_state->cur_frame.cb_ptr;    vop_infor->cur_mb.cr_ptr = enc_state->cur_frame.cr_ptr;    vop_infor->rec_mb.y_ptr  = enc_state->rec_frame.y_ptr;    vop_infor->rec_mb.cb_ptr = enc_state->rec_frame.cb_ptr;    vop_infor->rec_mb.cr_ptr = enc_state->rec_frame.cr_ptr;    if (PVOP == enc_state->vop_coding_type) {        /* init vop_rouding_type for PVOP */        /* vop_rouding_type are switched between 0 and 1 alternatively        // along with the coded PVOPs */        enc_state->rounding ^= 0x00000001;                /* init two motion compensation function ptrs */        if(1 == enc_state->rounding) {            vop_infor->copy_block_func_ptr  = (copy_block_func_ptr)                ippiMCBlock_RoundOn_8u;        } else {            vop_infor->copy_block_func_ptr  = (copy_block_func_ptr)                ippiMCBlock_RoundOff_8u;        }        /* init vop_fcode_forward for PVOP */        /* Please refer to Table7-5 of ISO/IEC 14496-2:2001(E) */        if (16 > enc_state->search_range) {            vop_infor->fcode_fwd = 1;        } else if (32 > enc_state->search_range) {            vop_infor->fcode_fwd = 2;        } else if (64 > enc_state->search_range) {            vop_infor->fcode_fwd = 3;        } else if (128 > enc_state->search_range) {            vop_infor->fcode_fwd = 4;        } else if (256 > enc_state->search_range) {            vop_infor->fcode_fwd = 5;        } else if (512 > enc_state->search_range) {            vop_infor->fcode_fwd = 6;        } else {            vop_infor->fcode_fwd = 7;        }        vop_infor->ref_point.x = 0;        vop_infor->ref_point.y = 0;        vop_infor->cur_point.x = 0;        vop_infor->cur_point.y = 0;        /* init buffer ptrs: position the 1st ref MB in ref VOP plane */        vop_infor->fwd_ref_mb.y_ptr  = enc_state->fwd_ref_frame.y_ptr;        vop_infor->fwd_ref_mb.cb_ptr = enc_state->fwd_ref_frame.cb_ptr;        vop_infor->fwd_ref_mb.cr_ptr = enc_state->fwd_ref_frame.cr_ptr;        vop_infor->fwd_ref_rec_mb.y_ptr  = enc_state->fwd_ref_rec_frame.y_ptr;        vop_infor->fwd_ref_rec_mb.cb_ptr = enc_state->fwd_ref_rec_frame.cb_ptr;        vop_infor->fwd_ref_rec_mb.cr_ptr = enc_state->fwd_ref_rec_frame.cr_ptr;                /* init mv_buf ptr */        vop_infor->mv_buf    = enc_state->mv_buf;        /* init tranp_buf ptr */        vop_infor->tranp_buf = enc_state->tranp_buf;                for (i = 0; i < (enc_state->mb_per_row + 2) * 4; i++) {            vop_infor->tranp_buf[i] = IPP_VIDEO_TRANSPARENT;        }            } else if (IVOP == enc_state->vop_coding_type) {                /* tranp_buf and mv_buf are not used in ivop */        vop_infor->mv_buf    = NULL;        vop_infor->tranp_buf = NULL;    }    return SAMPLE_STATUS_NOERR;}

⌨️ 快捷键说明

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