brandtr 872104ac41 Add optional visualization file writers to VideoProcessor tests.
The purpose of this visualization CL is to add the ability to record
video at the source, after encode, and after decode, in the VideoProcessor
tests. These output files can then be replayed and used as a subjective
complement to the objective metric plots given by the existing Python
plotting script.

BUG=webrtc:6634

Review-Url: https://codereview.webrtc.org/2700493006
Cr-Commit-Position: refs/heads/master@{#16738}
2017-02-21 11:59:15 +00:00

76 lines
2.3 KiB
C++

/*
* Copyright (c) 2011 The WebRTC 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 WEBRTC_TEST_TESTSUPPORT_FRAME_READER_H_
#define WEBRTC_TEST_TESTSUPPORT_FRAME_READER_H_
#include <stdio.h>
#include <string>
#include "webrtc/base/scoped_ref_ptr.h"
#include "webrtc/typedefs.h"
namespace webrtc {
class I420Buffer;
namespace test {
// Handles reading of I420 frames from video files.
class FrameReader {
public:
virtual ~FrameReader() {}
// Initializes the frame reader, i.e. opens the input file.
// This must be called before reading of frames has started.
// Returns false if an error has occurred, in addition to printing to stderr.
virtual bool Init() = 0;
// Reads a frame from the input file. On success, returns the frame.
// Returns nullptr if encountering end of file or a read error.
virtual rtc::scoped_refptr<I420Buffer> ReadFrame() = 0;
// Closes the input file if open. Essentially makes this class impossible
// to use anymore. Will also be invoked by the destructor.
virtual void Close() = 0;
// Frame length in bytes of a single frame image.
virtual size_t FrameLength() = 0;
// Total number of frames in the input video source.
virtual int NumberOfFrames() = 0;
};
class YuvFrameReaderImpl : public FrameReader {
public:
// Creates a file handler. The input file is assumed to exist and be readable.
// Parameters:
// input_filename The file to read from.
// width, height Size of each frame to read.
YuvFrameReaderImpl(std::string input_filename, int width, int height);
~YuvFrameReaderImpl() override;
bool Init() override;
rtc::scoped_refptr<I420Buffer> ReadFrame() override;
void Close() override;
size_t FrameLength() override;
int NumberOfFrames() override;
private:
const std::string input_filename_;
size_t frame_length_in_bytes_;
const int width_;
const int height_;
int number_of_frames_;
FILE* input_file_;
};
} // namespace test
} // namespace webrtc
#endif // WEBRTC_TEST_TESTSUPPORT_FRAME_READER_H_