📄 mp4dblck.c
字号:
for (i = 1; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) {
dst_coef[i] = 0;
}
/* 3. inverse DC and AC prediction, AC buffer update */
/* dst_coef, coef_bufrow, coef_bufcol must be 4 byte aligned */
if (ippStsNoErr != ippiPredictReconCoefIntra_MPEG4_16s (dst_coef,
coef_bufrow, coef_bufcol, quant_para, qp_pred, pred_dir, ac_pred_flag,
video_comp)) {
return SAMPLE_STATUS_ERR;
}
/* 4. inverse quantisation */
if (ippStsNoErr != ippiQuantInvIntra_MPEG4_16s_I(dst_coef, quant_para,
quant_matrix, video_comp)) {
return SAMPLE_STATUS_ERR;
}
/* 5. inverse DCT */
/* dst_coef and dst_val must be 8 byte aligned */
if (ippStsNoErr != ippiDCT8x8Inv_Video_16s8u_C1R(dst_coef, dst_val, step)) {
return SAMPLE_STATUS_ERR;
}
/* 6. DC buffer update */
switch (blk_indx){
case Y_BLOCK2:
tmp_coef = coef_bufcol[8];
coef_bufcol[8] = coef_bufrow[-16];
coef_bufrow[-16] = tmp_coef;
coef_bufcol[0] = coef_bufrow[0];
coef_bufrow[0] = dst_coef[0];
break;
case Y_BLOCK4:
coef_bufcol[0] = dst_coef[0];
break;
default:
coef_bufcol[0] = coef_bufrow[0];
coef_bufrow[0] = dst_coef[0];
break;
}
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
//
// Name: decode_block_intradcac_mpeg4
//
// Description: Decodes the INTRA block coefficients with both intra DC
// and AC transform coefficients in the bitstream. Inverse
// quantization, inversely zigzag positioning and IDCT,
// with appropriate clipping on each step, are performed
// on the coefficients.The results are then placed in the
// output frame/plane on a pixel basis.
//
// Input Arguments:
// stream_buf Pointer to the source video bitstream in which the
// intra block starts
// step Width of the destination plane.
// coef_bufrow Pointer to the coefficient row buffer.
// coef_bufcol Pointer to the coefficient column buffer.
// quant_para Quantization parameter of the macroblock which the
// current block belongs to.
// quant_buf Pointer to the quantization parameter buffer.
// quant_matrix Pointer to the quantization weighting matrix for intra
// MB. If it is NULL, it indicates to use the second
// inverse quantization method; if it is not NULL, the
// first inverse quantization method is used.
// blk_indx Block index indicating the component type and position
// as defined in subclause 6.1.3.8, Figure 6-5 of ISO/IEC
// 14496-2.
// intra_dcvlc_flag
// A flag determined by intra_dc_vlc_thr and Qp. This
// allows a mechanism to switch between two VLC's for
// coding of Intra DC coefficients as per Table 6-21 of
// ISO/IEC 14496-2.
// ac_pred_flag A flag indicating if the AC coefficients of the first
// row or first column are differentially coded for intra
// coded MB.
//
// Output Arguments:
// stream_buf Pointer to the source video bitstream after the block
// is decoded
// dst_val Pointer to the block in the destination plane.
// coef_bufrow Pointer to the updated coefficient row buffer.
// coef_bufcol Pointer to the updated coefficient column buffer.
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
// SAMPLE_STATUS_ERR If decoding fails
//
// Notes:
// 1) No boundary check for the bitstream buffer.
//
******************************************************************************/
sample_status
decode_block_intradcac_mpeg4
(sample_bitstream *stream_buf, Ipp8u *dst_val, int step, Ipp16s *coef_bufrow,
Ipp16s *coef_bufcol, Ipp8u quant_para, Ipp8u *quant_buf,
const Ipp8u *quant_matrix, int blk_indx, int intra_dcvlc_flag,
int ac_pred_flag)
{
int pred_dir; /* prediction direction */
int dc_left, dc_top, dc_left_top; /* DC value of the left, top and
// left-top block */
Ipp16s qp_pred; /* The QP value of the prediction
// reference macroblock */
Ipp16s coef_buf[72], tmp_coef;
Ipp16s* dst_coef = (Ipp16s*)SAMPLE_ALIGN8(coef_buf);
IppStatus ret_code;
IppVideoComponent video_comp;
qp_pred = quant_para;
/* 1. DC/AC prediction direction */
/* Below is the neighboring blocks used in DC/AC prediction direction
// shown in Figure 7-5 of ISO/IEC 14496-2
// --- --- ---
// | b | | c | | d |
// --- --- ---
// --- --- ---
// | a | | x | | y |
// --- --- ---
// --- --- ---
// | e | | w | | z |
// --- --- ---
// Befor decoding this macroblock(block x, y, z, w), the DC coefficients
// are stored as: (Fx[0][0] means the DC coefficient of x block)
// vop_infor->coef_buf_row[-8] = Fa[0][0];
// vop_infor->coef_buf_row[0] = Fc[0][0];
// vop_infor->coef_buf_row[8] = Fd[0][0];
// vop_infor->coef_buf_col[0] = Fb[0][0];
// vop_infor->coef_buf_col[8] = Fe[0][0];
//
// After the x block has been decoded, the DC coefficients are stored as:
// vop_infor->coef_buf_row[-8] = Fa[0][0];
// vop_infor->coef_buf_row[0] = Fx[0][0];
// vop_infor->coef_buf_row[8] = Fd[0][0];
// vop_infor->coef_buf_col[0] = Fc[0][0];
// vop_infor->coef_buf_col[8] = Fe[0][0];
//
// After the y block has been decoded, the DC coefficients are stored as:
// vop_infor->coef_buf_row[-8] = Fe[0][0];
// vop_infor->coef_buf_row[0] = Fx[0][0];
// vop_infor->coef_buf_row[8] = Fy[0][0];
// vop_infor->coef_buf_col[0] = Fd[0][0];
// vop_infor->coef_buf_col[8] = Fa[0][0];
//
// After the w block has been decoded, the DC coefficients are stored as:
// vop_infor->coef_buf_row[-8] = Fe[0][0];
// vop_infor->coef_buf_row[0] = Fw[0][0];
// vop_infor->coef_buf_row[8] = Fy[0][0];
// vop_infor->coef_buf_col[0] = Fd[0][0];
// vop_infor->coef_buf_col[8] = Fx[0][0];
//
// After the z block has been decoded, the DC coefficients are stored as:
// vop_infor->coef_buf_row[-8] = Fe[0][0];
// vop_infor->coef_buf_row[0] = Fw[0][0];
// vop_infor->coef_buf_row[8] = Fy[0][0];
// vop_infor->coef_buf_col[0] = Fd[0][0];
// vop_infor->coef_buf_col[8] = Fz[0][0];
// vop_infor->coef_buf_row += 16;
// If this is the last macroblock in a row, buffer should be updated as:
// vop_infor->coef_buf_col[8] = Fz[0][0]; */
dc_top = (0 > coef_bufrow[0]) ? 1024 : coef_bufrow[0];
dc_left = (0 > coef_bufrow[-8]) ? 1024 : coef_bufrow[-8];
dc_left_top = (0 > coef_bufcol[0]) ? 1024 : coef_bufcol[0];
if (ABS_MP4(dc_left - dc_left_top) < ABS_MP4(dc_top - dc_left_top)) {
pred_dir = IPP_VIDEO_VERTICAL;
if((0 <= coef_bufrow[0]) && (Y_BLOCK3 != blk_indx) && (Y_BLOCK4
!= blk_indx)) {
/* the reference block is from the top macro block */
qp_pred = quant_buf[1];
}
} else {
pred_dir = IPP_VIDEO_HORIZONTAL;
if((0 <= coef_bufrow[-8]) && (Y_BLOCK2 != blk_indx) && (Y_BLOCK4
!= blk_indx)) {
/* the reference block is from the left macro block */
qp_pred = quant_buf[0];
}
}
/* 2. VLC decoding of intra DC and AC and inverse scan */
video_comp = (Y_BLOCK4 >= blk_indx) ? IPP_VIDEO_LUMINANCE
: IPP_VIDEO_CHROMINANCE;
if (intra_dcvlc_flag) {
if (ac_pred_flag) {
/* dst_coef must be 4 byte aligned */
ret_code = ippiDecodeVLCZigzag_IntraDCVLC_MPEG4_1u16s(
&stream_buf->bs_cur_byte,
&stream_buf->bs_cur_bitoffset,
dst_coef,
pred_dir,
video_comp);
} else {
/* dst_coef must be 4 byte aligned */
ret_code = ippiDecodeVLCZigzag_IntraDCVLC_MPEG4_1u16s(
&stream_buf->bs_cur_byte,
&stream_buf->bs_cur_bitoffset,
dst_coef,
IPP_VIDEO_NONE,
video_comp);
}
} else {
if (ac_pred_flag) {
/* dst_coef must be 4 byte aligned */
ret_code = ippiDecodeVLCZigzag_IntraACVLC_MPEG4_1u16s(
&stream_buf->bs_cur_byte,
&stream_buf->bs_cur_bitoffset,
dst_coef,
pred_dir);
} else {
/* dst_coef must be 4 byte aligned */
ret_code = ippiDecodeVLCZigzag_IntraACVLC_MPEG4_1u16s(
&stream_buf->bs_cur_byte,
&stream_buf->bs_cur_bitoffset,
dst_coef,
IPP_VIDEO_NONE);
}
}
if (ippStsNoErr != ret_code) {
return SAMPLE_STATUS_ERR;
}
/* 3. inverse DC and AC prediction, AC buffer update */
/* dst_coef, coef_bufrow, coef_bufcol must be 4 byte aligned */
if (ippStsNoErr != ippiPredictReconCoefIntra_MPEG4_16s(dst_coef,
coef_bufrow, coef_bufcol, quant_para, qp_pred, pred_dir, ac_pred_flag,
video_comp)) {
return SAMPLE_STATUS_ERR;
}
/* 4. inverse quantisation */
if (ippStsNoErr != ippiQuantInvIntra_MPEG4_16s_I(dst_coef, quant_para,
quant_matrix, video_comp)) {
return SAMPLE_STATUS_ERR;
}
/* 5. inverse DCT */
/* dst_coef, dst_val must be 8 byte aligned */
if (ippStsNoErr != ippiDCT8x8Inv_Video_16s8u_C1R(dst_coef, dst_val, step)) {
return SAMPLE_STATUS_ERR;
}
/* 6. DC buffer update */
switch (blk_indx){
case Y_BLOCK2:
tmp_coef = coef_bufcol[8];
coef_bufcol[8] = coef_bufrow[-16];
coef_bufrow[-16] = tmp_coef;
coef_bufcol[0] = coef_bufrow[0];
coef_bufrow[0] = dst_coef[0];
break;
case Y_BLOCK4:
coef_bufcol[0] = dst_coef[0];
break;
default:
coef_bufcol[0] = coef_bufrow[0];
coef_bufrow[0] = dst_coef[0];
break;
}
return SAMPLE_STATUS_NOERR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -