📄 mp4dinit.c
字号:
ret_code = parse_voandvol_header_mpeg4(stream_buf, dec_state);
if (ret_code != SAMPLE_STATUS_NOERR) {
return ret_code;
}
/* determine the vop size */
dec_state->mb_per_row = (dec_state->vol_display_width + 15)
/ SAMPLE_VIDEO_MB_SIZE;
dec_state->mb_per_col = (dec_state->vol_display_height + 15)
/ SAMPLE_VIDEO_MB_SIZE;
dec_state->frame_dimension.width = dec_state->mb_per_row
* SAMPLE_VIDEO_MB_SIZE;
dec_state->frame_dimension.height = dec_state->mb_per_col
* SAMPLE_VIDEO_MB_SIZE;
dec_state->frame_step_set.y_step = dec_state->frame_dimension.width
+ SAMPLE_VIDEO_MB_SIZE * 2;
dec_state->frame_step_set.cb_step = dec_state->frame_dimension.width / 2
+ SAMPLE_VIDEO_MB_SIZE;
dec_state->frame_step_set.cr_step = dec_state->frame_dimension.width / 2
+ SAMPLE_VIDEO_MB_SIZE;
/* allocate working buffer for decoder */
ret_code = get_working_buffer_mpeg4 (dec_state);
if (ret_code != SAMPLE_STATUS_NOERR) {
decoder_free_mpeg4(dec_state);
return ret_code;
}
/* initialize other members of decoder state structure */
dec_state->vop_indx = 0;
/* rectangular picture */
dec_state->info_pic->pic_width = dec_state->vol_display_width;
dec_state->info_pic->pic_height = dec_state->vol_display_height;
dec_state->info_pic->pic_plane_num = 3;
dec_state->info_pic->pic_channel_num = 3;
dec_state->info_pic->pic_format = SAMPLE_YCbCr411;
dec_state->info_pic->pic_plane_step[0] =
dec_state->frame_step_set.y_step;
dec_state->info_pic->pic_plane_step[1] =
dec_state->frame_step_set.cb_step;
dec_state->info_pic->pic_plane_step[2] =
dec_state->frame_step_set.cr_step;
/* skip stuffing bits to search for next_start_code */
if (stream_buf->bs_cur_bitoffset) {
stream_buf->bs_cur_bitoffset = 0;
stream_buf->bs_cur_byte++;
}
/* search for the following next_start_code in the buffer */
ret_code = search_next_sc_mpeg4(stream_buf, &next_sc_pos);
if (ret_code != SAMPLE_STATUS_NOERR) {
decoder_free_mpeg4(dec_state);
return ret_code;
}
stream_buf->bs_cur_byte = next_sc_pos;
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: init_vop_infor_dec_mpeg4
// Desicription:
// Initialize VOP information struct at the beginning of
// decoding each VOP
// Input Arguments:
// dec_state Pointer to the general state struct of MPEG-4 decoder
// vop_infor Pointer to vop information struct of MPEG-4 decoder
//
// Output Arguments:
// dec_state Pointer to the updated state struct of MPEG-4 decoder
// vop_infor Pointer to updated vop infor struct of MPEG-4 decoder
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
// Note:
// support I-VOP, P-VOP initialization
******************************************************************************/
sample_status init_vop_infor_dec_mpeg4(mp4_dec_state *dec_state,
mp4_dec_vop_infor *vop_infor)
{
int i;
vop_infor->mb_indx = 0;
/* init qp_buf ptr */
vop_infor->cur_qp = dec_state->vop_quant;
vop_infor->qp_buf = dec_state->qp_buf;
/* init buffer ptrs: ac/dc prediction coefficient buffer */
vop_infor->coef_buf_row.y_ptr = dec_state->coef_buf_row.y_ptr + 16;
vop_infor->coef_buf_row.cb_ptr = dec_state->coef_buf_row.cb_ptr + 8;
vop_infor->coef_buf_row.cr_ptr = dec_state->coef_buf_row.cr_ptr + 8;
vop_infor->coef_buf_col.y_ptr = dec_state->coef_buf_col.y_ptr;
vop_infor->coef_buf_col.cb_ptr = dec_state->coef_buf_col.cb_ptr;
vop_infor->coef_buf_col.cr_ptr = dec_state->coef_buf_col.cr_ptr;
/* init the dc coefficient on the upper border */
for (i = 0; i< dec_state->mb_per_row + 1; i++) {
dec_state->coef_buf_row.y_ptr[i*16] = (Ipp16s) -1;
dec_state->coef_buf_row.y_ptr[i*16+8] = (Ipp16s) -1;
dec_state->coef_buf_row.cb_ptr[i*8] = (Ipp16s) -1;
dec_state->coef_buf_row.cr_ptr[i*8] = (Ipp16s) -1;
}
/* init the dc coefficient on the left border */
dec_state->coef_buf_col.y_ptr[0] = (Ipp16s) -1;
dec_state->coef_buf_col.y_ptr[8] = (Ipp16s) -1;
dec_state->coef_buf_col.cb_ptr[0] = (Ipp16s) -1;
dec_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 = dec_state->cur_frame.y_ptr;
vop_infor->cur_mb.cb_ptr = dec_state->cur_frame.cb_ptr;
vop_infor->cur_mb.cr_ptr = dec_state->cur_frame.cr_ptr;
if (PVOP == dec_state->vop_coding_type) {
/* init buffer ptrs: position the 1st ref MB in ref VOP plane */
vop_infor->fwd_ref_mb.y_ptr = dec_state->fwd_ref_frame.y_ptr;
vop_infor->fwd_ref_mb.cb_ptr = dec_state->fwd_ref_frame.cb_ptr;
vop_infor->fwd_ref_mb.cr_ptr = dec_state->fwd_ref_frame.cr_ptr;
/* init two motion compensation function ptrs */
if(1 == dec_state->rounding) {
vop_infor->recon_block_func_ptr = (recon_block_func_ptr)
ippiMCReconBlock_RoundOn;
vop_infor->copy_block_func_ptr = (copy_block_func_ptr)
ippiMCBlock_RoundOn_8u;
} else {
vop_infor->recon_block_func_ptr = (recon_block_func_ptr)
ippiMCReconBlock_RoundOff;
vop_infor->copy_block_func_ptr = (copy_block_func_ptr)
ippiMCBlock_RoundOff_8u;
}
/* init mv_buf ptr */
vop_infor->mv_buf = dec_state->mv_buf;
/* init tranp_buf ptr */
vop_infor->tranp_buf = dec_state->tranp_buf;
for(i=0; i< (dec_state->mb_per_row + 2) * 4; i++ ) {
vop_infor->tranp_buf[i] = IPP_VIDEO_TRANSPARENT;
}
} else if (IVOP == dec_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;
}
/******************************************************************************
// Name: decoder_free_mpeg4
// Desicription:
// Free working buffer of the MPEG-4 decoder
// Input Arguments:
// dec_state Pointer to the general state struct of MPEG-4 decoder
//
// Output Arguments:
// dec_state Pointer to the updated state struct of MPEG-4 decoder
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
// Note:
//
******************************************************************************/
sample_status decoder_free_mpeg4(mp4_dec_state *dec_state)
{
/* cur_frame.y_ptr */
if (dec_state->cur_frame.y_ptr) {
dec_state->cur_frame.y_ptr -= dec_state->frame_step_set.y_step
* SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;
free_align_mem_mpeg4((void*)&dec_state->cur_frame.y_ptr);
}
/* fwd_ref_frame.y_ptr */
if (dec_state->fwd_ref_frame.y_ptr) {
dec_state->fwd_ref_frame.y_ptr -= dec_state->frame_step_set.y_step
* SAMPLE_VIDEO_MB_SIZE + SAMPLE_VIDEO_MB_SIZE;
free_align_mem_mpeg4((void*)&dec_state->fwd_ref_frame.y_ptr);
}
/* cur_frame.cb_ptr */
if (dec_state->cur_frame.cb_ptr) {
dec_state->cur_frame.cb_ptr -= dec_state->frame_step_set.cb_step
* SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;
free_align_mem_mpeg4((void*)&dec_state->cur_frame.cb_ptr);
}
/* fwd_ref_frame.cb_ptr */
if (dec_state->fwd_ref_frame.cb_ptr) {
dec_state->fwd_ref_frame.cb_ptr -= dec_state->frame_step_set.cb_step
* SAMPLE_VIDEO_MB_SIZE / 2 +SAMPLE_VIDEO_MB_SIZE / 2;
free_align_mem_mpeg4((void*)&dec_state->fwd_ref_frame.cb_ptr);
}
/* cur_frame.cr_ptr */
if (dec_state->cur_frame.cr_ptr) {
dec_state->cur_frame.cr_ptr -= dec_state->frame_step_set.cr_step
* SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;
free_align_mem_mpeg4((void*)&dec_state->cur_frame.cr_ptr);
}
/* fwd_ref_frame.cr_ptr */
if (dec_state->fwd_ref_frame.cr_ptr) {
dec_state->fwd_ref_frame.cr_ptr -= dec_state->frame_step_set.cr_step
* SAMPLE_VIDEO_MB_SIZE / 2 + SAMPLE_VIDEO_MB_SIZE / 2;
free_align_mem_mpeg4((void*)&dec_state->fwd_ref_frame.cr_ptr);
}
/* coef_buf_row.y_ptr */
if (dec_state->coef_buf_row.y_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_row.y_ptr);
}
/* coef_buf_col.y_ptr */
if (dec_state->coef_buf_row.y_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_col.y_ptr);
}
/* coef_buf_row.cb_ptr */
if (dec_state->coef_buf_row.cb_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_row.cb_ptr);
}
/* coef_buf_col.cb_ptr */
if (dec_state->coef_buf_col.cb_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_col.cb_ptr);
}
/* coef_buf_row.cr_ptr */
if (dec_state->coef_buf_row.cr_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_row.cr_ptr);
}
/* coef_buf_col.cr_ptr */
if (dec_state->coef_buf_col.cr_ptr) {
free_align_mem_mpeg4((void*)&dec_state->coef_buf_col.cr_ptr);
}
/* mv_buf */
if (dec_state->mv_buf) {
free_align_mem_mpeg4((void*)&dec_state->mv_buf);
}
/* tranp_buf */
if (dec_state->tranp_buf) {
free_align_mem_mpeg4((void*)&dec_state->tranp_buf);
}
/* qp_buf */
if (dec_state->qp_buf) {
free_align_mem_mpeg4((void*)&dec_state->qp_buf);
}
/* info_pic */
if (dec_state->info_pic) {
free_align_mem_mpeg4((void*)&dec_state->info_pic);
}
return SAMPLE_STATUS_NOERR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -