📄 mp4einit.c
字号:
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 + -