/*
 *
 * Copyright (c) 2017 Texas Instruments Incorporated
 *
 * All rights reserved not granted herein.
 *
 * Limited License.
 *
 * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
 * license under copyrights and patents it now or hereafter owns or controls to make,
 * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
 * terms herein.  With respect to the foregoing patent license, such license is granted
 * solely to the extent that any such patent is necessary to Utilize the software alone.
 * The patent license shall not apply to any combinations which include this software,
 * other than combinations with devices manufactured by or for TI ("TI Devices").
 * No hardware patent is licensed hereunder.
 *
 * Redistributions must preserve existing copyright notices and reproduce this license
 * (including the above copyright notice and the disclaimer and (if applicable) source
 * code license limitations below) in the documentation and/or other materials provided
 * with the distribution
 *
 * Redistribution and use in binary form, without modification, are permitted provided
 * that the following conditions are met:
 *
 * *       No reverse engineering, decompilation, or disassembly of this software is
 * permitted with respect to any software provided in binary form.
 *
 * *       any redistribution and use are licensed by TI for use only with TI Devices.
 *
 * *       Nothing shall obligate TI to provide you with source code for the software
 * licensed and provided to you in object code.
 *
 * If software source code is provided to you, modification and redistribution of the
 * source code are permitted provided that the following conditions are met:
 *
 * *       any redistribution and use of the source code, including any resulting derivative
 * works, are licensed by TI for use only with TI Devices.
 *
 * *       any redistribution and use of any object code compiled from the source code
 * and any resulting derivative works, are licensed by TI for use only with TI Devices.
 *
 * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
 *
 * may be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * DISCLAIMER.
 *
 * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include "app_srv_module.h"


vx_status app_init_srv(vx_context context, SrvObj *srvObj)
{
    vx_status status = VX_SUCCESS;

    tivx_srv_params_t params;

    memset(&params, 0, sizeof(tivx_srv_params_t));
    params.cam_bpp = 24;
    srvObj->param_obj = vxCreateUserDataObject(context, "tivx_srv_params_t", sizeof(tivx_srv_params_t), &params);
    APP_ASSERT_VALID_REF(srvObj->param_obj);

    vx_image output  = vxCreateImage(context, srvObj->info_Output.width, srvObj->info_Output.height, srvObj->info_Output.dataFormat);
    srvObj->arr_Output  = vxCreateObjectArray(context, (vx_reference)output, 1);
    vxReleaseImage(&output);
    if (vxGetStatus((vx_reference)srvObj->arr_Output) != VX_SUCCESS)
    {
        status = VX_FAILURE;
        APP_PRINTF("init srvObj failed\n");
    }

    return status;
}

void app_deinit_srv(SrvObj *srvObj)
{
    vxReleaseObjectArray(&srvObj->arr_Output);
    vxReleaseUserDataObject(&srvObj->param_obj );
    return;
}

void app_delete_srv(SrvObj *srvObj)
{
    if(srvObj->node != NULL)
    {
    vxReleaseNode(&srvObj->node);
    }

    return;
}

vx_status app_create_graph_srv(vx_graph graph, SrvObj *srvObj, vx_object_array arrInPut)
{
    vx_status status = VX_SUCCESS;

    vx_image imgOutPut = (vx_image)vxGetObjectArrayItem(srvObj->arr_Output, 0);

    srvObj->node = tivxGlSrvNode(graph, srvObj->param_obj, arrInPut, NULL/*obj->srv_views_array*/, NULL/*obj->out_gpulut_array*/, imgOutPut);
    vxSetNodeTarget(srvObj->node, VX_TARGET_STRING, srvObj->name_Target);
    vxSetReferenceName((vx_reference)srvObj->node, srvObj->name_NodeObj);
    if (vxGetStatus((vx_reference)srvObj->node) != VX_SUCCESS)
    {
      APP_PRINTF("srv_node create failed\n");
      return VX_FAILURE;
    }

    APP_ASSERT_VALID_REF(srvObj->node);
    vxReleaseImage(&imgOutPut);
    return status;
}

