📄 i810xvmc.c
字号:
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 + -