xserver-xorg-video-ivtvdev: Changes to 'upstream-trunk'
Changelog | 9
README | 6
configure.ac | 8
src/Makefile.am | 3
src/TODO | 3
src/ivtv_xv.c | 1585 ++++++++----------
src/ivtvcompat.h | 77
src/ivtvdev.c | 945 +++++-----
src/ivtvdev.h | 29
src/ivtvhw.c | 1276 +++++++-------
src/ivtvhw.h | 103 -
xc/programs/Xserver/hw/xfree86/drivers/ivtv/Imakefile | 55
xc/programs/Xserver/hw/xfree86/drivers/ivtv/Makefile | 6
xc/programs/Xserver/hw/xfree86/drivers/ivtv/TODO | 11
xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtv_xv.c | 994 -----------
xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtvdev.c | 605 ------
xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtvdev.h | 17
xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtvhw.c | 819 ---------
xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtvhw.h | 86
19 files changed, 2115 insertions(+), 4522 deletions(-)
New commits:
commit d6a3ad7ae2af80470d52e07ab1db0032e0cc418d
Author: hverkuil <hverkuil@f93e8361-94ff-0310-af1b-c9b61a63ab7d>
Date: Fri Aug 3 18:06:35 2007 +0000
Remove obsolete text from the README.
git-svn-id: http://ivtvdriver.org/svn/xdriver/trunk@3991 f93e8361-94ff-0310-af1b-c9b61a63ab7d
diff --git a/README b/README
index e8333e5..13fc4a1 100644
--- a/README
+++ b/README
@@ -1,9 +1,3 @@
-This version should now build and run with both new Xorg servers based on the 7.x
-modular architecture.
-
-The source code is now in the src directory & the old xc directory should be ignored
-and will be removed soon.
-
Xorg 7.x Servers
===========
commit 2ec471fbe0d82cd33e64fe81607417d215352040
Author: hverkuil <hverkuil@f93e8361-94ff-0310-af1b-c9b61a63ab7d>
Date: Fri Aug 3 18:04:16 2007 +0000
Delete obsolete xc directory.
git-svn-id: http://ivtvdriver.org/svn/xdriver/trunk@3990 f93e8361-94ff-0310-af1b-c9b61a63ab7d
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Imakefile b/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Imakefile
deleted file mode 100644
index 6701ff3..0000000
--- a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Imakefile
+++ /dev/null
@@ -1,55 +0,0 @@
-XCOMM
-XCOMM This is an Imakefile for the fbdev driver.
-XCOMM
-XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/fbdev/Imakefile,v 1.10 2001/04/06 18:16:30 dawes Exp $
-#undef DefaultCCOptions
-#define DefaultCCOptions
-#define IHaveModules
-#include <Server.tmpl>
-
-SRCS = ivtvdev.c ivtvhw.c ivtv_xv.c
-OBJS = ivtvdev.o ivtvhw.o ivtv_xv.o
-
-#if defined(XF86DriverSDK)
-INCLUDES = -I. -I../../include
-#else
-INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \
- -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \
- -I$(SERVERSRC)/fb -I$(XF86SRC)/xaa \
- -I$(XF86SRC)/fbdevhw -I$(XF86SRC)/ramdac \
- -I$(XF86SRC)/ddc -I$(XF86SRC)/i2c \
- -I$(XF86SRC)/rac \
- -I$(SERVERSRC)/Xext -I$(XF86SRC)/xf24_32bpp\
- -I$(FONTINCSRC) -I$(SERVERSRC)/include -I$(XINCLUDESRC) \
- -I$(SERVERSRC)/miext/shadow -I$(EXTINCSRC) -I$(SERVERSRC)/render
-#endif
-#ifdef XF86_VERSION_CURRENT
-XCOMM We are using Xfree86
-
-#if XF86_VERSION_CURRENT >= XF86_VERSION_NUMERIC(4,3,99,16,0)
-DEFREGIONNULL = -DX_USE_REGION_NULL
-#endif
-
-#else
-XCOMM We are using X.org
-DEFREGIONNULL = -DX_USE_REGION_NULL
-#endif
-DEFINES = FbdevDefines $(DEFREGIONNULL)
-
-#if MakeHasPosixVariableSubstitutions
-SubdirLibraryRule($(OBJS))
-#endif
-
-ModuleObjectRule()
-
-ObjectModuleTarget(ivtvdev,$(OBJS))
-
-InstallObjectModule(ivtvdev,$(MODULEDIR),drivers)
-
-
-DependTarget()
-
-InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/ivtvdev)
-InstallDriverSDKNonExecFile(ivtvdev.c,$(DRIVERSDKDIR)/drivers/ivtvdev)
-
-InstallDriverSDKObjectModule(ivtvdev,$(DRIVERSDKMODULEDIR),drivers)
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Makefile b/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Makefile
deleted file mode 100644
index a4d5ecf..0000000
--- a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-all:
- echo "Run xmkmf /PATH_TO_X_SOURCE/"
-
-
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/TODO b/xc/programs/Xserver/hw/xfree86/drivers/ivtv/TODO
deleted file mode 100644
index 6a04e20..0000000
--- a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/TODO
+++ /dev/null
@@ -1,11 +0,0 @@
- DONE write to 82c registers from driver
- DONE open /dev/video0 if 48 returns ENODEV and check id.
- DONE Try to fail sensibly in PutImage
- DONE define better structure for ioctl
- DONE Buffer allocation for stream in driver
- DONE Compiler warnings
- DONE Apply to latest ivtv source
- DONE Make ivtv_xv cope with NTSC (don't hard code 576)
- DONE vsync wakeup for dma_to_device_vsync
-make ioctl fail if bad type
-do ioctl with bad type and make sure it fails appropriatly to detect correct driver.
diff --git a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtv_xv.c b/xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtv_xv.c
deleted file mode 100644
index 4e7ebdc..0000000
--- a/xc/programs/Xserver/hw/xfree86/drivers/ivtv/ivtv_xv.c
+++ /dev/null
@@ -1,994 +0,0 @@
-/* Based on s3virge xv code from XFree86 */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_xv.c,v 1.7 2003/02/04 02:20:50 dawes Exp $ */
-/*
-Copyright (C) 2000 The XFree86 Project, Inc. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
-NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the XFree86 Project shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the XFree86 Project.
-*/
-
-/*
- * s3v_xv.c
- * X Video Extension support
- *
- * S3 ViRGE driver
- *
- * 7/2000 Kevin Brosius
- *
- * Useful references:
- * X Video extension support -> xc/programs/hw/xfree86/common/xf86xv.c
- *
- */
-
-/*
- * I N C L U D E S
- */
-#include "ivtvhw.h"
-#include "ivtvdev.h"
-
-#include "xf86.h"
-#include "xf86xv.h"
-#include "Xv.h"
-#include "fourcc.h"
-#include "regionstr.h"
-typedef struct ivtv_xv_portData
-{
- unsigned int colorKey;
- RegionRec clip;
- int autopaintColorKey;
-}Ivtv_Xv_PortData;
-
-
-#define IVTV_MAX_PORTS 1
-#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
-
-#if !defined(XvExtension) || !defined(IVTV_IOC_PREP_FRAME_YUV)
-void IvtvInitVideo(ScreenPtr pScreen)
-{
- ErrorF("XVDriver disabled at compilation time\n");
-}
-#else
-
-static XF86VideoAdaptorPtr IVTVSetupImageVideoOverlay(ScreenPtr);
-static int IVTVSetPortAttributeOverlay(ScrnInfoPtr, Atom, INT32, pointer);
-static int IVTVGetPortAttributeOverlay(ScrnInfoPtr, Atom, INT32 *, pointer);
-
-static void IVTVStopVideo(ScrnInfoPtr, pointer, Bool);
-
-static void IVTVQueryBestSize(ScrnInfoPtr, Bool, short, short, short, short,
- unsigned int *, unsigned int *, pointer);
-static int IVTVPutImage(ScrnInfoPtr, short, short, short, short, short,
- short, short, short, int, unsigned char *, short,
- short, Bool, RegionPtr, pointer);
-static int IVTVQueryImageAttributes(ScrnInfoPtr, int, unsigned short *,
- unsigned short *, int *, int *);
-
-void IvtvInitVideo(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
- XF86VideoAdaptorPtr newAdaptor = NULL;
- int num_adaptors;
- ivtvHWPtr fPtr = FBDEVHWPTR(pScrn);
- if (!fPtr->yuvDevName)
- return;
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Enabling Xv support for PVR350\n");
- newAdaptor = IVTVSetupImageVideoOverlay(pScreen);
-
- num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
-
- if (newAdaptor) {
- if (!num_adaptors) {
- num_adaptors = 1;
- adaptors = &newAdaptor;
- } else {
- newAdaptors = /* need to free this someplace */
- xalloc((num_adaptors +
- 1) * sizeof(XF86VideoAdaptorPtr *));
- if (newAdaptors) {
- memcpy(newAdaptors, adaptors, num_adaptors *
- sizeof(XF86VideoAdaptorPtr));
- newAdaptors[num_adaptors] = newAdaptor;
- adaptors = newAdaptors;
- num_adaptors++;
- }
- }
- }
-
- if (num_adaptors)
- xf86XVScreenInit(pScreen, adaptors, num_adaptors);
-
- if (newAdaptors)
- xfree(newAdaptors);
-}
-
-/* client libraries expect an encoding */
-static XF86VideoEncodingRec DummyEncoding[1] = {
- { /* overlay limit */
- 0,
- "XV_IMAGE",
- 1440, 1152,
- {1, 1}
- }
-};
-
-#define NUM_FORMATS_OVERLAY 4
-#define NUM_FORMATS_TEXTURE 4
-
-static XF86VideoFormatRec Formats[NUM_FORMATS_TEXTURE] = {
- /*{15, TrueColor}, */ {16, TrueColor}, {24, TrueColor}
- /* ,
- {15, DirectColor} */ , {16, DirectColor}, {24, DirectColor}
-};
-
-#define NUM_IMAGES 1
-
-static XF86ImageRec Images[NUM_IMAGES] = {
- XVIMAGE_YV12
- /* XVIMAGE_UYVY */
-};
-
-#define NUM_ATTRIBUTES_OVERLAY 2
-
-static XF86AttributeRec Attributes[NUM_ATTRIBUTES_OVERLAY] =
-{
- {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"},
- {XvSettable | XvGettable, 0, 1, "XV_AUTOPAINT_COLORKEY"},
-
-#if 0
- {XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"},
- {XvSettable | XvGettable, 0, 255, "XV_CONTRAST"}
-#endif
-};
-static Atom xvColorKey, xvAutopaintColorKey;
-
-static int
-IVTVSetPortAttributeOverlay(ScrnInfoPtr pScrn,
- Atom attribute, INT32 value, pointer data)
-{
- IVTVDevPtr devPtr = IVTVDEVPTR(pScrn);
- Ivtv_Xv_PortData *pPriv = (Ivtv_Xv_PortData *)data;
-#ifdef JOHN
- if (attribute == xvBrightness) {
- if ((value < -128) || (value > 127))
- return BadValue;
- pPriv->brightness = value;
- OUTREG(MGAREG_BESLUMACTL, ((pPriv->brightness & 0xff) << 16) |
- (pPriv->contrast & 0xff));
- } else if (attribute == xvContrast) {
- if ((value < 0) || (value > 255))
- return BadValue;
- pPriv->contrast = value;
- OUTREG(MGAREG_BESLUMACTL, ((pPriv->brightness & 0xff) << 16) |
- (pPriv->contrast & 0xff));
- } else
-#endif
- if (attribute == xvColorKey) {
- pPriv->colorKey = value;
-#ifdef JOHN
- outMGAdac(0x55, (pPriv->colorKey & pScrn->mask.red) >>
- pScrn->offset.red);
- outMGAdac(0x56, (pPriv->colorKey & pScrn->mask.green) >>
- pScrn->offset.green);
- outMGAdac(0x57, (pPriv->colorKey & pScrn->mask.blue) >>
- pScrn->offset.blue);
-#endif
- REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
- }else if (attribute == xvAutopaintColorKey) {
- pPriv->autopaintColorKey = value;
- } else
- {
- ErrorF("IvtvSetPortAttributeOverlay bad attribute\n");
-
- return BadMatch;
- }
-
- return Success;
-}
-
-static int
-IVTVGetPortAttributeOverlay(ScrnInfoPtr pScrn,
- Atom attribute, INT32 * value, pointer data)
-{
- IVTVDevPtr devPtr = IVTVDEVPTR(pScrn);
- Ivtv_Xv_PortData *pPriv = (Ivtv_Xv_PortData *)data;
-
-#ifdef JOHN
- if (attribute == xvBrightness) {
- *value = pPriv->brightness;
- } else if (attribute == xvContrast) {
- *value = pPriv->contrast;
- } else
-#endif
- if (attribute == xvColorKey) {
- *value = pPriv->colorKey;
- } else if (attribute == xvAutopaintColorKey) {
- *value = pPriv->autopaintColorKey;
- } else
- {
- ErrorF("IvtvGetPortAttributeOverlay bad attribute\n");
- return BadMatch;
- }
-
- return Success;
-}
-
-static void
-IVTVQueryBestSize(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)
-{
- ErrorF("Query best vid_w %d vid_h %d drw_w %d drw_h %d\n",
- vid_w, vid_h, drw_w, drw_h);
- *p_w = drw_w;
- *p_h = drw_h;
-}
-
-static XF86VideoAdaptorPtr IVTVAllocAdaptor(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- XF86VideoAdaptorPtr adapt;
- DevUnion *pPriv;
- IVTVDevPtr devPtr = IVTVDEVPTR(pScrn);
- int i;
-
- if (!(adapt = xf86XVAllocateVideoAdaptorRec(pScrn)))
- return NULL;
-
- if (!(pPriv = xcalloc(1, sizeof(DevUnion) * IVTV_MAX_PORTS))) {
- xfree(adapt);
- return NULL;
- }
-
- adapt->pPortPrivates = pPriv;
-
- for (i = 0; i < IVTV_MAX_PORTS; i++)
- {
- Ivtv_Xv_PortData *portData = (Ivtv_Xv_PortData *)xcalloc(1,sizeof(Ivtv_Xv_PortData));
- portData->colorKey = 101;
- portData->autopaintColorKey = 0;
-#ifdef X_USE_REGION_NULL
- REGION_NULL(pScreen, &portData->clip);
-#else
- REGION_INIT(pScreen, &portData->clip, NullBox, 0);
-#endif
- adapt->pPortPrivates[i].ptr =portData;
- }
-
-
-#if 0
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
-#endif
- xvColorKey = MAKE_ATOM("XV_COLORKEY");
- xvAutopaintColorKey = MAKE_ATOM("XV_AUTOPAINT_COLORKEY");
-
- return adapt;
-}
-
-static XF86VideoAdaptorPtr IVTVSetupImageVideoOverlay(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
-#ifdef JOHN
- IVTVPtr ps3v = IVTVPTR(pScrn);
-#endif
- XF86VideoAdaptorPtr adapt;
- adapt = IVTVAllocAdaptor(pScreen);
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
- adapt->name = "PVR350";
- adapt->nEncodings = 1;
- adapt->pEncodings = &DummyEncoding[0];
- adapt->nFormats = NUM_FORMATS_OVERLAY;
- adapt->pFormats = Formats;
- adapt->nPorts = 1;
- adapt->pAttributes = Attributes /*Attributes */ ;
- adapt->nImages = 1;
- adapt->nAttributes = NUM_ATTRIBUTES_OVERLAY;
- adapt->pImages = Images;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = IVTVStopVideo;
- /* Empty Attrib functions - required anyway */
- adapt->SetPortAttribute = IVTVSetPortAttributeOverlay;
- adapt->GetPortAttribute = IVTVGetPortAttributeOverlay;
- adapt->QueryBestSize = IVTVQueryBestSize;
- adapt->PutImage = IVTVPutImage;
- adapt->QueryImageAttributes = IVTVQueryImageAttributes;
-
- return adapt;
-}
-
-static Bool RegionsEqual(RegionPtr A, RegionPtr B)
-{
- int *dataA, *dataB;
- int num;
-
- num = REGION_NUM_RECTS(A);
- if (num != REGION_NUM_RECTS(B))
- return FALSE;
-
- if ((A->extents.x1 != B->extents.x1) ||
- (A->extents.x2 != B->extents.x2) ||
- (A->extents.y1 != B->extents.y1) ||
- (A->extents.y2 != B->extents.y2))
- return FALSE;
-
- dataA = (int *)REGION_RECTS(A);
- dataB = (int *)REGION_RECTS(B);
-
- while (num--) {
- if ((dataA[0] != dataB[0]) || (dataA[1] != dataB[1]))
- return FALSE;
- dataA += 2;
- dataB += 2;
- }
-
- return TRUE;
-}
-
-#ifdef JOHN
-/* Not using this at the moment */
-/* IVTVClipVideo - copied from MGAClipVideo -
-
- Takes the dst box in standard X BoxRec form (top and left
- edges inclusive, bottom and right exclusive). The new dst
- box is returned. The source boundaries are given (x1, y1
- inclusive, x2, y2 exclusive) and returned are the new source
- boundaries in 16.16 fixed point.
-*/
-
-#define DummyScreen screenInfo.screens[0]
-
-static Bool
-IVTVClipVideo(BoxPtr dst,
- INT32 * x1,
- INT32 * x2,
- INT32 * y1, INT32 * y2, RegionPtr reg, INT32 width, INT32 height)
-{
- INT32 vscale, hscale, delta;
- BoxPtr extents = REGION_EXTENTS(DummyScreen, reg);
- int diff;
-
- hscale = ((*x2 - *x1) << 16) / (dst->x2 - dst->x1);
- vscale = ((*y2 - *y1) << 16) / (dst->y2 - dst->y1);
-
- *x1 <<= 16;
- *x2 <<= 16;
- *y1 <<= 16;
- *y2 <<= 16;
-
- diff = extents->x1 - dst->x1;
- if (diff > 0) {
- dst->x1 = extents->x1;
- *x1 += diff * hscale;
- }
- diff = dst->x2 - extents->x2;
- if (diff > 0) {
- dst->x2 = extents->x2;
- *x2 -= diff * hscale;
- }
- diff = extents->y1 - dst->y1;
- if (diff > 0) {
- dst->y1 = extents->y1;
- *y1 += diff * vscale;
- }
- diff = dst->y2 - extents->y2;
- if (diff > 0) {
- dst->y2 = extents->y2;
- *y2 -= diff * vscale;
- }
-
- if (*x1 < 0) {
- diff = (-*x1 + hscale - 1) / hscale;
- dst->x1 += diff;
- *x1 += diff * hscale;
- }
- delta = *x2 - (width << 16);
- if (delta > 0) {
- diff = (delta + hscale - 1) / hscale;
- dst->x2 -= diff;
- *x2 -= diff * hscale;
- }
- if (*x1 >= *x2)
- return FALSE;
-
- if (*y1 < 0) {
- diff = (-*y1 + vscale - 1) / vscale;
- dst->y1 += diff;
- *y1 += diff * vscale;
- }
- delta = *y2 - (height << 16);
- if (delta > 0) {
- diff = (delta + vscale - 1) / vscale;
- dst->y2 -= diff;
- *y2 -= diff * vscale;
- }
- if (*y1 >= *y2)
- return FALSE;
-
- if ((dst->x1 != extents->x1) || (dst->x2 != extents->x2) ||
- (dst->y1 != extents->y1) || (dst->y2 != extents->y2)) {
- RegionRec clipReg;
- REGION_INIT(DummyScreen, &clipReg, dst, 1);
- REGION_INTERSECT(DummyScreen, reg, reg, &clipReg);
- REGION_UNINIT(DummyScreen, &clipReg);
- }
- return TRUE;
-}
-#endif
-
-static void IVTVStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
-{
- ivtvHWPtr fPtr = FBDEVHWPTR(pScrn);
- Ivtv_Xv_PortData *pPriv = (Ivtv_Xv_PortData *)data;
-
- REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
-
- if (shutdown) {
- if (fPtr->fd_yuv != -1) {
- IVTVDevPtr devPtr = IVTVDEVPTR(pScrn);
- struct ivtvfb_ioctl_state_info state;
- close(fPtr->fd_yuv);
- fPtr->fd_yuv = -1;
- struct ivtvfb_ioctl_colorkey colorKey;
- colorKey.state = 0;
- colorKey.colorKey = pPriv->colorKey;
- if (ioctl(fPtr->fd,IVTVFB_IOCTL_SET_COLORKEY, &colorKey) < 0) {
- ErrorF
- ("IVTVFB_IOCTL_SET_COLORKEY failed (error: %s)\n",
- strerror(errno));
- }
- }
- }
-
-}
-
-static void de_macro_y(unsigned char *src, unsigned char *dst,
- int w, int h, int src_x, int src_y, int height, int width)
-{
- unsigned int x, y, i;
- unsigned char *dst_2;
- unsigned int h_tail, w_tail;
- unsigned int h_size, w_size;
- unsigned int h_lead, w_lead;
-
- // Always round the origin, but compensate by increasing the size
- if (src_x & 15) {
- w += src_x & 15;
- src_x &= ~15;
- }
-
- if (src_y & 15) {
- h += src_y & 15;
- src_y &= ~15;
- }
-
- // The right / bottom edge might not be a multiple of 16
- h_tail = h & 15;
- w_tail = w & 15;
-
- // One block is 16 pixels high
- h_size = 16;
-
- // descramble Y plane
- for (y = 0; y < h; y += 16) {
-
- // Clip if we've reached the bottom & the size isn't a multiple of 16
- if (y + 16 > h) h_size = h_tail;
-
- for (x = 0; x < w; x += 16) {
- if (x + 16 > w)
- w_size = w_tail;
- else
- w_size = 16;
-
- dst_2 = dst + (720 * y) + (720 * src_y) + (256 * (src_x>>4)) + (x * 16);
-
- for (i = 0; i < h_size; i++) {
- memcpy(dst_2, src + src_x + x + (y + i) * width + (src_y * width), w_size);
- dst_2 += 16;
- }
- }
- }
-}
-
-static void de_macro_uv(unsigned char *srcu, unsigned char *srcv,
- unsigned char *dst, int w, int h, int src_x, int src_y,
- int height, int width)
-{
- unsigned int x, y, i, f;
- unsigned char *dst_2;
- unsigned int h_tail, w_tail;
- unsigned int h_size, w_size;
- unsigned int h_lead, w_lead;
-
- // The uv plane is half the size of the y plane, so 'correct' all dimensions.
- w /= 2;
- h /= 2;
- src_x /= 2;
- src_y /= 2;
- height /= 2;
- width /= 2;
-
- // Always round the origin, but compensate by increasing the size
- if (src_x & 7) {
- w += src_x & 7;
- src_x &= ~7;
- }
-
- if (src_y & 15) {
- h += src_y & 15;
- src_y &= ~15;
- }
-
- // The right / bottom edge may not be a multiple of 16
- h_tail = h & 15;
- w_tail = w & 7;
-
- h_size = 16;
-
- // descramble U/V plane
- for (y = 0; y < h; y += 16) {
- if ( y + 16 > h ) h_size = h_tail;
- for (x = 0; x < w; x += 8) {
- dst_2 = dst + (720 * y) + (720 * src_y) + (256 * (src_x>>3)) + (x * 32);
- if (x + 8 <= w) {
- for (i = 0; i < h_size; i++) {
- int idx = src_x + x + ((y + i) * width) + (src_y * width);
- dst_2[0] = srcu[idx + 0];
- dst_2[1] = srcv[idx + 0];
- dst_2[2] = srcu[idx + 1];
- dst_2[3] = srcv[idx + 1];
- dst_2[4] = srcu[idx + 2];
- dst_2[5] = srcv[idx + 2];
- dst_2[6] = srcu[idx + 3];
- dst_2[7] = srcv[idx + 3];
- dst_2[8] = srcu[idx + 4];
- dst_2[9] = srcv[idx + 4];
- dst_2[10] = srcu[idx + 5];
- dst_2[11] = srcv[idx + 5];
- dst_2[12] = srcu[idx + 6];
- dst_2[13] = srcv[idx + 6];
- dst_2[14] = srcu[idx + 7];
- dst_2[15] = srcv[idx + 7];
- dst_2 += 16;
- }
- }
- else {
- for (i = 0; i < h_size; i ++) {
- int idx = src_x + x + ((y + i) * width) + (src_y * width);
- for (f = 0; f < w_tail; f++) {
- dst_2[0] = srcu[idx + f];
- dst_2[1] = srcv[idx + f];
- dst_2 += 2;
- }
-/*
- // Used for testing edge cutoff. Sets colour to Green
- for (f = w_tail;f < 8;f ++) {
- dst_2[0] = 0;
- dst_2[1] = 0;
- dst_2 += 2;
- }
-*/
- dst_2 += 16 - (w_tail << 1);
- }
- }
- }
- }
-}
-
-static unsigned long scale_yv12(unsigned char *src, unsigned char *dst,
- int src_w, int src_h, int src_x, int src_y, int height, int width)
-{
- // The PVR350 is limited to 720x576
- // Scale the incoming image down to fit
-
- // Scaled coords (destination)
- unsigned int sc_x, sc_y;
- // Unscaled coords (source)
- unsigned int us_x, us_y;
- // Offset to the u & v source planes
- unsigned int u_offset, v_offset;
- // Offset to the scaled uv plane
- unsigned int suv_offset;
- // Used to index into a macro block
- unsigned int blk_index;
- // Offset to start of line in source buffer
- unsigned int src_offset_vert;
- // Offset to pixel in source buffer
- unsigned int src_offset;
- // Used for pixel skipping & blending
- int xweight, xweight_m, xweight_skip, xskip, xskip_count;
- int yweight, yweight_m, yweight_skip, yskip, yskip_count;
-
- // Work out the skip. We don't need to be exact as the hardware will scale anyway.
- // Aliasing is done via 'weight' Calc the weight stepping as well
- if ( src_w > 720 ) {
- xskip = 720 / (src_w - 720);
- xweight_skip = 720 / xskip;
- }
- else {
- xskip = -1;
- xweight_skip = 0;
- }
-
- // Why 510 instead of 576 ?
- // Final output quality is better because the hardware
- // can treat it as a progressive image instead of interlaced
- // If src if taller than 1020, then we'll have to go for 576
- if (src_h > 510) {
- // Scale the image...
- if (src_h <= 1020) {
- yskip = 510 / (src_h - 510);
- yweight_skip = 510 / yskip;
- }
- else {
- yskip = 576 / (src_h - 576);
- yweight_skip = 576 / yskip;
- }
- }
- else {
- yskip = -1;
- yweight_skip = 0;
- }
-
-//ErrorF("xskip: %d yskip: %d xweight: %d ywieght: %d\n",xskip,yskip,xweight_skip,yweight_skip);
-
- // Calc the index to the u & v planes
- u_offset = (width * height);
- v_offset = u_offset + ((width * height) / 4);
-
- // Calc the index to the scaled u & v planes
- suv_offset = (720 * 576);
-
- // Shrink U/V - Don't alias, Just drop what we don't want
- sc_y = 0;
- yskip_count = 1;
- for (us_y = src_y >> 1; us_y < (src_y+src_h) >> 1; us_y ++) {
- sc_x = 0;
- xskip_count = 1;
- blk_index = 0;
-
- for (us_x = src_x >> 1; us_x < (src_x+src_w) >> 1; us_x ++) {
- // Copy v
- dst[((720*16)*(sc_y >> 4)) + ((blk_index & ~15) << 4) +
- ((sc_y & 15) << 4) + (blk_index++ & 15) + suv_offset] =
- src[((width >> 1) * us_y)+v_offset+us_x];
- // Copy u
- dst[((720*16)*(sc_y >> 4)) + ((blk_index & ~15) << 4) +
- ((sc_y & 15) << 4) + (blk_index++ & 15) + suv_offset] =
- src[((width >> 1) * us_y)+u_offset+us_x];
-
- if (xskip_count != xskip) {
- // Count towards the next horizontal skip
- xskip_count ++;
- }
- else {
- // Skip the next column & reset the horizontal skip counter
- xskip_count = 1;
- us_x ++;
- }
- // Move onto the next column in the scaled uv output
- sc_x ++;
- }
-
- if (yskip_count != yskip) {
- // Count towards the next vertical skip
- yskip_count ++;
- }
- else {
- // Skip the next row & reset te vertical skip counter
- yskip_count = 1;
- us_y ++;
- }
- // Next row in scaled uv output
- sc_y ++;
- }
-
- // Shrink Y - Full alias over both axis
-
- sc_y = 0;
- yskip_count = 1;
- yweight_m = 0;
- yweight = 0;
- for (us_y = src_y; us_y < (src_y+src_h); us_y ++) {
- sc_x = 0;
- xskip_count = 1;
- xweight_m = 0;
- xweight = 0;
-
- // Calc offset to beginning of the source line
- src_offset_vert = (width * us_y);
- for (us_x = src_x; us_x < (src_x+src_w); us_x ++) {
- // Offset to current working point
- src_offset = src_offset_vert + us_x;
- // Blend the rows, unless the source height is unscaled, or we're on the last line
- if ((yskip > 0) && (us_y + 1 != height)) {
- if (us_x < width -1)
- dst[(((720*16)*(sc_y >> 4)) + ((sc_x & ~15) << 4) + ((sc_y & 15) << 4) + (sc_x & 15))] =
- (((((src[src_offset] * (8-xweight)) + (src[src_offset+1] * xweight)) >> 3) * (8 - yweight)) + ((((src[src_offset+width] * (8-xweight)) + (src[src_offset+width+1] * xweight)) >> 3) * (yweight))) >> 3;
- else
- dst[(((720*16)*(sc_y >> 4)) + ((sc_x & ~15) << 4) + ((sc_y & 15)<<4) + (sc_x & 15))] =
- ((src[src_offset] * (8 - yweight)) + (src[src_offset+width] * yweight)) >> 3;
- }
- else {
- if (us_x < width -1)
- dst[(((720*16)*(sc_y >> 4)) + ((sc_x & ~15) << 4) + ((sc_y & 15)<<4) + (sc_x & 15))] =
- ((src[src_offset] * (8-xweight)) + ((src[src_offset+1] * xweight))) >> 3;
- else
- dst[(((720*16)*(sc_y >> 4)) + ((sc_x & ~15) << 4) + ((sc_y & 15)<<4) + (sc_x & 15))] =
- src[src_offset];
- }
-
- if (xskip_count != xskip) {
- // Count towards the next horizontal skip
- xskip_count ++;
- // Adjust the pixel weight
- xweight_m += xweight_skip;
- if (xweight_m > 720) xweight_m = 720;
- xweight = xweight_m / 90;
- }
- else {
- // Skip the next column & reset the skip counter
- xskip_count = 1;
- us_x ++;
- // Also reset the pixel weight
- if (xskip < 8) {
- xweight_m = 0;
- xweight = (8 - xskip) >> 1;
- }
- else {
- xweight = 0;
- xweight_m = 0;
- }
- }
- // Move onto the next column in the scaled y output
- sc_x ++;
- }
-
- if (yskip_count != yskip) {
- yskip_count ++;
- yweight_m += yweight_skip;
- if (yweight_m > 510) yweight_m = 510;
- yweight = yweight_m / 63;
- }
- else {
- yskip_count = 1;
- us_y ++;
- if (yskip < 8) {
- yweight_m = 0;
- yweight = (8 - yskip) >> 1;
- }
- else {
- yweight_m = 0;
- yweight = 0;
- }
- }
- // Next row in scaled y output
- sc_y ++;
- }
- // Return the new image size
- return ((sc_x << 16) | sc_y);
-}
-
-static char outbuf[622080];
-
-static int
-IVTVPutImage(ScrnInfoPtr pScrn,
- short src_x, short src_y,
- short drw_x, short drw_y,
- short src_w, short src_h,
- short drw_w, short drw_h,
- int id, unsigned char *buf,
- short width, short height,
- Bool sync, RegionPtr clipBoxes, pointer data)
-{
- ivtvHWPtr fPtr = FBDEVHWPTR(pScrn);
- Ivtv_Xv_PortData *pPriv = (Ivtv_Xv_PortData *)data;
-
- struct ivtvyuv_ioctl_dma_host_to_ivtv_args args;
-#ifdef JOHN
- ErrorF("src_w %d src_h %d drw_w %d drw_h %d width %d height %d\n",
- src_w, src_h, drw_w, drw_h, width, height);
- ErrorF("src_x %d src_y %d drw_x %d drw_y %d width %d height %d\n",
- src_x, src_y, drw_x, drw_y, width, height);
-#endif
-
- // Negative src coords are not yet supported
- if (src_y < 0) src_y = 0;
- if (src_x < 0) src_x = 0;
-
- // FIXME - Is this the correct place for this ?
-
- // Source coordinates must be even
- // For origin, round down
- src_x &= ~1;
- src_y &= ~1;
-
- // For size, round up
- src_w += src_w & 1;
- src_h += src_h & 1;
-
-#ifdef JOHN
- INT32 x1, x2, y1, y2;
- unsigned char *dst_start;
- int top, left, npixels, nlines;
-
- BoxRec dstBox;
- CARD32 tmp;
- static int once = 1;
- static int once2 = 1;
-
- /* Clip */
- x1 = src_x;
Reply to: