diff options
author | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-31 13:59:02 +0800 |
---|---|---|
committer | Cooper Yuan <cooperyuan@gmail.com> | 2009-05-31 13:59:02 +0800 |
commit | 11889ca4e24471fecff858158f752d4336b5fec3 (patch) | |
tree | 9f9a621b9a7f491d82277a136ecbc0442b5372f4 | |
parent | 14222e1b4c542a211c118db0aeec6cc859e2f614 (diff) |
xvmc: Add XvMC interface API, subpicture related functions are not implemented
-rw-r--r-- | src/xvmc/radeon_xvmc.c | 174 |
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; } |