/* * ======== VIDDEC2_processAsync ======== */ XDAS_Int32 VIDDEC2FRONT_processAsync(VIDDEC2_Handle handle, VIDDEC2_InArgs *inArgs, XDM_Context *context, VIDDEC2FRONT_OutArgs *outArgs) { XDAS_Int32 retVal = VIDDEC2_EFAIL; /* * Note, we do this because someday we may allow dynamically changing * the global 'VISA_isChecked()' value on the fly. If we allow that, * we need to ensure the value stays consistent in the context of this call. */ Bool checked = VISA_isChecked(); Log_print4(Diags_ENTRY, "[+E] VIDDEC2_processAsync> " "Enter (handle=0x%x, inArgs=0x%x, context=0x%x, outArgs=0x%x)", (IArg)handle, (IArg)inArgs, (IArg)context, (IArg)outArgs); if (handle) { IVIDDEC2FRONT_Handle alg = VISA_getAlgHandle((VISA_Handle)handle); if (alg != NULL) { if (checked) { /* validate inArgs with ranges. */ if (inArgs->inputID == 0) { Log_print2(Diags_USER7, "[+7] ERROR> app provided codec (0x%x) with out of range " "inArgs->inputID field (0x%x)", (IArg)alg, (IArg)(inArgs->inputID)); } #if 0 /* * Validate inBufs and outBufs. */ XdmUtils_validateSparseBufDesc1(inBufs, "inBufs"); XdmUtils_validateSparseBufDesc(outBufs, "outBufs"); #endif } retVal = processAsync(alg, inArgs, context, outArgs); } } Log_print2(Diags_EXIT, "[+X] VIDDEC2FRONT_processAsync> " "Exit (handle=0x%x, retVal=0x%x)", (IArg)handle, (IArg)retVal); return (retVal); }
/* * ======== VIDENC1_processAsync ======== */ XDAS_Int32 VIDENC1_processAsync(VIDENC1_Handle handle, IVIDEO1_BufDescIn *inBufs, XDM_BufDesc *outBufs, IVIDENC1_InArgs *inArgs, IVIDENC1_OutArgs *outArgs) { XDAS_Int32 retVal = VIDENC1_EFAIL; /* * Note, we do this because someday we may allow dynamically changing * the global 'VISA_isChecked()' value on the fly. If we allow that, * we need to ensure the value stays consistent in the context of this call. */ Bool checked = VISA_isChecked(); GT_5trace(CURTRACE, GT_ENTER, "VIDENC1_processAsync> " "Enter (handle=0x%x, inBufs=0x%x, outBufs=0x%x, inArgs=0x%x, " "outArgs=0x%x)\n", handle, inBufs, outBufs, inArgs, outArgs); if (handle) { IVIDENC1_Handle alg = VISA_getAlgHandle((VISA_Handle)handle); if (alg != NULL) { if (checked) { /* validate inArgs with ranges. */ if (inArgs->inputID == 0) { GT_2trace(CURTRACE, GT_7CLASS, "ERROR> app provided codec (0x%x) with out of range " "inArgs->inputID field (0x%x)\n", alg, inArgs->inputID); } /* * Validate inBufs and outBufs. */ /* TBD XdmUtils_validateVideoBufDesc1(inBufs, "inBufs"); */ XdmUtils_validateSparseBufDesc(outBufs, "outBufs"); } retVal = processAsync(alg, inBufs, outBufs, inArgs, outArgs); } } GT_2trace(CURTRACE, GT_ENTER, "VIDENC1_processAsync> " "Exit (handle=0x%x, retVal=0x%x)\n", handle, retVal); return (retVal); }
/* * ======== VIDDEC1_process ======== * This method must be the same for both local and remote invocation; * each call site in the client might be calling different implementations * (one that marshalls & sends and one that simply calls). This API * abstracts *all* video decoders (both high and low complexity * decoders are invoked using this method). */ XDAS_Int32 VIDDEC1_process(VIDDEC1_Handle handle, XDM1_BufDesc *inBufs, XDM_BufDesc *outBufs, VIDDEC1_InArgs *inArgs, VIDDEC1_OutArgs *outArgs) { XDAS_Int32 retVal = VIDDEC1_EFAIL; VIDDEC1_InArgs refInArgs; Int32 i; /* * Note, we assign "VISA_isChecked()" results to a local variable * rather than repeatedly query it throughout this fxn because * someday we may allow dynamically changing the global * 'VISA_isChecked()' value on the fly. If we allow that, we need * to ensure the value stays consistent in the context of this * call. */ Bool checked = VISA_isChecked(); if (checked) { /* Ensure inArgs and outArgs are non-NULL, per the XDM spec */ if ((!(XdmUtils_validateExtendedStruct(inArgs, sizeof(*inArgs), "inArgs"))) || (!(XdmUtils_validateExtendedStruct(outArgs, sizeof(*outArgs), "outArgs")))) { /* for safety, return here before dereferencing and crashing */ return (retVal); } } Log_print5(Diags_ENTRY, "[+E] VIDDEC1_process> " "Enter (handle=0x%x, inBufs=0x%x, outBufs=0x%x, inArgs=0x%x, " "outArgs=0x%x)", (IArg)handle, (IArg)inBufs, (IArg)outBufs, (IArg)inArgs, (IArg)outArgs); if (handle) { IVIDDEC1_Fxns *fxns = (IVIDDEC1_Fxns *)VISA_getAlgFxns((VISA_Handle)handle); IVIDDEC1_Handle alg = VISA_getAlgHandle((VISA_Handle)handle); if ((fxns != NULL) && (alg != NULL)) { if (checked) { /* validate inArgs with ranges. */ if (inArgs->inputID == 0) { Log_print2(Diags_USER7, "[+7] ERROR> app provided codec (0x%x) with out of range " "inArgs->inputID field (0x%x)", (IArg)alg, (IArg)(inArgs->inputID)); } /* * Validate inBufs and outBufs. */ XdmUtils_validateSparseBufDesc1(inBufs, "inBufs"); XdmUtils_validateSparseBufDesc(outBufs, "outBufs"); /* * Make a reference copy of inArgs so we can check that * the codec didn't modify them during process(). */ refInArgs = *inArgs; } //Log_printf(ti_sdo_ce_dvtLog, "%s", (Arg)"VIDDEC1:process", // (Arg)handle, (Arg)0); VISA_enter((VISA_Handle)handle); retVal = fxns->process(alg, inBufs, outBufs, inArgs, outArgs); VISA_exit((VISA_Handle)handle); if (checked) { /* ensure the codec didn't modify the read-only inArgs */ if (memcmp(&refInArgs, inArgs, sizeof(*inArgs)) != 0) { Log_print1(Diags_USER7, "[+7] ERROR> codec (0x%x) modified read-only inArgs " "struct!", (IArg)handle); } /* only check these on successful return */ if ((retVal == IVIDDEC1_EOK) || (!(XDM_ISFATALERROR( outArgs->decodedBufs.extendedError)))) { /* Validate outArgs->decodedBufs */ XdmUtils_validateVideo1BufDesc(&(outArgs->decodedBufs), "decodedBufs"); } /* Validate outArgs->displayBufs */ for (i = 0; ((outArgs->outputID[i] != 0) && (i < XDM_MAX_IO_BUFFERS)); i++) { if ((retVal == IVIDDEC1_EOK) || (!(XDM_ISFATALERROR(outArgs-> displayBufs[i].extendedError)))) { XdmUtils_validateVideo1BufDesc(&(outArgs->displayBufs[i]), "displayBufs"); } } } } } Log_print2(Diags_EXIT, "[+X] VIDDEC1_process> " "Exit (handle=0x%x, retVal=0x%x)", (IArg)handle, (IArg)retVal); return (retVal); }
/* * ======== VIDTRANSCODE_process ======== * This method must be the same for both local and remote invocation; * each call site in the client might be calling different implementations * (one that marshalls & sends and one that simply calls). This API * abstracts *all* video transcoders (both high and low complexity * transcoders are invoked using this method). */ XDAS_Int32 VIDTRANSCODE_process(VIDTRANSCODE_Handle handle, XDM1_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDTRANSCODE_InArgs *inArgs, IVIDTRANSCODE_OutArgs *outArgs) { XDAS_Int32 retVal = VIDTRANSCODE_EFAIL; VIDTRANSCODE_InArgs refInArgs; /* * Note, we assign "VISA_isChecked()" results to a local variable * rather than repeatedly query it throughout this fxn because * someday we may allow dynamically changing the global * 'VISA_isChecked()' value on the fly. If we allow that, we need * to ensure the value stays consistent in the context of this * call. */ Bool checked = VISA_isChecked(); if (checked) { /* Ensure inArgs and outArgs are non-NULL, per the XDM spec */ if ((!(XdmUtils_validateExtendedStruct(inArgs, sizeof(*inArgs), "inArgs"))) || (!(XdmUtils_validateExtendedStruct(outArgs, sizeof(*outArgs), "outArgs")))) { /* for safety, return here before dereferencing and crashing */ return (retVal); } } GT_5trace(CURTRACE, GT_ENTER, "VIDTRANSCODE_process> " "Enter (handle=0x%x, inBufs=0x%x, outBufs=0x%x, inArgs=0x%x, " "outArgs=0x%x)\n", handle, inBufs, outBufs, inArgs, outArgs); if (handle) { IVIDTRANSCODE_Fxns *fxns = (IVIDTRANSCODE_Fxns *)VISA_getAlgFxns((VISA_Handle)handle); IVIDTRANSCODE_Handle alg = VISA_getAlgHandle((VISA_Handle)handle); if (fxns && (alg != NULL)) { Log_printf(ti_sdo_ce_dvtLog, "%s", (Arg)"VIDTRANSCODE:process", (Arg)handle, (Arg)0); if (checked) { /* * Validate inBufs and outBufs. */ XdmUtils_validateSparseBufDesc1(inBufs, "inBufs"); XdmUtils_validateSparseBufDesc(outBufs, "outBufs"); /* * Zero out the outArgs struct (except for .size field); * it's write-only to the codec, so the app shouldn't pass * values through it, nor should the codec expect to * receive values through it. */ memset((void *)((XDAS_Int32)(outArgs) + sizeof(outArgs->size)), 0, (sizeof(*outArgs) - sizeof(outArgs->size))); /* * Make a reference copy of inArgs so we can check that * the codec didn't modify them during process(). */ refInArgs = *inArgs; } VISA_enter((VISA_Handle)handle); retVal = fxns->process(alg, inBufs, outBufs, inArgs, outArgs); VISA_exit((VISA_Handle)handle); if (checked) { /* ensure the codec didn't modify the read-only inArgs */ if (memcmp(&refInArgs, inArgs, sizeof(*inArgs)) != 0) { GT_1trace(CURTRACE, GT_7CLASS, "ERROR> codec (0x%x) modified read-only inArgs " "struct!\n", handle); } } } } GT_2trace(CURTRACE, GT_ENTER, "VIDTRANSCODE_process> " "Exit (handle=0x%x, retVal=0x%x)\n", handle, retVal); return (retVal); }