2
* $Id: nvidiavideo.c,v 1.3 2005/12/27 08:29:47 ajax Exp $
4
* Copyright Ā© 2003 Keith Packard
6
* Permission to use, copy, modify, distribute, and sell this software and its
7
* documentation for any purpose is hereby granted without fee, provided that
8
* the above copyright notice appear in all copies and that both that
9
* copyright notice and this permission notice appear in supporting
10
* documentation, and that the name of Keith Packard not be used in
11
* advertising or publicity pertaining to distribution of the software without
12
* specific, written prior permission. Keith Packard makes no
13
* representations about the suitability of this software for any purpose. It
14
* is provided "as is" without express or implied warranty.
16
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
* PERFORMANCE OF THIS SOFTWARE.
26
#include <kdrive-config.h>
30
#include <X11/extensions/Xv.h>
33
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
35
static Atom xvBrightness, xvSaturation, xvColorKey;
37
#define IMAGE_MAX_WIDTH 720
38
#define IMAGE_MAX_HEIGHT 576
41
nvidiaStopVideo(KdScreenInfo *screen, pointer data, Bool exit)
43
ScreenPtr pScreen = screen->pScreen;
44
KdScreenPriv(pScreen);
45
KdCardInfo *card = pScreenPriv->card;
46
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
47
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
48
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
49
Reg *reg = nvidiac->reg;
50
MediaReg *media = nvidiac->media_reg;
52
REGION_EMPTY(screen->pScreen, &pPortPriv->clip);
57
if(pPortPriv->videoOn)
60
/* wait for buffer to be displayed */
61
while (((media->TRIG_CNTL >> 5) & 1) != pPortPriv->currentBuf)
63
/* wait for buffer to be finished */
64
while (((media->TRIG_CNTL >> 6) & 1) != 0)
66
nvidiaWaitAvail (reg, 1);
67
media->OVERLAY_SCALE_CNTL = 0;
68
pPortPriv->videoOn = FALSE;
74
nvidiaSetPortAttribute(KdScreenInfo *screen,
79
ScreenPtr pScreen = screen->pScreen;
80
KdScreenPriv(pScreen);
81
KdCardInfo *card = pScreenPriv->card;
82
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
83
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
84
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
85
MediaReg *media = nvidiac->media_reg;
87
if(attribute == xvBrightness)
93
pPortPriv->brightness = value;
95
else if(attribute == xvSaturation)
101
pPortPriv->saturation = value;
103
else if(attribute == xvColorKey)
105
if (pPortPriv->colorKey != value)
107
pPortPriv->colorKey = value;
108
REGION_EMPTY(screen->pScreen, &pPortPriv->clip);
118
nvidiaGetPortAttribute(KdScreenInfo *screen,
123
NvidiaPortPrivPtr pPortPriv = (NvidiaPortPrivPtr)data;
125
if(attribute == xvBrightness)
126
*value = pPortPriv->brightness;
127
else if(attribute == xvSaturation)
128
*value = pPortPriv->saturation;
129
else if(attribute == xvColorKey)
130
*value = pPortPriv->colorKey;
138
nvidiaQueryBestSize(KdScreenInfo *screen,
154
nvidiaCopyPackedData(KdScreenInfo *screen,
166
ScreenPtr pScreen = screen->pScreen;
167
KdScreenPriv(pScreen);
168
KdCardInfo *card = pScreenPriv->card;
169
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
170
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
171
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
173
int srcDown, srcRight, srcNext;
176
switch (randr & RR_Rotate_All) {
183
src = buf + (srcH - 1) * 2;
188
src = buf + srcPitch * (srcH - 1) + (srcW - 1) * 2;
193
src = buf + srcPitch * (srcW - 1);
195
srcRight = -srcPitch;
199
src = src + top*srcDown + left*srcRight;
201
if (pPortPriv->currentBuf == 0)
202
dst = (CARD8 *) nvidias->vesa.fb + pPortPriv->YBuf0Offset;
204
dst = (CARD8 *) nvidias->vesa.fb + pPortPriv->YBuf1Offset;
208
srcNext = srcRight >> 1;
211
CARD16 *s = (CARD16 *) src;
212
CARD32 *d = (CARD32 *) dst;
216
*d++ = s[0] | (s[srcNext] << 16);
225
nvidiaCopyPlanarData(KdScreenInfo *screen,
230
int dstPitch, /* of chroma */
240
ScreenPtr pScreen = screen->pScreen;
241
KdScreenPriv(pScreen);
242
KdCardInfo *card = pScreenPriv->card;
243
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
244
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
245
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
247
CARD8 *src1, *src2, *src3, *dst1;
248
int srcDown, srcDown2, srcRight, srcRight2, srcNext;
250
/* compute source data pointers */
252
src2 = src1 + height * srcPitch;
253
src3 = src2 + (height >> 1) * srcPitch2;
254
switch (randr & RR_Rotate_All) {
257
srcDown2 = srcPitch2;
263
src1 = src1 + srcH - 1;
264
src2 = src2 + (srcH >> 1) - 1;
265
src3 = src3 + (srcH >> 1) - 1;
268
srcRight = srcPitch * 2;
269
srcRight2 = srcPitch2;
273
src1 = src1 + srcPitch * (srcH - 1) + (srcW - 1);
274
src2 = src2 + srcPitch2 * ((srcH >> 1) - 1) + ((srcW >> 1) - 1);
275
src3 = src3 + srcPitch2 * ((srcH >> 1) - 1) + ((srcW >> 1) - 1);
277
srcDown2 = -srcPitch2;
283
src1 = src1 + srcPitch * (srcW - 1);
284
src2 = src2 + srcPitch2 * ((srcW >> 1) - 1);
285
src3 = src3 + srcPitch2 * ((srcW >> 1) - 1);
288
srcRight = -srcPitch * 2;
289
srcRight2 = -srcPitch2;
294
/* adjust for origin */
295
src1 += top * srcDown + left * srcNext;
296
src2 += (top >> 1) * srcDown2 + (left >> 1) * srcRight2;
297
src3 += (top >> 1) * srcDown2 + (left >> 1) * srcRight2;
299
if (id == FOURCC_I420)
306
if (pPortPriv->currentBuf == 0)
307
dst1 = (CARD8 *) nvidias->vesa.fb + pPortPriv->YBuf0Offset;
309
dst1 = (CARD8 *) nvidias->vesa.fb + pPortPriv->YBuf1Offset;
312
for (j = 0; j < h; j++)
314
CARD32 *dst = (CARD32 *) dst1;
316
CARD8 *s1r = src1 + srcNext;
320
for (i = 0; i < w; i++)
322
*dst++ = *s1l | (*s1r << 16) | (*s3 << 8) | (*s2 << 24);
339
nvidiaPaintRegion (ScreenPtr pScreen, RegionPtr pRgn, Pixel fg)
341
WindowPtr pRoot = WindowTable[pScreen->myNum];
344
xRectangle *rects, *r;
345
BoxPtr pBox = REGION_RECTS (pRgn);
346
int nBox = REGION_NUM_RECTS (pRgn);
348
rects = ALLOCATE_LOCAL (nBox * sizeof (xRectangle));
356
r->width = pBox->x2 - pBox->x1;
357
r->height = pBox->y2 - pBox->y1;
362
pGC = GetScratchGC (pRoot->drawable.depth, pScreen);
367
val[1] = IncludeInferiors;
368
ChangeGC (pGC, GCForeground|GCSubwindowMode, val);
370
ValidateGC (&pRoot->drawable, pGC);
372
(*pGC->ops->PolyFillRect) (&pRoot->drawable, pGC,
373
REGION_NUM_RECTS (pRgn), rects);
377
DEALLOCATE_LOCAL (rects);
384
Takes the dst box in standard X BoxRec form (top and left
385
edges inclusive, bottom and right exclusive). The new dst
386
box is returned. The source boundaries are given (x1, y1
387
inclusive, x2, y2 exclusive) and returned are the new source
388
boundaries in 16.16 fixed point.
392
NvidiaClipVideo(BoxPtr dst,
397
BoxPtr extents, /* extents of the clip region */
401
INT32 vscale, hscale, delta;
404
hscale = ((*x2 - *x1) << 16) / (dst->x2 - dst->x1);
405
vscale = ((*y2 - *y1) << 16) / (dst->y2 - dst->y1);
407
*x1 <<= 16; *x2 <<= 16;
408
*y1 <<= 16; *y2 <<= 16;
410
diff = extents->x1 - dst->x1;
412
dst->x1 = extents->x1;
413
*x1 += diff * hscale;
415
diff = dst->x2 - extents->x2;
417
dst->x2 = extents->x2;
418
*x2 -= diff * hscale;
420
diff = extents->y1 - dst->y1;
422
dst->y1 = extents->y1;
423
*y1 += diff * vscale;
425
diff = dst->y2 - extents->y2;
427
dst->y2 = extents->y2;
428
*y2 -= diff * vscale;
432
diff = (- *x1 + hscale - 1)/ hscale;
434
*x1 += diff * hscale;
436
delta = *x2 - (width << 16);
438
diff = (delta + hscale - 1)/ hscale;
440
*x2 -= diff * hscale;
443
diff = (- *y1 + vscale - 1)/ vscale;
445
*y1 += diff * vscale;
447
delta = *y2 - (height << 16);
449
diff = (delta + vscale - 1)/ vscale;
451
*y2 -= diff * vscale;
456
nvidiaDisplayVideo(KdScreenInfo *screen,
458
int dstPitch, /* of chroma for 4:2:0 */
472
ScreenPtr pScreen = screen->pScreen;
473
KdScreenPriv(pScreen);
474
KdCardInfo *card = pScreenPriv->card;
475
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
476
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
477
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
478
Reg *reg = nvidiac->reg;
479
MediaReg *media = nvidiac->media_reg;
480
int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
481
int xscaleIntUV = 0, xscaleFractUV = 0;
482
int yscaleIntUV = 0, yscaleFractUV = 0;
483
int randr = nvidias->vesa.randr;
484
int HORZ_INC, VERT_INC;
486
CARD32 OVERLAY_SCALE_CNTL;
492
if (id == FOURCC_UYVY)
493
SCALER_IN = SCALER_IN_YVYU422;
495
SCALER_IN = SCALER_IN_VYUY422;
497
nvidiaWaitAvail (reg, 4);
499
media->VIDEO_FORMAT = SCALER_IN | VIDEO_IN_VYUY422;
502
media->OVERLAY_GRAPHICS_KEY_MSK = (1 << screen->fb[0].depth) - 1;
503
media->OVERLAY_GRAPHICS_KEY_CLR = pPortPriv->colorKey;
504
/* set key control to obey only graphics color key */
505
media->OVERLAY_KEY_CNTL = 0x50;
507
nvidiaWaitAvail (reg, 9);
508
media->CAPTURE_DEBUG = 0;
509
/* no exclusive video region */
510
media->OVERLAY_EXCLUSIVE_HORZ = 0;
511
media->OVERLAY_EXCLUSIVE_VERT = 0;
512
/* scaling coefficients */
513
media->SCALER_H_COEFF0 = 0x00002000;
514
media->SCALER_H_COEFF1 = 0x0D06200D;
515
media->SCALER_H_COEFF2 = 0x0D0A1C0D;
516
media->SCALER_H_COEFF3 = 0x0C0E1A0C;
517
media->SCALER_H_COEFF4 = 0x0C14140C;
518
media->SCALER_TEST = 0;
520
nvidiaWaitAvail (reg, 2);
521
media->OVERLAY_SCALE_CNTL = (SCALE_PIX_EXPAND |
527
bright = (pPortPriv->brightness * 64 / 1000);
532
bright = bright & 0x7f;
533
sat = ((pPortPriv->saturation * 31 + 31000) / 2000);
539
media->SCALER_COLOUR_CNTL = ((bright << 0) | /* BRIGHTNESS */
540
(sat << 8) | /* SATURATION_U */
541
(sat << 16) | /* SATURATION_V */
542
(0 << 21) | /* SCALER_VERT_ADJ_UV */
543
(0 << 28)); /* SCALER_HORZ_ADJ_UV */
545
VERT_INC = (src_h << 12) / drw_h;
546
HORZ_INC = (src_w << 12) / drw_w;
548
nvidiaWaitAvail (reg, 13);
550
/* lock registers to prevent non-atomic update */
551
media->OVERLAY_Y_X_START = 0x80000000 | NVIDIA_YX (dst_x1, dst_y1);
552
/* ending screen coordinate */
553
media->OVERLAY_Y_X_END = 0x80000000 | NVIDIA_YX (dst_x2, dst_y2);
555
media->OVERLAY_SCALE_INC = NVIDIA_YX(HORZ_INC, VERT_INC);
557
media->SCALER_BUF0_OFFSET = pPortPriv->YBuf0Offset;
558
media->SCALER_BUF1_OFFSET = pPortPriv->YBuf1Offset;
560
media->SCALER_BUF0_OFFSET_U = pPortPriv->YBuf0Offset;
561
media->SCALER_BUF1_OFFSET_U = pPortPriv->YBuf1Offset;
563
media->SCALER_BUF0_OFFSET_V = pPortPriv->YBuf0Offset;
564
media->SCALER_BUF1_OFFSET_V = pPortPriv->YBuf1Offset;
566
media->SCALER_BUF_PITCH = dstPitch >> 1;
567
media->SCALER_HEIGHT_WIDTH = NVIDIA_YX(src_w - (x1 >> 16), src_h - (y1 >> 16));
569
media->CAPTURE_CONFIG = pPortPriv->currentBuf << 28;
571
/* set XY location and unlock */
572
media->OVERLAY_Y_X_START = NVIDIA_YX (dst_x1, dst_y1);
576
nvidiaPutImage(KdScreenInfo *screen,
593
KdCardInfo *card = screen->card;
594
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
595
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
596
NvidiaPortPrivPtr pPortPriv = (NvidiaPortPrivPtr)data;
597
Reg *reg = nvidiac->reg;
598
MediaReg *media = nvidiac->media_reg;
599
INT32 x1, x2, y1, y2;
600
int randr = nvidias->vesa.randr;
601
int srcPitch, srcPitch2, dstPitch;
602
int top, left, npixels, nlines, size;
604
int dst_width = width, dst_height = height;
605
int rot_x1, rot_y1, rot_x2, rot_y2;
606
int dst_x1, dst_y1, dst_x2, dst_y2;
607
int rot_src_w, rot_src_h, rot_drw_w, rot_drw_h;
616
dstBox.x2 = drw_x + drw_w;
618
dstBox.y2 = drw_y + drw_h;
620
NvidiaClipVideo(&dstBox, &x1, &x2, &y1, &y2,
621
REGION_EXTENTS(pScreen, clipBoxes), width, height);
623
if((x1 >= x2) || (y1 >= y2))
629
if (randr & (RR_Rotate_0|RR_Rotate_180))
648
switch (randr & RR_Rotate_All) {
661
dst_y1 = screen->height - dstBox.x2;
663
dst_y2 = screen->height - dstBox.x1;
666
rot_y1 = (src_w << 16) - x2;
668
rot_y2 = (src_w << 16) - x1;
671
dst_x1 = screen->width - dstBox.x2;
672
dst_y1 = screen->height - dstBox.y2;
673
dst_x2 = screen->width - dstBox.x1;
674
dst_y2 = screen->height - dstBox.y1;
675
rot_x1 = (src_w << 16) - x2;
676
rot_y1 = (src_h << 16) - y2;
677
rot_x2 = (src_w << 16) - x1;
678
rot_y2 = (src_h << 16) - y1;
681
dst_x1 = screen->width - dstBox.y2;
683
dst_x2 = screen->width - dstBox.y1;
685
rot_x1 = (src_h << 16) - y2;
687
rot_x2 = (src_h << 16) - y1;
695
dstPitch = ((dst_width << 1) + 15) & ~15;
696
srcPitch = (width + 3) & ~3;
697
srcPitch2 = ((width >> 1) + 3) & ~3;
698
size = dstPitch * (int) dst_height;
703
dstPitch = ((dst_width << 1) + 15) & ~15;
704
srcPitch = (width << 1);
705
size = dstPitch * (int) dst_height;
709
pPortPriv->offset = nvidias->off_screen - (CARD8 *) nvidias->vesa.fb;
712
pPortPriv->YBuf0Offset = pPortPriv->offset;
713
pPortPriv->YBuf1Offset = pPortPriv->offset + size;
716
nvidiaWaitIdle (reg);
718
if (pPortPriv->videoOn)
720
/* wait for buffer to be displayed */
721
while (((media->TRIG_CNTL >> 5) & 1) != pPortPriv->currentBuf)
726
* Use the other buffer
728
pPortPriv->currentBuf = 1 - pPortPriv->currentBuf;
732
left = (rot_x1 >> 16) & ~1;
733
npixels = ((((rot_x2 + 0xffff) >> 16) + 1) & ~1) - left;
739
nlines = ((((rot_y2 + 0xffff) >> 16) + 1) & ~1) - top;
740
nvidiaCopyPlanarData(screen, buf, randr,
741
srcPitch, srcPitch2, dstPitch,
742
rot_src_w, rot_src_h, height,
743
top, left, nlines, npixels, id);
748
nlines = ((rot_y2 + 0xffff) >> 16) - top;
749
nvidiaCopyPackedData(screen, buf, randr,
751
rot_src_w, rot_src_h,
757
nvidiaDisplayVideo(screen, id, dstPitch,
758
rot_x1, rot_y1, rot_x2, rot_y2,
761
rot_src_w, rot_src_h, rot_drw_w, rot_drw_h);
763
/* update cliplist */
764
if (!REGION_EQUAL (screen->pScreen, &pPortPriv->clip, clipBoxes))
766
REGION_COPY (screen->pScreen, &pPortPriv->clip, clipBoxes);
767
nvidiaPaintRegion (screen->pScreen, &pPortPriv->clip, pPortPriv->colorKey);
770
pPortPriv->videoOn = TRUE;
776
nvidiaQueryImageAttributes(KdScreenInfo *screen,
785
if(*w > IMAGE_MAX_WIDTH)
786
*w = IMAGE_MAX_WIDTH;
787
if(*h > IMAGE_MAX_HEIGHT)
788
*h = IMAGE_MAX_HEIGHT;
791
if(offsets) offsets[0] = 0;
797
size = (*w + 3) & ~3;
803
tmp = ((*w >> 1) + 3) & ~3;
805
pitches[1] = pitches[2] = tmp;
826
/* client libraries expect an encoding */
827
static KdVideoEncodingRec DummyEncoding[1] =
832
IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,
837
#define NUM_FORMATS 3
839
static KdVideoFormatRec Formats[NUM_FORMATS] =
841
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
844
#define NUM_ATTRIBUTES 3
846
static KdAttributeRec Attributes[NUM_ATTRIBUTES] =
848
{XvSettable | XvGettable, 0, ~0, "XV_COLORKEY"},
849
{XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"},
850
{XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}
855
static KdImageRec Images[NUM_IMAGES] =
863
static void nvidiaResetVideo(KdScreenInfo *screen)
865
ScreenPtr pScreen = screen->pScreen;
866
KdScreenPriv(pScreen);
867
KdCardInfo *card = pScreenPriv->card;
868
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
869
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
870
NvidiaPortPrivPtr pPortPriv = nvidias->pAdaptor->pPortPrivates[0].ptr;
871
MediaReg *media = nvidiac->media_reg;
874
* Default to maximum image size in YV12
880
nvidiaReputImage (KdScreenInfo *screen,
886
ScreenPtr pScreen = screen->pScreen;
887
NvidiaPortPrivPtr pPortPriv = (NvidiaPortPrivPtr)data;
888
BoxPtr pOldExtents = REGION_EXTENTS (pScreen, &pPortPriv->clip);
889
BoxPtr pNewExtents = REGION_EXTENTS (pScreen, clipBoxes);
891
if (pOldExtents->x1 == pNewExtents->x1 &&
892
pOldExtents->x2 == pNewExtents->x2 &&
893
pOldExtents->y1 == pNewExtents->y1 &&
894
pOldExtents->y2 == pNewExtents->y2)
896
/* update cliplist */
897
if (!REGION_EQUAL (screen->pScreen, &pPortPriv->clip, clipBoxes))
899
REGION_COPY (screen->pScreen, &pPortPriv->clip, clipBoxes);
900
nvidiaPaintRegion (screen->pScreen, &pPortPriv->clip, pPortPriv->colorKey);
907
static KdVideoAdaptorPtr
908
nvidiaSetupImageVideo(ScreenPtr pScreen)
910
KdScreenPriv(pScreen);
911
nvidiaCardInfo(pScreenPriv);
912
nvidiaScreenInfo(pScreenPriv);
913
KdScreenInfo *screen = pScreenPriv->screen;
914
KdCardInfo *card = pScreenPriv->card;
915
KdVideoAdaptorPtr adapt;
916
NvidiaPortPrivPtr pPortPriv;
918
if(!(adapt = xcalloc(1, sizeof(KdVideoAdaptorRec) +
919
sizeof(NvidiaPortPrivRec) +
923
adapt->type = XvWindowMask | XvInputMask | XvImageMask;
924
adapt->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
925
adapt->name = "Nvidia Video Overlay";
926
adapt->nEncodings = 1;
927
adapt->pEncodings = DummyEncoding;
928
adapt->nFormats = NUM_FORMATS;
929
adapt->pFormats = Formats;
931
adapt->pPortPrivates = (DevUnion*)(&adapt[1]);
933
pPortPriv = (NvidiaPortPrivPtr)(&adapt->pPortPrivates[1]);
935
adapt->pPortPrivates[0].ptr = (pointer)(pPortPriv);
936
adapt->pAttributes = Attributes;
937
adapt->nImages = NUM_IMAGES;
938
adapt->nAttributes = NUM_ATTRIBUTES;
939
adapt->pImages = Images;
940
adapt->PutVideo = NULL;
941
adapt->PutStill = NULL;
942
adapt->GetVideo = NULL;
943
adapt->GetStill = NULL;
944
adapt->StopVideo = nvidiaStopVideo;
945
adapt->SetPortAttribute = nvidiaSetPortAttribute;
946
adapt->GetPortAttribute = nvidiaGetPortAttribute;
947
adapt->QueryBestSize = nvidiaQueryBestSize;
948
adapt->PutImage = nvidiaPutImage;
949
adapt->ReputImage = nvidiaReputImage;
950
adapt->QueryImageAttributes = nvidiaQueryImageAttributes;
952
pPortPriv->colorKey = nvidias->colorKey;
953
pPortPriv->videoOn = FALSE;
954
pPortPriv->brightness = 0;
955
pPortPriv->saturation = 0;
956
pPortPriv->currentBuf = 0;
958
/* gotta uninit this someplace */
959
REGION_INIT(pScreen, &pPortPriv->clip, NullBox, 0);
961
nvidias->pAdaptor = adapt;
963
xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
964
xvSaturation = MAKE_ATOM("XV_SATURATION");
965
xvColorKey = MAKE_ATOM("XV_COLORKEY");
967
nvidiaResetVideo(screen);
972
Bool nvidiaInitVideo(ScreenPtr pScreen)
974
KdScreenPriv(pScreen);
975
KdScreenInfo *screen = pScreenPriv->screen;
976
KdVideoAdaptorPtr *adaptors, *newAdaptors = NULL;
977
KdVideoAdaptorPtr newAdaptor = NULL;
979
KdCardInfo *card = pScreenPriv->card;
980
NvidiaScreenInfo *nvidias = (NvidiaScreenInfo *) screen->driver;
981
NvidiaCardInfo *nvidiac = (NvidiaCardInfo *) card->driver;
983
if (!nvidiac->media_reg)
986
newAdaptor = nvidiaSetupImageVideo(pScreen);
988
num_adaptors = KdXVListGenericAdaptors(screen, &adaptors);
995
adaptors = &newAdaptor;
999
newAdaptors = xalloc((num_adaptors + 1) *
1000
sizeof(KdVideoAdaptorPtr*));
1003
memcpy(newAdaptors, adaptors,
1004
num_adaptors * sizeof(KdVideoAdaptorPtr));
1005
newAdaptors[num_adaptors] = newAdaptor;
1006
adaptors = newAdaptors;
1013
KdXVScreenInit(pScreen, adaptors, num_adaptors);