Add some simple avce context tests to verify various encode context fields are appropriately configured.
Signed-off-by: U. Artie Eoff <[email protected]> --- test/Makefile.am | 3 + test/i965_avce_context_test.cpp | 258 ++++++++++++++++++++++++++++++++++++++++ test/i965_avce_test_common.cpp | 85 +++++++++++++ test/i965_avce_test_common.h | 39 ++++++ test/i965_internal_decl.h | 1 + 5 files changed, 386 insertions(+) create mode 100644 test/i965_avce_context_test.cpp create mode 100644 test/i965_avce_test_common.cpp create mode 100644 test/i965_avce_test_common.h diff --git a/test/Makefile.am b/test/Makefile.am index 08df3395a383..7a5437e71450 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -44,6 +44,7 @@ EXTRA_DIST = \ # test_i965_drv_video noinst_PROGRAMS = test_i965_drv_video noinst_HEADERS = \ + i965_avce_test_common.h \ i965_config_test.h \ i965_internal_decl.h \ i965_jpeg_test_data.h \ @@ -56,6 +57,8 @@ noinst_HEADERS = \ test_i965_drv_video_SOURCES = \ i965_avcd_config_test.cpp \ i965_avce_config_test.cpp \ + i965_avce_context_test.cpp \ + i965_avce_test_common.cpp \ i965_chipset_test.cpp \ i965_config_test.cpp \ i965_initialize_test.cpp \ diff --git a/test/i965_avce_context_test.cpp b/test/i965_avce_context_test.cpp new file mode 100644 index 000000000000..4777c9e6a13f --- /dev/null +++ b/test/i965_avce_context_test.cpp @@ -0,0 +1,258 @@ +/* + * 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 "i965_avce_test_common.h" +#include "i965_streamable.h" +#include "i965_test_fixture.h" + +#include <map> +#include <tuple> +#include <vector> + +namespace AVC { +namespace Encode { + +class AVCEContextTest + : public I965TestFixture + , public ::testing::WithParamInterface< + std::tuple<VAProfile, VAEntrypoint> > +{ +protected: + void SetUp() + { + I965TestFixture::SetUp(); + std::tie(profile, entrypoint) = GetParam(); + } + + void TearDown() + { + if (context != VA_INVALID_ID) + destroyContext(context); + if (config != VA_INVALID_ID) + destroyConfig(config); + I965TestFixture::TearDown(); + } + + operator struct intel_encoder_context const *() + { + if (config == VA_INVALID_ID) return NULL; + + struct i965_driver_data *i965(*this); + if (not i965) return NULL; + + struct object_context const *obj_context = CONTEXT(context); + if (not obj_context) return NULL; + + return reinterpret_cast<struct intel_encoder_context const *>( + obj_context->hw_context); + } + + VAProfile profile; + VAEntrypoint entrypoint; + VAConfigID config = VA_INVALID_ID; + VAContextID context = VA_INVALID_ID; +}; + +TEST_P(AVCEContextTest, RateControl) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + static const std::vector<unsigned> rateControls = { + VA_RC_NONE, VA_RC_CBR, VA_RC_VBR, VA_RC_VCM, VA_RC_CQP, + VA_RC_VBR_CONSTRAINED, VA_RC_MB, + }; + + for (auto rc : rateControls) { + ConfigAttribs attribs(1, {type:VAConfigAttribRateControl, value:rc}); + config = createConfig(profile, entrypoint, attribs); + context = createContext(config, 1, 1); + if (HasFailure()) continue; + + struct intel_encoder_context const *hw_context(*this); + EXPECT_PTR(hw_context); + if (HasFailure()) continue; + + EXPECT_EQ(rc, hw_context->rate_control_mode); + + destroyContext(context); + destroyConfig(config); + context = VA_INVALID_ID; + config = VA_INVALID_ID; + } +} + +TEST_P(AVCEContextTest, Codec) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + static const std::map<VAProfile, int> codecs = { + {VAProfileH264ConstrainedBaseline, CODEC_H264}, + {VAProfileH264Main, CODEC_H264}, + {VAProfileH264High, CODEC_H264}, + {VAProfileH264MultiviewHigh, CODEC_H264_MVC}, + {VAProfileH264StereoHigh, CODEC_H264_MVC}, + }; + + ASSERT_NO_FAILURE( + config = createConfig(profile, entrypoint); + context = createContext(config, 1, 1); + ); + + struct intel_encoder_context const *hw_context(*this); + ASSERT_PTR(hw_context); + + EXPECT_EQ(codecs.at(profile), hw_context->codec); +} + +TEST_P(AVCEContextTest, LowPowerMode) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + ASSERT_NO_FAILURE( + config = createConfig(profile, entrypoint); + context = createContext(config, 1, 1); + ); + + struct intel_encoder_context const *hw_context(*this); + ASSERT_PTR(hw_context); + + EXPECT_EQ( + (entrypoint == VAEntrypointEncSliceLP ? 1u : 0u), + hw_context->low_power_mode + ); +} + +TEST_P(AVCEContextTest, ROINotSpecified) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + // The lack of the VAConfigAttribEncROI config attribute + // will disable it. + ASSERT_NO_FAILURE( + config = createConfig(profile, entrypoint); + context = createContext(config, 1, 1); + ); + + struct intel_encoder_context const *hw_context(*this); + ASSERT_PTR(hw_context); + + EXPECT_EQ(0u, hw_context->context_roi); +} + +TEST_P(AVCEContextTest, ROISpecified) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + static const std::map<VAProfile, unsigned> roiSupport = { + {VAProfileH264ConstrainedBaseline, 1}, {VAProfileH264Main, 1}, + {VAProfileH264High, 1}, {VAProfileH264MultiviewHigh, 0}, + {VAProfileH264StereoHigh, 0}, + }; + + // The presence of the VAConfigAttribEncROI config attribute + // will enable it for supported profile + ConfigAttribs attribs(1, {type:VAConfigAttribEncROI}); + ASSERT_NO_FAILURE( + config = createConfig(profile, entrypoint, attribs); + context = createContext(config, 1, 1); + ); + + struct intel_encoder_context const *hw_context(*this); + ASSERT_PTR(hw_context); + + EXPECT_EQ(roiSupport.at(profile), hw_context->context_roi); +} + +TEST_P(AVCEContextTest, QualityRange) +{ + if (not IsSupported(profile, entrypoint)) { + RecordProperty("skipped", true); + std::cout << "[ SKIPPED ] " << getFullTestName() + << " is unsupported on this hardware" << std::endl; + return; + } + + const std::map<VAProfile, unsigned> qranges = { + {VAProfileH264ConstrainedBaseline, entrypoint == VAEntrypointEncSliceLP + ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE}, + {VAProfileH264Main, entrypoint == VAEntrypointEncSliceLP + ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE}, + {VAProfileH264High, entrypoint == VAEntrypointEncSliceLP + ? ENCODER_LP_QUALITY_RANGE : ENCODER_QUALITY_RANGE}, + {VAProfileH264MultiviewHigh, 1u}, + {VAProfileH264StereoHigh, 1u}, + }; + + ASSERT_NO_FAILURE( + config = createConfig(profile, entrypoint); + context = createContext(config, 1, 1); + ); + + struct intel_encoder_context const *hw_context(*this); + ASSERT_PTR(hw_context); + + EXPECT_EQ(qranges.at(profile), hw_context->quality_range); +} + +INSTANTIATE_TEST_CASE_P( + AVCEncode, AVCEContextTest, ::testing::Values( + std::make_tuple(VAProfileH264ConstrainedBaseline, VAEntrypointEncSlice), + std::make_tuple(VAProfileH264ConstrainedBaseline, VAEntrypointEncSliceLP), + std::make_tuple(VAProfileH264Main, VAEntrypointEncSlice), + std::make_tuple(VAProfileH264Main, VAEntrypointEncSliceLP), + std::make_tuple(VAProfileH264High, VAEntrypointEncSlice), + std::make_tuple(VAProfileH264High, VAEntrypointEncSliceLP), + std::make_tuple(VAProfileH264MultiviewHigh, VAEntrypointEncSlice), + std::make_tuple(VAProfileH264StereoHigh, VAEntrypointEncSlice) + ) +); + +} // namespace Encode +} // namespace AVC + diff --git a/test/i965_avce_test_common.cpp b/test/i965_avce_test_common.cpp new file mode 100644 index 000000000000..14aa36cf3740 --- /dev/null +++ b/test/i965_avce_test_common.cpp @@ -0,0 +1,85 @@ +/* + * 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 "i965_avce_test_common.h" +#include "i965_test_environment.h" + +namespace AVC { +namespace Encode { + +/** + * This is similar to i965_validate_config(...) in i965_drv_video.c + * except that there are a few other checks in regards to HW support + * expectations. + */ +VAStatus CheckSupported(VAProfile profile, VAEntrypoint entrypoint) +{ + I965TestEnvironment *env(I965TestEnvironment::instance()); + EXPECT_PTR(env); + + struct i965_driver_data *i965(*env); + EXPECT_PTR(i965); + + switch(profile) { + case VAProfileH264Baseline: + return VA_STATUS_ERROR_UNSUPPORTED_PROFILE; + + case VAProfileH264ConstrainedBaseline: + case VAProfileH264Main: + case VAProfileH264High: + if (entrypoint == VAEntrypointEncSlice) { + if (HAS_H264_ENCODING(i965)) { + return VA_STATUS_SUCCESS; + } + } else if (entrypoint == VAEntrypointEncSliceLP) { + if (IS_SKL(i965->intel.device_info)) { + return VA_STATUS_SUCCESS; + } + if (HAS_LP_H264_ENCODING(i965)) { + return VA_STATUS_SUCCESS; + } + } + break; + + case VAProfileH264MultiviewHigh: + case VAProfileH264StereoHigh: + if (entrypoint == VAEntrypointEncSlice) { + return VA_STATUS_SUCCESS; + } + break; + + default: + return VA_STATUS_ERROR_UNSUPPORTED_PROFILE; + } + + return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; +} + +bool IsSupported(VAProfile profile, VAEntrypoint entrypoint) +{ + return VA_STATUS_SUCCESS == CheckSupported(profile, entrypoint); +} + +} // namespace Encode +} // namespace AVC diff --git a/test/i965_avce_test_common.h b/test/i965_avce_test_common.h new file mode 100644 index 000000000000..46424386b279 --- /dev/null +++ b/test/i965_avce_test_common.h @@ -0,0 +1,39 @@ +/* + * 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 I965_AVCE_TEST_COMMON_H +#define I965_AVCE_TEST_COMMON_H + +#include <va/va.h> + +namespace AVC { +namespace Encode { + +VAStatus CheckSupported(VAProfile, VAEntrypoint); +bool IsSupported(VAProfile, VAEntrypoint); + +} // namespace Encode +} // namespace AVC + +#endif diff --git a/test/i965_internal_decl.h b/test/i965_internal_decl.h index dbfcbb87ee26..392cd3b3a8b2 100644 --- a/test/i965_internal_decl.h +++ b/test/i965_internal_decl.h @@ -28,6 +28,7 @@ extern "C" { #include "sysdeps.h" #include "i965_drv_video.h" + #include "i965_encoder.h" extern VAStatus i965_CreateConfig( VADriverContextP, VAProfile, VAEntrypoint, -- 2.4.11 _______________________________________________ Libva mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libva
