xref: /aosp_15_r20/external/libvpx/test/user_priv_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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