📄 mp4evops.c
字号:
vop_infor->tranp_buf += 4; if (0 == mby_indx) { for(i=0;i<4;i++){ vop_infor->tranp_buf[i] = IPP_VIDEO_OPAQUE; } } mv_cur_mb += 4; type_cur_mb ++; vop_infor->qp_buf ++; vop_infor->qp_buf[0] = vop_infor->cur_qp; } /* loop for each row */ /* position the 1st MB in the next row of the VOP */ vop_infor->cur_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->cur_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->cur_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->rec_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->fwd_ref_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->fwd_ref_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->fwd_ref_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->fwd_ref_rec_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->fwd_ref_rec_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->fwd_ref_rec_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; /* update dc coefficient of the 4th block in the last MB each row */ vop_infor->coef_buf_row.y_ptr[-8] = vop_infor->coef_buf_col.y_ptr[8]; /* restore ac/dc prediction coefficient row buffer ptrs */ vop_infor->coef_buf_row.y_ptr = enc_state->coef_buf_row.y_ptr + SAMPLE_VIDEO_MB_SIZE; vop_infor->coef_buf_row.cb_ptr = enc_state->coef_buf_row.cb_ptr + SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->coef_buf_row.cr_ptr = enc_state->coef_buf_row.cr_ptr + SAMPLE_VIDEO_BLOCK_SIZE; /* restore the dc coefficient on the left border */ vop_infor->coef_buf_col.y_ptr [0] = -1; vop_infor->coef_buf_col.y_ptr [8] = -1; vop_infor->coef_buf_col.cb_ptr[0] = -1; vop_infor->coef_buf_col.cr_ptr[0] = -1; /* restore qp_buf ptr */ vop_infor->qp_buf = enc_state->qp_buf; vop_infor->qp_buf[0] = enc_state->qp_buf[enc_state->mb_per_row]; vop_infor->tranp_buf = enc_state->tranp_buf; mv_cur_mb += 2 * 4; } /* loop for each column */ return SAMPLE_STATUS_NOERR;}/******************************************************************************// Name: encode_ivop_mpeg4// Desicription:// Encode the IVOP data in non-ER mode//// Input Arguments:// stream_buf - Pointer to the output video bitstream// enc_state - Pointer to the general state struct of MPEG-4 encoder// vop_infor - Pointer to the vop information struct of MPEG-4 encoder//// Output Arguments:// stream_buf - Pointer to the updated output video bitstream after// compression// enc_state - Pointer to the updated general state struct of MPEG-4// encoder// vop_infor - Pointer to the updated vop information struct of MPEG-4// encoder//// Returns:// SAMPLE_STATUS_NOERR If succeeds// SAMPLE_STATUS_ERR If encoding fails// Note:// ******************************************************************************/sample_status encode_ivop_mpeg4(sample_bitstream *stream_buf, mp4_enc_state *enc_state, mp4_enc_vop_infor *vop_infor){ int mby_indx = 0, mbx_indx = 0; sample_status ret_code; /* initialize high-level encoder state */ init_vop_infor_enc_mpeg4(enc_state, vop_infor); /* dump vop header information into output stream */ create_vop_header_mpeg4(stream_buf, enc_state, vop_infor); /* loop for each column */ for (mby_indx = 0; mby_indx < enc_state->mb_per_col; mby_indx++) { /* loop for each row */ for (mbx_indx = 0; mbx_indx < enc_state->mb_per_row; mbx_indx++) { /* determine the mb_type */ /* rate control is not supported, so quant para doesn't change with // macroblocks or frames and mb_type is always IPP_VIDEO_INTRA */ if (vop_infor->delta_qp) { vop_infor->mb_type = IPP_VIDEO_INTRA_Q; } else { vop_infor->mb_type = IPP_VIDEO_INTRA; } ret_code = encode_intra_mb_mpeg4(stream_buf, enc_state, vop_infor); if (SAMPLE_STATUS_NOERR != ret_code) { return ret_code; } vop_infor->mb_indx ++; vop_infor->cur_mb.y_ptr += SAMPLE_VIDEO_MB_SIZE; vop_infor->cur_mb.cb_ptr += SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->cur_mb.cr_ptr += SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.y_ptr += SAMPLE_VIDEO_MB_SIZE; vop_infor->rec_mb.cb_ptr += SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.cr_ptr += SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->coef_buf_row.y_ptr += SAMPLE_VIDEO_MB_SIZE; vop_infor->coef_buf_row.cb_ptr += SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->coef_buf_row.cr_ptr += SAMPLE_VIDEO_BLOCK_SIZE; /* update qp_buf ptr */ vop_infor->qp_buf++; vop_infor->qp_buf[0] = vop_infor->cur_qp; } /* position the 1st MB in the next row of the VOP */ vop_infor->cur_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->cur_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->cur_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.y_ptr += enc_state->frame_step_set.y_step * SAMPLE_VIDEO_MB_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_MB_SIZE; vop_infor->rec_mb.cb_ptr += enc_state->frame_step_set.cb_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->rec_mb.cr_ptr += enc_state->frame_step_set.cr_step * SAMPLE_VIDEO_BLOCK_SIZE - enc_state->mb_per_row * SAMPLE_VIDEO_BLOCK_SIZE; /* update dc coefficient of the 4th block in the last MB each row */ vop_infor->coef_buf_row.y_ptr[-8] = vop_infor->coef_buf_col.y_ptr[8]; /* restore ac/dc prediction coefficient row buffer ptrs */ vop_infor->coef_buf_row.y_ptr = enc_state->coef_buf_row.y_ptr + SAMPLE_VIDEO_MB_SIZE; vop_infor->coef_buf_row.cb_ptr = enc_state->coef_buf_row.cb_ptr + SAMPLE_VIDEO_BLOCK_SIZE; vop_infor->coef_buf_row.cr_ptr = enc_state->coef_buf_row.cr_ptr + SAMPLE_VIDEO_BLOCK_SIZE; /* restore the dc coefficient on the left border */ vop_infor->coef_buf_col.y_ptr [0] = -1; vop_infor->coef_buf_col.y_ptr [8] = -1; vop_infor->coef_buf_col.cb_ptr[0] = -1; vop_infor->coef_buf_col.cr_ptr[0] = -1; /* restore qp_buf ptr */ vop_infor->qp_buf = enc_state->qp_buf; vop_infor->qp_buf[0] = enc_state->qp_buf[enc_state->mb_per_row]; } return SAMPLE_STATUS_NOERR; }/******************************************************************************// Name: encode_mpeg4// Description: Frame encoding function for MPEG-4 baseline encoder,// it includes preprocess for preparing VOP encoding,// VOP encoding and postprocess for preparing output//// Input Arguments: // stream_buf Pointer to the output video bitstream// enc_state Pointer to the general state struct of MPEG-4 encoder//// Output Arguments:// stream_buf Pointer to the updated output video bitstream after// compression.// enc_state Pointer to the updated general state struct of MPEG-4// encoder.//// Returns: // SAMPLE_STATUS_NOERR If succeeds// SAMPLE_STATUS_ERR If encoding fails******************************************************************************/sample_status encode_mpeg4(sample_bitstream *stream_buf, mp4_enc_state *enc_state){ mp4_enc_vop_infor vop_infor; sample_status ret_code; /* determine the vop_coding_type*/ if (0 == (enc_state->vop_indx % (enc_state->ivop_interval + 1))) { enc_state->vop_coding_type = IVOP; ret_code = encode_ivop_mpeg4(stream_buf, enc_state, &vop_infor); } else { enc_state->vop_coding_type = PVOP; expand_frame_enc_mpeg4(enc_state); ret_code = encode_pvop_mpeg4(stream_buf, enc_state, &vop_infor); } if (SAMPLE_STATUS_NOERR != ret_code) { return ret_code; } /* fill stuffing bits */ if (!stream_buf->bs_cur_bitoffset) { stream_buf->bs_cur_byte[0] = 0x7F; } else { stream_buf->bs_cur_byte[0] |= bits_stuf_tbl[7 - stream_buf->bs_cur_bitoffset]; stream_buf->bs_cur_bitoffset = 0; } stream_buf->bs_cur_byte++; /* exchange between current and reference frame */ set_ref_frame_enc_mpeg4(enc_state); /* update input info pic pointers */ 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->vop_indx++; return SAMPLE_STATUS_NOERR;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -