[Libva] [PATCH intel-driver 10/11] test: jpeg/enc: add tests for YUY2 and UYVY inputs
U. Artie Eoff
ullysses.a.eoff at intel.com
Wed Sep 28 20:36:10 UTC 2016
...plus optimize TestInput::toOutputFourcc()
Signed-off-by: U. Artie Eoff <ullysses.a.eoff at intel.com>
---
test/i965_jpeg_encode_test.cpp | 18 ++++----
test/i965_jpeg_test_data.cpp | 97 +++++++++++++++++++++++++++++++++++++-----
test/i965_jpeg_test_data.h | 8 ++++
3 files changed, 104 insertions(+), 19 deletions(-)
diff --git a/test/i965_jpeg_encode_test.cpp b/test/i965_jpeg_encode_test.cpp
index b45448491670..789d4f35c228 100644
--- a/test/i965_jpeg_encode_test.cpp
+++ b/test/i965_jpeg_encode_test.cpp
@@ -278,7 +278,7 @@ protected:
ASSERT_INVALID_ID(coded);
unsigned size =
std::accumulate(input->sizes.begin(), input->sizes.end(), 8192u);
- size *= input->planes;
+ size *= 2;
coded = createBuffer(context, VAEncCodedBufferType, size);
}
@@ -349,8 +349,6 @@ protected:
void VerifyOutput()
{
- // VerifyOutput only supports VA_FOURCC_IMC3 output, currently
- ASSERT_EQ(unsigned(VA_FOURCC_IMC3), input->fourcc_output);
TestInput::SharedConst expect = input->toOutputFourcc();
ASSERT_PTR(expect.get());
@@ -414,6 +412,10 @@ protected:
VAImage image;
ASSERT_NO_FAILURE(deriveImage(osurfaces.front(), image));
+ ASSERT_EQ(expect->planes, image.num_planes);
+ ASSERT_GT(image.data_size, 0u);
+ ASSERT_EQ(expect->width(), image.width);
+ ASSERT_EQ(expect->height(), image.height);
ASSERT_NO_FAILURE(uint8_t *data = mapBuffer<uint8_t>(image.buf));
auto isClose = [](const uint8_t& a, const uint8_t& b) {
@@ -479,7 +481,7 @@ INSTANTIATE_TEST_CASE_P(
::testing::ValuesIn(
std::vector<TestInputCreator::SharedConst>(
5, TestInputCreator::SharedConst(new RandomSizeCreator))),
- ::testing::Values("I420", "NV12")
+ ::testing::Values("I420", "NV12", "UYVY", "YUY2")
)
);
@@ -513,7 +515,7 @@ INSTANTIATE_TEST_CASE_P(
Common, JPEGEncodeInputTest,
::testing::Combine(
::testing::ValuesIn(generateCommonInputs()),
- ::testing::Values("I420", "NV12")
+ ::testing::Values("I420", "NV12", "UYVY", "YUY2")
)
);
@@ -523,7 +525,7 @@ INSTANTIATE_TEST_CASE_P(
::testing::Values(
TestInputCreator::Shared(new FixedSizeCreator({8192, 8192}))
),
- ::testing::Values("I420", "NV12")
+ ::testing::Values("I420", "NV12", "UYVY", "YUY2")
)
);
@@ -560,7 +562,7 @@ INSTANTIATE_TEST_CASE_P(
Edge, JPEGEncodeInputTest,
::testing::Combine(
::testing::ValuesIn(generateEdgeCaseInputs()),
- ::testing::Values("I420", "NV12")
+ ::testing::Values("I420", "NV12", "UYVY", "YUY2")
)
);
@@ -578,7 +580,7 @@ INSTANTIATE_TEST_CASE_P(
Misc, JPEGEncodeInputTest,
::testing::Combine(
::testing::ValuesIn(generateMiscInputs()),
- ::testing::Values("I420", "NV12")
+ ::testing::Values("I420", "NV12", "UYVY", "YUY2")
)
);
diff --git a/test/i965_jpeg_test_data.cpp b/test/i965_jpeg_test_data.cpp
index da7d440b7855..6ca2d27e5fc8 100644
--- a/test/i965_jpeg_test_data.cpp
+++ b/test/i965_jpeg_test_data.cpp
@@ -794,6 +794,21 @@ namespace Encode {
t->format = VA_RT_FORMAT_YUV420;
t->fourcc_output = VA_FOURCC_IMC3;
break;
+ case VA_FOURCC_UYVY:
+ case VA_FOURCC_YUY2:
+ t->planes = 1;
+ t->widths = {(w + (w & 1)) << 1, 0, 0};
+ t->heights = {h + (h & 1), 0, 0};
+ t->format = VA_RT_FORMAT_YUV422;
+ t->fourcc_output = VA_FOURCC_422H;
+ break;
+ case VA_FOURCC_422H:
+ t->planes = 3;
+ t->widths = {w + (w & 1), (w + 1) >> 1, (w + 1) >> 1};
+ t->heights = {h + (h & 1), h + (h & 1), h + (h & 1)};
+ t->format = VA_RT_FORMAT_YUV422;
+ t->fourcc_output = VA_FOURCC_422H;
+ break;
default:
return Shared(); // fourcc is unsupported
}
@@ -849,28 +864,88 @@ namespace Encode {
return bytes.data() + offsets[i];
}
+ uint8_t* TestInput::begin(const size_t i)
+ {
+ return bytes.data() + offsets[i];
+ }
+
+ const uint8_t* TestInput::begin(const size_t i) const
+ {
+ return bytes.data() + offsets[i];
+ }
+
+ uint8_t* TestInput::end(const size_t i)
+ {
+ return begin(i) + sizes[i];
+ }
+
+ const uint8_t* TestInput::end(const size_t i) const
+ {
+ return begin(i) + sizes[i];
+ }
+
const TestInput::SharedConst TestInput::toOutputFourcc() const
{
TestInput::Shared result;
+
+ struct IsEvenIndex
+ {
+ IsEvenIndex():i(0){}
+ inline const bool operator()(const uint8_t&)
+ {
+ const bool r = (i % 2) != 1;
+ ++i;
+ return r;
+ }
+ size_t i;
+ };
+
+ struct IsOddIndex
+ {
+ IsOddIndex():i(0){}
+ inline const bool operator()(const uint8_t&)
+ {
+ const bool r = (i % 2) == 1;
+ ++i;
+ return r;
+ }
+ size_t i;
+ };
+
if (fourcc_output == VA_FOURCC_IMC3) {
if (fourcc == VA_FOURCC_I420) {
return shared_from_this();
} else if (fourcc == VA_FOURCC_NV12) {
result = create(VA_FOURCC_I420, width(), height());
- std::copy(
- std::begin(bytes), std::end(bytes),
- std::begin(result->bytes));
- size_t i(0);
- auto predicate = [&i](const ByteData::value_type&) {
- bool isu = ((i % 2) == 0) or (i == 0);
- ++i;
- return isu;
- };
+ // copy Y to plane 0
+ std::copy(begin(0), end(0), result->begin(0));
+ // copy U to plane 1
+ std::copy_if(begin(1), end(1), result->begin(1), IsEvenIndex());
+ // copy V to plane 2
+ std::copy_if(begin(1), end(1), result->begin(2), IsOddIndex());
+ }
+ } else if (fourcc_output == VA_FOURCC_422H) {
+ if (fourcc == VA_FOURCC_UYVY) {
+ result = create(VA_FOURCC_422H, width(), height());
+ // copy Y to plane 0
+ std::copy_if(begin(0), end(0), result->begin(0), IsOddIndex());
+ // copy UV across plane 1 and 2
+ std::copy_if(begin(0), end(0), result->begin(1), IsEvenIndex());
+ // partition U into plane 1 and V into plane 2
+ std::stable_partition(
+ result->begin(1), result->end(2), IsEvenIndex());
+ } else if (fourcc == VA_FOURCC_YUY2) {
+ result = create(VA_FOURCC_422H, width(), height());
+ // copy Y to plane 0
+ std::copy_if(begin(0), end(0), result->begin(0), IsEvenIndex());
+ // copy UV across plane 1 and 2
+ std::copy_if(begin(0), end(0), result->begin(1), IsOddIndex());
+ // partition U into plane 1 and V into plane 2
std::stable_partition(
- std::begin(result->bytes) + result->offsets[1],
- std::end(result->bytes), predicate);
+ result->begin(1), result->end(2), IsEvenIndex());
}
}
+
return result;
}
diff --git a/test/i965_jpeg_test_data.h b/test/i965_jpeg_test_data.h
index f29e579fead7..f3113f50cfa4 100644
--- a/test/i965_jpeg_test_data.h
+++ b/test/i965_jpeg_test_data.h
@@ -425,6 +425,14 @@ namespace Encode {
private:
TestInput();
+
+ /** get pointer to beginning of plane @param i **/
+ uint8_t* begin(const size_t i);
+ const uint8_t* begin(const size_t i) const;
+
+ /** get pointer to end of plane @param i **/
+ uint8_t* end(const size_t i);
+ const uint8_t* end(const size_t i) const;
};
class TestInputCreator
--
2.4.11
More information about the Libva
mailing list