2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
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.
11 #ifndef AOM_TEST_Y4M_VIDEO_SOURCE_H_
12 #define AOM_TEST_Y4M_VIDEO_SOURCE_H_
17 #include "common/y4minput.h"
18 #include "test/video_source.h"
20 namespace libaom_test
{
22 // This class extends VideoSource to allow parsing of raw yv12
23 // so that we can do actual file encodes.
24 class Y4mVideoSource
: public VideoSource
{
26 Y4mVideoSource(const std::string
&file_name
, unsigned int start
, int limit
)
27 : file_name_(file_name
), input_file_(NULL
), img_(new aom_image_t()),
28 start_(start
), limit_(limit
), frame_(0), framerate_numerator_(0),
29 framerate_denominator_(0), y4m_() {}
31 virtual ~Y4mVideoSource() {
32 aom_img_free(img_
.get());
36 virtual void OpenSource() {
38 input_file_
= OpenTestDataFile(file_name_
);
39 ASSERT_TRUE(input_file_
!= NULL
)
40 << "Input file open failed. Filename: " << file_name_
;
43 virtual void ReadSourceToStart() {
44 ASSERT_TRUE(input_file_
!= NULL
);
46 y4m_input_open(&y4m_
, input_file_
, NULL
, 0, AOM_CSP_UNKNOWN
, 0));
47 framerate_numerator_
= y4m_
.fps_n
;
48 framerate_denominator_
= y4m_
.fps_d
;
50 for (unsigned int i
= 0; i
< start_
; i
++) {
56 virtual void Begin() {
66 virtual aom_image_t
*img() const {
67 return (frame_
< limit_
) ? img_
.get() : NULL
;
70 // Models a stream where Timebase = 1/FPS, so pts == frame.
71 virtual aom_codec_pts_t
pts() const { return frame_
; }
73 virtual unsigned long duration() const { return 1; }
75 virtual aom_rational_t
timebase() const {
76 const aom_rational_t t
= { framerate_denominator_
, framerate_numerator_
};
80 virtual unsigned int frame() const { return frame_
; }
82 virtual unsigned int limit() const { return limit_
; }
84 virtual void FillFrame() {
85 ASSERT_TRUE(input_file_
!= NULL
);
86 // Read a frame from input_file.
87 y4m_input_fetch_frame(&y4m_
, input_file_
, img_
.get());
90 // Swap buffers with another y4m source. This allows reading a new frame
91 // while keeping the old frame around. A whole Y4mSource is required and
92 // not just a aom_image_t because of how the y4m reader manipulates
93 // aom_image_t internals,
94 void SwapBuffers(Y4mVideoSource
*other
) {
95 std::swap(other
->y4m_
.dst_buf
, y4m_
.dst_buf
);
97 tmp
= other
->img_
.release();
98 other
->img_
.reset(img_
.release());
104 y4m_input_close(&y4m_
);
106 if (input_file_
!= NULL
) {
112 std::string file_name_
;
114 std::unique_ptr
<aom_image_t
> img_
;
118 int framerate_numerator_
;
119 int framerate_denominator_
;
123 } // namespace libaom_test
125 #endif // AOM_TEST_Y4M_VIDEO_SOURCE_H_