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