/* * 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. */ #include "test_va_api_fixture.h" namespace VAAPI { // Testing VABufferType in groups that will be associated with VAProfile and // VAEntrypoint. vaCreateBuffer doesn't require these itself but its input // parameter do care about them. typedef ::testing::WithParamInterface> CreateBufferParamInterface; class VAAPICreateBuffer : public VAAPIFixture , public CreateBufferParamInterface { public: VAAPICreateBuffer() : profile(::testing::get<0>(GetParam())) , entrypoint(::testing::get<1>(GetParam())) , bufferType(::testing::get<2>(GetParam())) , bufferSize(::testing::get<3>(GetParam())) { } protected: const VAProfile& profile; const VAEntrypoint& entrypoint; const VABufferType& bufferType; const size_t bufferSize; virtual void SetUp() { VAAPIFixture::SetUp(); doInitialize(); ASSERT_FALSE(HasFailure()); } virtual void TearDown() { doTerminate(); VAAPIFixture::TearDown(); } }; typedef std::tuple BufferSpec; typedef std::vector BufferSpecs; typedef std::map BufferSpecsMap; using std::make_tuple; static const BufferSpecsMap decodeBufferSpecs = { {VAPictureParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAPictureParameterBufferMPEG2)), make_tuple(g_vaMPEG4Profiles, sizeof(VAPictureParameterBufferMPEG4)), make_tuple(g_vaH264Profiles, sizeof(VAPictureParameterBufferH264)), make_tuple(g_vaVC1Profiles, sizeof(VAPictureParameterBufferVC1)), make_tuple(g_vaJPEGProfiles, sizeof(VAPictureParameterBufferJPEGBaseline)), make_tuple(g_vaVP8Profiles, sizeof(VAPictureParameterBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VAPictureParameterBufferHEVC)), make_tuple(g_vaVP9Profiles, sizeof(VADecPictureParameterBufferVP9)), }}, {VAIQMatrixBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAIQMatrixBufferMPEG2)), make_tuple(g_vaMPEG4Profiles, sizeof(VAIQMatrixBufferMPEG4)), make_tuple(g_vaH264Profiles, sizeof(VAIQMatrixBufferH264)), make_tuple(g_vaJPEGProfiles, sizeof(VAIQMatrixBufferJPEGBaseline)), make_tuple(g_vaVP8Profiles, sizeof(VAIQMatrixBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VAIQMatrixBufferHEVC)), }}, {VASliceParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VASliceParameterBufferMPEG2)), make_tuple(g_vaMPEG4Profiles, sizeof(VASliceParameterBufferMPEG4)), make_tuple(g_vaH264Profiles, sizeof(VASliceParameterBufferH264)), make_tuple(g_vaVC1Profiles, sizeof(VASliceParameterBufferVC1)), make_tuple(g_vaJPEGProfiles, sizeof(VASliceParameterBufferJPEGBaseline)), make_tuple(g_vaVP8Profiles, sizeof(VASliceParameterBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VASliceParameterBufferHEVC)), make_tuple(g_vaVP9Profiles, sizeof(VASliceParameterBufferVP9)), }}, {VAMacroblockParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAMacroblockParameterBufferMPEG2)), }}, {VAQMatrixBufferType, { make_tuple(g_vaJPEGProfiles, sizeof(VAQMatrixBufferJPEG)), make_tuple(g_vaVP8Profiles, sizeof(VAQMatrixBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VAQMatrixBufferHEVC)), }}, {VAHuffmanTableBufferType, { make_tuple(g_vaJPEGProfiles, sizeof(VAHuffmanTableBufferJPEGBaseline)), }}, {VAProbabilityBufferType, { make_tuple(g_vaVP8Profiles, sizeof(VAProbabilityDataBufferVP8)), }}, }; static const BufferSpecsMap encodeBufferSpecs = { {VAEncSequenceParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAEncSequenceParameterBufferMPEG2)), make_tuple(g_vaMPEG4Profiles, sizeof(VAEncSequenceParameterBufferMPEG4)), make_tuple(g_vaH263Profiles, sizeof(VAEncSequenceParameterBufferH263)), make_tuple(g_vaH264Profiles, sizeof(VAEncSequenceParameterBufferH264)), make_tuple(g_vaVP8Profiles, sizeof(VAEncSequenceParameterBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VAEncSequenceParameterBufferHEVC)), make_tuple(g_vaVP9Profiles, sizeof(VAEncSequenceParameterBufferVP9)), }}, {VAEncPictureParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAEncPictureParameterBufferMPEG2)), make_tuple(g_vaMPEG4Profiles, sizeof(VAEncPictureParameterBufferMPEG4)), make_tuple(g_vaH263Profiles, sizeof(VAEncPictureParameterBufferH263)), make_tuple(g_vaH264Profiles, sizeof(VAEncPictureParameterBufferH264)), make_tuple(g_vaJPEGProfiles, sizeof(VAEncPictureParameterBufferJPEG)), make_tuple(g_vaVP8Profiles, sizeof(VAEncPictureParameterBufferVP8)), make_tuple(g_vaHEVCProfiles, sizeof(VAEncPictureParameterBufferHEVC)), make_tuple(g_vaVP9Profiles, sizeof(VAEncPictureParameterBufferVP9)), }}, {VAEncSliceParameterBufferType, { make_tuple(g_vaMPEG2Profiles, sizeof(VAEncSliceParameterBufferMPEG2)), make_tuple(g_vaH264Profiles, sizeof(VAEncSliceParameterBufferH264)), make_tuple(g_vaJPEGProfiles, sizeof(VAEncSliceParameterBufferJPEG)), make_tuple(g_vaHEVCProfiles, sizeof(VAEncSliceParameterBufferHEVC)), }}, {VAEncPackedHeaderParameterBufferType, { make_tuple(g_vaProfiles, sizeof(VAEncPackedHeaderParameterBuffer)), }}, {VAEncMiscParameterBufferType, { make_tuple(g_vaProfiles, sizeof(VAEncMiscParameterBuffer)), }}, }; static const BufferSpecsMap vppBufferSpecs = { {VAProcPipelineParameterBufferType, { make_tuple(g_vaNoneProfiles, sizeof(VAProcPipelineParameterBuffer)), }}, {VAProcFilterParameterBufferType, { make_tuple(g_vaNoneProfiles, sizeof(VAProcFilterParameterBuffer)), make_tuple(g_vaNoneProfiles, sizeof(VAProcFilterParameterBufferDeinterlacing)), make_tuple(g_vaNoneProfiles, sizeof(VAProcFilterParameterBufferColorBalance)), make_tuple(g_vaNoneProfiles, sizeof(VAProcFilterParameterBufferTotalColorCorrection)), }}, }; TEST_P(VAAPICreateBuffer, CreateBufferWithOutData) { // vaCreateBuffer uses a VAContextID as an input. This VAContextID requires // a VAConfigID to be created. VAConfigID requires VAProfile and // VAEntrypoint to be given. As such, to test vaCreateBuffer these are // the minimum requirements. There's no need to create surfaces or attach // them to a VAConfigID. if (not isSupported(profile, entrypoint)) { skipTest(profile, entrypoint); return; } // profile and entrypoint are supported createConfig(profile, entrypoint); // vaCreateContext input requires resolution, since this test // doesn't create surfaces, passing min resolution should provide // the desired result. Resolution minRes, maxRes; getMinMaxSurfaceResolution(minRes, maxRes); doCreateContext(minRes); createBuffer(bufferType, bufferSize); destroyBuffer(); doDestroyContext(); destroyConfig(); } std::vector generateInput() { std::vector inputs; const auto addBufferSpecs = [&]( const BufferSpecsMap& bsm, const Entrypoints& entrypoints) { for (const auto& specs : bsm) { const auto& bufferType = std::get<0>(specs); for (const auto& spec: std::get<1>(specs)) { const auto& bufferSize = std::get<1>(spec); for (const auto& profile : std::get<0>(spec)) { for (const auto& entrypoint : entrypoints) { inputs.push_back( make_tuple( profile, entrypoint, bufferType, bufferSize)); } } } } }; addBufferSpecs(decodeBufferSpecs, {VAEntrypointVLD,}); addBufferSpecs(encodeBufferSpecs, {VAEntrypointEncSlice, VAEntrypointEncSliceLP, VAEntrypointEncPicture,}); addBufferSpecs(vppBufferSpecs, {VAEntrypointVideoProc,}); return inputs; } INSTANTIATE_TEST_CASE_P( CreateBuffer, VAAPICreateBuffer, ::testing::ValuesIn(generateInput())); } // namespace VAAPI