i830_video.c

来自「是由intel提供的针对intel显卡915以上系列的linux驱动」· C语言 代码 · 共 2,323 行 · 第 1/5 页

C
2,323
字号
   } else if (attribute == xvGamma1 && (IS_I9XX(pI830))) {      *value = pPriv->gamma1;   } else if (attribute == xvGamma2 && (IS_I9XX(pI830))) {      *value = pPriv->gamma2;   } else if (attribute == xvGamma3 && (IS_I9XX(pI830))) {      *value = pPriv->gamma3;   } else if (attribute == xvGamma4 && (IS_I9XX(pI830))) {      *value = pPriv->gamma4;   } else if (attribute == xvGamma5 && (IS_I9XX(pI830))) {      *value = pPriv->gamma5;   } else if (attribute == xvColorKey) {      *value = pPriv->colorKey;   } else if (attribute == xvDoubleBuffer) {      *value = pPriv->doubleBuffer;   } else       return BadMatch;   return Success;}static voidI830QueryBestSize(ScrnInfoPtr pScrn,		  Bool motion,		  short vid_w, short vid_h,		  short drw_w, short drw_h,		  unsigned int *p_w, unsigned int *p_h, pointer data){   if (vid_w > (drw_w << 1))      drw_w = vid_w >> 1;   if (vid_h > (drw_h << 1))      drw_h = vid_h >> 1;   *p_w = drw_w;   *p_h = drw_h;}static voidI830CopyPackedData(ScrnInfoPtr pScrn,		   unsigned char *buf,		   int srcPitch,		   int dstPitch, int top, int left, int h, int w){   I830Ptr pI830 = I830PTR(pScrn);   I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;   unsigned char *src, *dst;   int i,j;   unsigned char *s;   ErrorF("I830CopyPackedData: (%d,%d) (%d,%d)\n"	   "srcPitch: %d, dstPitch: %d\n", top, left, h, w, srcPitch, dstPitch);   src = buf + (top * srcPitch) + (left << 1);   if (pPriv->currentBuf == 0)      dst = pI830->FbBase + pPriv->YBuf0offset;   else      dst = pI830->FbBase + pPriv->YBuf1offset;   switch (pI830->rotation) {      case RR_Rotate_0:         w <<= 1;         for (i = 0; i < h; i++) {            memcpy(dst, src, w);            src += srcPitch;            dst += dstPitch;         }	 break;      case RR_Rotate_90:         h <<= 1;         for (i = 0; i < h; i+=2) {            s = src;            for (j = 0; j < w; j++) {		/* Copy Y */               dst[(i + 0) + ((w - j - 1) * dstPitch)] = *s++; 		(void)*s++;            }            src += srcPitch;         }         h >>= 1;   	 src = buf + (top * srcPitch) + (left << 1);         for (i = 0; i < h; i+=2) {            for (j = 0; j < w; j+=2) {		/* Copy U */		dst[((i*2) + 1) + ((w - j - 1) * dstPitch)] = src[(j*2) + 1 + (i * srcPitch)];		dst[((i*2) + 1) + ((w - j - 2) * dstPitch)] = src[(j*2) + 1 + ((i+1) * srcPitch)];		/* Copy V */		dst[((i*2) + 3) + ((w - j - 1) * dstPitch)] = src[(j*2) + 3 + (i * srcPitch)];		dst[((i*2) + 3) + ((w - j - 2) * dstPitch)] = src[(j*2) + 3 + ((i+1) * srcPitch)];            }         }         break;      case RR_Rotate_180:         w <<= 1;         for (i = 0; i < h; i++) {            s = src;            for (j = 0; j < w; j+=4) {               dst[(w - j - 4) + ((h - i - 1) * dstPitch)] = *s++;               dst[(w - j - 3) + ((h - i - 1) * dstPitch)] = *s++;               dst[(w - j - 2) + ((h - i - 1) * dstPitch)] = *s++;               dst[(w - j - 1) + ((h - i - 1) * dstPitch)] = *s++;            }            src += srcPitch;         }         break;      case RR_Rotate_270:         h <<= 1;         for (i = 0; i < h; i+=2) {            s = src;            for (j = 0; j < w; j++) {		/* Copy Y */               dst[(h - i - 2) + (j * dstPitch)] = *s++;		(void)*s++;            }            src += srcPitch;         }         h >>= 1;   	 src = buf + (top * srcPitch) + (left << 1);         for (i = 0; i < h; i+=2) {            for (j = 0; j < w; j+=2) {		/* Copy U */		dst[(((h - i)*2) - 3) + (j * dstPitch)] = src[(j*2) + 1 + (i * srcPitch)];		dst[(((h - i)*2) - 3) + ((j - 1) * dstPitch)] = src[(j*2) + 1 + ((i+1) * srcPitch)];		/* Copy V */		dst[(((h - i)*2) - 1) + (j * dstPitch)] = src[(j*2) + 3 + (i * srcPitch)];		dst[(((h - i)*2) - 1) + ((j - 1) * dstPitch)] = src[(j*2) + 3 + ((i+1) * srcPitch)];            }         }         break;   }}static voidI830CopyPlanarData(ScrnInfoPtr pScrn, unsigned char *buf, int srcPitch,		   int srcPitch2, int dstPitch, int srcH, int top, int left,		   int h, int w, int id){   I830Ptr pI830 = I830PTR(pScrn);   I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;   int i, j = 0;   unsigned char *src1, *src2, *src3, *dst1, *dst2, *dst3;   unsigned char *s;   int dstPitch2 = dstPitch << 1;   ErrorF("I830CopyPlanarData: srcPitch %d, srcPitch %d, dstPitch %d\n"	   "nlines %d, npixels %d, top %d, left %d\n", srcPitch, srcPitch2, dstPitch,	   h, w, top, left);   /* Copy Y data */   src1 = buf + (top * srcPitch) + left;   ErrorF("src1 is %p, offset is %ld\n", src1,	  (unsigned long)src1 - (unsigned long)buf);   if (pPriv->currentBuf == 0)      dst1 = pI830->FbBase + pPriv->YBuf0offset;   else      dst1 = pI830->FbBase + pPriv->YBuf1offset;   switch (pI830->rotation) {      case RR_Rotate_0:         for (i = 0; i < h; i++) {            memcpy(dst1, src1, w);            src1 += srcPitch;            dst1 += dstPitch2;         }	 break;      case RR_Rotate_90:         for (i = 0; i < h; i++) {            s = src1;            for (j = 0; j < w; j++) {               dst1[(i) + ((w - j - 1) * dstPitch2)] = *s++;            }            src1 += srcPitch;         }         break;      case RR_Rotate_180:         for (i = 0; i < h; i++) {            s = src1;            for (j = 0; j < w; j++) {               dst1[(w - j - 1) + ((h - i - 1) * dstPitch2)] = *s++;            }            src1 += srcPitch;         }         break;      case RR_Rotate_270:         for (i = 0; i < h; i++) {            s = src1;            for (j = 0; j < w; j++) {               dst1[(h - i - 1) + (j * dstPitch2)] = *s++;            }            src1 += srcPitch;         }         break;   }   /* Copy V data for YV12, or U data for I420 */   src2 = buf + (srcH * srcPitch) + ((top * srcPitch) >> 2) + (left >> 1);   ErrorF("src2 is %p, offset is %ld\n", src2,	  (unsigned long)src2 - (unsigned long)buf);   if (pPriv->currentBuf == 0) {      if (id == FOURCC_I420)	 dst2 = pI830->FbBase + pPriv->UBuf0offset;      else	 dst2 = pI830->FbBase + pPriv->VBuf0offset;   } else {      if (id == FOURCC_I420)	 dst2 = pI830->FbBase + pPriv->UBuf1offset;      else	 dst2 = pI830->FbBase + pPriv->VBuf1offset;   }   switch (pI830->rotation) {      case RR_Rotate_0:         for (i = 0; i < h / 2; i++) {            memcpy(dst2, src2, w / 2);            src2 += srcPitch2;            dst2 += dstPitch;         }         break;      case RR_Rotate_90:         for (i = 0; i < (h/2); i++) {            s = src2;            for (j = 0; j < (w/2); j++) {               dst2[(i) + (((w/2) - j - 1) * (dstPitch))] = *s++;            }            src2 += srcPitch2;         }         break;      case RR_Rotate_180:         for (i = 0; i < (h/2); i++) {            s = src2;            for (j = 0; j < (w/2); j++) {               dst2[((w/2) - j - 1) + (((h/2) - i - 1) * dstPitch)] = *s++;            }            src2 += srcPitch2;         }         break;      case RR_Rotate_270:         for (i = 0; i < (h/2); i++) {            s = src2;            for (j = 0; j < (w/2); j++) {               dst2[((h/2) - i - 1) + (j * dstPitch)] = *s++;            }            src2 += srcPitch2;         }         break;   }   /* Copy U data for YV12, or V data for I420 */   src3 = buf + (srcH * srcPitch) + ((srcH >> 1) * srcPitch2) +	 ((top * srcPitch) >> 2) + (left >> 1);   ErrorF("src3 is %p, offset is %ld\n", src3,	  (unsigned long)src3 - (unsigned long)buf);   if (pPriv->currentBuf == 0) {      if (id == FOURCC_I420)	 dst3 = pI830->FbBase + pPriv->VBuf0offset;      else	 dst3 = pI830->FbBase + pPriv->UBuf0offset;   } else {      if (id == FOURCC_I420)	 dst3 = pI830->FbBase + pPriv->VBuf1offset;      else	 dst3 = pI830->FbBase + pPriv->UBuf1offset;   }   switch (pI830->rotation) {      case RR_Rotate_0:         for (i = 0; i < h / 2; i++) {            memcpy(dst3, src3, w / 2);            src3 += srcPitch2;            dst3 += dstPitch;         }         break;      case RR_Rotate_90:         for (i = 0; i < (h/2); i++) {            s = src3;            for (j = 0; j < (w/2); j++) {               dst3[(i) + (((w/2) - j - 1) * (dstPitch))] = *s++;            }            src3 += srcPitch2;         }         break;      case RR_Rotate_180:         for (i = 0; i < (h/2); i++) {            s = src3;            for (j = 0; j < (w/2); j++) {               dst3[((w/2) - j - 1) + (((h/2) - i - 1) * dstPitch)] = *s++;            }            src3 += srcPitch2;         }         break;      case RR_Rotate_270:         for (i = 0; i < (h/2); i++) {            s = src3;            for (j = 0; j < (w/2); j++) {               dst3[((h/2) - i - 1) + (j * dstPitch)] = *s++;            }            src3 += srcPitch2;         }         break;   }}typedef struct {   CARD8 sign;   CARD16 mantissa;   CARD8 exponent;} coeffRec, *coeffPtr;static BoolSetCoeffRegs(double *coeff, int mantSize, coeffPtr pCoeff, int pos){   int maxVal, icoeff, res;   int sign;   double c;   sign = 0;   maxVal = 1 << mantSize;   c = *coeff;   if (c < 0.0) {      sign = 1;      c = -c;   }   res = 12 - mantSize;   if ((icoeff = (int)(c * 4 * maxVal + 0.5)) < maxVal) {      pCoeff[pos].exponent = 3;      pCoeff[pos].mantissa = icoeff << res;      *coeff = (double)icoeff / (double)(4 * maxVal);   } else if ((icoeff = (int)(c * 2 * maxVal + 0.5)) < maxVal) {      pCoeff[pos].exponent = 2;      pCoeff[pos].mantissa = icoeff << res;      *coeff = (double)icoeff / (double)(2 * maxVal);   } else if ((icoeff = (int)(c * maxVal + 0.5)) < maxVal) {      pCoeff[pos].exponent = 1;      pCoeff[pos].mantissa = icoeff << res;      *coeff = (double)icoeff / (double)(maxVal);   } else if ((icoeff = (int)(c * maxVal * 0.5 + 0.5)) < maxVal) {      pCoeff[pos].exponent = 0;      pCoeff[pos].mantissa = icoeff << res;      *coeff = (double)icoeff / (double)(maxVal / 2);   } else {      /* Coeff out of range */      return FALSE;   }   pCoeff[pos].sign = sign;   if (sign)      *coeff = -(*coeff);   return TRUE;}static voidUpdateCoeff(int taps, double fCutoff, Bool isHoriz, Bool isY, coeffPtr pCoeff){   int i, j, j1, num, pos, mantSize;   double pi = 3.1415926535, val, sinc, window, sum;   double rawCoeff[MAX_TAPS * 32], coeffs[N_PHASES][MAX_TAPS];   double diff;   int tapAdjust[MAX_TAPS], tap2Fix;   Bool isVertAndUV;   if (isHoriz)      mantSize = 7;   else      mantSize = 6;   isVertAndUV = !isHoriz && !isY;   num = taps * 16;   for (i = 0; i < num  * 2; i++) {      val = (1.0 / fCutoff) * taps * pi * (i - num) / (2 * num);      if (val == 0.0)	 sinc = 1.0;      else	 sinc = sin(val) / val;      /* Hamming window */      window = (0.5 - 0.5 * cos(i * pi / num));      rawCoeff[i] = sinc * window;   }   for (i = 0; i < N_PHASES; i++) {      /* Normalise the coefficients. */      sum = 0.0;      for (j = 0; j < taps; j++) {	 pos = i + j * 32;	 sum += rawCoeff[pos];      }      for (j = 0; j < taps; j++) {	 pos = i + j * 32;	 coeffs[i][j] = rawCoeff[pos] / sum;      }      /* Set the register values. */      for (j = 0; j < taps; j++) {	 pos = j + i * taps;	 if ((j == (taps - 1) / 2) && !isVertAndUV)	    SetCoeffRegs(&coeffs[i][j], mantSize + 2, pCoeff, pos);	 else	    SetCoeffRegs(&coeffs[i][j], mantSize, pCoeff, pos);      }      tapAdjust[0] = (taps - 1) / 2;      for (j = 1, j1 = 1; j <= tapAdjust[0]; j++, j1++) {	 tapAdjust[j1] = tapAdjust[0] - j;	 tapAdjust[++j1] = tapAdjust[0] + j;      }      /* Adjust the coefficients. */      sum = 0.0;      for (j = 0; j < taps; j++)	 sum += coeffs[i][j];      if (sum != 1.0) {	 for (j1 = 0; j1 < taps; j1++) {	    tap2Fix = tapAdjust[j1];	    diff = 1.0 - sum;	    coeffs[i][tap2Fix] += diff;	    pos = tap2Fix + i * taps;	    if ((tap2Fix == (taps - 1) / 2) && !isVertAndUV)	       SetCoeffRegs(&coeffs[i][tap2Fix], mantSize + 2, pCoeff, pos);	    else	       SetCoeffRegs(&coeffs[i][tap2Fix], mantSize, pCoeff, pos);	    sum = 0.0;	    for (j = 0; j < taps; j++)	       sum += coeffs[i][j];	    if (sum == 1.0)	       break;	 }      }   }}static voidI830DisplayVideo(ScrnInfoPtr pScrn, int id, short width, short height,		 int dstPitch, int x1, int y1, int x2, int y2, BoxPtr dstBox,		 short src_w, short src_h, short drw_w, short drw_h){   I830Ptr pI830 = I830PTR(pScrn);   I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;   I830OverlayRegPtr overlay =	 (I830OverlayRegPtr) (pI830->FbBase + pI830->OverlayMem->Start);   unsigned int swidth;   unsigned int mask, shift, offsety, offsetu;   int tmp;   ErrorF("I830DisplayVideo: %dx%d (pitch %d)\n", width, height,	   dstPitch);   if (!pPriv->overlayOK)      return;#if VIDEO_DEBUG   CompareOverlay(pI830, (CARD32 *) overlay, 0x100);#endif   /* When in dual head with different bpp setups we need to refresh the    * color key, so let's reset the video parameters and refresh here */#if 0   if (pI830->entityPrivate)#endif      I830ResetVideo(pScrn);   /* Ensure overlay is turned on with OVERLAY_ENABLE at 0 */   if (!*pI830->overlayOn)      OVERLAY_UPDATE;

⌨️ 快捷键说明

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