Merge "Simplify rd_pick_intra_sby_mode()"
[platform/upstream/libvpx.git] / test / decode_api_test.cc
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  */
10 #include "third_party/googletest/src/include/gtest/gtest.h"
11
12 #include "test/ivf_video_source.h"
13 #include "./vpx_config.h"
14 #include "vpx/vp8dx.h"
15 #include "vpx/vpx_decoder.h"
16
17 namespace {
18
19 #define NELEMENTS(x) static_cast<int>(sizeof(x) / sizeof(x[0]))
20
21 TEST(DecodeAPI, InvalidParams) {
22   static const vpx_codec_iface_t *kCodecs[] = {
23 #if CONFIG_VP8_DECODER
24     &vpx_codec_vp8_dx_algo,
25 #endif
26 #if CONFIG_VP9_DECODER
27     &vpx_codec_vp9_dx_algo,
28 #endif
29   };
30   uint8_t buf[1] = {0};
31   vpx_codec_ctx_t dec;
32
33   EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(NULL, NULL, NULL, 0));
34   EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(&dec, NULL, NULL, 0));
35   EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, NULL, 0, NULL, 0));
36   EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, buf, 0, NULL, 0));
37   EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
38             vpx_codec_decode(NULL, buf, NELEMENTS(buf), NULL, 0));
39   EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
40             vpx_codec_decode(NULL, NULL, NELEMENTS(buf), NULL, 0));
41   EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_destroy(NULL));
42   EXPECT_TRUE(vpx_codec_error(NULL) != NULL);
43
44   for (int i = 0; i < NELEMENTS(kCodecs); ++i) {
45     EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
46               vpx_codec_dec_init(NULL, kCodecs[i], NULL, 0));
47
48     EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, kCodecs[i], NULL, 0));
49     EXPECT_EQ(VPX_CODEC_UNSUP_BITSTREAM,
50               vpx_codec_decode(&dec, buf, NELEMENTS(buf), NULL, 0));
51     EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
52               vpx_codec_decode(&dec, NULL, NELEMENTS(buf), NULL, 0));
53     EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
54               vpx_codec_decode(&dec, buf, 0, NULL, 0));
55
56     EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
57   }
58 }
59
60 #if CONFIG_VP9_DECODER
61 // Test VP9 codec controls after a decode error to ensure the code doesn't
62 // misbehave.
63 void TestVp9Controls(vpx_codec_ctx_t *dec) {
64   static const int kControls[] = {
65     VP8D_GET_LAST_REF_UPDATES,
66     VP8D_GET_FRAME_CORRUPTED,
67     VP9D_GET_DISPLAY_SIZE,
68   };
69   int val[2];
70
71   for (int i = 0; i < NELEMENTS(kControls); ++i) {
72     const vpx_codec_err_t res = vpx_codec_control_(dec, kControls[i], val);
73     switch (kControls[i]) {
74       case VP8D_GET_FRAME_CORRUPTED:
75         EXPECT_EQ(VPX_CODEC_ERROR, res) << kControls[i];
76         break;
77       default:
78         EXPECT_EQ(VPX_CODEC_OK, res) << kControls[i];
79         break;
80     }
81     EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
82               vpx_codec_control_(dec, kControls[i], NULL));
83   }
84
85   vp9_ref_frame_t ref;
86   ref.idx = 0;
87   EXPECT_EQ(VPX_CODEC_ERROR, vpx_codec_control(dec, VP9_GET_REFERENCE, &ref));
88   EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
89             vpx_codec_control(dec, VP9_GET_REFERENCE, NULL));
90
91   vpx_ref_frame_t ref_copy;
92   const int width = 352;
93   const int height = 288;
94   ASSERT_TRUE(
95       vpx_img_alloc(&ref_copy.img, VPX_IMG_FMT_I420, width, height, 1) != NULL);
96   ref_copy.frame_type = VP8_LAST_FRAME;
97   EXPECT_EQ(VPX_CODEC_ERROR,
98             vpx_codec_control(dec, VP8_COPY_REFERENCE, &ref_copy));
99   EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
100             vpx_codec_control(dec, VP8_COPY_REFERENCE, NULL));
101   vpx_img_free(&ref_copy.img);
102 }
103
104 TEST(DecodeAPI, Vp9InvalidDecode) {
105   const vpx_codec_iface_t *const codec = &vpx_codec_vp9_dx_algo;
106   const char filename[] =
107       "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.v2.ivf";
108   libvpx_test::IVFVideoSource video(filename);
109   video.Init();
110   video.Begin();
111   ASSERT_TRUE(!HasFailure());
112
113   vpx_codec_ctx_t dec;
114   EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, codec, NULL, 0));
115   const uint32_t frame_size = static_cast<uint32_t>(video.frame_size());
116   EXPECT_EQ(VPX_CODEC_MEM_ERROR,
117             vpx_codec_decode(&dec, video.cxdata(), frame_size, NULL, 0));
118   vpx_codec_iter_t iter = NULL;
119   EXPECT_EQ(NULL, vpx_codec_get_frame(&dec, &iter));
120
121   TestVp9Controls(&dec);
122   EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
123 }
124 #endif  // CONFIG_VP9_DECODER
125
126 }  // namespace