📄 umc_mpeg1_dec.cpp
字号:
/*////////////////////////////////////////////////////////////////////////////////// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include "umc_mpeg2_dec_base.h"#pragma warning(disable: 4244)using namespace UMC;static short zero_memory[6*64] = {0};Status MPEG2VideoDecoderBase::skipped_macroblockP_mpeg1(int threadID){ IppVideoContext *video = &Video[threadID]; sMacroblock *pMacro = &Video[threadID].macroblock; sSlice *pSlice = &Video[threadID].slice; int y_plain_index; int u_plain_index; int pitch_y, pitch_uv; IppiSize roiy, roiuv; int nmb; int toskip = pSlice->mb_address_increment-1; pMacro->row_l = pSlice->mb_row_prev << 4; pMacro->col_l = pSlice->mb_col_prev << 4; pitch_y = video->frame_buffer.Y_comp_pitch; pitch_uv = video->frame_buffer.U_comp_pitch; nmb = min(toskip, sequenceHeader.mb_width - pSlice->mb_col_prev); roiy.height = 16; roiuv.height = 8; while(toskip>0){ pMacro->row_c = pMacro->row_l >> 1; pMacro->col_c = pMacro->col_l >> 1; roiy.width = 16*nmb; roiuv.width = 8*nmb; y_plain_index = pMacro->row_l * pitch_y + pMacro->col_l; u_plain_index = pMacro->row_c * pitch_uv + pMacro->col_c; ippiCopy_8u_C1R(&video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data[y_plain_index], pitch_y, &video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data[y_plain_index], pitch_y, roiy); ippiCopy_8u_C1R(&video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].U_comp_data[u_plain_index], pitch_uv, &video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data[u_plain_index], pitch_uv, roiuv); ippiCopy_8u_C1R(&video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].V_comp_data[u_plain_index], pitch_uv, &video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data[u_plain_index], pitch_uv, roiuv); toskip -= nmb; nmb = min(toskip, sequenceHeader.mb_width); pMacro->col_l = 0; pMacro->row_l += 16; if(pMacro->row_l >= sequenceHeader.mb_height*16) return UMC_BAD_STREAM; } return UMC_OK;}Status MPEG2VideoDecoderBase::skipped_macroblockB_mpeg1(int threadID){ int i; unsigned int width; unsigned int width2; int offset_l, offset_c; int right_fl, down_fl, right_bl, down_bl, right_fc, down_fc, right_bc, down_bc; int flag1, flag2, flag1c, flag2c; int right_half; int down_half; IppVideoContext *video = &Video[threadID]; sMacroblock *pMacro = &Video[threadID].macroblock; sSlice *pSlice = &Video[threadID].slice; width = video->frame_buffer.Y_comp_pitch; width2 = video->frame_buffer.U_comp_pitch; pMacro->row_l = pSlice->mb_row_prev << 4; pMacro->col_l = pSlice->mb_col_prev << 4; pMacro->row_c = pSlice->mb_row_prev << 3; pMacro->col_c = pSlice->mb_col_prev << 3; offset_l = pMacro->row_l * width + pMacro->col_l; offset_c = pMacro->row_c * width2 + pMacro->col_c; // All pMacro->recon* was converted into half pel mode in the previous MB. if(pMacro->macroblock_motion_forward && pMacro->macroblock_motion_backward) { //half mode down_fl = pMacro->vector[1] >> 1; right_fl = pMacro->vector[0] >> 1; flag1 = ((pMacro->vector[0] & 1) << 3) | ((pMacro->vector[1] & 1) << 2); right_half = pMacro->vector[0] / 2; down_half = pMacro->vector[1] / 2; down_fc = down_half >> 1; right_fc = right_half >> 1; flag1c = ((right_half & 1) << 3) | ((down_half & 1) << 2); down_bl = pMacro->vector[3] >> 1; right_bl = pMacro->vector[2] >> 1; flag2 = ((pMacro->vector[2] & 1) << 3) | ((pMacro->vector[3] & 1) << 2); down_half = pMacro->vector[3] / 2; right_half = pMacro->vector[2] / 2; down_bc = down_half >> 1; right_bc = right_half >> 1; flag2c = ((right_half & 1) << 3) | ((down_half & 1) << 2); int off_fl = down_fl * width + right_fl; int off_fc = down_fc * width2 + right_fc; int off_bl = down_bl * width + right_bl; int off_bc = down_bc * width2 + right_bc; for(i=0; i<pSlice->mb_address_increment-1; i++) { ippiMC16x16B_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data + offset_l + off_fl, width, flag1, video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].Y_comp_data + offset_l + off_bl, width, flag2, zero_memory, 32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + offset_l, width, 0); ippiMC8x8B_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].U_comp_data + offset_c + off_fc, width2, flag1c, video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].U_comp_data + offset_c + off_bc, width2, flag2c, zero_memory, 16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + offset_c, width2, 0); ippiMC8x8B_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].V_comp_data + offset_c + off_fc, width2, flag1c, video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].V_comp_data + offset_c + off_bc, width2, flag2c, zero_memory, 16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + offset_c, width2, 0); pMacro->col_l += 16; if(pMacro->col_l >= sequenceHeader.mb_width * 16) { pMacro->row_l += 16; pMacro->row_c += 8; if(pMacro->row_l >= sequenceHeader.mb_height * 16) return UMC_BAD_STREAM; offset_l = pMacro->row_l * width; offset_c = pMacro->row_c * width2; pMacro->col_l = 0; } else { offset_l += 16; offset_c += 8; } } } else if(pMacro->macroblock_motion_forward) { //half mode down_fl = pMacro->vector[1] >> 1; right_fl = pMacro->vector[0] >> 1; flag1 = ((pMacro->vector[0] & 1) << 3) | ((pMacro->vector[1] & 1) << 2); right_half = pMacro->vector[0] / 2; down_half = pMacro->vector[1] / 2; down_fc = down_half >> 1; right_fc = right_half >> 1; flag1c = ((right_half & 1) << 3) | ((down_half & 1) << 2); int off_fl = down_fl * width + right_fl; int off_fc = down_fc * width2 + right_fc; for(i=0; i<pSlice->mb_address_increment-1; i++) { ippiMC16x16_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].Y_comp_data + offset_l + off_fl, width, zero_memory, 32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + offset_l, width, flag1, 0); ippiMC8x8_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].U_comp_data + offset_c + off_fc, width2, zero_memory, 16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + offset_c, width2, flag1c, 0); ippiMC8x8_8u_C1(video->frame_buffer.frame_p_c_n[video->frame_buffer.prev_index].V_comp_data + offset_c + off_fc, width2, zero_memory, 16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].V_comp_data + offset_c, width2, flag1c, 0); pMacro->col_l += 16; if(pMacro->col_l >= sequenceHeader.mb_width * 16) { pMacro->row_l += 16; pMacro->row_c += 8; if(pMacro->row_l >= sequenceHeader.mb_height * 16) return UMC_BAD_STREAM; offset_l = pMacro->row_l * width; offset_c = pMacro->row_c * width2; pMacro->col_l = 0; } else { offset_l += 16; offset_c += 8; } } } else { down_bl = pMacro->vector[3] >> 1; right_bl = pMacro->vector[2] >> 1; flag2 = ((pMacro->vector[2] & 1) << 3) | ((pMacro->vector[3] & 1) << 2); down_half = pMacro->vector[3] / 2; right_half = pMacro->vector[2] / 2; down_bc = down_half >> 1; right_bc = right_half >> 1; flag2c = ((right_half & 1) << 3) | ((down_half & 1) << 2); int off_bl = down_bl * width + right_bl; int off_bc = down_bc * width2 + right_bc; for(i=0; i<pSlice->mb_address_increment-1; i++) { ippiMC16x16_8u_C1( video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].Y_comp_data + offset_l + off_bl, width, zero_memory, 32, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].Y_comp_data + offset_l, width, flag2, 0); ippiMC8x8_8u_C1( video->frame_buffer.frame_p_c_n[video->frame_buffer.next_index].U_comp_data + offset_c + off_bc, width2, zero_memory, 16, video->frame_buffer.frame_p_c_n[video->frame_buffer.curr_index].U_comp_data + offset_c,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -