blob: 8f5c55f9ba439ae126d4fc7851c39a9e6e406cf8 [file] [log] [blame]
/*
* 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.
*/
#include "webrtc/modules/video_coding/test/test_util.h"
#include <assert.h>
#include <math.h>
#include <iomanip>
#include <sstream>
#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
#include "webrtc/modules/video_coding/internal_defines.h"
#include "webrtc/test/testsupport/fileutils.h"
CmdArgs::CmdArgs()
: codecName("VP8"),
codecType(webrtc::kVideoCodecVP8),
width(352),
height(288),
rtt(0),
inputFile(webrtc::test::ResourcePath("foreman_cif", "yuv")),
outputFile(webrtc::test::OutputPath() +
"video_coding_test_output_352x288.yuv") {}
namespace {
void SplitFilename(const std::string& filename,
std::string* basename,
std::string* extension) {
assert(basename);
assert(extension);
std::string::size_type idx;
idx = filename.rfind('.');
if (idx != std::string::npos) {
*basename = filename.substr(0, idx);
*extension = filename.substr(idx + 1);
} else {
*basename = filename;
*extension = "";
}
}
std::string AppendWidthHeightCount(const std::string& filename,
int width,
int height,
int count) {
std::string basename;
std::string extension;
SplitFilename(filename, &basename, &extension);
std::stringstream ss;
ss << basename << "_" << count << "." << width << "_" << height << "."
<< extension;
return ss.str();
}
} // namespace
FileOutputFrameReceiver::FileOutputFrameReceiver(
const std::string& base_out_filename,
uint32_t ssrc)
: out_filename_(),
out_file_(NULL),
timing_file_(NULL),
width_(0),
height_(0),
count_(0) {
std::string basename;
std::string extension;
if (base_out_filename.empty()) {
basename = webrtc::test::OutputPath() + "rtp_decoded";
extension = "yuv";
} else {
SplitFilename(base_out_filename, &basename, &extension);
}
std::stringstream ss;
ss << basename << "_" << std::hex << std::setw(8) << std::setfill('0') << ssrc
<< "." << extension;
out_filename_ = ss.str();
}
FileOutputFrameReceiver::~FileOutputFrameReceiver() {
if (timing_file_ != NULL) {
fclose(timing_file_);
}
if (out_file_ != NULL) {
fclose(out_file_);
}
}
int32_t FileOutputFrameReceiver::FrameToRender(
webrtc::VideoFrame& video_frame) {
if (timing_file_ == NULL) {
std::string basename;
std::string extension;
SplitFilename(out_filename_, &basename, &extension);
timing_file_ = fopen((basename + "_renderTiming.txt").c_str(), "w");
if (timing_file_ == NULL) {
return -1;
}
}
if (out_file_ == NULL || video_frame.width() != width_ ||
video_frame.height() != height_) {
if (out_file_) {
fclose(out_file_);
}
printf("New size: %dx%d\n", video_frame.width(), video_frame.height());
width_ = video_frame.width();
height_ = video_frame.height();
std::string filename_with_width_height =
AppendWidthHeightCount(out_filename_, width_, height_, count_);
++count_;
out_file_ = fopen(filename_with_width_height.c_str(), "wb");
if (out_file_ == NULL) {
return -1;
}
}
fprintf(timing_file_, "%u, %u\n", video_frame.timestamp(),
webrtc::MaskWord64ToUWord32(video_frame.render_time_ms()));
if (PrintVideoFrame(video_frame, out_file_) < 0) {
return -1;
}
return 0;
}
webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname) {
if (strncmp(plname, "VP8", 3) == 0) {
return webrtc::kRtpVideoVp8;
} else {
// Default value.
return webrtc::kRtpVideoGeneric;
}
}