blob: 7ff663e395bdaeec64ea7c4d6c6c244a60ed4032 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Henrik Kjellander2557b862015-11-18 22:00:21 +010011#include "webrtc/modules/video_coding/test/test_util.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000013#include <assert.h>
14#include <math.h>
15
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000016#include <iomanip>
17#include <sstream>
18
19#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010020#include "webrtc/modules/video_coding/internal_defines.h"
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000021#include "webrtc/test/testsupport/fileutils.h"
22
23CmdArgs::CmdArgs()
24 : codecName("VP8"),
25 codecType(webrtc::kVideoCodecVP8),
26 width(352),
27 height(288),
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000028 rtt(0),
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000029 inputFile(webrtc::test::ProjectRootPath() + "/resources/foreman_cif.yuv"),
30 outputFile(webrtc::test::OutputPath() +
philipel5908c712015-12-21 08:23:20 -080031 "video_coding_test_output_352x288.yuv") {}
mikhal@webrtc.org46171cf2011-08-29 23:38:04 +000032
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000033namespace {
34
philipel5908c712015-12-21 08:23:20 -080035void SplitFilename(const std::string& filename,
36 std::string* basename,
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000037 std::string* extension) {
38 assert(basename);
39 assert(extension);
40
41 std::string::size_type idx;
42 idx = filename.rfind('.');
43
philipel5908c712015-12-21 08:23:20 -080044 if (idx != std::string::npos) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000045 *basename = filename.substr(0, idx);
46 *extension = filename.substr(idx + 1);
47 } else {
48 *basename = filename;
49 *extension = "";
50 }
niklase@google.com470e71d2011-07-07 08:21:25 +000051}
52
philipel5908c712015-12-21 08:23:20 -080053std::string AppendWidthHeightCount(const std::string& filename,
54 int width,
55 int height,
56 int count) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000057 std::string basename;
58 std::string extension;
59 SplitFilename(filename, &basename, &extension);
60 std::stringstream ss;
philipel5908c712015-12-21 08:23:20 -080061 ss << basename << "_" << count << "." << width << "_" << height << "."
62 << extension;
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000063 return ss.str();
64}
65
66} // namespace
67
68FileOutputFrameReceiver::FileOutputFrameReceiver(
philipel5908c712015-12-21 08:23:20 -080069 const std::string& base_out_filename,
70 uint32_t ssrc)
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000071 : out_filename_(),
72 out_file_(NULL),
73 timing_file_(NULL),
74 width_(0),
75 height_(0),
76 count_(0) {
77 std::string basename;
78 std::string extension;
pbosbb36fdf2015-07-09 07:48:14 -070079 if (base_out_filename.empty()) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000080 basename = webrtc::test::OutputPath() + "rtp_decoded";
81 extension = "yuv";
82 } else {
83 SplitFilename(base_out_filename, &basename, &extension);
84 }
85 std::stringstream ss;
philipel5908c712015-12-21 08:23:20 -080086 ss << basename << "_" << std::hex << std::setw(8) << std::setfill('0') << ssrc
87 << "." << extension;
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +000088 out_filename_ = ss.str();
89}
90
91FileOutputFrameReceiver::~FileOutputFrameReceiver() {
92 if (timing_file_ != NULL) {
93 fclose(timing_file_);
94 }
95 if (out_file_ != NULL) {
96 fclose(out_file_);
97 }
98}
99
pbos@webrtc.org77f6b212013-05-03 12:02:11 +0000100int32_t FileOutputFrameReceiver::FrameToRender(
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -0700101 webrtc::VideoFrame& video_frame) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000102 if (timing_file_ == NULL) {
103 std::string basename;
104 std::string extension;
105 SplitFilename(out_filename_, &basename, &extension);
106 timing_file_ = fopen((basename + "_renderTiming.txt").c_str(), "w");
107 if (timing_file_ == NULL) {
108 return -1;
109 }
110 }
magjed@webrtc.org2056ee32015-03-16 13:46:52 +0000111 if (out_file_ == NULL || video_frame.width() != width_ ||
112 video_frame.height() != height_) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000113 if (out_file_) {
114 fclose(out_file_);
115 }
magjed@webrtc.org2056ee32015-03-16 13:46:52 +0000116 printf("New size: %dx%d\n", video_frame.width(), video_frame.height());
117 width_ = video_frame.width();
118 height_ = video_frame.height();
philipel5908c712015-12-21 08:23:20 -0800119 std::string filename_with_width_height =
120 AppendWidthHeightCount(out_filename_, width_, height_, count_);
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000121 ++count_;
122 out_file_ = fopen(filename_with_width_height.c_str(), "wb");
123 if (out_file_ == NULL) {
124 return -1;
125 }
126 }
magjed@webrtc.org2056ee32015-03-16 13:46:52 +0000127 fprintf(timing_file_, "%u, %u\n", video_frame.timestamp(),
philipel5908c712015-12-21 08:23:20 -0800128 webrtc::MaskWord64ToUWord32(video_frame.render_time_ms()));
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -0700129 if (PrintVideoFrame(video_frame, out_file_) < 0) {
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000130 return -1;
131 }
132 return 0;
133}
134
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000135webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname) {
philipel5908c712015-12-21 08:23:20 -0800136 if (strncmp(plname, "VP8", 3) == 0) {
wu@webrtc.org822fbd82013-08-15 23:38:54 +0000137 return webrtc::kRtpVideoVp8;
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000138 } else {
marpan@webrtc.org5b883172014-11-01 06:10:48 +0000139 // Default value.
140 return webrtc::kRtpVideoGeneric;
solenberg@webrtc.org56b5f772013-04-16 10:31:56 +0000141 }
142}