📄 i810xvmc.c
字号:
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: renderFrameinFrame// Description: inline function that sets hardware parameters for a Frame// encoded macroblock in a frame picture.***************************************************************************/static __inline__ void renderFrameinFrame(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; unsigned int ysize = y_frame_bytes[mb->coded_block_pattern]; unsigned int usize = u_frame_bytes[mb->coded_block_pattern]; unsigned int vsize = v_frame_bytes[mb->coded_block_pattern]; uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4); dw1 = type_table[mb->macroblock_type & 0xf] | (((uint)mb->coded_block_pattern)<<22); fmv.s[0] = mb->PMV[0][0][1]; fmv.s[1] = mb->PMV[0][0][0]; bmv.s[0] = mb->PMV[0][1][1]; bmv.s[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++ = fmv.u[0]; *dy++ = bmv.u[0]; PACK_CORR_DATA(dy,block_ptr,ysize); block_ptr = (short *)((unsigned long)block_ptr + ysize); /* End Y Blocks */ fmv.s[0] /= 2; fmv.s[1] /= 2; bmv.s[0] /= 2; bmv.s[1] /= 2; xy >>= 1; /* U Block */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1; *du++ = xy; *du++ = (8<<16) | 8; *du++ = fmv.u[0]; *du++ = bmv.u[0]; PACK_CORR_DATA(du,block_ptr,usize); block_ptr = (short *)((unsigned long)block_ptr + usize); /* End U Block */ /* V Block */ *dv++ = GFXBLOCK + 4 + (vsize>>2); *dv++ = (3<<30) | (1<<28) | dw1; *dv++ = xy; *dv++ = (8<<16) | 8; *dv++ = fmv.u[0]; *dv++ = bmv.u[0]; PACK_CORR_DATA(dv,block_ptr,vsize); block_ptr = (short *)((unsigned long)block_ptr + vsize); /* End V Block */ *datay = dy; *datau = du; *datav = dv;}/***************************************************************************// Function: renderFrameinFrameDCT1// Description: inline function that sets hardware parameters for a Frame// encoded macroblock in a frame picture with DCT type 1.***************************************************************************/static __inline__ void renderFrameinFrameDCT1(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; short * top_left_b = NULL; short * top_right_b = NULL; short * bottom_left_b = NULL; short * bottom_right_b = NULL; uint temp_bp = 0; uint ysize = y_dct1_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); uint dw1 = type_table[mb->macroblock_type & 0xf] | (((uint)mb->coded_block_pattern)<<22); fmv.s[0] = mb->PMV[0][0][1]; fmv.s[1] = mb->PMV[0][0][0]; bmv.s[0] = mb->PMV[0][1][1]; bmv.s[1] = mb->PMV[0][1][0]; /* It is easiest to find out what blocks are in need of reading first rather than as we go. */ top_left_b = &empty_block[0]; if(dw1 & (1<<27)) { temp_bp |= (1<<25); top_left_b = block_ptr; block_ptr += 64; } top_right_b = &empty_block[0]; if(dw1 & (1<<26)) { temp_bp |= (1<<24); top_right_b = block_ptr; block_ptr += 64; } bottom_left_b = &empty_block[0]; if(dw1 & (1<<25)) { temp_bp |= (1<<27); bottom_left_b = block_ptr; block_ptr += 64; } bottom_right_b = &empty_block[0]; if(dw1 & (1<<24)) { temp_bp |= (1<<26); bottom_right_b = block_ptr; block_ptr += 64; } dw1 |= temp_bp; /* Y Block */ *dy++ = GFXBLOCK + 4 + (ysize>>2); *dy++ = (1<<30) | (3<<28) | dw1; *dy++ = xy; *dy++ = (16<<16) | 16; *dy++ = fmv.u[0]; *dy++ = bmv.u[0]; if(dw1 & (1<<27)) { PACK_CORR_DATA_1to0(dy,top_left_b,bottom_left_b); top_left_b = (short *)((unsigned long)top_left_b + 64); bottom_left_b = (short *)((unsigned long)bottom_left_b + 64); } if(dw1 & (1<<26)) { PACK_CORR_DATA_1to0(dy,top_right_b,bottom_right_b); top_right_b = (short *)((unsigned long)top_right_b + 64); bottom_right_b = (short *)((unsigned long)bottom_right_b + 64); } if(dw1 & (1<<27)) { PACK_CORR_DATA_1to0(dy,top_left_b,bottom_left_b); } if(dw1 & (1<<26)) { PACK_CORR_DATA_1to0(dy,top_right_b,bottom_right_b); } /* End Y Block */ fmv.s[0] /= 2; fmv.s[1] /= 2; bmv.s[0] /= 2; bmv.s[1] /= 2; xy >>= 1; /* U Block */ *du++ = GFXBLOCK + 4 + (usize>>2); *du++ = (2<<30) | (1<<28) | dw1; *du++ = xy; *du++ = (8<<16) | 8; *du++ = fmv.u[0]; *du++ = bmv.u[0]; 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++ = fmv.u[0]; *dv++ = bmv.u[0]; PACK_CORR_DATA(dv,block_ptr,vsize); block_ptr = (short *)((unsigned long)block_ptr + vsize); *datay = dy; *datau = du; *datav = dv;}/***************************************************************************// Function: renderDualPrimeinFrame// Description: inline function that sets hardware parameters for a Dual// Prime encoded macroblock in a frame picture with dct 1.***************************************************************************/static __inline__ void renderDualPrimeinFrame(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); /* Past Surface (map 0) is used for same parity prediction, Future surface (map 1) is used for opposite. */ dw1[0] = (((uint)mb->coded_block_pattern)<<22) | 3<<12 | 2<<6 | 2<<3 | 3; dw1[1] = (((mb->coded_block_pattern & 0x3) | ((mb->coded_block_pattern & 0xc)<<2))<<22) | 3<<12 | 3<<6 | 3<<3 | 2; fmv.s[0] = mb->PMV[0][0][1]; fmv.s[1] = mb->PMV[0][0][0]; bmv.s[0] = mb->PMV[1][0][1]; bmv.s[1] = mb->PMV[1][0][0]; fmv.s[2] = mb->PMV[0][0][1]; fmv.s[3] = mb->PMV[0][0][0]; bmv.s[2] = mb->PMV[1][1][1]; 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); fmv.s[0] /= 2; fmv.s[1] /= 2; bmv.s[0] /= 2; bmv.s[1] /= 2; fmv.s[2] /= 2; fmv.s[3] /= 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(dw1[0] & (1<<23)) { 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(dw1[1] & (1<<23)) { 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(dw1[0] & (1<<22)) { 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(dw1[1] & (1<<22)) { 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: renderDualPrimeinFrameDCT0// Description: inline function that sets hardware parameters for a Dual// Prime encoded macroblock in a frame picture with dct 0.***************************************************************************/static __inline__ void renderDualPrimeinFrameDCT0(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]; short * top_left_b = NULL; short * top_right_b = NULL; short * bottom_left_b = NULL; short * bottom_right_b = NULL; uint cbp = (uint)mb->coded_block_pattern; uint ysize = y_dct0_field_bytes[cbp]; uint usize = u_field_bytes[cbp]; uint vsize = v_field_bytes[cbp]; uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<3); /* Past Surface (map 0) is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -