/*
* Copyright (c) 2009-2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file     media_libva_vp_tools.c
//! \brief    LibVA Video Processing tool functions implementation
//!

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

#include <va/va.h>
#include <va/va_vpp.h>
#include <va/va_backend.h>

#include "vphal.h"
#include "vphal_ddi.h"

#include "media_libva.h"
#include "media_libva_util.h"
#include "media_libva_vp.h"
#include "media_libva_vp_tools.h"

#if (_DEBUG || _RELEASE_INTERNAL)

VAStatus VpInitDumpConfig(
    PDDI_VP_CONTEXT     pVpCtx)
{
    int32_t     uSurfIndex;
    VAStatus    vaStatus = VA_STATUS_SUCCESS;

    pVpCtx->pCurVpDumpDDIParam = nullptr;
    pVpCtx->pPreVpDumpDDIParam = nullptr;

    // allocate pCurVpDumpDDIParam
    pVpCtx->pCurVpDumpDDIParam = (PDDI_VP_DUMP_PARAM)MOS_AllocAndZeroMemory(sizeof(DDI_VP_DUMP_PARAM));
    if (pVpCtx->pCurVpDumpDDIParam)
    {
        for (uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
        {
            pVpCtx->pCurVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex] = (VAProcPipelineParameterBuffer *)MOS_AllocAndZeroMemory(sizeof(VAProcPipelineParameterBuffer));
            if (nullptr == pVpCtx->pCurVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex])
            {
                vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
                goto FINISH;
            }
        }
    }
    // allocate pPreVpDumpDDIParam
    pVpCtx->pPreVpDumpDDIParam = (PDDI_VP_DUMP_PARAM)MOS_AllocAndZeroMemory(sizeof(DDI_VP_DUMP_PARAM));
    if (pVpCtx->pPreVpDumpDDIParam)
    {
        for (uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
        {
            pVpCtx->pPreVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex] = (VAProcPipelineParameterBuffer *)MOS_AllocAndZeroMemory(sizeof(VAProcPipelineParameterBuffer));
            if (nullptr == pVpCtx->pPreVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex])
            {
                vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
                goto FINISH;
            }
        }
    }

FINISH:
    pVpCtx->fpDumpFile = nullptr;
    return vaStatus;
}

void VpDestoryDumpConfig(
    PDDI_VP_CONTEXT     pVpCtx)
{
    int32_t     uSurfIndex;
    VAStatus    vaStatus = VA_STATUS_SUCCESS;

    if (pVpCtx->pCurVpDumpDDIParam)
    {
        for (uint32_t uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
        {
            if (nullptr != pVpCtx->pCurVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex])
            {
                MOS_FreeMemAndSetNull(pVpCtx->pCurVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex]);
            }
        }
        MOS_FreeMemAndSetNull(pVpCtx->pCurVpDumpDDIParam);
    }

    if (nullptr != pVpCtx->pPreVpDumpDDIParam)
    {
        for (uint32_t uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
        {
            if (nullptr != pVpCtx->pPreVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex])
            {
                MOS_FreeMemAndSetNull(pVpCtx->pPreVpDumpDDIParam->pPipelineParamBuffers[uSurfIndex]);
            }
        }
        MOS_FreeMemAndSetNull(pVpCtx->pPreVpDumpDDIParam);
    }

    if (nullptr != pVpCtx->fpDumpFile)
    {
        fclose(pVpCtx->fpDumpFile);
        pVpCtx->fpDumpFile = nullptr;
    }
}

//!
//! \brief   dump deinterlacing parameter
//! \param   fpLog
//!          [in] file pointer pointed to dumpped file
//! \param   deint
//!          [in] pointed to deinterlacing parameter
//!
void VpDumpDeinterlacingParameterBuffer(
    FILE                                      *fpLog,
    VAProcFilterParameterBufferDeinterlacing  *deint)
{
    if (deint && fpLog)
    {
        fprintf(fpLog, "\t    type = %d\n",      deint->type);
        fprintf(fpLog, "\t    algorithm = %d\n", deint->algorithm);
        fprintf(fpLog, "\t    flags = %d\n",     deint->flags);
    }
}

//!
//! \brief   dump color balance parameter
//! \param   fpLog
//!          [in] file pointer pointed to dumpped file
//! \param   colorbalance
//!          [in] pointed to colorbalance parameter
//! \param   uElementNum
//!          [in] number of elements
//!
void VpDumpColorBalanceParameterBuffer(
    FILE                                     *fpLog,
    VAProcFilterParameterBufferColorBalance  *colorbalance,
    uint32_t                                 uElementNum)
{
    for (uint32_t i = 0; i<uElementNum; i++)
    {
        if (fpLog && colorbalance)
        {
            fprintf(fpLog, "\t    type = %d\n",   colorbalance[i].type);
            fprintf(fpLog, "\t    attrib = %d\n", colorbalance[i].attrib);
            fprintf(fpLog, "\t    value = %f\n",  colorbalance[i].value);
        }
    }
}

//!
//! \brief   dump TCC parameter
//! \param   fpLog
//!          [in] file pointer pointed to dumpped file
//! \param   filter_param
//!          [in] pointed to TCC parameter
//! \param   uElementNum
//!          [in] number of elements
//!
void VpDumpTotalColorCorrectionParameterBuffer(
    FILE                                             *fpLog,
    VAProcFilterParameterBufferTotalColorCorrection  *filter_param,
    uint32_t                                         uElementNum)
{
    for (uint32_t i = 0; i<uElementNum; i++)
    {
        if (fpLog && filter_param)
        {
            fprintf(fpLog, "\t    type = %d\n",   filter_param[i].type);
            fprintf(fpLog, "\t    attrib = %d\n", filter_param[i].attrib);
            fprintf(fpLog, "\t    value = %f\n",  filter_param[i].value);
        }
    }
}

//!
//! \brief   dump filter parameter
//! \param   fpLog
//!          [in] file pointer pointed to dumpped file
//! \param   buffer
//!          [in] pointed to filter parameter
//!
void VpDumpFilterParameterBuffer(
    FILE                            *fpLog,
    VAProcFilterParameterBuffer     *buffer)
{
    if (fpLog && buffer)
    {
        fprintf(fpLog, "\t    type = %d\n",  buffer->type);
        fprintf(fpLog, "\t    value = %f\n", buffer->value);
    }
}

//!
//! \brief   dump filters parameter
//! \param   fpLog
//!          [in] file pointer pointed to dumpped file
//! \param   pVaDrvCtx
//!          [in] driver context
//! \param   filters
//!          [in] pointed to filters
//! \param   num_filters
//!          [in] number of filters
//!
void VpDumpProcFiltersParameterBuffer(
    FILE                *fpLog,
    VADriverContextP    pVaDrvCtx,
    VABufferID          *filters,
    unsigned int        num_filters)
{
    VABufferType        type;
    unsigned int        size;
    unsigned int        num_elements;
    PDDI_MEDIA_CONTEXT  pMediaCtx;
    void                *pData;
    PDDI_MEDIA_BUFFER   pFilterBuf;

    size                = 0;
    num_elements        = 0;
    pFilterBuf          = nullptr;
    pMediaCtx           = nullptr;
    pData               = nullptr;

    if (nullptr == fpLog || nullptr == pVaDrvCtx)
    {
        return;
    }

    pMediaCtx = DdiMedia_GetMediaContext(pVaDrvCtx);

    fprintf(fpLog, "\t  num_filters = %d\n", num_filters);
    fprintf(fpLog, "\t  filters = %p\n", filters);

    if (num_filters == 0 || filters == nullptr)
    {
        return;
    }

    // get buffer type information
    for (int i = 0; i < num_filters; i++)
    {
        VABufferID filter = filters[i];
        pFilterBuf = DdiMedia_GetBufferFromVABufferID(pMediaCtx, filter);

        // Map Buffer data to virtual addres space
        DdiMedia_MapBuffer(pVaDrvCtx, filter, &pData);

        VAProcFilterParameterBufferBase* filter_param = (VAProcFilterParameterBufferBase*) pData;
        if (nullptr != pFilterBuf)
        {
            fprintf(fpLog, "\t  num_elements = %d\n", pFilterBuf->uiNumElements);
        }

        if (nullptr != filter_param)
        {
            switch (filter_param->type)
            {
            case VAProcFilterDeinterlacing:
                VpDumpDeinterlacingParameterBuffer(fpLog, (VAProcFilterParameterBufferDeinterlacing *)pData);
                break;

            case VAProcFilterColorBalance:
                if (nullptr != pFilterBuf)
                {
                    VpDumpColorBalanceParameterBuffer(fpLog, (VAProcFilterParameterBufferColorBalance *)pData, pFilterBuf->uiNumElements);
                }
                break;

            case VAProcFilterTotalColorCorrection:
                if (nullptr != pFilterBuf)
                {
                    VpDumpTotalColorCorrectionParameterBuffer(fpLog, (VAProcFilterParameterBufferTotalColorCorrection *)pData, pFilterBuf->uiNumElements);
                }
                break;

            case VAProcFilterNoiseReduction:
                VpDumpFilterParameterBuffer(fpLog, (VAProcFilterParameterBuffer *)pData);
                break;

            case VAProcFilterSharpening:
                VpDumpFilterParameterBuffer(fpLog, (VAProcFilterParameterBuffer *)pData);
                break;

            case VAProcFilterSkinToneEnhancement:
                VpDumpFilterParameterBuffer(fpLog, (VAProcFilterParameterBuffer *)pData);
                break;

            default:
                fprintf(fpLog, "\t    type = %d\n", filter_param->type);
                break;
            }
        }
    }
}

//!
//! \brief   read a config "env" for vpddi.conf or from environment setting
//! \param   env
//!          [in] Pipeline parameters from application (VAProcPipelineParameterBuffer)
//! \param   env_value
//!          [out]
//! \return  int
//!          return 0, if the "env" is set, and the value is copied into env_value
//!          return 1, if the env is not set
//!
int  VpParseLogConfig(
    const char *env,
    char       *env_value)
{
    char *token, *value, *saveptr;
    char oneline[1024];
    FILE *fp = nullptr;

    if (env == nullptr)
    {
        return 1;
    }

    fp = fopen("/etc/vpddi.conf", "r");
    while (fp && (fgets(oneline, 1024, fp) != nullptr))
    {
        if (strlen(oneline) == 1)
        {
            continue;
        }

        token = strtok_r(oneline, "=\n", &saveptr);
        value = strtok_r(nullptr, "=\n", &saveptr);

        if (nullptr == token || nullptr == value)
        {
            continue;
        }

        if (strcmp(token, env) == 0)
        {
            if (env_value)
            {
                strncpy(env_value, value, 1024);
            }

            fclose(fp);
            fp = nullptr;
            return 0;
        }
    }
    if (fp)
    {
        fclose(fp);
        fp = nullptr;
    }

    // no setting in config file, use env setting
    value = getenv(env);
    if (value)
    {
        if (env_value)
        {
            strncpy(env_value, value, 1024);
        }

        return 0;
    }

    return 1;
}

//!
//! \brief   compare current dump parameters with the previous
//! \param   pCur
//!          [in] current dump parameters
//! \param   pPre
//!          [in] previous dump parameters
//! \return  bool
//!          return true, if current parameters and previous are same
//!          return false, if current parameters and previous are different
//!
bool VpCmpDDIDumpParam(
    PDDI_VP_DUMP_PARAM  pCur,
    PDDI_VP_DUMP_PARAM  pPre)
{
    bool bRet = true;

    if (!pCur || !pPre)
    {
        return false;
    }

    if (memcmp(pCur->SrcFormat, pPre->SrcFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_SOURCES) != 0)
    {
         bRet = false;
    }

    if (memcmp(pCur->TargetFormat, pPre->TargetFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_TARGETS) != 0)
    {
         bRet = false;
    }

    for (uint32_t uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
    {
        if (memcmp(pCur->pPipelineParamBuffers[uSurfIndex], pPre->pPipelineParamBuffers[uSurfIndex], sizeof(VAProcPipelineParameterBuffer)) != 0)
        {
            bRet = false;
        }
    }

    return bRet;
}

VAStatus VpDumpProcPipelineParams(
    VADriverContextP        pVaDrvCtx,
    PDDI_VP_CONTEXT         pVpCtx)
{
    PDDI_MEDIA_CONTEXT      pMediaCtx;
    FILE                    *fpLog;
    long                    suffix;
    struct timeval          time;
    VPHAL_RENDER_PARAMS     *pRenderParams;
    PDDI_MEDIA_SURFACE      pMediaSrcSurf;
    bool                    bDumpToFile;
    PDDI_VP_DUMP_PARAM      pCurDDIParam;
    PDDI_VP_DUMP_PARAM      pPreDDIParam;
    char                    env_value[1024];

    DDI_CHK_NULL(pVaDrvCtx,                  "Null pVaDrvCtx.",       VA_STATUS_ERROR_INVALID_CONTEXT);
    DDI_CHK_NULL(pVpCtx,                     "Null pVpCtx.",          VA_STATUS_ERROR_INVALID_CONTEXT);
    DDI_CHK_NULL(pVpCtx->pVpHalRenderParams, "Null Render Params.",   VA_STATUS_ERROR_INVALID_PARAMETER);
    DDI_CHK_NULL(pVpCtx->pCurVpDumpDDIParam, "Null Dump Params.",     VA_STATUS_ERROR_INVALID_PARAMETER);
    DDI_CHK_NULL(pVpCtx->pPreVpDumpDDIParam, "Null Dump Params.",     VA_STATUS_ERROR_INVALID_PARAMETER);

    for (uint32_t index = 0; index < pVpCtx->pVpHalRenderParams->uDstCount; index++)
    {
        pVpCtx->pCurVpDumpDDIParam->TargetFormat[index] = pVpCtx->pVpHalRenderParams->pTarget[index]->Format;
    }

    pCurDDIParam = pVpCtx->pCurVpDumpDDIParam;
    pPreDDIParam = pVpCtx->pPreVpDumpDDIParam;

    // If current ddi param is same with the previous, don't dump into file.
    bDumpToFile = VpCmpDDIDumpParam(pCurDDIParam, pPreDDIParam);
    if (bDumpToFile)
    {
       return VA_STATUS_SUCCESS;
    }

    fpLog              = nullptr;
    pMediaCtx          = DdiMedia_GetMediaContext(pVaDrvCtx);
    pRenderParams      = pVpCtx->pVpHalRenderParams;
    pMediaSrcSurf      = nullptr;

    gettimeofday(&time, nullptr);
    suffix = ((long)time.tv_sec) * 1000 + (long)time.tv_usec / 1000;

    if (pVpCtx->fpDumpFile == nullptr)
    {
        const char * pTraceName = "VPDDI_TRACE";
        if (VpParseLogConfig(pTraceName, &env_value[0]) == 0)
        {
            int32_t tmp = strnlen(env_value, sizeof(env_value));
            int32_t left = sizeof(env_value) - tmp;
            snprintf(env_value+tmp, left, "%ld", suffix);
            MOS_SecureFileOpen(&pVpCtx->fpDumpFile, env_value, "w");
        }
    }
    fpLog = pVpCtx->fpDumpFile;

    if (fpLog)
    {
        fprintf(fpLog, "\t-------------------------------\n");
        fprintf(fpLog, "\tTargetFormat Count = %d\n", pRenderParams->uDstCount);
        for (uint32_t uDstIndex = 0; uDstIndex < pRenderParams->uDstCount; uDstIndex++)
        {
            fprintf(fpLog, "\tTargetFormat = %d\n", (int32_t)(pCurDDIParam->TargetFormat[uDstIndex]));
        }
        for (uint32_t uSurfIndex = 0; uSurfIndex < pRenderParams->uSrcCount; uSurfIndex++)
        {
            VAProcPipelineParameterBuffer  *p = pCurDDIParam->pPipelineParamBuffers[uSurfIndex];
            if (p)
            {
                fprintf(fpLog, "\t--VAProcPipelineParameterBuffer\n");
                fprintf(fpLog, "\t  surface = 0x%08x\n", p->surface);
                fprintf(fpLog, "\t    Format = %d\n", (int32_t)(pCurDDIParam->SrcFormat[uSurfIndex]));

                if (p->surface_region)
                {
                    fprintf(fpLog, "\t  surface_region\n");
                    fprintf(fpLog, "\t    x = %d\n", p->surface_region->x);
                    fprintf(fpLog, "\t    y = %d\n", p->surface_region->y);
                    fprintf(fpLog, "\t    width = %d\n", p->surface_region->width);
                    fprintf(fpLog, "\t    height = %d\n", p->surface_region->height);
                }

                fprintf(fpLog, "\t  surface_color_standard = %d\n", p->surface_color_standard);

                if (p->output_region)
                {
                    fprintf(fpLog, "\t  output_region\n");
                    fprintf(fpLog, "\t    x = %d\n", p->output_region->x);
                    fprintf(fpLog, "\t    y = %d\n", p->output_region->y);
                    fprintf(fpLog, "\t    width = %d\n", p->output_region->width);
                    fprintf(fpLog, "\t    height = %d\n", p->output_region->height);
                }

                fprintf(fpLog, "\t  output_background_color = 0x%08x\n", p->output_background_color);
                fprintf(fpLog, "\t  output_color_standard = %d\n", p->output_color_standard);
                fprintf(fpLog, "\t  pipeline_flags = 0x%08x\n", p->pipeline_flags);
                fprintf(fpLog, "\t  filter_flags = 0x%08x\n", p->filter_flags);

                VpDumpProcFiltersParameterBuffer(fpLog, pVaDrvCtx, p->filters, p->num_filters);

                fprintf(fpLog, "\t  num_forward_references = 0x%08x\n", p->num_forward_references);

                if (p->num_forward_references)
                {
                    fprintf(fpLog, "\t  forward_references\n");

                    if (p->forward_references)
                    {
                        /* only dump the first 5 forward references */
                        for (int32_t i = 0; i < p->num_forward_references && i < 5; i++)
                        {
                            fprintf(fpLog, "\t    forward_references[%d] = 0x%08x\n", i, p->forward_references[i]);
                        }
                    }
                    else
                    {
                        for (int32_t i = 0; i < p->num_forward_references && i < 5; i++)
                        {
                            fprintf(fpLog, "\t    forward_references[%d] = (nullptr)\n", i);
                        }
                    }
                }

                fprintf(fpLog, "\t  num_backward_references = 0x%08x\n", p->num_backward_references);

                if (p->num_backward_references)
                {
                    fprintf(fpLog, "\t  backward_references\n");

                    if (p->backward_references)
                    {
                        /* only dump the first 5 backward references */
                        for (int32_t i = 0; i < p->num_backward_references && i < 5; i++)
                        {
                            fprintf(fpLog, "\t    backward_references[%d] = 0x%08x\n", i, p->backward_references[i]);
                        }
                    }
                    else
                    {
                        for (int32_t i = 0; i < p->num_backward_references && i < 5; i++)
                        {
                            fprintf(fpLog, "\t    backward_references[%d] = (nullptr)\n", i);
                        }
                    }
                }

                fprintf(fpLog, "\t  rotation_state = %d\n", p->rotation_state);
                if (p->blend_state)
                {
                    fprintf(fpLog, "\t  blend_state\n");
                    fprintf(fpLog, "\t    flags = %d\n", p->blend_state->flags);
                    fprintf(fpLog, "\t    global_alpha = %f\n", p->blend_state->global_alpha);
                    fprintf(fpLog, "\t    min_luma = %f\n", p->blend_state->min_luma);
                    fprintf(fpLog, "\t    max_luma = %f\n", p->blend_state->max_luma);
                }

                fprintf(fpLog, "\t  mirror_state = %d\n", p->mirror_state);
                //fprintf(fpLog, "\t  additional_outputs = 0x%08x\n", (unsigned int32_t)(*(p->additional_outputs)));
                fprintf(fpLog, "\t  num_additional_outputs = %d\n", p->num_additional_outputs);
#if (VA_MAJOR_VERSION < 1)
                fprintf(fpLog, "\t  chroma_siting_flag = %d\n", p->input_surface_flag & 0x3);
#else
                fprintf(fpLog, "\t  chroma_siting_flag = %d\n", p->input_color_properties.chroma_sample_location & 0x3);
#endif
            }
        }

        MOS_SecureMemcpy(pPreDDIParam->SrcFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_SOURCES, pCurDDIParam->SrcFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_SOURCES);
        MOS_SecureMemcpy(pPreDDIParam->TargetFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_TARGETS, pCurDDIParam->TargetFormat, sizeof(MOS_FORMAT)*VPHAL_MAX_TARGETS);
        for (uint32_t uSurfIndex = 0; uSurfIndex < VPHAL_MAX_SOURCES; uSurfIndex++)
        {
            MOS_SecureMemcpy(pPreDDIParam->pPipelineParamBuffers[uSurfIndex], sizeof(VAProcPipelineParameterBuffer), pCurDDIParam->pPipelineParamBuffers[uSurfIndex], sizeof(VAProcPipelineParameterBuffer));
        }
    }

    return VA_STATUS_SUCCESS;
}

#endif //(_DEBUG || _RELEASE_INTERNAL)

//!
//! \brief   initialize configuration values for Android 
//! \param   [in] pConfigValues
//!          vp config values
//!
void VpConfigValuesInit(
    PVP_CONFIG           pConfigValues)
{
    if (nullptr == pConfigValues)
    {
        return;
    }
    pConfigValues->dwVpPath                   = 0;
    pConfigValues->dwVpComponent              = 0;
    pConfigValues->dwReportedDeinterlaceMode  = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwReportedScalingMode      = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwReportedOutputPipeMode   = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwReportedVEFeatureInUse   = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwVPMMCInUseReported       = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwRTCompressibleReported   = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwRTCompressModeReported   = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwCapturePipeInUseReported = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwReportedCompositionMode  = LIBVA_VP_CONFIG_NOT_REPORTED;

    pConfigValues->dwFFDICompressibleReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwFFDICompressModeReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwFFDNCompressibleReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwFFDNCompressModeReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwSTMMCompressibleReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwSTMMCompressModeReported    = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwScalerCompressibleReported  = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwScalerCompressModeReported  = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwPrimaryCompressibleReported = LIBVA_VP_CONFIG_NOT_REPORTED;
    pConfigValues->dwPrimaryCompressModeReported = LIBVA_VP_CONFIG_NOT_REPORTED;
}

void VpFeatureReport(
    PVP_CONFIG         pConfig)
{
    WriteUserFeature(__VPHAL_VEBOX_OUTPUTPIPE_MODE_ID,         pConfig->dwCurrentOutputPipeMode, nullptr);
    WriteUserFeature(__VPHAL_VEBOX_FEATURE_INUSE_ID,           pConfig->dwCurrentVEFeatureInUse, nullptr);

#if (_DEBUG || _RELEASE_INTERNAL)
#ifdef _MMC_SUPPORTED
    //VP MMC In Use
    WriteUserFeature(__VPHAL_ENABLE_MMC_IN_USE_ID,             pConfig->dwVPMMCInUse, nullptr);
    //VP Primary Surface Compress Mode Report
    WriteUserFeature(__VPHAL_PRIMARY_SURFACE_COMPRESS_MODE_ID, pConfig->dwPrimaryCompressMode, nullptr);
    //VP Primary Surface Compressible
    WriteUserFeature(__VPHAL_PRIMARY_SURFACE_COMPRESSIBLE_ID,  pConfig->dwPrimaryCompressible, nullptr);
    //VP RT Compress Mode
    WriteUserFeature(__VPHAL_RT_COMPRESS_MODE_ID,              pConfig->dwRTCompressMode, nullptr);
    //VP RT Compressible
    WriteUserFeature(__VPHAL_RT_COMPRESSIBLE_ID,               pConfig->dwRTCompressible, nullptr);
#endif
#endif //(_DEBUG || _RELEASE_INTERNAL)
}

VAStatus    VpReportFeatureMode(PDDI_VP_CONTEXT pVpCtx)
{
    VP_CONFIG             ConfigValues = {};

    DDI_CHK_NULL(pVpCtx,         "Null pVpCtx.",   VA_STATUS_ERROR_INVALID_CONTEXT);
    DDI_CHK_NULL(pVpCtx->pVpHal, "Null pVpHal.",   VA_STATUS_ERROR_INVALID_PARAMETER);

    VpConfigValuesInit(&ConfigValues);

    VpHal_DdiReportFeatureMode(pVpCtx->pVpHal, &ConfigValues);

    VpFeatureReport(&ConfigValues);

    return VA_STATUS_SUCCESS;
}

