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 + -
显示快捷键?