1 /*
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 
11 #include "webrtc/modules/video_coding/test/test_util.h"
12 
13 #include <assert.h>
14 #include <math.h>
15 
16 #include <iomanip>
17 #include <sstream>
18 
19 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
20 #include "webrtc/modules/video_coding/internal_defines.h"
21 #include "webrtc/test/testsupport/fileutils.h"
22 
CmdArgs()23 CmdArgs::CmdArgs()
24     : codecName("VP8"),
25       codecType(webrtc::kVideoCodecVP8),
26       width(352),
27       height(288),
28       rtt(0),
29       inputFile(webrtc::test::ProjectRootPath() + "/resources/foreman_cif.yuv"),
30       outputFile(webrtc::test::OutputPath() +
31                  "video_coding_test_output_352x288.yuv") {}
32 
33 namespace {
34 
SplitFilename(const std::string & filename,std::string * basename,std::string * extension)35 void SplitFilename(const std::string& filename,
36                    std::string* basename,
37                    std::string* extension) {
38   assert(basename);
39   assert(extension);
40 
41   std::string::size_type idx;
42   idx = filename.rfind('.');
43 
44   if (idx != std::string::npos) {
45     *basename = filename.substr(0, idx);
46     *extension = filename.substr(idx + 1);
47   } else {
48     *basename = filename;
49     *extension = "";
50   }
51 }
52 
AppendWidthHeightCount(const std::string & filename,int width,int height,int count)53 std::string AppendWidthHeightCount(const std::string& filename,
54                                    int width,
55                                    int height,
56                                    int count) {
57   std::string basename;
58   std::string extension;
59   SplitFilename(filename, &basename, &extension);
60   std::stringstream ss;
61   ss << basename << "_" << count << "." << width << "_" << height << "."
62      << extension;
63   return ss.str();
64 }
65 
66 }  // namespace
67 
FileOutputFrameReceiver(const std::string & base_out_filename,uint32_t ssrc)68 FileOutputFrameReceiver::FileOutputFrameReceiver(
69     const std::string& base_out_filename,
70     uint32_t ssrc)
71     : 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;
79   if (base_out_filename.empty()) {
80     basename = webrtc::test::OutputPath() + "rtp_decoded";
81     extension = "yuv";
82   } else {
83     SplitFilename(base_out_filename, &basename, &extension);
84   }
85   std::stringstream ss;
86   ss << basename << "_" << std::hex << std::setw(8) << std::setfill('0') << ssrc
87      << "." << extension;
88   out_filename_ = ss.str();
89 }
90 
~FileOutputFrameReceiver()91 FileOutputFrameReceiver::~FileOutputFrameReceiver() {
92   if (timing_file_ != NULL) {
93     fclose(timing_file_);
94   }
95   if (out_file_ != NULL) {
96     fclose(out_file_);
97   }
98 }
99 
FrameToRender(webrtc::VideoFrame & video_frame)100 int32_t FileOutputFrameReceiver::FrameToRender(
101     webrtc::VideoFrame& video_frame) {
102   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   }
111   if (out_file_ == NULL || video_frame.width() != width_ ||
112       video_frame.height() != height_) {
113     if (out_file_) {
114       fclose(out_file_);
115     }
116     printf("New size: %dx%d\n", video_frame.width(), video_frame.height());
117     width_ = video_frame.width();
118     height_ = video_frame.height();
119     std::string filename_with_width_height =
120         AppendWidthHeightCount(out_filename_, width_, height_, count_);
121     ++count_;
122     out_file_ = fopen(filename_with_width_height.c_str(), "wb");
123     if (out_file_ == NULL) {
124       return -1;
125     }
126   }
127   fprintf(timing_file_, "%u, %u\n", video_frame.timestamp(),
128           webrtc::MaskWord64ToUWord32(video_frame.render_time_ms()));
129   if (PrintVideoFrame(video_frame, out_file_) < 0) {
130     return -1;
131   }
132   return 0;
133 }
134 
ConvertCodecType(const char * plname)135 webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname) {
136   if (strncmp(plname, "VP8", 3) == 0) {
137     return webrtc::kRtpVideoVp8;
138   } else {
139     // Default value.
140     return webrtc::kRtpVideoGeneric;
141   }
142 }
143