📄 i810xvmc.c
字号:
} else { /* Opposite parity, set up as if it were backward motion and use map1. */ dw1[1] = 2<<12 | ((0x2 + parity)<<6) | (0x3 - parity) | ((((uint)mb->coded_block_pattern<<22) & (0x3<<22)) | (((uint)mb->coded_block_pattern<<24) & (0x3<<26))); bmv[2] = mb->PMV[1][0][1]; bmv[3] = mb->PMV[1][0][0]; fmv[2] = 0; fmv[3] = 0; } } else { dw1[0] = type_table[mb->macroblock_type & 0xf] | drps_table[~ps & 0x1] | mvfs_table[mb->motion_vertical_field_select & 3] | (((uint)mb->coded_block_pattern)<<22); dw1[1] = type_table[mb->macroblock_type & 0xf] | drps_table[~ps & 0x1] | mvfs_table[(mb->motion_vertical_field_select>>2) & 0x3] | ((((uint)mb->coded_block_pattern<<22) & (0x3<<22)) | (((uint)mb->coded_block_pattern<<24) & (0x3<<26))); fmv[0] = mb->PMV[0][0][1]; fmv[1] = mb->PMV[0][0][0]; fmv[2] = mb->PMV[1][0][1]; fmv[3] = mb->PMV[1][0][0]; bmv[0] = mb->PMV[0][1][1]; bmv[1] = mb->PMV[0][1][0]; bmv[2] = mb->PMV[1][1][1]; bmv[3] = mb->PMV[1][1][0]; } /* First Y Block */ *dy++ = GFXBLOCK + 4 + (y1size>>2); *dy++ = (1<<30) | (2<<28) | dw1[0]; *dy++ = xy; *dy++ = (8<<16) | 16; *dy++ = *(uint *)fmv; *dy++ = *(uint *)bmv; PACK_CORR_DATA(dy,block_ptr,y1size); block_ptr = (short *)((unsigned long)block_ptr + y1size); /* Second Y Block */ *dy++ = GFXBLOCK + 4 + (y2size>>2); *dy++ = (1<<30) | (2<<28) | dw1[1]; *dy++ = (xy + 8); *dy++ = (8<<16) | 16; *dy++ = *(uint *)&fmv[2]; *dy++ = *(uint *)&bmv[2]; PACK_CORR_DATA(dy,block_ptr,y2size); block_ptr = (short *)((unsigned long)block_ptr + y2size); /* End Y Blocks */ fmv[0] /= 2; fmv[1] /= 2; fmv[2] /= 2; fmv[3] /= 2; bmv[0] /= 2; bmv[1] /= 2; bmv[2] /= 2; bmv[3] /= 2; xy >>= 1; /* U Blocks */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1[0]; *du++ = xy; *du++ = (4<<16) | 8; *du++ = *(uint *)fmv; *du++ = *(uint *)bmv; PACK_CORR_DATA(du,block_ptr,usize); block_ptr = (short *)((unsigned long)block_ptr + usize); /* Second U block */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1[1]; *du++ = (xy + 4); *du++ = (4<<16) | 8; *du++ = *(uint *)&fmv[2]; *du++ = *(uint *)&bmv[2]; PACK_CORR_DATA(du,block_ptr,usize); block_ptr = (short *)((unsigned long)block_ptr + usize); /* End U Blocks */ /* V Blocks */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1[0]; *dv++ = xy; *dv++ = (4<<16) | 8; *dv++ = *(uint *)fmv; *dv++ = *(uint *)bmv; PACK_CORR_DATA(dv,block_ptr,vsize); block_ptr = (short *)((unsigned long)block_ptr + vsize); /* Second V Block */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1[1]; *dv++ = (xy + 4); *dv++ = (4<<16) | 8; *dv++ = *(uint *)&fmv[2]; *dv++ = *(uint *)&bmv[2]; PACK_CORR_DATA(dv,block_ptr,vsize); block_ptr = (short *)((unsigned long)block_ptr + vsize); /* End V Blocks */ *datay = dy; *datau = du; *datav = dv;}/***************************************************************************// Function: renderDualPrimeinField// Description: inline function that sets hardware parameters for a Dual// prime encoded macroblock in a field picture.***************************************************************************/static __inline__ void renderDualPrimeinField(uint **datay,uint **datau, uint **datav,XvMCMacroBlock *mb, short *block_ptr,uint ps, uint flags) { register uint *dy = *datay; register uint *du = *datau; register uint *dv = *datav; /* Motion Vectors */ short fmv[2]; short bmv[2]; /* gfxblock dword 1 */ uint dw1; uint ysize = y_frame_bytes[mb->coded_block_pattern]; uint usize = u_frame_bytes[mb->coded_block_pattern]; uint vsize = v_frame_bytes[mb->coded_block_pattern]; uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4); if(ps & XVMC_TOP_FIELD) { dw1 = (mb->coded_block_pattern<<22) | 3<<12 | 2<<6 | 2<<3 | 3; } else { dw1 = (mb->coded_block_pattern<<22) | 3<<12 | 3<<6 | 3<<3 | 2; } fmv[0] = mb->PMV[0][0][1]; fmv[1] = mb->PMV[0][0][0]; bmv[0] = mb->PMV[0][1][1]; bmv[1] = mb->PMV[0][1][0]; /* Y Block */ *dy++ = GFXBLOCK + 4 + (ysize>>2); *dy++ = (1<<30) | (3<<28) | dw1; *dy++ = xy; *dy++ = (16<<16) | 16; *dy++ = *(uint *)fmv; *dy++ = *(uint *)bmv; PACK_CORR_DATA(dy,block_ptr,ysize); block_ptr = (short *)((unsigned long)block_ptr + ysize); /* End Y Blocks */ fmv[0] /= 2; fmv[1] /= 2; bmv[0] /= 2; bmv[1] /= 2; xy >>= 1; /* U Block */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1; *du++ = xy; *du++ = (8<<16) | 8; *du++ = *(uint *)fmv; *du++ = *(uint *)bmv; PACK_CORR_DATA(du,block_ptr,usize); block_ptr = (short *)((unsigned long)block_ptr + usize); /* V Block */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1; *dv++ = xy; *dv++ = (8<<16) | 8; *dv++ = *(uint *)fmv; *dv++ = *(uint *)bmv; PACK_CORR_DATA(dv,block_ptr,vsize); block_ptr = (short *)((unsigned long)block_ptr + vsize); *datay = dy; *datau = du; *datav = dv;}/***************************************************************************// Function: renderFieldinFrame// Description: inline function that sets hardware parameters for a Field// encoded macroblock in a frame picture.***************************************************************************/typedef union { short s[4]; uint u[2];} su_t;static __inline__ void renderFieldinFrame(uint **datay,uint **datau, uint **datav, XvMCMacroBlock *mb,short *block_ptr, uint flags) { register uint *dy = *datay; register uint *du = *datau; register uint *dv = *datav; /* Motion Vectors */ su_t fmv; su_t bmv; /* gfxblock dword 1 */ uint dw1[2]; uint y1size = y_first_field_bytes[mb->coded_block_pattern]; uint y2size = y_second_field_bytes[mb->coded_block_pattern]; uint usize = u_field_bytes[mb->coded_block_pattern]; uint vsize = v_field_bytes[mb->coded_block_pattern]; uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<3); dw1[0] = type_table[mb->macroblock_type & 0xf] | (0x2<<6) | mvfs_table[mb->motion_vertical_field_select & 3] | (((uint)mb->coded_block_pattern)<<22); dw1[1] = type_table[mb->macroblock_type & 0xf] | (0x3<<6) | mvfs_table[mb->motion_vertical_field_select>>2] | (((mb->coded_block_pattern & 0x3) | ((mb->coded_block_pattern & 0xc)<<2))<<22); fmv.s[0] = mb->PMV[0][0][1]/2; fmv.s[1] = mb->PMV[0][0][0]; fmv.s[2] = mb->PMV[1][0][1]/2; fmv.s[3] = mb->PMV[1][0][0]; bmv.s[0] = mb->PMV[0][1][1]/2; bmv.s[1] = mb->PMV[0][1][0]; bmv.s[2] = mb->PMV[1][1][1]/2; bmv.s[3] = mb->PMV[1][1][0]; /* First Y Block */ *dy++ = GFXBLOCK + 4 + (y1size>>2); *dy++ = (1<<30) | (2<<28) | dw1[0]; *dy++ = xy; *dy++ = (8<<16) | 16; *dy++ = fmv.u[0]; *dy++ = bmv.u[0]; PACK_CORR_DATA(dy,block_ptr,y1size); block_ptr = (short *)((unsigned long)block_ptr + y1size); /* Second Y Block */ *dy++ = GFXBLOCK + 4 + (y2size>>2); *dy++ = (1<<30) | (2<<28) | dw1[1]; *dy++ = xy; *dy++ = (8<<16) | 16; *dy++ = fmv.u[1]; *dy++ = bmv.u[1]; PACK_CORR_DATA(dy,block_ptr,y2size); block_ptr = (short *)((unsigned long)block_ptr + y2size); /* End Y Blocks */ fmv.s[0] /= 2; fmv.s[1] /= 2; fmv.s[2] /= 2; fmv.s[3] /= 2; bmv.s[0] /= 2; bmv.s[1] /= 2; bmv.s[2] /= 2; bmv.s[3] /= 2; xy >>= 1; /* U Blocks */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1[0]; *du++ = xy; *du++ = (4<<16) | 8; *du++ = fmv.u[0]; *du++ = bmv.u[0]; if(usize) { PACK_CORR_DATA_SHORT(du,block_ptr); } /* Second U Block */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1[1]; *du++ = xy; *du++ = (4<<16) | 8; *du++ = fmv.u[1]; *du++ = bmv.u[1]; if(usize) { block_ptr = (short *)((unsigned long)block_ptr + 16); PACK_CORR_DATA_SHORT(du,block_ptr); block_ptr = (short *)((unsigned long)block_ptr + 112); } /* End U Blocks */ /* V Blocks */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1[0]; *dv++ = xy; *dv++ = (4<<16) | 8; *dv++ = fmv.u[0]; *dv++ = bmv.u[0]; if(vsize) { PACK_CORR_DATA_SHORT(dv,block_ptr); } /* Second V Block */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1[1]; *dv++ = xy; *dv++ = (4<<16) | 8; *dv++ = fmv.u[1]; *dv++ = bmv.u[1]; if(vsize) { block_ptr = (short *)((unsigned long)block_ptr + 16); PACK_CORR_DATA_SHORT(dv,block_ptr); block_ptr = (short *)((unsigned long)block_ptr + 112); } /* End V Blocks */ *datay = dy; *datau = du; *datav = dv;}/***************************************************************************// Function: renderFieldinFrameDCT0// Description: inline function that sets hardware parameters for a Field// encoded macroblock in a frame picture with DCT0.***************************************************************************/static __inline__ void renderFieldinFrameDCT0(uint **datay,uint **datau, uint **datav,XvMCMacroBlock *mb, short *block_ptr,uint flags) { register uint *dy = *datay; register uint *du = *datau; register uint *dv = *datav; /* Motion Vectors */ su_t fmv; su_t bmv; /* CBP */ uint cbp = (uint)mb->coded_block_pattern; /* gfxblock dword 1 */ uint dw1[2]; short * top_left_b = NULL; short * top_right_b = NULL; short * bottom_left_b = NULL; short * bottom_right_b = NULL; unsigned int ysize = y_dct0_field_bytes[cbp]; unsigned int usize = u_field_bytes[cbp]; unsigned int vsize = v_field_bytes[cbp]; uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<3); dw1[0] = type_table[mb->macroblock_type & 0xf] | (0x2<<6) | mvfs_table[mb->motion_vertical_field_select & 3] | ((cbp | ((cbp<<2) & 0x30))<<22); dw1[1] = type_table[mb->macroblock_type & 0xf] | (0x3<<6) | mvfs_table[mb->motion_vertical_field_select>>2] | ((cbp | ((cbp<<2) & 0x30))<<22); fmv.s[0] = mb->PMV[0][0][1]/2; fmv.s[1] = mb->PMV[0][0][0]; fmv.s[2] = mb->PMV[1][0][1]/2; fmv.s[3] = mb->PMV[1][0][0]; bmv.s[0] = mb->PMV[0][1][1]/2; bmv.s[1] = mb->PMV[0][1][0]; bmv.s[2] = mb->PMV[1][1][1]/2; bmv.s[3] = mb->PMV[1][1][0]; /* The i810 cannot use DCT0 directly with field motion, we have to interlace the data for it. We use a zero block when the CBP has one half of the to-be-interlaced data but not the other half. */ top_left_b = &empty_block[0]; if(cbp & 0x20) { top_left_b = block_ptr; block_ptr += 64; } top_right_b = &empty_block[0]; if(cbp & 0x10) { top_right_b = block_ptr; block_ptr += 64; } bottom_left_b = &empty_block[0]; if(cbp & 0x8) { bottom_left_b = block_ptr; block_ptr += 64; } bottom_right_b = &empty_block[0]; if(cbp & 0x4) { bottom_right_b = block_ptr; block_ptr += 64; } /* First Y Block */ *dy++ = GFXBLOCK + 4 + (ysize>>2); *dy++ = (1<<30) | (2<<28) | dw1[0]; *dy++ = xy; *dy++ = (8<<16) | 16; *dy++ = fmv.u[0]; *dy++ = bmv.u[0]; if(dw1[0] & (1<<27)) { PACK_CORR_DATA_0to1(dy,top_left_b,bottom_left_b); } if(dw1[0] & (1<<26)) { PACK_CORR_DATA_0to1(dy,top_right_b,bottom_right_b); } /* Second Y Block */ *dy++ = GFXBLOCK + 4 + (ysize>>2); *dy++ = (1<<30) | (2<<28) | dw1[1]; *dy++ = xy; *dy++ = (8<<16) | 16; *dy++ = fmv.u[1]; *dy++ = bmv.u[1]; if(dw1[1] & (1<<27)) { top_left_b = (short *)((unsigned long)top_left_b + 16); bottom_left_b = (short *)((unsigned long)bottom_left_b + 16); PACK_CORR_DATA_0to1(dy,top_left_b,bottom_left_b); } if(dw1[1] & (1<<26)) { top_right_b = (short *)((unsigned long)top_right_b + 16); bottom_right_b = (short *)((unsigned long)bottom_right_b + 16); PACK_CORR_DATA_0to1(dy,top_right_b,bottom_right_b); } /* End Y Blocks */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -