/*
 * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
 *
 * 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, sub license, 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 (including the
 * next paragraph) 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 NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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.
 */

#ifndef test_data_h
#define test_data_h
#include <va/va.h>

namespace VAAPI {
static const std::vector<VAProfile> m_vaProfiles
    = { VAProfileNone,
        VAProfileMPEG2Simple,
        VAProfileMPEG2Main,
        VAProfileMPEG4Simple,
        VAProfileMPEG4AdvancedSimple,
        VAProfileMPEG4Main,
        VAProfileH264Main,
        VAProfileH264High,
        VAProfileVC1Simple,
        VAProfileVC1Main,
        VAProfileVC1Advanced,
        VAProfileH263Baseline,
        VAProfileJPEGBaseline,
        VAProfileH264ConstrainedBaseline,
        VAProfileVP8Version0_3,
        VAProfileH264MultiviewHigh,
        VAProfileH264StereoHigh,
        VAProfileHEVCMain,
        VAProfileHEVCMain10,
        VAProfileVP9Profile0,
        VAProfileVP9Profile1,
        VAProfileVP9Profile2,
        VAProfileVP9Profile3 };

static const std::vector<VAEntrypoint> m_vaEntrypoints
    = { VAEntrypointVLD,        VAEntrypointIZZ,        VAEntrypointIDCT,
        VAEntrypointMoComp,     VAEntrypointDeblocking, VAEntrypointEncSlice,
        VAEntrypointEncPicture, VAEntrypointEncSliceLP, VAEntrypointVideoProc,
        VAEntrypointFEI };

static const std::vector<VAConfigAttribType> m_vaConfigAttribs
    = { VAConfigAttribRTFormat,
        VAConfigAttribSpatialResidual,
        VAConfigAttribSpatialClipping,
        VAConfigAttribIntraResidual,
        VAConfigAttribEncryption,
        VAConfigAttribRateControl,
        VAConfigAttribDecSliceMode,
        VAConfigAttribEncPackedHeaders,
        VAConfigAttribEncInterlaced,
        VAConfigAttribEncMaxRefFrames,
        VAConfigAttribEncMaxSlices,
        VAConfigAttribEncSliceStructure,
        VAConfigAttribEncMacroblockInfo,
        VAConfigAttribEncJPEG,
        VAConfigAttribEncQualityRange,
        VAConfigAttribEncSkipFrame,
        VAConfigAttribEncROI,
        VAConfigAttribEncRateControlExt,
        VAConfigAttribFEIFunctionType,
        VAConfigAttribFEIMVPredictors };

static const std::vector<VASurfaceAttribType> m_vaSurfaceAttribs
    = { VASurfaceAttribNone,       VASurfaceAttribPixelFormat,
        VASurfaceAttribMinWidth,   VASurfaceAttribMaxWidth,
        VASurfaceAttribMinHeight,  VASurfaceAttribMaxHeight,
        VASurfaceAttribMemoryType, VASurfaceAttribExternalBufferDescriptor,
        VASurfaceAttribUsageHint,  VASurfaceAttribCount };

static const std::vector<std::pair<uint32_t, uint32_t> > m_vaResolutions
    = { { 16, 16 },      { 32, 32 },     { 176, 120 },   { 352, 240 },
        { 352, 288 },    { 480, 320 },   { 720, 480 },   { 720, 576 },
        { 768, 576 },    { 800, 480 },   { 854, 480 },   { 1280, 720 },
        { 1920, 1080 },  { 2048, 1080 }, { 4096, 2160 }, { 8192, 8192 },
        { 10240, 10240 } };

static const std::vector<uint32_t> m_vaRTFormats
    = { VA_RT_FORMAT_YUV420,   VA_RT_FORMAT_YUV422, VA_RT_FORMAT_YUV444,
        VA_RT_FORMAT_YUV411,   VA_RT_FORMAT_YUV400, VA_RT_FORMAT_YUV420_10BPP,
        VA_RT_FORMAT_RGB16,    VA_RT_FORMAT_RGB32,  VA_RT_FORMAT_RGBP,
        VA_RT_FORMAT_PROTECTED };

static const std::vector<VABufferType> m_vaBufferTypes
    = { VAPictureParameterBufferType,
        VAIQMatrixBufferType,
        VABitPlaneBufferType,
        VASliceGroupMapBufferType,
        VASliceParameterBufferType,
        VASliceDataBufferType,
        VAMacroblockParameterBufferType,
        VAResidualDataBufferType,
        VADeblockingParameterBufferType,
        VAImageBufferType,
        VAProtectedSliceDataBufferType,
        VAQMatrixBufferType,
        VAHuffmanTableBufferType,
        VAProbabilityBufferType,
        VAEncCodedBufferType,
        VAEncSequenceParameterBufferType,
        VAEncPictureParameterBufferType,
        VAEncSliceParameterBufferType,
        VAEncPackedHeaderParameterBufferType,
        VAEncPackedHeaderDataBufferType,
        VAEncMiscParameterBufferType,
        VAEncMacroblockParameterBufferType,
        VAEncMacroblockMapBufferType,
        VAProcPipelineParameterBufferType,
        VAProcFilterParameterBufferType,
        VAEncFEIMVBufferType,
        VAEncFEIMBCodeBufferType,
        VAEncFEIDistortionBufferType,
        VAEncFEIMBControlBufferType,
        VAEncFEIMVPredictorBufferType };
}
#endif
