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/main/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/main/source/internal_defines.h"
21 #include "webrtc/test/testsupport/fileutils.h"
22 
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 
34 namespace {
35 
36 void SplitFilename(const std::string& filename, 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 
53 std::string AppendWidthHeightCount(const std::string& filename, int width,
54                                    int height, int count) {
55   std::string basename;
56   std::string extension;
57   SplitFilename(filename, &basename, &extension);
58   std::stringstream ss;
59   ss << basename << "_" << count << "." <<  width << "_" << height << "." <<
60       extension;
61   return ss.str();
62 }
63 
64 }  // namespace
65 
66 FileOutputFrameReceiver::FileOutputFrameReceiver(
67     const std::string& base_out_filename, uint32_t ssrc)
68     : out_filename_(),
69       out_file_(NULL),
70       timing_file_(NULL),
71       width_(0),
72       height_(0),
73       count_(0) {
74   std::string basename;
75   std::string extension;
76   if (base_out_filename == "") {
77     basename = webrtc::test::OutputPath() + "rtp_decoded";
78     extension = "yuv";
79   } else {
80     SplitFilename(base_out_filename, &basename, &extension);
81   }
82   std::stringstream ss;
83   ss << basename << "_" << std::hex << std::setw(8) << std::setfill('0') <<
84       ssrc << "." << extension;
85   out_filename_ = ss.str();
86 }
87 
88 FileOutputFrameReceiver::~FileOutputFrameReceiver() {
89   if (timing_file_ != NULL) {
90     fclose(timing_file_);
91   }
92   if (out_file_ != NULL) {
93     fclose(out_file_);
94   }
95 }
96 
97 int32_t FileOutputFrameReceiver::FrameToRender(
98     webrtc::I420VideoFrame& video_frame) {
99   if (timing_file_ == NULL) {
100     std::string basename;
101     std::string extension;
102     SplitFilename(out_filename_, &basename, &extension);
103     timing_file_ = fopen((basename + "_renderTiming.txt").c_str(), "w");
104     if (timing_file_ == NULL) {
105       return -1;
106     }
107   }
108   if (out_file_ == NULL || video_frame.width() != width_ ||
109       video_frame.height() != height_) {
110     if (out_file_) {
111       fclose(out_file_);
112     }
113     printf("New size: %dx%d\n", video_frame.width(), video_frame.height());
114     width_ = video_frame.width();
115     height_ = video_frame.height();
116     std::string filename_with_width_height = AppendWidthHeightCount(
117         out_filename_, width_, height_, count_);
118     ++count_;
119     out_file_ = fopen(filename_with_width_height.c_str(), "wb");
120     if (out_file_ == NULL) {
121       return -1;
122     }
123   }
124   fprintf(timing_file_, "%u, %u\n", video_frame.timestamp(),
125       webrtc::MaskWord64ToUWord32(video_frame.render_time_ms()));
126   if (PrintI420VideoFrame(video_frame, out_file_) < 0) {
127     return -1;
128   }
129   return 0;
130 }
131 
132 webrtc::RtpVideoCodecTypes ConvertCodecType(const char* plname) {
133   if (strncmp(plname,"VP8" , 3) == 0) {
134     return webrtc::kRtpVideoVp8;
135   } else {
136     // Default value.
137     return webrtc::kRtpVideoGeneric;
138   }
139 }
140