diff options
author | U. Artie Eoff <ullysses.a.eoff@intel.com> | 2016-10-11 12:21:46 -0700 |
---|---|---|
committer | Sean V Kelley <seanvk@posteo.de> | 2016-10-13 12:22:10 -0700 |
commit | fc7bd0639a83b182b6e8a02217b22fd544253e08 (patch) | |
tree | 9fe4ec26b0fc3c67a9646987051353ba009e37c1 /test | |
parent | 31d499ebdd0fe080d8e3654ab90fede155b148fe (diff) |
test: add some avce context tests
Add some simple avce context tests to verify various
encode context fields are appropriately configured.
Signed-off-by: U. Artie Eoff <ullysses.a.eoff@intel.com>
Reviewed-by: Sean V Kelley <seanvk@posteo.de>
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile.am | 3 | ||||
-rw-r--r-- | test/i965_avce_context_test.cpp | 257 | ||||
-rw-r--r-- | test/i965_avce_test_common.cpp | 85 | ||||
-rw-r--r-- | test/i965_avce_test_common.h | 39 | ||||
-rw-r--r-- | test/i965_internal_decl.h | 1 |
5 files changed, 385 insertions, 0 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index 08df339..7a5437e 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 0000000..a936df0 --- /dev/null +++ b/test/i965_avce_context_test.cpp @@ -0,0 +1,257 @@ +/* + * 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 0000000..14aa36c --- /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 0000000..4642438 --- /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 dbfcbb8..392cd3b 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, |