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

📄 i810xvmc.c

📁 显驱动 Intel英特尔G45G43G41G35G33G31G965Q963Q965GM965系列显卡最新X.Org驱动2.4.0版For Linux
💻 C
📖 第 1 页 / 共 5 页
字号:
  128,128,128,128,256,256,256,256,  128,128,128,128,256,256,256,256,  256,256,256,256,256,256,256,256,  256,256,256,256,256,256,256,256};static unsigned int y_dct1_frame_bytes[] = {  0,0,0,0,256,256,256,256,  256,256,256,256,512,512,512,512,  256,256,256,256,256,256,256,256,  512,512,512,512,512,512,512,512,  256,256,256,256,512,512,512,512,  256,256,256,256,512,512,512,512,  512,512,512,512,512,512,512,512,  512,512,512,512,512,512,512,512};static unsigned int u_field_bytes[] = {  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64,  0,0,64,64,0,0,64,64};static unsigned int v_field_bytes[] = {  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64,  0,64,0,64,0,64,0,64};static short empty_block[] = {  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0};/***************************************************************************// Function: dispatchYContext// Description: Allocate a DMA buffer write the Y MC Context info in it,//  and dispatch it to hardware.***************************************************************************/static __inline__ void dispatchYContext(i810XvMCSurface *privTarget,					i810XvMCSurface *privPast,					i810XvMCSurface *privFuture,					i810XvMCContext *pI810XvMC) {  uint *data;  drmBufPtr pDMA;  drm_i810_mc_t mc;  pDMA = i810_get_free_buffer(pI810XvMC);  data = pDMA->address;  *data++ = CMD_FLUSH;  *data++ = BOOLEAN_ENA_2;  *data++ = CMD_FLUSH;  *data++ = DEST_BUFFER_INFO;  *data++ = privTarget->dbi1y;  *data++ = DEST_BUFFER_VAR;  *data++ = privTarget->dbv1;  /* Past Surface */  *data++ = CMD_MAP_INFO;  *data++ = privPast->mi1y;  *data++ = privPast->mi2y;  *data++ = privPast->mi3y;  /* Future Surface */  *data++ = CMD_MAP_INFO;  *data++ = privFuture->mi1y | 0x1<<28;  *data++ = privFuture->mi2y;  *data++ = privFuture->mi3y;  mc.idx = pDMA->idx;  mc.used = (unsigned long)data - (unsigned long)pDMA->address;  mc.last_render = ++pI810XvMC->last_render;  privTarget->last_render = pI810XvMC->last_render;  I810_MC(pI810XvMC,mc);}static __inline__ void renderError(void) {  printf("Invalid Macroblock Parameters found.\n");  return;}/***************************************************************************// Function: renderIntrainFrame// Description: inline function that sets hardware parameters for an Intra//  encoded macroblock in a Frame picture.***************************************************************************/static __inline__ void renderIntrainFrame(uint **datay,uint **datau,					  uint **datav,					  XvMCMacroBlock *mb,					  short *block_ptr) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  /* Y Blocks */  *dy++ = GFXBLOCK + 68;  *dy++ = (1<<30) | (3<<28) | (0xf<<24);  *dy++ = ((uint)mb->x<<20) | ((uint)mb->y<<4);  *dy++ = (16<<16) | 16;  *dy++ = 0;  *dy++ = 0;  PACK_INTRA_DATA(dy,block_ptr,256);  dy += 64;  block_ptr += 256;  /* End Y Blocks */  /* U Block */  *du++ = GFXBLOCK + 20;  *du++ = (2<<30) | (1<<28) | (1<<23);  *du++ = (((uint)mb->x)<<19) | (((uint)mb->y)<<3);  *du++ = (8<<16) | 8;  *du++ = 0;  *du++ = 0;  PACK_INTRA_DATA(du,block_ptr,64);  du += 16;  block_ptr += 64;    /* V Block */  *dv++ = GFXBLOCK + 20;  *dv++ = (3<<30) | (1<<28) | (1<<22);  *dv++ = (((uint)mb->x)<<19) | (((uint)mb->y)<<3);  *dv++ = (8<<16) | 8;  *dv++ = 0;  *dv++ = 0;  PACK_INTRA_DATA(dv,block_ptr,64);  dv += 16;  block_ptr += 64;  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderIntrainFrameDCT1// Description: inline function that sets hardware parameters for an Intra//  encoded macroblock in a Frame picture with DCT type 1.***************************************************************************/static __inline__ void renderIntrainFrameDCT1(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;  /* Y Blocks */  *dy++ = GFXBLOCK + 36;  *dy++ = (1<<30) | (2<<28) | (0x3<<26) | (0x2<<6);  *dy++ = ((uint)mb->x<<20) | ((uint)mb->y<<3);  *dy++ = (8<<16) | 16;  *dy++ = 0;  *dy++ = 0;  PACK_INTRA_DATA(dy,block_ptr,128);  dy += 32;  block_ptr += 128;  /* Second Y block */  *dy++ = GFXBLOCK + 36;  *dy++ = (1<<30) | (2<<28) | (0x3<<26) | (0x3<<6);  *dy++ = ((uint)mb->x<<20) | ((uint)mb->y<<3);  *dy++ = (8<<16) | 16;  *dy++ = 0;  *dy++ = 0;  PACK_INTRA_DATA(dy,block_ptr,128);  dy += 32;  block_ptr += 128;  /* End Y Blocks */      /* U Block */  *du++ = GFXBLOCK + 20;  *du++ = (2<<30) | (1<<28) | (1<<23);  *du++ = (((uint)mb->x)<<19) | (((uint)mb->y)<<3);  *du++ = (8<<16) | 8;  *du++ = 0;  *du++ = 0;  PACK_INTRA_DATA(du,block_ptr,64);  du += 16;  block_ptr += 64;    /* V Block */  *dv++ = GFXBLOCK + 20;  *dv++ = (3<<30) | (1<<28) | (1<<22);  *dv++ = (((uint)mb->x)<<19) | (((uint)mb->y)<<3);  *dv++ = (8<<16) | 8;  *dv++ = 0;  *dv++ = 0;  PACK_INTRA_DATA(dv,block_ptr,64);  dv += 16;  block_ptr += 64;  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderIntrainField// Description: inline function that sets hardware parameters for an Intra//  encoded macroblock in Field pictures.***************************************************************************/static __inline__ void renderIntrainField(uint **datay,uint **datau,					  uint **datav,					  XvMCMacroBlock *mb,short *block_ptr,					  uint ps) {  register uint *dy = *datay;  register uint *du = *datau;  register uint *dv = *datav;  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4);  uint dw1 = drps_table[~ps & 0x1];  /* Y Blocks */  *dy++ = GFXBLOCK + 68;  *dy++ = (1<<30) | (3<<28) | (0xf<<24) | dw1;  *dy++ = xy;  *dy++ = (16<<16) | 16;  *dy++ = 0;  *dy++ = 0;  PACK_INTRA_DATA(dy,block_ptr,256);  dy += 64;  block_ptr += 256;  /* End Y Blocks */  xy >>= 1;  /* U Block */  *du++ = GFXBLOCK + 20;  *du++ = (2<<30) | (1<<28) | (1<<23) | dw1;  *du++ = xy;  *du++ = (8<<16) | 8;  *du++ = 0;  *du++ = 0;  PACK_INTRA_DATA(du,block_ptr,64);  du += 16;  block_ptr += 64;    /* V Block */  *dv++ = GFXBLOCK + 20;  *dv++ = (3<<30) | (1<<28) | (1<<22) | dw1;  *dv++ = xy;  *dv++ = (8<<16) | 8;  *dv++ = 0;  *dv++ = 0;  PACK_INTRA_DATA(dv,block_ptr,64);  dv += 16;  block_ptr += 64;  *datay = dy;  *datau = du;  *datav = dv;}/***************************************************************************// Function: renderFieldinField// Description: inline function that sets hardware parameters for a Field//  encoded macroblock in a Field Picture.***************************************************************************/static __inline__ void renderFieldinField(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 parity = ~ps & XVMC_TOP_FIELD;  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);  /* i810 Specific flag used to identify the second field in a P frame */  if(flags & 0x80000000) {    /* P Frame */    if((mb->motion_vertical_field_select & XVMC_SELECT_FIRST_FORWARD) ==      parity) {      /* Same parity, use reference field (map0) */      dw1 = 1<<12 | ((0x2 + parity)<<6) | ((0x2 + parity)<<3) |	(((uint)mb->coded_block_pattern)<<22);      fmv[0] = mb->PMV[0][0][1];      fmv[1] = mb->PMV[0][0][0];      bmv[0] = 0;      bmv[1] = 0;    }    else {      /*	Opposite parity, set up as if it were backward	motion and use map1.      */      dw1 = 2<<12 | ((0x2 + parity)<<6) | (0x3 - parity) |	(((uint)mb->coded_block_pattern)<<22);      bmv[0] = mb->PMV[0][0][1];      bmv[1] = mb->PMV[0][0][0];      fmv[0] = 0;      fmv[1] = 0;    }  }  else {    dw1 = type_table[mb->macroblock_type & 0xf] |      drps_table[~ps & 0x1] |      mvfs_table[mb->motion_vertical_field_select & 3] |      (((uint)mb->coded_block_pattern)<<22);        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: render16x8inField// Description: inline function that sets hardware parameters for a 16x8//  encoded macroblock in a field picture.***************************************************************************/static __inline__ void render16x8inField(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[4];  short bmv[4];  /* 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 parity = ~ps & XVMC_TOP_FIELD;  uint xy = ((uint)mb->x<<20) | ((uint)mb->y<<4);  /* i810 Specific flag used to identify the second field in a P frame */  if(flags & 0x80000000) {    /* P Frame */    if((mb->motion_vertical_field_select & XVMC_SELECT_FIRST_FORWARD) ==      parity) {      /* Same parity, use reference field (map0) */      dw1[0] = 1<<12 | ((0x2 + parity)<<6) | ((0x2 + parity)<<3) |	(((uint)mb->coded_block_pattern)<<22);      fmv[0] = mb->PMV[0][0][1];      fmv[1] = mb->PMV[0][0][0];      bmv[0] = 0;      bmv[1] = 0;    }    else {      /*	Opposite parity, set up as if it were backward	motion and use map1.      */      dw1[0] = 2<<12 | ((0x2 + parity)<<6) | (0x3 - parity) |	(((uint)mb->coded_block_pattern)<<22);      bmv[0] = mb->PMV[0][0][1];      bmv[1] = mb->PMV[0][0][0];      fmv[0] = 0;      fmv[1] = 0;    }    if((mb->motion_vertical_field_select & XVMC_SELECT_SECOND_FORWARD) ==       (parity<<2)) {      /* Same parity, use reference field (map0) */      dw1[1] = 1<<12 | ((0x2 + parity)<<6) | ((0x2 + parity)<<3) |	((((uint)mb->coded_block_pattern<<22) & (0x3<<22)) |	 (((uint)mb->coded_block_pattern<<24) & (0x3<<26)));      fmv[2] = mb->PMV[1][0][1];      fmv[3] = mb->PMV[1][0][0];      bmv[2] = 0;      bmv[3] = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -