Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 1 | /* |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 3 | * |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 4 | * This source code is subject to the terms of the BSD 2 Clause License and |
| 5 | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| 6 | * was not distributed with this source code in the LICENSE file, you can |
| 7 | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| 8 | * Media Patent License 1.0 was not distributed with this source code in the |
| 9 | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
Johann | 123e8a6 | 2017-12-28 14:40:49 -0800 | [diff] [blame] | 10 | */ |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 11 | |
Tom Finegan | 7a07ece | 2017-02-07 17:14:05 -0800 | [diff] [blame] | 12 | #include "third_party/googletest/src/googletest/include/gtest/gtest.h" |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 13 | |
John Koleszar | 706cafe | 2013-01-18 11:51:12 -0800 | [diff] [blame] | 14 | #include "test/codec_factory.h" |
Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 15 | #include "test/decode_test_driver.h" |
James Zern | eebb648 | 2012-11-27 13:08:05 -0800 | [diff] [blame] | 16 | #include "test/register_state_check.h" |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 17 | #include "test/video_source.h" |
Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 18 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 19 | namespace libaom_test { |
Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 20 | |
Peter de Rivaz | 105fa6d | 2016-09-27 15:24:03 +0100 | [diff] [blame] | 21 | const char kAV1Name[] = "AOMedia Project AV1 Decoder"; |
Jim Bankoski | 96727b9 | 2014-06-23 08:37:18 -0700 | [diff] [blame] | 22 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 23 | aom_codec_err_t Decoder::PeekStream(const uint8_t *cxdata, size_t size, |
| 24 | aom_codec_stream_info_t *stream_info) { |
Tom Finegan | 21f4825 | 2018-05-15 11:31:04 -0700 | [diff] [blame] | 25 | return aom_codec_peek_stream_info(CodecInterface(), cxdata, size, |
| 26 | stream_info); |
Jim Bankoski | 96727b9 | 2014-06-23 08:37:18 -0700 | [diff] [blame] | 27 | } |
| 28 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 29 | aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size) { |
hkuang | 5e7242d | 2014-06-23 14:59:20 -0700 | [diff] [blame] | 30 | return DecodeFrame(cxdata, size, NULL); |
| 31 | } |
| 32 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 33 | aom_codec_err_t Decoder::DecodeFrame(const uint8_t *cxdata, size_t size, |
hkuang | 5e7242d | 2014-06-23 14:59:20 -0700 | [diff] [blame] | 34 | void *user_priv) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 35 | aom_codec_err_t res_dec; |
John Koleszar | 771fc83 | 2013-03-27 10:41:29 -0700 | [diff] [blame] | 36 | InitOnce(); |
James Zern | 29e1b1a | 2014-07-09 21:02:02 -0700 | [diff] [blame] | 37 | API_REGISTER_STATE_CHECK( |
Tom Finegan | 21f4825 | 2018-05-15 11:31:04 -0700 | [diff] [blame] | 38 | res_dec = aom_codec_decode(&decoder_, cxdata, size, user_priv)); |
Dmitry Kovalev | 26cec5c | 2013-03-15 18:21:55 -0700 | [diff] [blame] | 39 | return res_dec; |
Yaowu Xu | c953aea | 2012-08-30 13:43:15 -0700 | [diff] [blame] | 40 | } |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 41 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 42 | bool Decoder::IsAV1() const { |
Yunqing Wang | 8e5e338 | 2016-05-05 16:42:57 -0700 | [diff] [blame] | 43 | const char *codec_name = GetDecoderName(); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 44 | return strncmp(kAV1Name, codec_name, sizeof(kAV1Name) - 1) == 0; |
Yunqing Wang | 8e5e338 | 2016-05-05 16:42:57 -0700 | [diff] [blame] | 45 | } |
| 46 | |
Tom Finegan | c8c928c | 2018-02-26 14:31:13 -0800 | [diff] [blame] | 47 | void DecoderTest::HandlePeekResult(Decoder *const /*decoder*/, |
| 48 | CompressedVideoSource * /*video*/, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 49 | const aom_codec_err_t res_peek) { |
Tom Finegan | c8c928c | 2018-02-26 14:31:13 -0800 | [diff] [blame] | 50 | /* The Av1 implementation of PeekStream returns an error only if the |
| 51 | * data passed to it isn't a valid Av1 chunk. */ |
| 52 | ASSERT_EQ(AOM_CODEC_OK, res_peek) |
| 53 | << "Peek return failed: " << aom_codec_err_to_string(res_peek); |
Deb Mukherjee | c447a50 | 2014-07-15 01:54:29 -0700 | [diff] [blame] | 54 | } |
| 55 | |
hkuang | c147cf3 | 2014-07-01 16:04:53 -0700 | [diff] [blame] | 56 | void DecoderTest::RunLoop(CompressedVideoSource *video, |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 57 | const aom_codec_dec_cfg_t &dec_cfg) { |
James Zern | 3b96b76 | 2017-03-24 17:12:19 -0700 | [diff] [blame] | 58 | Decoder *const decoder = codec_->CreateDecoder(dec_cfg, flags_); |
John Koleszar | 706cafe | 2013-01-18 11:51:12 -0800 | [diff] [blame] | 59 | ASSERT_TRUE(decoder != NULL); |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 60 | bool end_of_file = false; |
Yaowu Xu | c657779 | 2018-05-30 08:04:06 -0700 | [diff] [blame] | 61 | bool peeked_stream = false; |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 62 | |
| 63 | // Decode frames. |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 64 | for (video->Begin(); !::testing::Test::HasFailure() && !end_of_file; |
James Zern | 8f5b81f | 2014-06-21 19:04:12 -0700 | [diff] [blame] | 65 | video->Next()) { |
Frank Galligan | f9d69bd | 2013-12-09 17:07:10 -0800 | [diff] [blame] | 66 | PreDecodeFrameHook(*video, decoder); |
Jim Bankoski | 96727b9 | 2014-06-23 08:37:18 -0700 | [diff] [blame] | 67 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 68 | aom_codec_stream_info_t stream_info; |
Wan-Teh Chang | e74099f | 2018-05-23 14:57:35 -0700 | [diff] [blame] | 69 | stream_info.is_annexb = 0; |
| 70 | |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 71 | if (video->cxdata() != NULL) { |
Yaowu Xu | c657779 | 2018-05-30 08:04:06 -0700 | [diff] [blame] | 72 | if (!peeked_stream) { |
| 73 | // TODO(yaowu): PeekStream returns error for non-sequence_header_obu, |
| 74 | // therefore should only be tried once per sequence, this shall be fixed |
| 75 | // once PeekStream is updated to properly operate on other obus. |
| 76 | const aom_codec_err_t res_peek = decoder->PeekStream( |
| 77 | video->cxdata(), video->frame_size(), &stream_info); |
| 78 | HandlePeekResult(decoder, video, res_peek); |
| 79 | ASSERT_FALSE(::testing::Test::HasFailure()); |
| 80 | peeked_stream = true; |
| 81 | } |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 82 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 83 | aom_codec_err_t res_dec = |
clang-format | 3a826f1 | 2016-08-11 17:46:05 -0700 | [diff] [blame] | 84 | decoder->DecodeFrame(video->cxdata(), video->frame_size()); |
Wan-Teh Chang | 6fe004d | 2018-04-30 16:50:29 -0700 | [diff] [blame] | 85 | if (!HandleDecodeResult(res_dec, *video, decoder)) break; |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 86 | } else { |
| 87 | // Signal end of the file to the decoder. |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 88 | const aom_codec_err_t res_dec = decoder->DecodeFrame(NULL, 0); |
| 89 | ASSERT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); |
Hangyu Kuang | 7050074 | 2014-07-31 19:04:35 -0700 | [diff] [blame] | 90 | end_of_file = true; |
| 91 | } |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 92 | |
John Koleszar | 706cafe | 2013-01-18 11:51:12 -0800 | [diff] [blame] | 93 | DxDataIterator dec_iter = decoder->GetDxData(); |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 94 | const aom_image_t *img = NULL; |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 95 | |
| 96 | // Get decompressed data |
James Zern | 9af24c3 | 2018-07-10 20:47:25 -0700 | [diff] [blame] | 97 | while (!::testing::Test::HasFailure() && (img = dec_iter.Next())) |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 98 | DecompressedFrameHook(*img, video->frame_number()); |
| 99 | } |
John Koleszar | 706cafe | 2013-01-18 11:51:12 -0800 | [diff] [blame] | 100 | delete decoder; |
Yunqing Wang | 15dffcf | 2012-10-04 12:59:36 -0700 | [diff] [blame] | 101 | } |
hkuang | c147cf3 | 2014-07-01 16:04:53 -0700 | [diff] [blame] | 102 | |
| 103 | void DecoderTest::RunLoop(CompressedVideoSource *video) { |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 104 | aom_codec_dec_cfg_t dec_cfg = aom_codec_dec_cfg_t(); |
hkuang | c147cf3 | 2014-07-01 16:04:53 -0700 | [diff] [blame] | 105 | RunLoop(video, dec_cfg); |
| 106 | } |
| 107 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 108 | void DecoderTest::set_cfg(const aom_codec_dec_cfg_t &dec_cfg) { |
hkuang | 9353607 | 2014-11-20 15:39:56 -0800 | [diff] [blame] | 109 | memcpy(&cfg_, &dec_cfg, sizeof(cfg_)); |
| 110 | } |
| 111 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 112 | void DecoderTest::set_flags(const aom_codec_flags_t flags) { flags_ = flags; } |
hkuang | 9353607 | 2014-11-20 15:39:56 -0800 | [diff] [blame] | 113 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 114 | } // namespace libaom_test |