From: Alex Converse Date: Thu, 16 Jan 2014 23:17:41 +0000 (-0800) Subject: Add Y4mVideoSource to be used with 4:4:4 tests. X-Git-Tag: v1.4.0~2647^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8a0b0a035a72e7b675058b1734eb04f2f5f2f28b;p=libvpx Add Y4mVideoSource to be used with 4:4:4 tests. Change-Id: Ida3128e7e8a2ed333ac0b4ee92c23cb7dc1b7843 --- diff --git a/test/test.mk b/test/test.mk index 5a1d39de5..6d4f96933 100644 --- a/test/test.mk +++ b/test/test.mk @@ -24,6 +24,8 @@ LIBVPX_TEST_SRCS-yes += encode_test_driver.cc LIBVPX_TEST_SRCS-yes += encode_test_driver.h LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += error_resilience_test.cc LIBVPX_TEST_SRCS-$(CONFIG_ENCODERS) += i420_video_source.h +LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += y4m_video_source.h +LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += ../y4minput.h ../y4minput.c LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += keyframe_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += borders_test.cc LIBVPX_TEST_SRCS-$(CONFIG_VP9_ENCODER) += resize_test.cc diff --git a/test/y4m_video_source.h b/test/y4m_video_source.h new file mode 100644 index 000000000..bd86c2c04 --- /dev/null +++ b/test/y4m_video_source.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2012 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef TEST_Y4M_VIDEO_SOURCE_H_ +#define TEST_Y4M_VIDEO_SOURCE_H_ +#include + +#include "test/video_source.h" +extern "C" { +#include "./y4minput.h" +} + +namespace libvpx_test { + +// This class extends VideoSource to allow parsing of raw yv12 +// so that we can do actual file encodes. +class Y4mVideoSource : public VideoSource { + public: + Y4mVideoSource(const std::string &file_name, + unsigned int start, int limit) + : file_name_(file_name), + input_file_(NULL), + img_(new vpx_image_t()), + start_(start), + limit_(limit), + frame_(0), + framerate_numerator_(0), + framerate_denominator_(0), + y4m_() { + } + + virtual ~Y4mVideoSource() { + vpx_img_free(img_.get()); + y4m_input_close(&y4m_); + if (input_file_) + fclose(input_file_); + } + + virtual void Begin() { + if (input_file_) + fclose(input_file_); + input_file_ = OpenTestDataFile(file_name_); + ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: " + << file_name_; + + y4m_input_open(&y4m_, input_file_, NULL, 0, 0); + framerate_numerator_ = y4m_.fps_n; + framerate_denominator_ = y4m_.fps_d; + + frame_ = 0; + for (unsigned int i = 0; i < start_; i++) { + Next(); + } + + FillFrame(); + } + + virtual void Next() { + ++frame_; + FillFrame(); + } + + virtual vpx_image_t *img() const { + return (frame_ < limit_) ? img_.get() : NULL; + } + + // Models a stream where Timebase = 1/FPS, so pts == frame. + virtual vpx_codec_pts_t pts() const { return frame_; } + + virtual unsigned long duration() const { return 1; } + + virtual vpx_rational_t timebase() const { + const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ }; + return t; + } + + virtual unsigned int frame() const { return frame_; } + + virtual unsigned int limit() const { return limit_; } + + virtual void FillFrame() { + ASSERT_TRUE(input_file_ != NULL); + // Read a frame from input_file. + y4m_input_fetch_frame(&y4m_, input_file_, img_.get()); + } + + protected: + std::string file_name_; + FILE *input_file_; + testing::internal::scoped_ptr img_; + unsigned int start_; + unsigned int limit_; + unsigned int frame_; + int framerate_numerator_; + int framerate_denominator_; + y4m_input y4m_; +}; + +} // namespace libvpx_test + +#endif // TEST_Y4M_VIDEO_SOURCE_H_