summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-08-10 17:52:03 +0200
committerLuc Verhaegen <libv@skynet.be>2009-11-04 15:13:02 +0100
commit1f731702a0ea27fb22c1610e4ee648bcef19cddc (patch)
tree38163bf24ee5287ae9780c8a2c428292b4bfbeb2
parent1318f248783935e3370340e0ab3e3fb5547fbb0d (diff)
XvMC: Extend protocol to pass slice count around.
-rw-r--r--lib/xvmc/xvmc_unichrome.c9
-rw-r--r--lib/xvmc/xvmce.c3
-rw-r--r--lib/xvmc/xvmce.h2
-rw-r--r--lib/xvmc/xvmce_proto.h3
-rw-r--r--src/via_xvmc.c5
5 files changed, 13 insertions, 9 deletions
diff --git a/lib/xvmc/xvmc_unichrome.c b/lib/xvmc/xvmc_unichrome.c
index a8fe4ad..2a65647 100644
--- a/lib/xvmc/xvmc_unichrome.c
+++ b/lib/xvmc/xvmc_unichrome.c
@@ -66,6 +66,7 @@ static int XvMCE_ErrorBase;
static XID current_surface_id = 0;
static int current_surface_size = 0;
+static int current_slice_count = 0;
/* because of the rather abhorrent nature of the XvMC interface. */
static XvPortID XvMCPortID = 0;
@@ -421,6 +422,8 @@ XvMCBeginSurface(Display *display, XvMCContext *context, XvMCSurface *target,
if (control->flags & XVMC_Q_SCALE_TYPE)
SliceFlags |= XVMCE_SLICEFLAGS_QUANTIZATION_TABLE_MASK;
+ current_slice_count = 0;
+
status = XVMCEBufferSliceInit(display, XvMCPortID, target->surface_id,
PictureType, SliceFlags,
past ? 1 : 0, past ? past->surface_id : 0,
@@ -452,11 +455,13 @@ XvMCPutSlice(Display *display, XvMCContext *context,
current_surface_size += size;
status = XVMCEBufferSliceSend(display, XvMCPortID, current_surface_id,
- size, slice);
+ current_slice_count, size, slice);
if (status != Success)
fprintf(stderr, "%s: XVMCEBufferSliceSend failed: %d\n",
__func__, status);
+ current_slice_count++;
+
return status;
}
@@ -476,7 +481,7 @@ XvMCPutSlice2(Display *display, XvMCContext *context,
current_surface_size += size;
status = XVMCEBufferSliceSend(display, XvMCPortID, current_surface_id,
- size, slice);
+ slicecode, size, slice);
if (status != Success)
fprintf(stderr, "%s: XVMCEBufferSliceSend failed: %d\n",
__func__, status);
diff --git a/lib/xvmc/xvmce.c b/lib/xvmc/xvmce.c
index fc59494..562b593 100644
--- a/lib/xvmc/xvmce.c
+++ b/lib/xvmc/xvmce.c
@@ -247,7 +247,7 @@ XVMCEBufferSliceInit(Display *dpy, XvPortID port, XID Buffer,
*/
Status
XVMCEBufferSliceSend(Display *dpy, XvPortID port, XID Buffer,
- int SliceSize, char *Slice)
+ int SliceCount, int SliceSize, char *Slice)
{
XExtDisplayInfo *info = XvMCEFindDisplay(dpy);
xvmceBufferSliceSendReq *req;
@@ -260,6 +260,7 @@ XVMCEBufferSliceSend(Display *dpy, XvPortID port, XID Buffer,
req->Port = port;
req->Buffer = Buffer;
+ req->SliceCount = SliceCount;
req->SliceLength = SliceSize;
_XSend(dpy, Slice, SliceSize);
diff --git a/lib/xvmc/xvmce.h b/lib/xvmc/xvmce.h
index 8454dbc..fae1f2f 100644
--- a/lib/xvmc/xvmce.h
+++ b/lib/xvmc/xvmce.h
@@ -39,5 +39,5 @@ Status XVMCEBufferSliceInit(Display *dpy, XvPortID port, XID Buffer,
CARD8 MVRange_ForwardsHorizontal,
CARD8 MVRange_ForwardsVertical);
Status XVMCEBufferSliceSend(Display *dpy, XvPortID port, XID Buffer,
- int SliceSize, char *Slice);
+ int SliceCount, int SliceSize, char *Slice);
#endif /* XVMCE_H */
diff --git a/lib/xvmc/xvmce_proto.h b/lib/xvmc/xvmce_proto.h
index cdbe720..47777f1 100644
--- a/lib/xvmc/xvmce_proto.h
+++ b/lib/xvmc/xvmce_proto.h
@@ -175,8 +175,9 @@ typedef struct {
CARD16 length B16;
CARD32 Port B32;
CARD32 Buffer B32;
+ CARD32 SliceCount B32;
CARD32 SliceLength B32;
} xvmceBufferSliceSendReq;
-#define sz_xvmceBufferSliceSendReq 16
+#define sz_xvmceBufferSliceSendReq 20
#endif /* XVMCE_PROTO_H */
diff --git a/src/via_xvmc.c b/src/via_xvmc.c
index 741bbe4..7a2f568 100644
--- a/src/via_xvmc.c
+++ b/src/via_xvmc.c
@@ -259,10 +259,7 @@ XvMCEProcBufferSliceSend(ClientPtr client)
return BadAccess;
}
- ViaDebug(pScrn->scrnIndex, "%s: Buffer 0x%08X: Slice %dbytes\n",
- __func__, stuff->Buffer, stuff->SliceLength);
-
- ViaMpegSlicePut(VIAPTR(pScrn)->Swov->Mpeg, stuff->Buffer, 0, // FIXME.
+ ViaMpegSlicePut(VIAPTR(pScrn)->Swov->Mpeg, stuff->Buffer, stuff->SliceCount,
stuff->SliceLength, (CARD8 *) &stuff[1]);
return (client->noClientException);