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