> -----Original Message-----
> From: Xiang, Haihao
> Sent: Thursday, October 13, 2016 1:39 AM
> To: Eoff, Ullysses A <ullysses.a.e...@intel.com>; libva@lists.freedesktop.org
> Subject: Re: [Libva] [PATCH intel-driver 3/3] test: add some avce context 
> tests
> 
> On Tue, 2016-10-11 at 12:21 -0700, U. Artie Eoff wrote:
> > Add some simple avce context tests to verify various
> > encode context fields are appropriately configured.
> >
> > Signed-off-by: U. Artie Eoff <ullysses.a.e...@intel.com>
> > ---
> >  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);
> 
> The internal variable of hw_context->rate_control_mode is used here,
> does it mean we will have to change the gtest case if we do any change
> to hw_context->rate_control_mode in the driver?
> 
> E.g. rename or remove hw_context->rate_control_mode in the future.
> 

Yes.  That just comes with the territory of testing... especially unit tests.
It is normal to need to refactor some tests when APIs and data
structures change.  It forces you to think about the changes and ensure
they are tested and don't cause regressions to some extent.

> 
> > +
> > +        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,
_______________________________________________
Libva mailing list
Libva@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to