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