1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <cstdio>
12*fb1b10abSAndroid Build Coastguard Worker #include <cstdlib>
13*fb1b10abSAndroid Build Coastguard Worker #include <string>
14*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "test/decode_test_driver.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/ivf_video_source.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "test/md5_helper.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
22*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_WEBM_IO
23*fb1b10abSAndroid Build Coastguard Worker #include "test/webm_video_source.h"
24*fb1b10abSAndroid Build Coastguard Worker #endif
25*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
26*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vp8.h"
27*fb1b10abSAndroid Build Coastguard Worker
28*fb1b10abSAndroid Build Coastguard Worker namespace {
29*fb1b10abSAndroid Build Coastguard Worker
30*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
31*fb1b10abSAndroid Build Coastguard Worker using std::string;
32*fb1b10abSAndroid Build Coastguard Worker
33*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_WEBM_IO
34*fb1b10abSAndroid Build Coastguard Worker
CheckUserPrivateData(void * user_priv,int * target)35*fb1b10abSAndroid Build Coastguard Worker void CheckUserPrivateData(void *user_priv, int *target) {
36*fb1b10abSAndroid Build Coastguard Worker // actual pointer value should be the same as expected.
37*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(reinterpret_cast<void *>(target), user_priv)
38*fb1b10abSAndroid Build Coastguard Worker << "user_priv pointer value does not match.";
39*fb1b10abSAndroid Build Coastguard Worker }
40*fb1b10abSAndroid Build Coastguard Worker
41*fb1b10abSAndroid Build Coastguard Worker // Decodes |filename|. Passes in user_priv data when calling DecodeFrame and
42*fb1b10abSAndroid Build Coastguard Worker // compares the user_priv from return img with the original user_priv to see if
43*fb1b10abSAndroid Build Coastguard Worker // they match. Both the pointer values and the values inside the addresses
44*fb1b10abSAndroid Build Coastguard Worker // should match.
DecodeFile(const string & filename)45*fb1b10abSAndroid Build Coastguard Worker string DecodeFile(const string &filename) {
46*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
47*fb1b10abSAndroid Build Coastguard Worker libvpx_test::WebMVideoSource video(filename);
48*fb1b10abSAndroid Build Coastguard Worker video.Init();
49*fb1b10abSAndroid Build Coastguard Worker
50*fb1b10abSAndroid Build Coastguard Worker vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
51*fb1b10abSAndroid Build Coastguard Worker libvpx_test::VP9Decoder decoder(cfg, 0);
52*fb1b10abSAndroid Build Coastguard Worker
53*fb1b10abSAndroid Build Coastguard Worker libvpx_test::MD5 md5;
54*fb1b10abSAndroid Build Coastguard Worker int frame_num = 0;
55*fb1b10abSAndroid Build Coastguard Worker for (video.Begin(); !::testing::Test::HasFailure() && video.cxdata();
56*fb1b10abSAndroid Build Coastguard Worker video.Next()) {
57*fb1b10abSAndroid Build Coastguard Worker void *user_priv = reinterpret_cast<void *>(&frame_num);
58*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_err_t res =
59*fb1b10abSAndroid Build Coastguard Worker decoder.DecodeFrame(video.cxdata(), video.frame_size(),
60*fb1b10abSAndroid Build Coastguard Worker (frame_num == 0) ? nullptr : user_priv);
61*fb1b10abSAndroid Build Coastguard Worker if (res != VPX_CODEC_OK) {
62*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(VPX_CODEC_OK, res) << decoder.DecodeError();
63*fb1b10abSAndroid Build Coastguard Worker break;
64*fb1b10abSAndroid Build Coastguard Worker }
65*fb1b10abSAndroid Build Coastguard Worker libvpx_test::DxDataIterator dec_iter = decoder.GetDxData();
66*fb1b10abSAndroid Build Coastguard Worker const vpx_image_t *img = nullptr;
67*fb1b10abSAndroid Build Coastguard Worker
68*fb1b10abSAndroid Build Coastguard Worker // Get decompressed data.
69*fb1b10abSAndroid Build Coastguard Worker while ((img = dec_iter.Next())) {
70*fb1b10abSAndroid Build Coastguard Worker if (frame_num == 0) {
71*fb1b10abSAndroid Build Coastguard Worker CheckUserPrivateData(img->user_priv, nullptr);
72*fb1b10abSAndroid Build Coastguard Worker } else {
73*fb1b10abSAndroid Build Coastguard Worker CheckUserPrivateData(img->user_priv, &frame_num);
74*fb1b10abSAndroid Build Coastguard Worker
75*fb1b10abSAndroid Build Coastguard Worker // Also test ctrl_get_reference api.
76*fb1b10abSAndroid Build Coastguard Worker struct vp9_ref_frame ref = vp9_ref_frame();
77*fb1b10abSAndroid Build Coastguard Worker // Randomly fetch a reference frame.
78*fb1b10abSAndroid Build Coastguard Worker ref.idx = rnd.Rand8() % 3;
79*fb1b10abSAndroid Build Coastguard Worker decoder.Control(VP9_GET_REFERENCE, &ref);
80*fb1b10abSAndroid Build Coastguard Worker
81*fb1b10abSAndroid Build Coastguard Worker CheckUserPrivateData(ref.img.user_priv, nullptr);
82*fb1b10abSAndroid Build Coastguard Worker }
83*fb1b10abSAndroid Build Coastguard Worker md5.Add(img);
84*fb1b10abSAndroid Build Coastguard Worker }
85*fb1b10abSAndroid Build Coastguard Worker
86*fb1b10abSAndroid Build Coastguard Worker frame_num++;
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker return string(md5.Get());
89*fb1b10abSAndroid Build Coastguard Worker }
90*fb1b10abSAndroid Build Coastguard Worker
TEST(UserPrivTest,VideoDecode)91*fb1b10abSAndroid Build Coastguard Worker TEST(UserPrivTest, VideoDecode) {
92*fb1b10abSAndroid Build Coastguard Worker // no tiles or frame parallel; this exercises the decoding to test the
93*fb1b10abSAndroid Build Coastguard Worker // user_priv.
94*fb1b10abSAndroid Build Coastguard Worker EXPECT_STREQ("b35a1b707b28e82be025d960aba039bc",
95*fb1b10abSAndroid Build Coastguard Worker DecodeFile("vp90-2-03-size-226x226.webm").c_str());
96*fb1b10abSAndroid Build Coastguard Worker }
97*fb1b10abSAndroid Build Coastguard Worker
98*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_WEBM_IO
99*fb1b10abSAndroid Build Coastguard Worker
100*fb1b10abSAndroid Build Coastguard Worker } // namespace
101