Home | History | Annotate | Download | only in test
      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 
     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 
     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 
     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 
     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 
     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 
    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 
    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