Move VideoStreamReceiver JSON configuration parser to test source_set.

This change moves the configuration parser that converts a JSON representation
of the VideoStreamReceiver::Config structure into a native object into the test
directory so that it can be shared with the new corpus_generator utility that is
being built. This rtc_source_set will have an additional utility function added
in a subsequent CL that will allow the generation of a VideoStreamSender::Config
from a given VideoStreamReceiver::Config and visa versa.

Bug: webrtc:10117
Change-Id: I3035826f799f8d1fcdeaa76997391f030c855a5c
Reviewed-on: https://webrtc-review.googlesource.com/c/116880
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26252}
diff --git a/test/BUILD.gn b/test/BUILD.gn
index bb49e2e..773e25f 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -874,3 +874,15 @@
     ]
   }
 }
+
+rtc_source_set("call_config_utils") {
+  sources = [
+    "call_config_utils.cc",
+    "call_config_utils.h",
+  ]
+  deps = [
+    "../call:call_interfaces",
+    "../call:video_stream_api",
+    "../rtc_base:rtc_json",
+  ]
+}
diff --git a/test/call_config_utils.cc b/test/call_config_utils.cc
new file mode 100644
index 0000000..48d4849
--- /dev/null
+++ b/test/call_config_utils.cc
@@ -0,0 +1,72 @@
+/*
+ *  Copyright (c) 2019 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 "test/call_config_utils.h"
+
+#include <string>
+#include <vector>
+
+namespace webrtc {
+namespace test {
+
+// Deserializes a JSON representation of the VideoReceiveStream::Config back
+// into a valid object. This will not initialize the decoders or the renderer.
+VideoReceiveStream::Config ParseVideoReceiveStreamJsonConfig(
+    webrtc::Transport* transport,
+    const Json::Value& json) {
+  auto receive_config = VideoReceiveStream::Config(transport);
+  for (const auto decoder_json : json["decoders"]) {
+    VideoReceiveStream::Decoder decoder;
+    decoder.video_format =
+        SdpVideoFormat(decoder_json["payload_name"].asString());
+    decoder.payload_type = decoder_json["payload_type"].asInt64();
+    for (const auto& params_json : decoder_json["codec_params"]) {
+      std::vector<std::string> members = params_json.getMemberNames();
+      RTC_CHECK_EQ(members.size(), 1);
+      decoder.video_format.parameters[members[0]] =
+          params_json[members[0]].asString();
+    }
+    receive_config.decoders.push_back(decoder);
+  }
+  receive_config.render_delay_ms = json["render_delay_ms"].asInt64();
+  receive_config.target_delay_ms = json["target_delay_ms"].asInt64();
+  receive_config.rtp.remote_ssrc = json["rtp"]["remote_ssrc"].asInt64();
+  receive_config.rtp.local_ssrc = json["rtp"]["local_ssrc"].asInt64();
+  receive_config.rtp.rtcp_mode =
+      json["rtp"]["rtcp_mode"].asString() == "RtcpMode::kCompound"
+          ? RtcpMode::kCompound
+          : RtcpMode::kReducedSize;
+  receive_config.rtp.remb = json["rtp"]["remb"].asBool();
+  receive_config.rtp.transport_cc = json["rtp"]["transport_cc"].asBool();
+  receive_config.rtp.nack.rtp_history_ms =
+      json["rtp"]["nack"]["rtp_history_ms"].asInt64();
+  receive_config.rtp.ulpfec_payload_type =
+      json["rtp"]["ulpfec_payload_type"].asInt64();
+  receive_config.rtp.red_payload_type =
+      json["rtp"]["red_payload_type"].asInt64();
+  receive_config.rtp.rtx_ssrc = json["rtp"]["rtx_ssrc"].asInt64();
+
+  for (const auto& pl_json : json["rtp"]["rtx_payload_types"]) {
+    std::vector<std::string> members = pl_json.getMemberNames();
+    RTC_CHECK_EQ(members.size(), 1);
+    Json::Value rtx_payload_type = pl_json[members[0]];
+    receive_config.rtp.rtx_associated_payload_types[std::stoi(members[0])] =
+        rtx_payload_type.asInt64();
+  }
+  for (const auto& ext_json : json["rtp"]["extensions"]) {
+    receive_config.rtp.extensions.emplace_back(ext_json["uri"].asString(),
+                                               ext_json["id"].asInt64(),
+                                               ext_json["encrypt"].asBool());
+  }
+  return receive_config;
+}
+
+}  // namespace test.
+}  // namespace webrtc.
diff --git a/test/call_config_utils.h b/test/call_config_utils.h
new file mode 100644
index 0000000..246c7f8
--- /dev/null
+++ b/test/call_config_utils.h
@@ -0,0 +1,29 @@
+/*
+ *  Copyright (c) 2019 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.
+ */
+
+#ifndef TEST_CALL_CONFIG_UTILS_H_
+#define TEST_CALL_CONFIG_UTILS_H_
+
+#include "call/video_receive_stream.h"
+#include "rtc_base/strings/json.h"
+
+namespace webrtc {
+namespace test {
+
+// Deserializes a JSON representation of the VideoReceiveStream::Config back
+// into a valid object. This will not initialize the decoders or the renderer.
+VideoReceiveStream::Config ParseVideoReceiveStreamJsonConfig(
+    webrtc::Transport* transport,
+    const Json::Value& json);
+
+}  // namespace test
+}  // namespace webrtc
+
+#endif  // TEST_CALL_CONFIG_UTILS_H_
diff --git a/video/BUILD.gn b/video/BUILD.gn
index cb4b311..5afed77 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -408,7 +408,7 @@
   rtc_executable("video_replay") {
     testonly = true
     sources = [
-      "replay.cc",
+      "video_replay.cc",
     ]
     deps = [
       "../api/test/video:function_video_factory",
@@ -422,6 +422,7 @@
       "../rtc_base:rtc_base_approved",
       "../rtc_base:rtc_json",
       "../system_wrappers",
+      "../test:call_config_utils",
       "../test:fake_video_codecs",
       "../test:rtp_test_utils",
       "../test:run_test",
diff --git a/video/replay.cc b/video/video_replay.cc
similarity index 85%
rename from video/replay.cc
rename to video/video_replay.cc
index 030c01a..79d13eb 100644
--- a/video/replay.cc
+++ b/video/video_replay.cc
@@ -13,7 +13,6 @@
 #include <fstream>
 #include <map>
 #include <memory>
-#include <sstream>
 
 #include "absl/memory/memory.h"
 #include "api/test/video/function_video_decoder_factory.h"
@@ -31,6 +30,7 @@
 #include "rtc_base/time_utils.h"
 #include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/sleep.h"
+#include "test/call_config_utils.h"
 #include "test/call_test.h"
 #include "test/encoder_settings.h"
 #include "test/fake_decoder.h"
@@ -222,11 +222,11 @@
   ~DecoderBitstreamFileWriter() { fclose(file_); }
 
   int32_t Decode(const EncodedImage& encoded_frame,
-                      bool /* missing_frames */,
-                      const CodecSpecificInfo* /* codec_specific_info */,
-                      int64_t /* render_time_ms */) override {
-    if (fwrite(encoded_frame._buffer, 1, encoded_frame._length, file_)
-        < encoded_frame._length) {
+                 bool /* missing_frames */,
+                 const CodecSpecificInfo* /* codec_specific_info */,
+                 int64_t /* render_time_ms */) override {
+    if (fwrite(encoded_frame._buffer, 1, encoded_frame._length, file_) <
+        encoded_frame._length) {
       RTC_LOG_ERR(LS_ERROR) << "fwrite of encoded frame failed.";
       return WEBRTC_VIDEO_CODEC_ERROR;
     }
@@ -237,60 +237,6 @@
   FILE* file_;
 };
 
-// Deserializes a JSON representation of the VideoReceiveStream::Config back
-// into a valid object. This will not initialize the decoders or the renderer.
-class VideoReceiveStreamConfigDeserializer final {
- public:
-  static VideoReceiveStream::Config Deserialize(webrtc::Transport* transport,
-                                                const Json::Value& json) {
-    auto receive_config = VideoReceiveStream::Config(transport);
-    for (const auto decoder_json : json["decoders"]) {
-      VideoReceiveStream::Decoder decoder;
-      decoder.video_format =
-          SdpVideoFormat(decoder_json["payload_name"].asString());
-      decoder.payload_type = decoder_json["payload_type"].asInt64();
-      for (const auto& params_json : decoder_json["codec_params"]) {
-        std::vector<std::string> members = params_json.getMemberNames();
-        RTC_CHECK_EQ(members.size(), 1);
-        decoder.video_format.parameters[members[0]] =
-            params_json[members[0]].asString();
-      }
-      receive_config.decoders.push_back(decoder);
-    }
-    receive_config.render_delay_ms = json["render_delay_ms"].asInt64();
-    receive_config.target_delay_ms = json["target_delay_ms"].asInt64();
-    receive_config.rtp.remote_ssrc = json["rtp"]["remote_ssrc"].asInt64();
-    receive_config.rtp.local_ssrc = json["rtp"]["local_ssrc"].asInt64();
-    receive_config.rtp.rtcp_mode =
-        json["rtp"]["rtcp_mode"].asString() == "RtcpMode::kCompound"
-            ? RtcpMode::kCompound
-            : RtcpMode::kReducedSize;
-    receive_config.rtp.remb = json["rtp"]["remb"].asBool();
-    receive_config.rtp.transport_cc = json["rtp"]["transport_cc"].asBool();
-    receive_config.rtp.nack.rtp_history_ms =
-        json["rtp"]["nack"]["rtp_history_ms"].asInt64();
-    receive_config.rtp.ulpfec_payload_type =
-        json["rtp"]["ulpfec_payload_type"].asInt64();
-    receive_config.rtp.red_payload_type =
-        json["rtp"]["red_payload_type"].asInt64();
-    receive_config.rtp.rtx_ssrc = json["rtp"]["rtx_ssrc"].asInt64();
-
-    for (const auto& pl_json : json["rtp"]["rtx_payload_types"]) {
-      std::vector<std::string> members = pl_json.getMemberNames();
-      RTC_CHECK_EQ(members.size(), 1);
-      Json::Value rtx_payload_type = pl_json[members[0]];
-      receive_config.rtp.rtx_associated_payload_types[std::stoi(members[0])] =
-          rtx_payload_type.asInt64();
-    }
-    for (const auto& ext_json : json["rtp"]["extensions"]) {
-      receive_config.rtp.extensions.emplace_back(ext_json["uri"].asString(),
-                                                 ext_json["id"].asInt64(),
-                                                 ext_json["encrypt"].asBool());
-    }
-    return receive_config;
-  }
-};
-
 // The RtpReplayer is responsible for parsing the configuration provided by the
 // user, setting up the windows, recieve streams and decoders and then replaying
 // the provided RTP dump.
@@ -361,8 +307,8 @@
     size_t config_count = 0;
     for (const auto& json : json_configs) {
       // Create the configuration and parse the JSON into the config.
-      auto receive_config = VideoReceiveStreamConfigDeserializer::Deserialize(
-          &(stream_state->transport), json);
+      auto receive_config =
+          ParseVideoReceiveStreamJsonConfig(&(stream_state->transport), json);
       // Instantiate the underlying decoder.
       for (auto& decoder : receive_config.decoders) {
         decoder = test::CreateMatchingDecoder(decoder.payload_type,