⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i810xvmc.c

📁 显驱动 Intel英特尔G45G43G41G35G33G31G965Q963Q965GM965系列显卡最新X.Org驱动2.4.0版For Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    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 + -