summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCooper Yuan <cooperyuan@gmail.com>2009-05-31 13:59:02 +0800
committerCooper Yuan <cooperyuan@gmail.com>2009-05-31 13:59:02 +0800
commit11889ca4e24471fecff858158f752d4336b5fec3 (patch)
tree9f9a621b9a7f491d82277a136ecbc0442b5372f4
parent14222e1b4c542a211c118db0aeec6cc859e2f614 (diff)
xvmc: Add XvMC interface API, subpicture related functions are not implemented
-rw-r--r--src/xvmc/radeon_xvmc.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/xvmc/radeon_xvmc.c b/src/xvmc/radeon_xvmc.c
index 1f464d4..5fb88c3 100644
--- a/src/xvmc/radeon_xvmc.c
+++ b/src/xvmc/radeon_xvmc.c
@@ -470,6 +470,20 @@ _X_EXPORT Status XvMCCreateBlocks(Display *display, XvMCContext *context,
unsigned int num_blocks,
XvMCBlockArray *block)
{
+ Status ret;
+ if (!display || !context || !num_blocks || !block)
+ return BadValue;
+
+ memset(block, 0, sizeof(XvMCBlockArray));
+
+ if (!(block->blocks = (short *)malloc((num_blocks << 6) * sizeof(short))))
+ return BadAlloc;
+
+ block->num_blocks = num_blocks;
+ block->context_id = context->context_id;
+ block->privData = NULL;
+
+ return Success;
}
/*
@@ -477,6 +491,19 @@ _X_EXPORT Status XvMCCreateBlocks(Display *display, XvMCContext *context,
*/
_X_EXPORT Status XvMCDestroyBlocks(Display *display, XvMCBlockArray *block)
{
+ Status ret;
+ if (!display || !block)
+ return BadValue;
+
+ if (block->blocks)
+ free(block->blocks);
+
+ block->context_id = 0;
+ block->num_blocks = 0;
+ block->blocks = NULL;
+ block->privData = NULL;
+
+ return Success;
}
/*
@@ -486,6 +513,20 @@ _X_EXPORT Status XvMCCreateMacroBlocks(Display *display, XvMCContext *context,
unsigned int num_blocks,
XvMCMacroBlockArray *blocks)
{
+ if (!display || !context || !blocks || !num_blocks)
+ return BadValue;
+
+ memset(blocks, 0, sizeof(XvMCMacroBlockArray));
+ blocks->macro_blocks = (XvMCMacroBlock *)malloc(num_blocks * sizeof(XvMCMacroBlock));
+
+ if (!blocks->macro_blocks)
+ return BadAlloc;
+
+ blocks->num_blocks = num_blocks;
+ blocks->context_id = context->context_id;
+ blocks->privData = NULL;
+
+ return Success;
}
/*
@@ -493,6 +534,17 @@ _X_EXPORT Status XvMCCreateMacroBlocks(Display *display, XvMCContext *context,
*/
_X_EXPORT Status XvMCDestroyMacroBlocks(Display *display, XvMCMacroBlockArray *block)
{
+ if (!display || !block)
+ return BadValue;
+ if (block->macro_blocks)
+ free(block->macro_blocks);
+
+ block->context_id = 0;
+ block->num_blocks = 0;
+ block->macro_blocks = NULL;
+ block->privData = NULL;
+
+ return Success;
}
/*
@@ -513,6 +565,29 @@ _X_EXPORT Status XvMCRenderSurface(Display *display, XvMCContext *context,
XvMCMacroBlockArray *macroblock_array,
XvMCBlockArray *blocks)
{
+ Status ret;
+
+ if (!display || !context)
+ {
+ ErrorF("[XvMC]: Invalid Display, Context or Target!");
+ return XvMCBadContext;
+ }
+ if (!target_surface)
+ return XvMCBadSurface;
+
+ ret = (xvmc_driver_ptr->render_surface)(display, context,
+ picture_structure,
+ target_surface, past_surface,
+ future_surface, flags,
+ num_macroblocks, first_macroblock,
+ macroblock_array, blocks);
+
+ if (ret)
+ {
+ ErrorF("[XvMC]: render surface fail\n");
+ return ret;
+ }
+ return Success;
}
/*
@@ -547,6 +622,44 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
unsigned short destw, unsigned short desth,
int flags)
{
+ Status ret = Success;
+ XvMCContext *context;
+ radeon_xvmc_context_ptr radeon_ctx;
+ radeon_xvmc_surface_ptr radeon_surf;
+
+ if (!display || !surface)
+ return XvMCBadSurface;
+
+ radeon_ctx = radeon_xvmc_find_context(surface->context_id);
+ radeon_surf = radeon_xvmc_find_surface(surface->surface_id);
+ if (!radeon_ctx || !radeon_surf)
+ return XvMCBadSurface;
+ context = radeon_ctx->context;
+
+ if (radeon_surf->gc_init == FALSE)
+ {
+ radeon_surf->gc = XCreateGC(display, draw, 0, NULL);
+ radeon_surf->gc_init = TRUE;
+ }
+ else if (draw != radeon_surf->last_draw)
+ {
+ XFreeGC(display, radeon_surf->gc);
+ radeon_surf->gc = XCreateGC(display, draw, 0, NULL);
+ }
+ radeon_surf->last_draw = draw;
+
+ /* fill intel_surf->data */
+ ret = (xvmc_driver_ptr->put_surface)(display, surface, draw, srcx, srcy,
+ srcw, srch, destx, desty, destw, desth, flags, &radeon_surf->data);
+ if (ret)
+ {
+ ErrorF("[XvMC]: put surface fail\n");
+ return ret;
+ }
+ ret = XvPutImage(display, context->port, draw, radeon_surf->gc,
+ radeon_surf->image, srcx, srcy, srcw, srch, destx, desty,
+ destw, desth);
+ return ret;
}
/*
@@ -557,6 +670,17 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
*/
_X_EXPORT Status XvMCSyncSurface(Display *display, XvMCSurface *surface)
{
+ Status ret;
+ int stat = 0;
+
+ if (!display || !surface)
+ return XvMCBadSurface;
+
+ do {
+ ret = XvMCGetSurfaceStatus(display, surface, &stat);
+ } while (!ret && (stat & XVMC_RENDERING));
+
+ return ret;
}
/*
@@ -571,6 +695,9 @@ _X_EXPORT Status XvMCSyncSurface(Display *display, XvMCSurface *surface)
*/
_X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface *surface)
{
+ if (!display || !surface)
+ return XvMCBadSurface;
+ return Success;
}
/*
@@ -587,6 +714,19 @@ _X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface *surface)
*/
_X_EXPORT Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, int *stat)
{
+ Status ret;
+
+ if (!display || !surface || !stat)
+ return XvMCBadSurface;
+
+ ret = (xvmc_driver_ptr->get_surface_status)(display, surface, stat);
+ if (ret)
+ {
+ ErrorF("[XvMC]: get surface status fail\n");
+ return ret;
+ }
+
+ return Success;
}
/*
@@ -600,6 +740,26 @@ _X_EXPORT Status XvMCGetSurfaceStatus(Display *display, XvMCSurface *surface, in
*/
_X_EXPORT Status XvMCHideSurface(Display *display, XvMCSurface *surface)
{
+ int stat = 0;
+ Status ret;
+
+ if (!display || !surface)
+ return XvMCBadSurface;
+
+ XvMCSyncSurface(display, surface);
+
+ /*
+ * Get the status of the surface, if it is not currently displayed
+ * we don't need to worry about it.
+ */
+ if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
+ return ret;
+
+ if (!(stat & XVMC_DISPLAYING))
+ return Success;
+
+ ErrorF("[XvMC]: XvMCHideSurface not implemented!\n");
+ return BadValue;
}
/*
@@ -621,6 +781,8 @@ _X_EXPORT Status XvMCCreateSubpicture(Display *display, XvMCContext *context,
unsigned short width, unsigned short height,
int xvimage_id)
{
+ ErrorF("[XvMC]: XvMCCreateSubpicture not implemented!\n");
+ return BadValue;
}
/*
@@ -640,6 +802,9 @@ _X_EXPORT Status XvMCClearSubpicture(Display *display, XvMCSubpicture *subpictur
unsigned short width, unsigned short height,
unsigned int color)
{
+ ErrorF("[XvMC]: XvMCClearSubpicture not implemented!\n");
+ return BadValue;
+
}
/*
@@ -663,6 +828,8 @@ _X_EXPORT Status XvMCCompositeSubpicture(Display *display, XvMCSubpicture *subpi
unsigned short width, unsigned short height,
short dstx, short dsty)
{
+ ErrorF("[XvMC]: XvMCCompositeSubpicture not implemented!\n");
+ return BadValue;
}
/*
@@ -676,6 +843,7 @@ _X_EXPORT Status XvMCCompositeSubpicture(Display *display, XvMCSubpicture *subpi
*/
_X_EXPORT Status XvMCDestroySubpicture(Display *display, XvMCSubpicture *subpicture)
{
+ ErrorF("[XvMC]: XvMCDestroySubpicture not implemented!\n");
return BadValue;
}
@@ -692,6 +860,7 @@ _X_EXPORT Status XvMCDestroySubpicture(Display *display, XvMCSubpicture *subpict
_X_EXPORT Status XvMCSetSubpicturePalette(Display *display, XvMCSubpicture *subpicture,
unsigned char *palette)
{
+ ErrorF("[XvMC]: XvMCSetSubpicturePalette not implemented!\n");
return BadValue;
}
@@ -725,6 +894,7 @@ _X_EXPORT Status XvMCBlendSubpicture(Display *display, XvMCSurface *target_surfa
short surfx, short surfy,
unsigned short surfw, unsigned short surfh)
{
+ ErrorF("[XvMC]: XvMCBlendSubpicture not implemented!\n");
return BadValue;
}
@@ -763,6 +933,7 @@ _X_EXPORT Status XvMCBlendSubpicture2(Display *display,
short surfx, short surfy,
unsigned short surfw, unsigned short surfh)
{
+ ErrorF("[XvMC]: XvMCBlendSubpicture2 not implemented!\n");
return BadValue;
}
@@ -778,6 +949,7 @@ _X_EXPORT Status XvMCBlendSubpicture2(Display *display,
*/
_X_EXPORT Status XvMCSyncSubpicture(Display *display, XvMCSubpicture *subpicture)
{
+ ErrorF("[XvMC]: XvMCSyncSubpicture not implemented!\n");
return BadValue;
}
@@ -794,6 +966,7 @@ _X_EXPORT Status XvMCSyncSubpicture(Display *display, XvMCSubpicture *subpicture
*/
_X_EXPORT Status XvMCFlushSubpicture(Display *display, XvMCSubpicture *subpicture)
{
+ ErrorF("[XvMC]: XvMCFlushSubpicture not implemented!\n");
return BadValue;
}
@@ -814,6 +987,7 @@ _X_EXPORT Status XvMCFlushSubpicture(Display *display, XvMCSubpicture *subpictur
_X_EXPORT Status XvMCGetSubpictureStatus(Display *display, XvMCSubpicture *subpicture,
int *stat)
{
+ ErrorF("[XvMC]: XvMCGetSubpictureStatus not implemented!\n");
return BadValue;
}