xref: /aosp_15_r20/external/libaom/test/webm_video_source.h (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_TEST_WEBM_VIDEO_SOURCE_H_
12*77c1e3ccSAndroid Build Coastguard Worker #define AOM_TEST_WEBM_VIDEO_SOURCE_H_
13*77c1e3ccSAndroid Build Coastguard Worker #include <cstdarg>
14*77c1e3ccSAndroid Build Coastguard Worker #include <cstdio>
15*77c1e3ccSAndroid Build Coastguard Worker #include <cstdlib>
16*77c1e3ccSAndroid Build Coastguard Worker #include <new>
17*77c1e3ccSAndroid Build Coastguard Worker #include <string>
18*77c1e3ccSAndroid Build Coastguard Worker #include "common/tools_common.h"
19*77c1e3ccSAndroid Build Coastguard Worker #include "common/webmdec.h"
20*77c1e3ccSAndroid Build Coastguard Worker #include "test/video_source.h"
21*77c1e3ccSAndroid Build Coastguard Worker 
22*77c1e3ccSAndroid Build Coastguard Worker namespace libaom_test {
23*77c1e3ccSAndroid Build Coastguard Worker 
24*77c1e3ccSAndroid Build Coastguard Worker // This class extends VideoSource to allow parsing of WebM files,
25*77c1e3ccSAndroid Build Coastguard Worker // so that we can do actual file decodes.
26*77c1e3ccSAndroid Build Coastguard Worker class WebMVideoSource : public CompressedVideoSource {
27*77c1e3ccSAndroid Build Coastguard Worker  public:
WebMVideoSource(const std::string & file_name)28*77c1e3ccSAndroid Build Coastguard Worker   explicit WebMVideoSource(const std::string &file_name)
29*77c1e3ccSAndroid Build Coastguard Worker       : file_name_(file_name), aom_ctx_(new AvxInputContext()),
30*77c1e3ccSAndroid Build Coastguard Worker         webm_ctx_(new WebmInputContext()), buf_(nullptr), buf_sz_(0),
31*77c1e3ccSAndroid Build Coastguard Worker         frame_sz_(0), frame_number_(0), end_of_file_(false) {}
32*77c1e3ccSAndroid Build Coastguard Worker 
~WebMVideoSource()33*77c1e3ccSAndroid Build Coastguard Worker   ~WebMVideoSource() override {
34*77c1e3ccSAndroid Build Coastguard Worker     if (aom_ctx_->file != nullptr) fclose(aom_ctx_->file);
35*77c1e3ccSAndroid Build Coastguard Worker     webm_free(webm_ctx_);
36*77c1e3ccSAndroid Build Coastguard Worker     delete aom_ctx_;
37*77c1e3ccSAndroid Build Coastguard Worker     delete webm_ctx_;
38*77c1e3ccSAndroid Build Coastguard Worker   }
39*77c1e3ccSAndroid Build Coastguard Worker 
Init()40*77c1e3ccSAndroid Build Coastguard Worker   void Init() override {
41*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_, nullptr);
42*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(webm_ctx_, nullptr);
43*77c1e3ccSAndroid Build Coastguard Worker   }
44*77c1e3ccSAndroid Build Coastguard Worker 
Begin()45*77c1e3ccSAndroid Build Coastguard Worker   void Begin() override {
46*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_, nullptr);
47*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(webm_ctx_, nullptr);
48*77c1e3ccSAndroid Build Coastguard Worker     aom_ctx_->file = OpenTestDataFile(file_name_);
49*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_->file, nullptr)
50*77c1e3ccSAndroid Build Coastguard Worker         << "Input file open failed. Filename: " << file_name_;
51*77c1e3ccSAndroid Build Coastguard Worker 
52*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_EQ(file_is_webm(webm_ctx_, aom_ctx_), 1) << "file is not WebM";
53*77c1e3ccSAndroid Build Coastguard Worker 
54*77c1e3ccSAndroid Build Coastguard Worker     FillFrame();
55*77c1e3ccSAndroid Build Coastguard Worker   }
56*77c1e3ccSAndroid Build Coastguard Worker 
Next()57*77c1e3ccSAndroid Build Coastguard Worker   void Next() override {
58*77c1e3ccSAndroid Build Coastguard Worker     ++frame_number_;
59*77c1e3ccSAndroid Build Coastguard Worker     FillFrame();
60*77c1e3ccSAndroid Build Coastguard Worker   }
61*77c1e3ccSAndroid Build Coastguard Worker 
FillFrame()62*77c1e3ccSAndroid Build Coastguard Worker   void FillFrame() {
63*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_, nullptr);
64*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(webm_ctx_, nullptr);
65*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_->file, nullptr);
66*77c1e3ccSAndroid Build Coastguard Worker     const int status = webm_read_frame(webm_ctx_, &buf_, &frame_sz_, &buf_sz_);
67*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_GE(status, 0) << "webm_read_frame failed";
68*77c1e3ccSAndroid Build Coastguard Worker     if (status == 1) {
69*77c1e3ccSAndroid Build Coastguard Worker       end_of_file_ = true;
70*77c1e3ccSAndroid Build Coastguard Worker     }
71*77c1e3ccSAndroid Build Coastguard Worker   }
72*77c1e3ccSAndroid Build Coastguard Worker 
SeekToNextKeyFrame()73*77c1e3ccSAndroid Build Coastguard Worker   void SeekToNextKeyFrame() {
74*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_, nullptr);
75*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(webm_ctx_, nullptr);
76*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(aom_ctx_->file, nullptr);
77*77c1e3ccSAndroid Build Coastguard Worker     do {
78*77c1e3ccSAndroid Build Coastguard Worker       const int status =
79*77c1e3ccSAndroid Build Coastguard Worker           webm_read_frame(webm_ctx_, &buf_, &frame_sz_, &buf_sz_);
80*77c1e3ccSAndroid Build Coastguard Worker       ASSERT_GE(status, 0) << "webm_read_frame failed";
81*77c1e3ccSAndroid Build Coastguard Worker       ++frame_number_;
82*77c1e3ccSAndroid Build Coastguard Worker       if (status == 1) {
83*77c1e3ccSAndroid Build Coastguard Worker         end_of_file_ = true;
84*77c1e3ccSAndroid Build Coastguard Worker       }
85*77c1e3ccSAndroid Build Coastguard Worker     } while (!webm_ctx_->is_key_frame && !end_of_file_);
86*77c1e3ccSAndroid Build Coastguard Worker   }
87*77c1e3ccSAndroid Build Coastguard Worker 
cxdata()88*77c1e3ccSAndroid Build Coastguard Worker   const uint8_t *cxdata() const override {
89*77c1e3ccSAndroid Build Coastguard Worker     return end_of_file_ ? nullptr : buf_;
90*77c1e3ccSAndroid Build Coastguard Worker   }
frame_size()91*77c1e3ccSAndroid Build Coastguard Worker   size_t frame_size() const override { return frame_sz_; }
frame_number()92*77c1e3ccSAndroid Build Coastguard Worker   unsigned int frame_number() const override { return frame_number_; }
93*77c1e3ccSAndroid Build Coastguard Worker 
94*77c1e3ccSAndroid Build Coastguard Worker  protected:
95*77c1e3ccSAndroid Build Coastguard Worker   std::string file_name_;
96*77c1e3ccSAndroid Build Coastguard Worker   AvxInputContext *aom_ctx_;
97*77c1e3ccSAndroid Build Coastguard Worker   WebmInputContext *webm_ctx_;
98*77c1e3ccSAndroid Build Coastguard Worker   uint8_t *buf_;  // Owned by webm_ctx_ and freed when webm_ctx_ is freed.
99*77c1e3ccSAndroid Build Coastguard Worker   size_t buf_sz_;
100*77c1e3ccSAndroid Build Coastguard Worker   size_t frame_sz_;
101*77c1e3ccSAndroid Build Coastguard Worker   unsigned int frame_number_;
102*77c1e3ccSAndroid Build Coastguard Worker   bool end_of_file_;
103*77c1e3ccSAndroid Build Coastguard Worker };
104*77c1e3ccSAndroid Build Coastguard Worker 
105*77c1e3ccSAndroid Build Coastguard Worker }  // namespace libaom_test
106*77c1e3ccSAndroid Build Coastguard Worker 
107*77c1e3ccSAndroid Build Coastguard Worker #endif  // AOM_TEST_WEBM_VIDEO_SOURCE_H_
108