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

📄 mp4einit.c

📁 Linux下的基于intel的ipp库的MPEG4编码程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -