📄 umc_mpeg2_dec_mc.cpp
字号:
int pitch_y = video->frame_buffer.Y_comp_pitch; int pitch_uv = video->frame_buffer.U_comp_pitch; int pitch_y_2 = pitch_y*2; int pitch_uv_2 = pitch_uv*2; int ptc_uv, ptc_y; int flag1, flag2, flag3, flag4; int offs; int offs1; int offs2; ptc_uv = pitch_uv + pitch_uv*(!pMacro->prediction_type); ptc_y = pitch_y + pitch_y*(!pMacro->prediction_type); //bi_direction if(pMacro->macroblock_motion_forward && pMacro->macroblock_motion_backward) { ref_Y_data1 = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data; ref_U_data1 = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].U_comp_data; ref_V_data1 = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].V_comp_data; ref_Y_data2 = video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].Y_comp_data; ref_U_data2 = video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].U_comp_data; ref_V_data2 = video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].V_comp_data; switch(pMacro->prediction_type) { case IPPVC_MC_FRAME: pMacro->vector_luma[1] = pMacro->vector[1] >> 1; pMacro->vector_luma[0] = pMacro->vector[0] >> 1; pMacro->vector_luma[3] = pMacro->vector[3] >> 1; pMacro->vector_luma[2] = pMacro->vector[2] >> 1; pMacro->vector_chroma[1] = pMacro->vector[1] >> 1;//down pMacro->vector_chroma[0] = pMacro->vector[0] >> 2;//right pMacro->vector_chroma[3] = pMacro->vector[3] >> 1;//down pMacro->vector_chroma[2] = pMacro->vector[2] >> 2;//right offs1 = (pMacro->vector_chroma[1] + pMacro->row_c + pMacro->motion_vertical_field_select[0])*pitch_uv + pMacro->vector_chroma[0] + pMacro->col_c; offs2 = (pMacro->vector_chroma[3] + pMacro->row_c + pMacro->motion_vertical_field_select[1])*pitch_uv + pMacro->vector_chroma[2] + pMacro->col_c; flag1 = ((pMacro->vector[0] & 1) << 3) | ((pMacro->vector[1] & 1) << 2); flag2 = ((pMacro->vector[0] & 2) << 2) | ((pMacro->vector[1] & 1) << 2); flag3 = ((pMacro->vector[2] & 1) << 3) | ((pMacro->vector[3] & 1) << 2); flag4 = ((pMacro->vector[2] & 2) << 2) | ((pMacro->vector[3] & 1) << 2); i = ippiMC16x16B_8u_C1( ref_Y_data1 + (pMacro->vector_luma[1] + pMacro->row_l)*pitch_y + pMacro->vector_luma[0] + pMacro->col_l, ptc_y, flag1, ref_Y_data2 + (pMacro->vector_luma[3] + pMacro->row_l)*pitch_y + pMacro->vector_luma[2] + pMacro->col_l, ptc_y, flag3, diff,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + pMacro->offset_l, ptc_y, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16B_8u_C1 ( ref_U_data1 + offs1, ptc_uv, flag2, ref_U_data2 + offs2, ptc_uv, flag4, diff+256,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + pMacro->offset_c, ptc_uv, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16B_8u_C1 ( ref_V_data1 + offs1, ptc_uv,flag2, ref_V_data2 + offs2, ptc_uv,flag4, diff+384,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + pMacro->offset_c, ptc_uv, 0); VM_ASSERT(i == ippStsOk); break; case IPPVC_MC_FIELD: if(PictureHeader.picture_structure == FRAME_PICTURE) { for(r = 0; r < pMacro->motion_vector_count; r++) { pMacro->vector_luma[4*r + 1] = (pMacro->vector[4*r + 1] >> 1) << 1; pMacro->vector_luma[4*r] = pMacro->vector[4*r] >> 1; pMacro->vector_luma[4*r + 3] = (pMacro->vector[4*r + 3] >> 1) << 1; pMacro->vector_luma[4*r + 2] = pMacro->vector[4*r + 2] >> 1; pMacro->vector_chroma[4*r + 1] = pMacro->vector_luma[4*r + 1];//down pMacro->vector_chroma[4*r] = pMacro->vector[4*r] >> 2;//right pMacro->vector_chroma[4*r + 3] = pMacro->vector_luma[4*r + 3];//down pMacro->vector_chroma[4*r + 2] = pMacro->vector[4*r + 2] >> 2;//right offs1 = (pMacro->vector_chroma[4*r + 1] + pMacro->row_c + pMacro->motion_vertical_field_select[2*r])*pitch_uv + pMacro->vector_chroma[4*r] + pMacro->col_c; offs2 = (pMacro->vector_chroma[4*r + 3] + pMacro->row_c + pMacro->motion_vertical_field_select[2*r+1])*pitch_uv + pMacro->vector_chroma[4*r + 2] + pMacro->col_c; flag1 = ((pMacro->vector[4*r] & 1) << 3) | ((pMacro->vector[4*r + 1] & 1) << 2); flag2 = ((pMacro->vector[4*r] & 2) << 2) | ((pMacro->vector[4*r + 1] & 1) << 2); flag3 = ((pMacro->vector[4*r + 2] & 1) << 3) | ((pMacro->vector[4*r + 3] & 1) << 2); flag4 = ((pMacro->vector[4*r + 2] & 2) << 2) | ((pMacro->vector[4*r + 3] & 1) << 2); i = ippiMC16x8B_8u_C1( ref_Y_data1 + (pMacro->vector_luma[4*r + 1] + pMacro->row_l + pMacro->motion_vertical_field_select[2*r])*pitch_y + pMacro->vector_luma[4*r] + pMacro->col_l, ptc_y, flag1, ref_Y_data2 + (pMacro->vector_luma[4*r + 3] + pMacro->row_l + pMacro->motion_vertical_field_select[2*r+1])*pitch_y + pMacro->vector_luma[4*r + 2] + pMacro->col_l, ptc_y, flag3, diff+16*r,64, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + pMacro->offset_l + pMacro->shift_y[r], ptc_y, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x8B_8u_C1( ref_U_data1 + offs1, ptc_uv, flag2, ref_U_data2 + offs2, ptc_uv, flag4, diff+256+8*r,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + pMacro->offset_c + pMacro->shift_uv[r], ptc_uv, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x8B_8u_C1( ref_V_data1 + offs1, ptc_uv,flag2, ref_V_data2 + offs2, ptc_uv,flag4, diff+384+8*r,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + pMacro->offset_c + pMacro->shift_uv[r], ptc_uv, 0); VM_ASSERT(i == ippStsOk); }//for(r) } else { pMacro->vector_luma[1] = (pMacro->vector[1] >> 1) << 1; pMacro->vector_luma[0] = pMacro->vector[0] >> 1; pMacro->vector_luma[3] = (pMacro->vector[3] >> 1) << 1; pMacro->vector_luma[2] = pMacro->vector[2] >> 1; pMacro->vector_chroma[1] = (pMacro->vector[1] >> 1) << 1;//down pMacro->vector_chroma[0] = pMacro->vector[0] >> 2;//right pMacro->vector_chroma[3] = (pMacro->vector[3] >> 1) << 1;//down pMacro->vector_chroma[2] = pMacro->vector[2] >> 2;//right offs1 = (pMacro->vector_chroma[1] + pMacro->row_c + pMacro->motion_vertical_field_select[0])*pitch_uv + pMacro->vector_chroma[0] + pMacro->col_c; offs2 = (pMacro->vector_chroma[3] + pMacro->row_c + pMacro->motion_vertical_field_select[1])*pitch_uv + pMacro->vector_chroma[2] + pMacro->col_c; flag1 = ((pMacro->vector[0] & 1) << 3) | ((pMacro->vector[1] & 1) << 2); flag2 = ((pMacro->vector[0] & 2) << 2) | ((pMacro->vector[1] & 1) << 2); flag3 = ((pMacro->vector[2] & 1) << 3) | ((pMacro->vector[3] & 1) << 2); flag4 = ((pMacro->vector[2] & 2) << 2) | ((pMacro->vector[3] & 1) << 2); i = ippiMC16x16B_8u_C1( ref_Y_data1 + (pMacro->vector_luma[1] + pMacro->row_l + pMacro->motion_vertical_field_select[0])*pitch_y + pMacro->vector_luma[0] + pMacro->col_l, ptc_y, flag1, ref_Y_data2 + (pMacro->vector_luma[3] + pMacro->row_l + pMacro->motion_vertical_field_select[1])*pitch_y + pMacro->vector_luma[2] + pMacro->col_l, ptc_y, flag3, diff,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + pMacro->offset_l + pMacro->odd_pitch_y, ptc_y, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16B_8u_C1( ref_U_data1 + offs1, ptc_uv, flag2, ref_U_data2 + offs2, ptc_uv, flag4, diff+256,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + pMacro->offset_c + pMacro->odd_pitch_uv, ptc_uv, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16B_8u_C1( ref_V_data1 + offs1, ptc_uv,flag2, ref_V_data2 + offs2, ptc_uv,flag4, diff+384,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + pMacro->offset_c + pMacro->odd_pitch_uv, ptc_uv, 0); VM_ASSERT(i == ippStsOk); } break; case IPPVC_MC_16X8: for(r = 0; r < pMacro->motion_vector_count; r++) { pMacro->vector_luma[4*r + 1] = (pMacro->vector[4*r + 1] >> 1) << 1; pMacro->vector_luma[4*r] = pMacro->vector[4*r] >> 1; pMacro->vector_luma[4*r + 3] = (pMacro->vector[4*r + 3] >> 1) << 1; pMacro->vector_luma[4*r + 2] = pMacro->vector[4*r + 2] >> 1; pMacro->vector_chroma[4*r + 1] = (pMacro->vector[4*r + 1] >> 1) << 1;//down pMacro->vector_chroma[4*r] = pMacro->vector[4*r] >> 2;//right pMacro->vector_chroma[4*r + 3] = (pMacro->vector[4*r + 3] >> 1) << 1;//down pMacro->vector_chroma[4*r + 2] = pMacro->vector[4*r + 2] >> 2;//right offs1 = (pMacro->vector_chroma[4*r + 1] + pMacro->row_c + pMacro->motion_vertical_field_select[2*r])*pitch_uv + pMacro->vector_chroma[4*r] + pMacro->col_c; offs2 = (pMacro->vector_chroma[4*r + 3] + pMacro->row_c + pMacro->motion_vertical_field_select[2*r+1])*pitch_uv + pMacro->vector_chroma[4*r + 2] + pMacro->col_c; flag1 = ((pMacro->vector[4*r] & 1) << 3) | ((pMacro->vector[4*r + 1] & 1) << 2); flag2 = ((pMacro->vector[4*r] & 2) << 2) | ((pMacro->vector[4*r + 1] & 1) << 2); flag3 = ((pMacro->vector[4*r + 2] & 1) << 3) | ((pMacro->vector[4*r + 3] & 1) << 2); flag4 = ((pMacro->vector[4*r + 2] & 2) << 2) | ((pMacro->vector[4*r + 3] & 1) << 2); i = ippiMC16x8B_8u_C1( ref_Y_data1 + (pMacro->vector_luma[4*r + 1] + pMacro->row_l + 16 * r + pMacro->motion_vertical_field_select[2*r])*pitch_y + pMacro->vector_luma[4*r] + pMacro->col_l, pitch_y_2, flag1, ref_Y_data2 + (pMacro->vector_luma[4*r + 3] + pMacro->row_l + 16 * r + pMacro->motion_vertical_field_select[2*r+1])*pitch_y + pMacro->vector_luma[4*r + 2] + pMacro->col_l, pitch_y_2, flag3, diff+128*r,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + pMacro->offset_l + pMacro->shift_y[r] + pMacro->odd_pitch_y, pitch_y_2, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x8B_8u_C1( ref_U_data1 + offs1 + 8 * r * pitch_uv, pitch_uv_2, flag2, ref_U_data2 + offs2 + 8 * r * pitch_uv, pitch_uv_2, flag4, diff+256+64*r,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + pMacro->offset_c + pMacro->shift_uv[r] + pMacro->odd_pitch_uv, pitch_uv_2, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x8B_8u_C1( ref_V_data1 + offs1 + 8 * r * pitch_uv, pitch_uv_2,flag2, ref_V_data2 + offs2 + 8 * r * pitch_uv, pitch_uv_2,flag4, diff+384+64*r,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + pMacro->offset_c + pMacro->shift_uv[r] + pMacro->odd_pitch_uv, pitch_uv_2, 0); VM_ASSERT(i == ippStsOk); }//for(r) break; } } else if(pMacro->macroblock_motion_forward || PictureHeader.picture_coding_type == P_FRAME) { switch(pMacro->prediction_type) { case IPPVC_MC_FRAME: ref_Y_data = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data; ref_U_data = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].U_comp_data; ref_V_data = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].V_comp_data; pMacro->vector_luma[1] = pMacro->vector[1] >> 1; pMacro->vector_luma[0] = pMacro->vector[0] >> 1; pMacro->vector_chroma[1] = pMacro->vector[1] >> 1;//down pMacro->vector_chroma[0] = pMacro->vector[0] >> 2;//right offs = (pMacro->vector_chroma[1] + pMacro->row_c + pMacro->motion_vertical_field_select[0])* pitch_uv + pMacro->vector_chroma[0] + pMacro->col_c; flag1 = ((pMacro->vector[0] & 1) << 3) | ((pMacro->vector[1] & 1) << 2); flag2 = ((pMacro->vector[0] & 2) << 2) | ((pMacro->vector[1] & 1) << 2); i = ippiMC16x16_8u_C1( ref_Y_data + (pMacro->vector_luma[1] + pMacro->row_l) * pitch_y + pMacro->vector_luma[0] + pMacro->col_l, ptc_y, diff,32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + pMacro->offset_l, ptc_y, flag1, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16_8u_C1( ref_U_data + offs, ptc_uv, diff+256,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + pMacro->offset_c, ptc_uv, flag2, 0); VM_ASSERT(i == ippStsOk); i = ippiMC8x16_8u_C1( ref_V_data + offs, ptc_uv, diff+384,16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + pMacro->offset_c, ptc_uv, flag2, 0); VM_ASSERT(i == ippStsOk); break; case IPPVC_MC_FIELD: if(PictureHeader.picture_structure == FRAME_PICTURE) { ref_Y_data = video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -