James Zern | 6a2e9ef | 2014-08-09 18:35:40 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2014 The WebM project authors. All Rights Reserved. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 10 | |
James Zern | 6a2e9ef | 2014-08-09 18:35:40 -0700 | [diff] [blame] | 11 | #include "third_party/googletest/src/include/gtest/gtest.h" |
| 12 | |
| 13 | #include "./vpx_config.h" |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 14 | #include "test/ivf_video_source.h" |
James Zern | 6a2e9ef | 2014-08-09 18:35:40 -0700 | [diff] [blame] | 15 | #include "vpx/vp8dx.h" |
| 16 | #include "vpx/vpx_decoder.h" |
| 17 | |
| 18 | namespace { |
| 19 | |
| 20 | #define NELEMENTS(x) static_cast<int>(sizeof(x) / sizeof(x[0])) |
| 21 | |
| 22 | TEST(DecodeAPI, InvalidParams) { |
| 23 | static const vpx_codec_iface_t *kCodecs[] = { |
| 24 | #if CONFIG_VP8_DECODER |
| 25 | &vpx_codec_vp8_dx_algo, |
| 26 | #endif |
| 27 | #if CONFIG_VP9_DECODER |
| 28 | &vpx_codec_vp9_dx_algo, |
| 29 | #endif |
Jingning Han | 3ee6db6 | 2015-08-05 19:00:31 -0700 | [diff] [blame] | 30 | #if CONFIG_VP10_DECODER |
| 31 | &vpx_codec_vp10_dx_algo, |
| 32 | #endif |
James Zern | 6a2e9ef | 2014-08-09 18:35:40 -0700 | [diff] [blame] | 33 | }; |
| 34 | uint8_t buf[1] = {0}; |
| 35 | vpx_codec_ctx_t dec; |
| 36 | |
| 37 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(NULL, NULL, NULL, 0)); |
| 38 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(&dec, NULL, NULL, 0)); |
| 39 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, NULL, 0, NULL, 0)); |
| 40 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, buf, 0, NULL, 0)); |
| 41 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 42 | vpx_codec_decode(NULL, buf, NELEMENTS(buf), NULL, 0)); |
| 43 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 44 | vpx_codec_decode(NULL, NULL, NELEMENTS(buf), NULL, 0)); |
| 45 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_destroy(NULL)); |
| 46 | EXPECT_TRUE(vpx_codec_error(NULL) != NULL); |
| 47 | |
| 48 | for (int i = 0; i < NELEMENTS(kCodecs); ++i) { |
| 49 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 50 | vpx_codec_dec_init(NULL, kCodecs[i], NULL, 0)); |
| 51 | |
| 52 | EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, kCodecs[i], NULL, 0)); |
| 53 | EXPECT_EQ(VPX_CODEC_UNSUP_BITSTREAM, |
| 54 | vpx_codec_decode(&dec, buf, NELEMENTS(buf), NULL, 0)); |
| 55 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 56 | vpx_codec_decode(&dec, NULL, NELEMENTS(buf), NULL, 0)); |
| 57 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 58 | vpx_codec_decode(&dec, buf, 0, NULL, 0)); |
| 59 | |
| 60 | EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec)); |
| 61 | } |
| 62 | } |
| 63 | |
Johann | 39a74e1 | 2014-12-18 17:36:58 -0800 | [diff] [blame] | 64 | #if CONFIG_VP8_DECODER |
| 65 | TEST(DecodeAPI, OptionalParams) { |
| 66 | vpx_codec_ctx_t dec; |
| 67 | |
| 68 | #if CONFIG_ERROR_CONCEALMENT |
| 69 | EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, &vpx_codec_vp8_dx_algo, NULL, |
| 70 | VPX_CODEC_USE_ERROR_CONCEALMENT)); |
| 71 | #else |
| 72 | EXPECT_EQ(VPX_CODEC_INCAPABLE, |
| 73 | vpx_codec_dec_init(&dec, &vpx_codec_vp8_dx_algo, NULL, |
| 74 | VPX_CODEC_USE_ERROR_CONCEALMENT)); |
| 75 | #endif // CONFIG_ERROR_CONCEALMENT |
| 76 | } |
| 77 | #endif // CONFIG_VP8_DECODER |
| 78 | |
James Zern | 7d9da93 | 2014-08-09 18:47:58 -0700 | [diff] [blame] | 79 | #if CONFIG_VP9_DECODER |
| 80 | // Test VP9 codec controls after a decode error to ensure the code doesn't |
| 81 | // misbehave. |
| 82 | void TestVp9Controls(vpx_codec_ctx_t *dec) { |
| 83 | static const int kControls[] = { |
| 84 | VP8D_GET_LAST_REF_UPDATES, |
| 85 | VP8D_GET_FRAME_CORRUPTED, |
| 86 | VP9D_GET_DISPLAY_SIZE, |
Adrian Grange | cf54b88 | 2015-02-13 08:14:44 -0800 | [diff] [blame] | 87 | VP9D_GET_FRAME_SIZE |
James Zern | 7d9da93 | 2014-08-09 18:47:58 -0700 | [diff] [blame] | 88 | }; |
| 89 | int val[2]; |
| 90 | |
| 91 | for (int i = 0; i < NELEMENTS(kControls); ++i) { |
| 92 | const vpx_codec_err_t res = vpx_codec_control_(dec, kControls[i], val); |
| 93 | switch (kControls[i]) { |
| 94 | case VP8D_GET_FRAME_CORRUPTED: |
| 95 | EXPECT_EQ(VPX_CODEC_ERROR, res) << kControls[i]; |
| 96 | break; |
| 97 | default: |
| 98 | EXPECT_EQ(VPX_CODEC_OK, res) << kControls[i]; |
| 99 | break; |
| 100 | } |
| 101 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 102 | vpx_codec_control_(dec, kControls[i], NULL)); |
| 103 | } |
James Zern | 3caed4f | 2014-08-09 18:54:28 -0700 | [diff] [blame] | 104 | |
| 105 | vp9_ref_frame_t ref; |
| 106 | ref.idx = 0; |
| 107 | EXPECT_EQ(VPX_CODEC_ERROR, vpx_codec_control(dec, VP9_GET_REFERENCE, &ref)); |
| 108 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 109 | vpx_codec_control(dec, VP9_GET_REFERENCE, NULL)); |
| 110 | |
| 111 | vpx_ref_frame_t ref_copy; |
| 112 | const int width = 352; |
| 113 | const int height = 288; |
| 114 | ASSERT_TRUE( |
| 115 | vpx_img_alloc(&ref_copy.img, VPX_IMG_FMT_I420, width, height, 1) != NULL); |
| 116 | ref_copy.frame_type = VP8_LAST_FRAME; |
| 117 | EXPECT_EQ(VPX_CODEC_ERROR, |
| 118 | vpx_codec_control(dec, VP8_COPY_REFERENCE, &ref_copy)); |
| 119 | EXPECT_EQ(VPX_CODEC_INVALID_PARAM, |
| 120 | vpx_codec_control(dec, VP8_COPY_REFERENCE, NULL)); |
| 121 | vpx_img_free(&ref_copy.img); |
James Zern | 7d9da93 | 2014-08-09 18:47:58 -0700 | [diff] [blame] | 122 | } |
| 123 | |
| 124 | TEST(DecodeAPI, Vp9InvalidDecode) { |
| 125 | const vpx_codec_iface_t *const codec = &vpx_codec_vp9_dx_algo; |
| 126 | const char filename[] = |
| 127 | "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.v2.ivf"; |
| 128 | libvpx_test::IVFVideoSource video(filename); |
| 129 | video.Init(); |
| 130 | video.Begin(); |
| 131 | ASSERT_TRUE(!HasFailure()); |
| 132 | |
| 133 | vpx_codec_ctx_t dec; |
| 134 | EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, codec, NULL, 0)); |
James Zern | caffcb8 | 2014-08-12 23:11:38 -0700 | [diff] [blame] | 135 | const uint32_t frame_size = static_cast<uint32_t>(video.frame_size()); |
Yaowu Xu | 7c0c62d | 2015-07-16 15:40:22 -0700 | [diff] [blame] | 136 | #if CONFIG_VP9_HIGHBITDEPTH |
James Zern | 7d9da93 | 2014-08-09 18:47:58 -0700 | [diff] [blame] | 137 | EXPECT_EQ(VPX_CODEC_MEM_ERROR, |
James Zern | caffcb8 | 2014-08-12 23:11:38 -0700 | [diff] [blame] | 138 | vpx_codec_decode(&dec, video.cxdata(), frame_size, NULL, 0)); |
Yaowu Xu | 7c0c62d | 2015-07-16 15:40:22 -0700 | [diff] [blame] | 139 | #else |
| 140 | EXPECT_EQ(VPX_CODEC_UNSUP_BITSTREAM, |
| 141 | vpx_codec_decode(&dec, video.cxdata(), frame_size, NULL, 0)); |
| 142 | #endif |
James Zern | 7d9da93 | 2014-08-09 18:47:58 -0700 | [diff] [blame] | 143 | vpx_codec_iter_t iter = NULL; |
| 144 | EXPECT_EQ(NULL, vpx_codec_get_frame(&dec, &iter)); |
| 145 | |
| 146 | TestVp9Controls(&dec); |
| 147 | EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec)); |
| 148 | } |
| 149 | #endif // CONFIG_VP9_DECODER |
| 150 | |
James Zern | 6a2e9ef | 2014-08-09 18:35:40 -0700 | [diff] [blame] | 151 | } // namespace |