15dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org/* 25dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 35dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * 45dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * Use of this source code is governed by a BSD-style license 55dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * that can be found in the LICENSE file in the root of the source 65dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * tree. An additional intellectual property rights grant can be found 75dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * in the file PATENTS. All contributing project authors may 85dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org * be found in the AUTHORS file in the root of the source tree. 95dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org */ 105dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#ifndef TEST_WEBM_VIDEO_SOURCE_H_ 115dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#define TEST_WEBM_VIDEO_SOURCE_H_ 125dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include <cstdarg> 135dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include <cstdio> 145dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include <cstdlib> 155dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include <new> 165dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include <string> 17693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "../tools_common.h" 18693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com#include "../webmdec.h" 195dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#include "test/video_source.h" 205dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 215dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.orgnamespace libvpx_test { 225dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 235dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org// This class extends VideoSource to allow parsing of WebM files, 245dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org// so that we can do actual file decodes. 255dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.orgclass WebMVideoSource : public CompressedVideoSource { 265dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org public: 275dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org explicit WebMVideoSource(const std::string &file_name) 285dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org : file_name_(file_name), 29693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_ctx_(new VpxInputContext()), 30693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com webm_ctx_(new WebmInputContext()), 315dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org buf_(NULL), 325dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org buf_sz_(0), 335dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org frame_(0), 345dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org end_of_file_(false) { 355dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 365dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 375dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org virtual ~WebMVideoSource() { 38693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com if (vpx_ctx_->file != NULL) 39693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com fclose(vpx_ctx_->file); 40693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com webm_free(webm_ctx_); 41693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com delete vpx_ctx_; 42693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com delete webm_ctx_; 435dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 445dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 455dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org virtual void Init() { 465dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 475dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 485dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org virtual void Begin() { 49693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com vpx_ctx_->file = OpenTestDataFile(file_name_); 50693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_TRUE(vpx_ctx_->file != NULL) << "Input file open failed. Filename: " 515dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org << file_name_; 525dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 53693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_EQ(file_is_webm(webm_ctx_, vpx_ctx_), 1) << "file is not WebM"; 545dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 555dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org FillFrame(); 565dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 575dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 585dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org virtual void Next() { 595dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org ++frame_; 605dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org FillFrame(); 615dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 625dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 635dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org void FillFrame() { 64693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_TRUE(vpx_ctx_->file != NULL); 65693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com const int status = webm_read_frame(webm_ctx_, &buf_, &buf_sz_, &buf_sz_); 66693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com ASSERT_GE(status, 0) << "webm_read_frame failed"; 67693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com if (status == 1) { 68693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com end_of_file_ = true; 695dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 705dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 715dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 725dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org virtual const uint8_t *cxdata() const { 735dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org return end_of_file_ ? NULL : buf_; 745dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org } 75411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org virtual size_t frame_size() const { return buf_sz_; } 76411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org virtual unsigned int frame_number() const { return frame_; } 775dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 785dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org protected: 795dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org std::string file_name_; 80693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com VpxInputContext *vpx_ctx_; 81693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com WebmInputContext *webm_ctx_; 825dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org uint8_t *buf_; 835dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org size_t buf_sz_; 845dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org unsigned int frame_; 855dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org bool end_of_file_; 865dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org}; 875dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 885dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org} // namespace libvpx_test 895dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org 905dd56c20f0694054af94fd6a5062eb0233d5cce6fgalligan@chromium.org#endif // TEST_WEBM_VIDEO_SOURCE_H_ 91