| Index: webrtc/media/engine/webrtcvoiceengine.cc | 
| diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc | 
| index ed67ce84ba00cc520872b1a17e0ea8bdbb579160..a58193c98e356cf58ce474d9777bea1942160b59 100644 | 
| --- a/webrtc/media/engine/webrtcvoiceengine.cc | 
| +++ b/webrtc/media/engine/webrtcvoiceengine.cc | 
| @@ -520,14 +520,20 @@ bool WebRtcVoiceEngine::ToCodecInst(const AudioCodec& in, | 
| return WebRtcVoiceCodecs::ToCodecInst(in, out); | 
| } | 
|  | 
| -WebRtcVoiceEngine::WebRtcVoiceEngine(webrtc::AudioDeviceModule* adm) | 
| -    : WebRtcVoiceEngine(adm, new VoEWrapper()) { | 
| +WebRtcVoiceEngine::WebRtcVoiceEngine( | 
| +    webrtc::AudioDeviceModule* adm, | 
| +    std::shared_ptr<webrtc::AudioDecoderFactory> decoder_factory) | 
| +    : WebRtcVoiceEngine(adm, decoder_factory, new VoEWrapper()) { | 
| audio_state_ = webrtc::AudioState::Create(MakeAudioStateConfig(voe())); | 
| } | 
|  | 
| -WebRtcVoiceEngine::WebRtcVoiceEngine(webrtc::AudioDeviceModule* adm, | 
| -                                     VoEWrapper* voe_wrapper) | 
| -    : adm_(adm), voe_wrapper_(voe_wrapper) { | 
| +WebRtcVoiceEngine::WebRtcVoiceEngine( | 
| +    webrtc::AudioDeviceModule* adm, | 
| +    std::shared_ptr<webrtc::AudioDecoderFactory> decoder_factory, | 
| +    VoEWrapper* voe_wrapper) | 
| +    : adm_(adm), | 
| +      decoder_factory_(std::move(decoder_factory)), | 
| +      voe_wrapper_(voe_wrapper) { | 
| RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 
| LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine"; | 
| RTC_DCHECK(voe_wrapper); | 
| @@ -547,7 +553,8 @@ WebRtcVoiceEngine::WebRtcVoiceEngine(webrtc::AudioDeviceModule* adm, | 
| webrtc::Trace::SetTraceCallback(this); | 
| webrtc::Trace::set_level_filter(kElevatedTraceFilter); | 
| LOG(LS_INFO) << webrtc::VoiceEngine::GetVersionString(); | 
| -  RTC_CHECK_EQ(0, voe_wrapper_->base()->Init(adm_.get())); | 
| +  RTC_CHECK_EQ(0, voe_wrapper_->base()->Init(adm_.get(), nullptr, | 
| +                                             decoder_factory_)); | 
| webrtc::Trace::set_level_filter(kDefaultTraceFilter); | 
|  | 
| // No ADM supplied? Get the default one from VoE. | 
| @@ -1253,13 +1260,15 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream | 
|  | 
| class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { | 
| public: | 
| -  WebRtcAudioReceiveStream(int ch, | 
| -                           uint32_t remote_ssrc, | 
| -                           uint32_t local_ssrc, | 
| -                           bool use_transport_cc, | 
| -                           const std::string& sync_group, | 
| -                           const std::vector<webrtc::RtpExtension>& extensions, | 
| -                           webrtc::Call* call) | 
| +  WebRtcAudioReceiveStream( | 
| +      int ch, | 
| +      uint32_t remote_ssrc, | 
| +      uint32_t local_ssrc, | 
| +      bool use_transport_cc, | 
| +      const std::string& sync_group, | 
| +      const std::vector<webrtc::RtpExtension>& extensions, | 
| +      webrtc::Call* call, | 
| +      std::shared_ptr<webrtc::AudioDecoderFactory> decoder_factory) | 
| : call_(call), config_() { | 
| RTC_DCHECK_GE(ch, 0); | 
| RTC_DCHECK(call); | 
| @@ -1267,6 +1276,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { | 
| config_.rtp.local_ssrc = local_ssrc; | 
| config_.voe_channel_id = ch; | 
| config_.sync_group = sync_group; | 
| +    config_.decoder_factory = std::move(decoder_factory); | 
| RecreateAudioReceiveStream(use_transport_cc, extensions); | 
| } | 
|  | 
| @@ -2096,7 +2106,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { | 
| ssrc, new WebRtcAudioReceiveStream(channel, ssrc, receiver_reports_ssrc_, | 
| recv_transport_cc_enabled_, | 
| sp.sync_label, recv_rtp_extensions_, | 
| -                                         call_))); | 
| +                                         call_, engine_->decoder_factory_))); | 
|  | 
| SetNack(channel, send_codec_spec_.nack_enabled); | 
| SetPlayout(channel, playout_); | 
|  |