Use external VideoDecoders in VideoReceiveStream.

Removes direct VideoCodec use from the new API, exposes VideoDecoders
through webrtc/video_decoder.h similar to VideoEncoders.

Also includes some preparation for wiring up external decoders in
WebRtcVideoEngine2 by adding AllocatedDecoders that specify whether they
were allocated internally or externally.

Additionally addresses a data race in VideoReceiver that was exposed with this change.

R=mflodman@webrtc.org, stefan@webrtc.org
TBR=pthatcher@webrtc.org
BUG=2854,1667

Review URL: https://webrtc-codereview.appspot.com/27829004

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@7560 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/test/call_test.cc b/test/call_test.cc
index 4e7fa9a..126c716 100644
--- a/test/call_test.cc
+++ b/test/call_test.cc
@@ -99,23 +99,15 @@
 void CallTest::CreateMatchingReceiveConfigs() {
   assert(!send_config_.rtp.ssrcs.empty());
   assert(receive_configs_.empty());
-  assert(fake_decoders_.empty());
+  assert(allocated_decoders_.empty());
   VideoReceiveStream::Config config;
-  VideoCodec codec =
-      test::CreateDecoderVideoCodec(send_config_.encoder_settings);
-  config.codecs.push_back(codec);
   config.rtp.local_ssrc = kReceiverLocalSsrc;
-  if (send_config_.encoder_settings.encoder == &fake_encoder_) {
-    config.external_decoders.resize(1);
-    config.external_decoders[0].payload_type =
-        send_config_.encoder_settings.payload_type;
-  }
   for (size_t i = 0; i < send_config_.rtp.ssrcs.size(); ++i) {
-    if (send_config_.encoder_settings.encoder == &fake_encoder_) {
-      FakeDecoder* decoder = new FakeDecoder();
-      fake_decoders_.push_back(decoder);
-      config.external_decoders[0].decoder = decoder;
-    }
+    VideoReceiveStream::Decoder decoder =
+        test::CreateMatchingDecoder(send_config_.encoder_settings);
+    allocated_decoders_.push_back(decoder.decoder);
+    config.decoders.clear();
+    config.decoders.push_back(decoder);
     config.rtp.remote_ssrc = send_config_.rtp.ssrcs[i];
     receive_configs_.push_back(config);
   }
@@ -150,7 +142,7 @@
   for (size_t i = 0; i < receive_streams_.size(); ++i)
     receiver_call_->DestroyVideoReceiveStream(receive_streams_[i]);
   receive_streams_.clear();
-  fake_decoders_.clear();
+  allocated_decoders_.clear();
 }
 
 const unsigned int CallTest::kDefaultTimeoutMs = 30 * 1000;
diff --git a/test/call_test.h b/test/call_test.h
index 695fb2a..b9a091b 100644
--- a/test/call_test.h
+++ b/test/call_test.h
@@ -74,7 +74,7 @@
 
   scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
   test::FakeEncoder fake_encoder_;
-  ScopedVector<test::FakeDecoder> fake_decoders_;
+  ScopedVector<VideoDecoder> allocated_decoders_;
 };
 
 class BaseTest : public RtpRtcpObserver {
diff --git a/test/encoder_settings.cc b/test/encoder_settings.cc
index 0eeb0b9..db064bb 100644
--- a/test/encoder_settings.cc
+++ b/test/encoder_settings.cc
@@ -12,8 +12,8 @@
 #include <assert.h>
 #include <string.h>
 
-#include "webrtc/video_encoder.h"
-#include "webrtc/video_engine/vie_defines.h"
+#include "webrtc/test/fake_decoder.h"
+#include "webrtc/video_decoder.h"
 
 namespace webrtc {
 namespace test {
@@ -53,33 +53,17 @@
   return stream_settings;
 }
 
-VideoCodec CreateDecoderVideoCodec(
+VideoReceiveStream::Decoder CreateMatchingDecoder(
     const VideoSendStream::Config::EncoderSettings& encoder_settings) {
-  VideoCodec codec;
-  memset(&codec, 0, sizeof(codec));
-
-  codec.plType = encoder_settings.payload_type;
-  strcpy(codec.plName, encoder_settings.payload_name.c_str());
+  VideoReceiveStream::Decoder decoder;
+  decoder.payload_type = encoder_settings.payload_type;
+  decoder.payload_name = encoder_settings.payload_name;
   if (encoder_settings.payload_name == "VP8") {
-    codec.codecType = kVideoCodecVP8;
-  } else if (encoder_settings.payload_name == "H264") {
-    codec.codecType = kVideoCodecH264;
+    decoder.decoder = VideoDecoder::Create(VideoDecoder::kVp8);
   } else {
-    codec.codecType = kVideoCodecGeneric;
+    decoder.decoder = new FakeDecoder();
   }
-
-  if (codec.codecType == kVideoCodecVP8) {
-    codec.codecSpecific.VP8 = VideoEncoder::GetDefaultVp8Settings();
-  } else if (codec.codecType == kVideoCodecH264) {
-    codec.codecSpecific.H264 = VideoEncoder::GetDefaultH264Settings();
-  }
-
-  codec.width = 320;
-  codec.height = 180;
-  codec.startBitrate = codec.minBitrate = codec.maxBitrate = 300;
-
-  return codec;
+  return decoder;
 }
-
 }  // namespace test
 }  // namespace webrtc
diff --git a/test/encoder_settings.h b/test/encoder_settings.h
index ea2be97..a44d366 100644
--- a/test/encoder_settings.h
+++ b/test/encoder_settings.h
@@ -10,13 +10,14 @@
 #ifndef WEBRTC_TEST_ENCODER_SETTINGS_H_
 #define WEBRTC_TEST_ENCODER_SETTINGS_H_
 
+#include "webrtc/video_receive_stream.h"
 #include "webrtc/video_send_stream.h"
 
 namespace webrtc {
 namespace test {
 std::vector<VideoStream> CreateVideoStreams(size_t num_streams);
 
-VideoCodec CreateDecoderVideoCodec(
+VideoReceiveStream::Decoder CreateMatchingDecoder(
     const VideoSendStream::Config::EncoderSettings& encoder_settings);
 }  // namespace test
 }  // namespace webrtc