141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/*
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org */
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "third_party/googletest/src/include/gtest/gtest.h"
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "test/ivf_video_source.h"
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "./vpx_config.h"
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "vpx/vp8dx.h"
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "vpx/vpx_decoder.h"
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgnamespace {
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#define NELEMENTS(x) static_cast<int>(sizeof(x) / sizeof(x[0]))
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(DecodeAPI, InvalidParams) {
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static const vpx_codec_iface_t *kCodecs[] = {
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_VP8_DECODER
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    &vpx_codec_vp8_dx_algo,
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_VP9_DECODER
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    &vpx_codec_vp9_dx_algo,
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  };
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  uint8_t buf[1] = {0};
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vpx_codec_ctx_t dec;
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(NULL, NULL, NULL, 0));
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_dec_init(&dec, NULL, NULL, 0));
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, NULL, 0, NULL, 0));
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_decode(NULL, buf, 0, NULL, 0));
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_decode(NULL, buf, NELEMENTS(buf), NULL, 0));
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_decode(NULL, NULL, NELEMENTS(buf), NULL, 0));
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM, vpx_codec_destroy(NULL));
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_TRUE(vpx_codec_error(NULL) != NULL);
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  for (int i = 0; i < NELEMENTS(kCodecs); ++i) {
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_codec_dec_init(NULL, kCodecs[i], NULL, 0));
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, kCodecs[i], NULL, 0));
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_UNSUP_BITSTREAM,
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_codec_decode(&dec, buf, NELEMENTS(buf), NULL, 0));
5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_codec_decode(&dec, NULL, NELEMENTS(buf), NULL, 0));
5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_codec_decode(&dec, buf, 0, NULL, 0));
5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#if CONFIG_VP9_DECODER
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Test VP9 codec controls after a decode error to ensure the code doesn't
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// misbehave.
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgvoid TestVp9Controls(vpx_codec_ctx_t *dec) {
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  static const int kControls[] = {
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    VP8D_GET_LAST_REF_UPDATES,
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    VP8D_GET_FRAME_CORRUPTED,
6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    VP9D_GET_DISPLAY_SIZE,
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  };
6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  int val[2];
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  for (int i = 0; i < NELEMENTS(kControls); ++i) {
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    const vpx_codec_err_t res = vpx_codec_control_(dec, kControls[i], val);
7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    switch (kControls[i]) {
7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      case VP8D_GET_FRAME_CORRUPTED:
7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        EXPECT_EQ(VPX_CODEC_ERROR, res) << kControls[i];
7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        break;
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      default:
7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        EXPECT_EQ(VPX_CODEC_OK, res) << kControls[i];
7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        break;
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              vpx_codec_control_(dec, kControls[i], NULL));
8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vp9_ref_frame_t ref;
8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ref.idx = 0;
8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_ERROR, vpx_codec_control(dec, VP9_GET_REFERENCE, &ref));
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_control(dec, VP9_GET_REFERENCE, NULL));
9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vpx_ref_frame_t ref_copy;
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const int width = 352;
9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const int height = 288;
9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ASSERT_TRUE(
9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      vpx_img_alloc(&ref_copy.img, VPX_IMG_FMT_I420, width, height, 1) != NULL);
9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ref_copy.frame_type = VP8_LAST_FRAME;
9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_ERROR,
9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_control(dec, VP8_COPY_REFERENCE, &ref_copy));
9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_INVALID_PARAM,
10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_control(dec, VP8_COPY_REFERENCE, NULL));
10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vpx_img_free(&ref_copy.img);
10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgTEST(DecodeAPI, Vp9InvalidDecode) {
10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const vpx_codec_iface_t *const codec = &vpx_codec_vp9_dx_algo;
10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const char filename[] =
10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      "invalid-vp90-2-00-quantizer-00.webm.ivf.s5861_r01-05_b6-.v2.ivf";
10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  libvpx_test::IVFVideoSource video(filename);
10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  video.Init();
11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  video.Begin();
11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  ASSERT_TRUE(!HasFailure());
11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vpx_codec_ctx_t dec;
11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_OK, vpx_codec_dec_init(&dec, codec, NULL, 0));
11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  const uint32_t frame_size = static_cast<uint32_t>(video.frame_size());
11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_MEM_ERROR,
11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            vpx_codec_decode(&dec, video.cxdata(), frame_size, NULL, 0));
11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  vpx_codec_iter_t iter = NULL;
11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(NULL, vpx_codec_get_frame(&dec, &iter));
12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  TestVp9Controls(&dec);
12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&dec));
12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif  // CONFIG_VP9_DECODER
12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}  // namespace
127