diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-08-10 17:52:03 +0200 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-11-04 15:13:02 +0100 |
commit | 1f731702a0ea27fb22c1610e4ee648bcef19cddc (patch) | |
tree | 38163bf24ee5287ae9780c8a2c428292b4bfbeb2 | |
parent | 1318f248783935e3370340e0ab3e3fb5547fbb0d (diff) |
XvMC: Extend protocol to pass slice count around.
-rw-r--r-- | lib/xvmc/xvmc_unichrome.c | 9 | ||||
-rw-r--r-- | lib/xvmc/xvmce.c | 3 | ||||
-rw-r--r-- | lib/xvmc/xvmce.h | 2 | ||||
-rw-r--r-- | lib/xvmc/xvmce_proto.h | 3 | ||||
-rw-r--r-- | src/via_xvmc.c | 5 |
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); |