Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(277)

Side by Side Diff: webrtc/media/engine/webrtcvideoengine.cc

Issue 3007073002: Add new video codec factories (Closed)
Patch Set: . Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/media/engine/webrtcvideoengine.h" 11 #include "webrtc/media/engine/webrtcvideoengine.h"
12 12
13 #include <stdio.h> 13 #include <stdio.h>
14 #include <algorithm> 14 #include <algorithm>
15 #include <set> 15 #include <set>
16 #include <string> 16 #include <string>
17 #include <utility> 17 #include <utility>
18 18
19 #include "webrtc/api/video/i420_buffer.h" 19 #include "webrtc/api/video/i420_buffer.h"
20 #include "webrtc/api/video_codecs/sdp_video_format.h"
20 #include "webrtc/api/video_codecs/video_decoder.h" 21 #include "webrtc/api/video_codecs/video_decoder.h"
22 #include "webrtc/api/video_codecs/video_decoder_factory.h"
21 #include "webrtc/api/video_codecs/video_encoder.h" 23 #include "webrtc/api/video_codecs/video_encoder.h"
24 #include "webrtc/api/video_codecs/video_encoder_factory.h"
22 #include "webrtc/call/call.h" 25 #include "webrtc/call/call.h"
23 #include "webrtc/common_video/h264/profile_level_id.h" 26 #include "webrtc/common_video/h264/profile_level_id.h"
24 #include "webrtc/media/engine/constants.h" 27 #include "webrtc/media/engine/constants.h"
25 #include "webrtc/media/engine/internaldecoderfactory.h" 28 #include "webrtc/media/engine/internaldecoderfactory.h"
26 #include "webrtc/media/engine/internalencoderfactory.h" 29 #include "webrtc/media/engine/internalencoderfactory.h"
27 #include "webrtc/media/engine/scopedvideodecoder.h" 30 #include "webrtc/media/engine/scopedvideodecoder.h"
28 #include "webrtc/media/engine/scopedvideoencoder.h" 31 #include "webrtc/media/engine/scopedvideoencoder.h"
29 #include "webrtc/media/engine/simulcast.h" 32 #include "webrtc/media/engine/simulcast.h"
30 #include "webrtc/media/engine/simulcast_encoder_adapter.h" 33 #include "webrtc/media/engine/simulcast_encoder_adapter.h"
31 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h" 34 #include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 const VideoDecoderParams& decoder_params) const = 0; 82 const VideoDecoderParams& decoder_params) const = 0;
80 }; 83 };
81 84
82 namespace { 85 namespace {
83 86
84 std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs( 87 std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
85 const std::vector<VideoCodec>& input_codecs); 88 const std::vector<VideoCodec>& input_codecs);
86 89
87 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter 90 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter
88 // interface. 91 // interface.
89 // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory 92 // TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and
90 // interface, https://bugs.chromium.org/p/webrtc/issues/detail?id=7925. 93 // webrtc:7925 is fixed.
91 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { 94 class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter {
92 public: 95 public:
93 explicit CricketEncoderFactoryAdapter( 96 explicit CricketEncoderFactoryAdapter(
94 WebRtcVideoEncoderFactory* external_encoder_factory) 97 WebRtcVideoEncoderFactory* external_encoder_factory)
95 : internal_encoder_factory_(new InternalEncoderFactory()), 98 : internal_encoder_factory_(new InternalEncoderFactory()),
96 external_encoder_factory_(external_encoder_factory) {} 99 external_encoder_factory_(external_encoder_factory) {}
97 100
98 private: 101 private:
99 explicit CricketEncoderFactoryAdapter( 102 explicit CricketEncoderFactoryAdapter(
100 const CricketEncoderFactoryAdapter& other) 103 const CricketEncoderFactoryAdapter& other)
(...skipping 22 matching lines...) Expand all
123 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {} 126 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {}
124 127
125 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( 128 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
126 const VideoCodec& codec, 129 const VideoCodec& codec,
127 const VideoDecoderParams& decoder_params) const override; 130 const VideoDecoderParams& decoder_params) const override;
128 131
129 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_; 132 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_;
130 WebRtcVideoDecoderFactory* const external_decoder_factory_; 133 WebRtcVideoDecoderFactory* const external_decoder_factory_;
131 }; 134 };
132 135
136 // Wraps webrtc::VideoEncoderFactory into common EncoderFactoryAdapter
137 // interface.
138 class WebRtcEncoderFactoryAdapter : public EncoderFactoryAdapter {
139 public:
140 explicit WebRtcEncoderFactoryAdapter(
141 std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory)
142 : encoder_factory_(std::move(encoder_factory)) {}
143
144 private:
145 AllocatedEncoder CreateVideoEncoder(
146 const VideoCodec& codec,
147 bool is_conference_mode_screenshare) const override {
148 if (!encoder_factory_)
149 return AllocatedEncoder();
150 const webrtc::SdpVideoFormat format(codec.name, codec.params);
151 const webrtc::VideoEncoderFactory::CodecInfo info =
152 encoder_factory_->QueryVideoEncoder(format);
153 return AllocatedEncoder(encoder_factory_->CreateVideoEncoder(format),
154 info.is_hardware_accelerated,
155 info.has_internal_source);
156 }
157
158 std::vector<VideoCodec> GetSupportedCodecs() const override {
159 if (!encoder_factory_)
160 return std::vector<VideoCodec>();
161 std::vector<VideoCodec> codecs;
162 for (const webrtc::SdpVideoFormat& format :
163 encoder_factory_->GetSupportedFormats()) {
164 VideoCodec codec;
165 codec.name = format.name;
166 codec.params = format.parameters;
167 codecs.push_back(codec);
168 }
169 return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
170 }
171
172 std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
173 };
174
175 // Wraps webrtc::VideoDecoderFactory into common DecoderFactoryAdapter
176 // interface.
177 class WebRtcDecoderFactoryAdapter : public DecoderFactoryAdapter {
178 public:
179 explicit WebRtcDecoderFactoryAdapter(
180 std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory)
181 : decoder_factory_(std::move(decoder_factory)) {}
182
183 private:
184 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
185 const VideoCodec& codec,
186 const VideoDecoderParams& decoder_params) const override {
187 return decoder_factory_
188 ? decoder_factory_->CreateVideoDecoder(
189 webrtc::SdpVideoFormat(codec.name, codec.params))
190 : nullptr;
191 }
192
193 std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
194 };
195
133 // If this field trial is enabled, we will enable sending FlexFEC and disable 196 // If this field trial is enabled, we will enable sending FlexFEC and disable
134 // sending ULPFEC whenever the former has been negotiated in the SDPs. 197 // sending ULPFEC whenever the former has been negotiated in the SDPs.
135 bool IsFlexfecFieldTrialEnabled() { 198 bool IsFlexfecFieldTrialEnabled() {
136 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03"); 199 return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03");
137 } 200 }
138 201
139 // If this field trial is enabled, the "flexfec-03" codec may have been 202 // If this field trial is enabled, the "flexfec-03" codec may have been
140 // advertised as being supported in the local SDP. That means that we must be 203 // advertised as being supported in the local SDP. That means that we must be
141 // ready to receive FlexFEC packets. See internalencoderfactory.cc. 204 // ready to receive FlexFEC packets. See internalencoderfactory.cc.
142 bool IsFlexfecAdvertisedFieldTrialEnabled() { 205 bool IsFlexfecAdvertisedFieldTrialEnabled() {
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 WebRtcVideoEngine::WebRtcVideoEngine( 457 WebRtcVideoEngine::WebRtcVideoEngine(
395 WebRtcVideoEncoderFactory* external_video_encoder_factory, 458 WebRtcVideoEncoderFactory* external_video_encoder_factory,
396 WebRtcVideoDecoderFactory* external_video_decoder_factory) 459 WebRtcVideoDecoderFactory* external_video_decoder_factory)
397 : decoder_factory_( 460 : decoder_factory_(
398 new CricketDecoderFactoryAdapter(external_video_decoder_factory)), 461 new CricketDecoderFactoryAdapter(external_video_decoder_factory)),
399 encoder_factory_( 462 encoder_factory_(
400 new CricketEncoderFactoryAdapter(external_video_encoder_factory)) { 463 new CricketEncoderFactoryAdapter(external_video_encoder_factory)) {
401 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; 464 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
402 } 465 }
403 466
467 WebRtcVideoEngine::WebRtcVideoEngine(
468 std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
469 std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
470 : decoder_factory_(
471 new WebRtcDecoderFactoryAdapter(std::move(video_decoder_factory))),
472 encoder_factory_(
473 new WebRtcEncoderFactoryAdapter(std::move(video_encoder_factory))) {
474 LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
475 }
476
404 WebRtcVideoEngine::~WebRtcVideoEngine() { 477 WebRtcVideoEngine::~WebRtcVideoEngine() {
405 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; 478 LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine";
406 } 479 }
407 480
408 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel( 481 WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel(
409 webrtc::Call* call, 482 webrtc::Call* call,
410 const MediaConfig& config, 483 const MediaConfig& config,
411 const VideoOptions& options) { 484 const VideoOptions& options) {
412 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); 485 LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString();
413 return new WebRtcVideoChannel(call, config, options, encoder_factory_.get(), 486 return new WebRtcVideoChannel(call, config, options, encoder_factory_.get(),
(...skipping 2194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2608 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - 2681 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() -
2609 1); 2682 1);
2610 } 2683 }
2611 2684
2612 std::vector<webrtc::VideoStream> streams; 2685 std::vector<webrtc::VideoStream> streams;
2613 streams.push_back(stream); 2686 streams.push_back(stream);
2614 return streams; 2687 return streams;
2615 } 2688 }
2616 2689
2617 } // namespace cricket 2690 } // namespace cricket
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvideoengine.h ('k') | webrtc/media/engine/webrtcvideoengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698