xref: /aosp_15_r20/external/libvpx/test/webm_video_source.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2012 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 #ifndef VPX_TEST_WEBM_VIDEO_SOURCE_H_
11*fb1b10abSAndroid Build Coastguard Worker #define VPX_TEST_WEBM_VIDEO_SOURCE_H_
12*fb1b10abSAndroid Build Coastguard Worker #include <cstdarg>
13*fb1b10abSAndroid Build Coastguard Worker #include <cstdio>
14*fb1b10abSAndroid Build Coastguard Worker #include <cstdlib>
15*fb1b10abSAndroid Build Coastguard Worker #include <new>
16*fb1b10abSAndroid Build Coastguard Worker #include <string>
17*fb1b10abSAndroid Build Coastguard Worker #include "../tools_common.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "../webmdec.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "test/video_source.h"
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker namespace libvpx_test {
22*fb1b10abSAndroid Build Coastguard Worker 
23*fb1b10abSAndroid Build Coastguard Worker // This class extends VideoSource to allow parsing of WebM files,
24*fb1b10abSAndroid Build Coastguard Worker // so that we can do actual file decodes.
25*fb1b10abSAndroid Build Coastguard Worker class WebMVideoSource : public CompressedVideoSource {
26*fb1b10abSAndroid Build Coastguard Worker  public:
WebMVideoSource(const std::string & file_name)27*fb1b10abSAndroid Build Coastguard Worker   explicit WebMVideoSource(const std::string &file_name)
28*fb1b10abSAndroid Build Coastguard Worker       : file_name_(file_name), vpx_ctx_(new VpxInputContext()),
29*fb1b10abSAndroid Build Coastguard Worker         webm_ctx_(new WebmInputContext()), buf_(nullptr), buf_sz_(0), frame_(0),
30*fb1b10abSAndroid Build Coastguard Worker         end_of_file_(false) {}
31*fb1b10abSAndroid Build Coastguard Worker 
~WebMVideoSource()32*fb1b10abSAndroid Build Coastguard Worker   ~WebMVideoSource() override {
33*fb1b10abSAndroid Build Coastguard Worker     if (vpx_ctx_->file != nullptr) fclose(vpx_ctx_->file);
34*fb1b10abSAndroid Build Coastguard Worker     webm_free(webm_ctx_);
35*fb1b10abSAndroid Build Coastguard Worker     delete vpx_ctx_;
36*fb1b10abSAndroid Build Coastguard Worker     delete webm_ctx_;
37*fb1b10abSAndroid Build Coastguard Worker   }
38*fb1b10abSAndroid Build Coastguard Worker 
Init()39*fb1b10abSAndroid Build Coastguard Worker   void Init() override {}
40*fb1b10abSAndroid Build Coastguard Worker 
Begin()41*fb1b10abSAndroid Build Coastguard Worker   void Begin() override {
42*fb1b10abSAndroid Build Coastguard Worker     vpx_ctx_->file = OpenTestDataFile(file_name_);
43*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(vpx_ctx_->file, nullptr)
44*fb1b10abSAndroid Build Coastguard Worker         << "Input file open failed. Filename: " << file_name_;
45*fb1b10abSAndroid Build Coastguard Worker 
46*fb1b10abSAndroid Build Coastguard Worker     ASSERT_EQ(file_is_webm(webm_ctx_, vpx_ctx_), 1) << "file is not WebM";
47*fb1b10abSAndroid Build Coastguard Worker 
48*fb1b10abSAndroid Build Coastguard Worker     FillFrame();
49*fb1b10abSAndroid Build Coastguard Worker   }
50*fb1b10abSAndroid Build Coastguard Worker 
Next()51*fb1b10abSAndroid Build Coastguard Worker   void Next() override {
52*fb1b10abSAndroid Build Coastguard Worker     ++frame_;
53*fb1b10abSAndroid Build Coastguard Worker     FillFrame();
54*fb1b10abSAndroid Build Coastguard Worker   }
55*fb1b10abSAndroid Build Coastguard Worker 
FillFrame()56*fb1b10abSAndroid Build Coastguard Worker   void FillFrame() {
57*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(vpx_ctx_->file, nullptr);
58*fb1b10abSAndroid Build Coastguard Worker     const int status = webm_read_frame(webm_ctx_, &buf_, &buf_sz_);
59*fb1b10abSAndroid Build Coastguard Worker     ASSERT_GE(status, 0) << "webm_read_frame failed";
60*fb1b10abSAndroid Build Coastguard Worker     if (status == 1) {
61*fb1b10abSAndroid Build Coastguard Worker       end_of_file_ = true;
62*fb1b10abSAndroid Build Coastguard Worker     }
63*fb1b10abSAndroid Build Coastguard Worker   }
64*fb1b10abSAndroid Build Coastguard Worker 
SeekToNextKeyFrame()65*fb1b10abSAndroid Build Coastguard Worker   void SeekToNextKeyFrame() {
66*fb1b10abSAndroid Build Coastguard Worker     ASSERT_NE(vpx_ctx_->file, nullptr);
67*fb1b10abSAndroid Build Coastguard Worker     do {
68*fb1b10abSAndroid Build Coastguard Worker       const int status = webm_read_frame(webm_ctx_, &buf_, &buf_sz_);
69*fb1b10abSAndroid Build Coastguard Worker       ASSERT_GE(status, 0) << "webm_read_frame failed";
70*fb1b10abSAndroid Build Coastguard Worker       ++frame_;
71*fb1b10abSAndroid Build Coastguard Worker       if (status == 1) {
72*fb1b10abSAndroid Build Coastguard Worker         end_of_file_ = true;
73*fb1b10abSAndroid Build Coastguard Worker       }
74*fb1b10abSAndroid Build Coastguard Worker     } while (!webm_ctx_->is_key_frame && !end_of_file_);
75*fb1b10abSAndroid Build Coastguard Worker   }
76*fb1b10abSAndroid Build Coastguard Worker 
cxdata()77*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *cxdata() const override {
78*fb1b10abSAndroid Build Coastguard Worker     return end_of_file_ ? nullptr : buf_;
79*fb1b10abSAndroid Build Coastguard Worker   }
frame_size()80*fb1b10abSAndroid Build Coastguard Worker   size_t frame_size() const override { return buf_sz_; }
frame_number()81*fb1b10abSAndroid Build Coastguard Worker   unsigned int frame_number() const override { return frame_; }
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker  protected:
84*fb1b10abSAndroid Build Coastguard Worker   std::string file_name_;
85*fb1b10abSAndroid Build Coastguard Worker   VpxInputContext *vpx_ctx_;
86*fb1b10abSAndroid Build Coastguard Worker   WebmInputContext *webm_ctx_;
87*fb1b10abSAndroid Build Coastguard Worker   uint8_t *buf_;
88*fb1b10abSAndroid Build Coastguard Worker   size_t buf_sz_;
89*fb1b10abSAndroid Build Coastguard Worker   unsigned int frame_;
90*fb1b10abSAndroid Build Coastguard Worker   bool end_of_file_;
91*fb1b10abSAndroid Build Coastguard Worker };
92*fb1b10abSAndroid Build Coastguard Worker 
93*fb1b10abSAndroid Build Coastguard Worker }  // namespace libvpx_test
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_TEST_WEBM_VIDEO_SOURCE_H_
96