Add new video codec factories

This CL adds interfaces for the new video codec factories and wires them
up in WebRtcVideoEngine. The default behavior is unmodified however, and
the new code is currently unused except for the tests.

A follow-up CL will be uploaded for exposing them in the
PeerConnectionFactory API: https://codereview.webrtc.org/3004353002/.

BUG=webrtc:7925
R=andersc@webrtc.org, stefan@webrtc.org

Review-Url: https://codereview.webrtc.org/3007073002 .
Cr-Commit-Position: refs/heads/master@{#19828}
diff --git a/webrtc/api/video_codecs/BUILD.gn b/webrtc/api/video_codecs/BUILD.gn
index c8bde01..4a050ab 100644
--- a/webrtc/api/video_codecs/BUILD.gn
+++ b/webrtc/api/video_codecs/BUILD.gn
@@ -16,8 +16,10 @@
   sources = [
     "sdp_video_format.h",
     "video_decoder.h",
+    "video_decoder_factory.h",
     "video_encoder.cc",
     "video_encoder.h",
+    "video_encoder_factory.h",
   ]
 
   deps = [
diff --git a/webrtc/api/video_codecs/video_decoder_factory.h b/webrtc/api/video_codecs/video_decoder_factory.h
new file mode 100644
index 0000000..2a44207
--- /dev/null
+++ b/webrtc/api/video_codecs/video_decoder_factory.h
@@ -0,0 +1,39 @@
+/*
+ *  Copyright (c) 2017 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 WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
+#define WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
+
+#include <memory>
+#include <vector>
+
+namespace webrtc {
+
+class VideoDecoder;
+struct SdpVideoFormat;
+
+// A factory that creates VideoDecoders.
+// NOTE: This class is still under development and may change without notice.
+class VideoDecoderFactory {
+ public:
+  // Returns a list of supported video formats in order of preference, to use
+  // for signaling etc.
+  virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0;
+
+  // Creates a VideoDecoder for the specified format.
+  virtual std::unique_ptr<VideoDecoder> CreateVideoDecoder(
+      const SdpVideoFormat& format) = 0;
+
+  virtual ~VideoDecoderFactory() {}
+};
+
+}  // namespace webrtc
+
+#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
diff --git a/webrtc/api/video_codecs/video_encoder_factory.h b/webrtc/api/video_codecs/video_encoder_factory.h
new file mode 100644
index 0000000..4e77392
--- /dev/null
+++ b/webrtc/api/video_codecs/video_encoder_factory.h
@@ -0,0 +1,57 @@
+/*
+ *  Copyright (c) 2017 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 WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
+#define WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
+
+#include <memory>
+#include <vector>
+
+namespace webrtc {
+
+class VideoEncoder;
+struct SdpVideoFormat;
+
+// A factory that creates VideoEncoders.
+// NOTE: This class is still under development and may change without notice.
+class VideoEncoderFactory {
+ public:
+  // TODO(magjed): Try to get rid of this struct.
+  struct CodecInfo {
+    // |is_hardware_accelerated| is true if the encoders created by this factory
+    // of the given codec will use hardware support.
+    bool is_hardware_accelerated;
+    // |has_internal_source| is true if encoders created by this factory of the
+    // given codec will use internal camera sources, meaning that they don't
+    // require/expect frames to be delivered via webrtc::VideoEncoder::Encode.
+    // This flag is used as the internal_source parameter to
+    // webrtc::ViEExternalCodec::RegisterExternalSendCodec.
+    bool has_internal_source;
+  };
+
+  // Returns a list of supported video formats in order of preference, to use
+  // for signaling etc.
+  virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0;
+
+  // Returns information about how this format will be encoded. The specified
+  // format must be one of the supported formats by this factory.
+  // TODO(magjed): Try to get rid of this method.
+  virtual CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const = 0;
+
+  // Creates a VideoEncoder for the specified format.
+  virtual std::unique_ptr<VideoEncoder> CreateVideoEncoder(
+      const SdpVideoFormat& format) = 0;
+
+  virtual ~VideoEncoderFactory() {}
+};
+
+}  // namespace webrtc
+
+#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_