1/*
2 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10#ifndef TEST_WEBM_VIDEO_SOURCE_H_
11#define TEST_WEBM_VIDEO_SOURCE_H_
12#include <cstdarg>
13#include <cstdio>
14#include <cstdlib>
15#include <new>
16#include <string>
17#include "../tools_common.h"
18#include "../webmdec.h"
19#include "test/video_source.h"
20
21namespace libvpx_test {
22
23// This class extends VideoSource to allow parsing of WebM files,
24// so that we can do actual file decodes.
25class WebMVideoSource : public CompressedVideoSource {
26 public:
27  explicit WebMVideoSource(const std::string &file_name)
28      : file_name_(file_name),
29        vpx_ctx_(new VpxInputContext()),
30        webm_ctx_(new WebmInputContext()),
31        buf_(NULL),
32        buf_sz_(0),
33        frame_(0),
34        end_of_file_(false) {
35  }
36
37  virtual ~WebMVideoSource() {
38    if (vpx_ctx_->file != NULL)
39      fclose(vpx_ctx_->file);
40    webm_free(webm_ctx_);
41    delete vpx_ctx_;
42    delete webm_ctx_;
43  }
44
45  virtual void Init() {
46  }
47
48  virtual void Begin() {
49    vpx_ctx_->file = OpenTestDataFile(file_name_);
50    ASSERT_TRUE(vpx_ctx_->file != NULL) << "Input file open failed. Filename: "
51        << file_name_;
52
53    ASSERT_EQ(file_is_webm(webm_ctx_, vpx_ctx_), 1) << "file is not WebM";
54
55    FillFrame();
56  }
57
58  virtual void Next() {
59    ++frame_;
60    FillFrame();
61  }
62
63  void FillFrame() {
64    ASSERT_TRUE(vpx_ctx_->file != NULL);
65    const int status = webm_read_frame(webm_ctx_, &buf_, &buf_sz_, &buf_sz_);
66    ASSERT_GE(status, 0) << "webm_read_frame failed";
67    if (status == 1) {
68      end_of_file_ = true;
69    }
70  }
71
72  virtual const uint8_t *cxdata() const {
73    return end_of_file_ ? NULL : buf_;
74  }
75  virtual size_t frame_size() const { return buf_sz_; }
76  virtual unsigned int frame_number() const { return frame_; }
77
78 protected:
79  std::string file_name_;
80  VpxInputContext *vpx_ctx_;
81  WebmInputContext *webm_ctx_;
82  uint8_t *buf_;
83  size_t buf_sz_;
84  unsigned int frame_;
85  bool end_of_file_;
86};
87
88}  // namespace libvpx_test
89
90#endif  // TEST_WEBM_VIDEO_SOURCE_H_
91