Chromium Code Reviews| Index: content/common/gpu/media/vaapi_jpeg_decoder_unittest.cc |
| diff --git a/content/common/gpu/media/vaapi_jpeg_decoder_unittest.cc b/content/common/gpu/media/vaapi_jpeg_decoder_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..35f63a63d919a8a3954a20da6781228a04e22d93 |
| --- /dev/null |
| +++ b/content/common/gpu/media/vaapi_jpeg_decoder_unittest.cc |
| @@ -0,0 +1,143 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <string> |
| + |
| +// This has to be included first. |
| +// See http://code.google.com/p/googletest/issues/detail?id=371 |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +#include "base/at_exit.h" |
| +#include "base/bind.h" |
| +#include "base/files/file_util.h" |
| +#include "base/logging.h" |
| +#include "base/md5.h" |
| +#include "base/path_service.h" |
| +#include "base/strings/string_piece.h" |
| +#include "content/common/gpu/media/vaapi_jpeg_decoder.h" |
| + |
| +namespace content { |
| +namespace { |
| + |
| +base::FilePath GetDataDir() { |
| + base::FilePath data_dir; |
| + PathService::Get(base::DIR_SOURCE_ROOT, &data_dir); |
| + return data_dir.AppendASCII("media").AppendASCII("test").AppendASCII("data"); |
|
wuchengli
2015/01/12 09:08:52
pixel-1280x720.bin can be removed from this CL sin
kcwu
2015/01/16 15:12:55
Done.
|
| +} |
| + |
| +void LogOnError(VaapiJpegDecoder::DecodeStatus error) { |
| + LOG(FATAL) << "Oh noes! Decoder failed: " << error; |
| +} |
| + |
| +class VaapiJpegDecoderTest : public ::testing::Test { |
| + protected: |
| + VaapiJpegDecoderTest() : x_display_(nullptr) {} |
| + |
| + void SetUp() override { |
| + x_display_ = XOpenDisplay(nullptr); |
|
wuchengli
2015/01/12 09:08:52
How does this work with freon?
kcwu
2015/01/16 15:12:55
Done.
|
| + ASSERT_TRUE(x_display_); |
| + |
| + base::Closure report_error_cb = |
| + base::Bind(&LogOnError, VaapiJpegDecoder::VAAPI_ERROR); |
| + wrapper_ = VaapiWrapper::Create(VaapiWrapper::kDecode, media::MJPEGPROFILE, |
| + x_display_, report_error_cb); |
| + ASSERT_TRUE(wrapper_.get()); |
|
Owen Lin
2015/01/13 06:17:58
Do we need the get()?
kcwu
2015/01/16 15:12:55
Done.
|
| + decoder_.reset( |
| + new VaapiJpegDecoder(wrapper_.get(), base::Bind(&LogOnError))); |
| + } |
| + |
| + void TearDown() override { |
| + decoder_.reset(); |
| + wrapper_.reset(); |
| + |
| + if (x_display_) { |
| + XCloseDisplay(x_display_); |
| + } |
| + } |
| + |
| + VaapiJpegDecoder::DecodeStatus RunDecode(const base::StringPiece& data, |
| + std::string& md5sum); |
| + |
| + private: |
| + scoped_ptr<VaapiWrapper> wrapper_; |
| + scoped_ptr<VaapiJpegDecoder> decoder_; |
| + |
| + // x_display need to be initialized and possibly freed manually. |
|
wuchengli
2015/01/12 09:08:52
possibly is vague. Should we free manually or not?
kcwu
2015/01/16 15:12:55
Done.
|
| + Display* x_display_; |
| +}; |
| + |
| +VaapiJpegDecoder::DecodeStatus VaapiJpegDecoderTest::RunDecode( |
| + const base::StringPiece& data, |
| + std::string& md5sum) { |
|
Owen Lin
2015/01/13 06:17:58
Why not just pass the expected md5sum and rename i
kcwu
2015/01/16 15:12:56
Done.
|
| + gfx::Size size; |
| + VASurfaceID surface_id; |
| + VaapiJpegDecoder::DecodeStatus status = |
| + decoder_->Decode(reinterpret_cast<const uint8*>(data.data()), data.size(), |
| + &size, &surface_id); |
| + |
| + if (status != VaapiJpegDecoder::SUCCESS) { |
| + LOG(ERROR) << "Decode failed"; |
| + return status; |
| + } |
| + |
| + VAImage image; |
| + VAImageFormat format; |
| + uint32_t kI420_fourcc = 'I' | '4' << 8 | '2' << 16 | '0' << 24; |
|
wuchengli
2015/01/12 09:08:53
VA_FOURCC_IYUV? I420 is IYUV.
kcwu
2015/01/16 15:12:55
No. vaCreateImage failed with VA_FOURCC_IYUV
|
| + memset(&image, 0, sizeof(image)); |
| + memset(&format, 0, sizeof(format)); |
| + format.fourcc = kI420_fourcc; |
| + format.byte_order = VA_LSB_FIRST; |
| + format.bits_per_pixel = 12; |
| + |
| + void* mem; |
| + if (!wrapper_->GetVaImageWithFormat(surface_id, &format, size, &image, |
| + &mem)) { |
| + LOG(ERROR) << "Cannot get VAImage"; |
| + return VaapiJpegDecoder::VAAPI_ERROR; |
| + } |
| + EXPECT_EQ(kI420_fourcc, image.format.fourcc); |
| + |
| + base::StringPiece result(reinterpret_cast<const char*>(mem), |
| + size.width() * size.height() * 2); |
| + md5sum = base::MD5String(result); |
| + |
| + wrapper_->ReturnVaImageForTesting(&image); |
|
Owen Lin
2015/01/13 06:17:58
Why there is no DecodeDone() ? Is this because it
kcwu
2015/01/16 15:12:55
Yes. I added DecodeDone anyway.
|
| + |
| + return VaapiJpegDecoder::SUCCESS; |
| +} |
| + |
| +TEST_F(VaapiJpegDecoderTest, DecodeSuccess) { |
| + base::FilePath input_file = GetDataDir().AppendASCII("pixel-1280x720.jpg"); |
|
wuchengli
2015/01/12 09:08:52
Make this a constant.
kcwu
2015/01/16 15:12:55
Done.
|
| + |
| + std::string data; |
| + ASSERT_TRUE(base::ReadFileToString(input_file, &data)) |
| + << "failed to read input data from " << input_file.value(); |
| + |
| + std::string actual_md5sum; |
| + EXPECT_EQ(VaapiJpegDecoder::SUCCESS, RunDecode(data, actual_md5sum)); |
| + EXPECT_EQ("451f28cc874a2206fc5c5a9213b212bd", actual_md5sum); |
|
wuchengli
2015/01/12 09:08:53
Make this a constant.
kcwu
2015/01/16 15:12:55
Done.
|
| +} |
| + |
| +TEST_F(VaapiJpegDecoderTest, DecodeFail) { |
| + base::FilePath input_file = GetDataDir().AppendASCII("pixel-1280x720.jpg"); |
| + |
| + std::string data; |
| + ASSERT_TRUE(base::ReadFileToString(input_file, &data)) |
| + << "failed to read input data from " << input_file.value(); |
| + |
| + // make data corrupted to simulate parse failure |
|
wuchengli
2015/01/12 09:08:53
Capitalize the first word and add period.
kcwu
2015/01/16 15:12:55
Done.
|
| + data[0] = 0x1; |
| + |
| + std::string actual_md5sum; |
| + EXPECT_EQ(VaapiJpegDecoder::PARSE_ERROR, RunDecode(data, actual_md5sum)); |
| +} |
| + |
| +} // namespace |
| +} // namespace content |
| + |
| +int main(int argc, char** argv) { |
| + testing::InitGoogleTest(&argc, argv); |
| + base::AtExitManager exit_manager; |
| + return RUN_ALL_TESTS(); |
| +} |