OLD | NEW |
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 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 const VideoCodec& codec, | 67 const VideoCodec& codec, |
68 bool is_conference_mode_screenshare) const = 0; | 68 bool is_conference_mode_screenshare) const = 0; |
69 | 69 |
70 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0; | 70 virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0; |
71 | 71 |
72 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0; | 72 virtual std::unique_ptr<EncoderFactoryAdapter> clone() const = 0; |
73 }; | 73 }; |
74 | 74 |
75 class DecoderFactoryAdapter { | 75 class DecoderFactoryAdapter { |
76 public: | 76 public: |
77 struct AllocatedDecoder { | |
78 AllocatedDecoder() = default; | |
79 AllocatedDecoder(std::unique_ptr<webrtc::VideoDecoder> decoder, | |
80 bool is_hardware_accelerated); | |
81 | |
82 std::unique_ptr<webrtc::VideoDecoder> decoder; | |
83 bool is_hardware_accelerated; | |
84 }; | |
85 | |
86 virtual ~DecoderFactoryAdapter() {} | 77 virtual ~DecoderFactoryAdapter() {} |
87 | 78 |
88 virtual AllocatedDecoder CreateVideoDecoder( | 79 virtual std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( |
89 webrtc::VideoCodecType type, | 80 webrtc::VideoCodecType type, |
90 const VideoDecoderParams& decoder_params) const = 0; | 81 const VideoDecoderParams& decoder_params) const = 0; |
91 | 82 |
92 virtual std::unique_ptr<DecoderFactoryAdapter> clone() const = 0; | 83 virtual std::unique_ptr<DecoderFactoryAdapter> clone() const = 0; |
93 }; | 84 }; |
94 | 85 |
95 namespace { | 86 namespace { |
96 | 87 |
97 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter | 88 // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter |
98 // interface. | 89 // interface. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 explicit CricketDecoderFactoryAdapter( | 121 explicit CricketDecoderFactoryAdapter( |
131 WebRtcVideoDecoderFactory* external_decoder_factory) | 122 WebRtcVideoDecoderFactory* external_decoder_factory) |
132 : internal_decoder_factory_(new InternalDecoderFactory()), | 123 : internal_decoder_factory_(new InternalDecoderFactory()), |
133 external_decoder_factory_(external_decoder_factory) {} | 124 external_decoder_factory_(external_decoder_factory) {} |
134 | 125 |
135 private: | 126 private: |
136 explicit CricketDecoderFactoryAdapter( | 127 explicit CricketDecoderFactoryAdapter( |
137 const CricketDecoderFactoryAdapter& other) | 128 const CricketDecoderFactoryAdapter& other) |
138 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {} | 129 : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {} |
139 | 130 |
140 AllocatedDecoder CreateVideoDecoder( | 131 std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder( |
141 webrtc::VideoCodecType type, | 132 webrtc::VideoCodecType type, |
142 const VideoDecoderParams& decoder_params) const override; | 133 const VideoDecoderParams& decoder_params) const override; |
143 | 134 |
144 std::unique_ptr<DecoderFactoryAdapter> clone() const override { | 135 std::unique_ptr<DecoderFactoryAdapter> clone() const override { |
145 return std::unique_ptr<DecoderFactoryAdapter>( | 136 return std::unique_ptr<DecoderFactoryAdapter>( |
146 new CricketDecoderFactoryAdapter(*this)); | 137 new CricketDecoderFactoryAdapter(*this)); |
147 } | 138 } |
148 | 139 |
149 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_; | 140 const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_; |
150 WebRtcVideoDecoderFactory* const external_decoder_factory_; | 141 WebRtcVideoDecoderFactory* const external_decoder_factory_; |
(...skipping 1977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 config_.renderer = this; | 2119 config_.renderer = this; |
2129 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> | 2120 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>> |
2130 old_decoders; | 2121 old_decoders; |
2131 ConfigureCodecs(recv_codecs, &old_decoders); | 2122 ConfigureCodecs(recv_codecs, &old_decoders); |
2132 ConfigureFlexfecCodec(flexfec_config.payload_type); | 2123 ConfigureFlexfecCodec(flexfec_config.payload_type); |
2133 MaybeRecreateWebRtcFlexfecStream(); | 2124 MaybeRecreateWebRtcFlexfecStream(); |
2134 RecreateWebRtcVideoStream(); | 2125 RecreateWebRtcVideoStream(); |
2135 RTC_DCHECK(old_decoders.empty()); | 2126 RTC_DCHECK(old_decoders.empty()); |
2136 } | 2127 } |
2137 | 2128 |
2138 DecoderFactoryAdapter::AllocatedDecoder::AllocatedDecoder( | |
2139 std::unique_ptr<webrtc::VideoDecoder> decoder, | |
2140 bool is_hardware_accelerated) | |
2141 : decoder(std::move(decoder)), | |
2142 is_hardware_accelerated(is_hardware_accelerated) {} | |
2143 | |
2144 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { | 2129 WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { |
2145 if (flexfec_stream_) { | 2130 if (flexfec_stream_) { |
2146 MaybeDissociateFlexfecFromVideo(); | 2131 MaybeDissociateFlexfecFromVideo(); |
2147 call_->DestroyFlexfecReceiveStream(flexfec_stream_); | 2132 call_->DestroyFlexfecReceiveStream(flexfec_stream_); |
2148 } | 2133 } |
2149 call_->DestroyVideoReceiveStream(stream_); | 2134 call_->DestroyVideoReceiveStream(stream_); |
2150 allocated_decoders_.clear(); | 2135 allocated_decoders_.clear(); |
2151 } | 2136 } |
2152 | 2137 |
2153 const std::vector<uint32_t>& | 2138 const std::vector<uint32_t>& |
2154 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const { | 2139 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const { |
2155 return stream_params_.ssrcs; | 2140 return stream_params_.ssrcs; |
2156 } | 2141 } |
2157 | 2142 |
2158 rtc::Optional<uint32_t> | 2143 rtc::Optional<uint32_t> |
2159 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { | 2144 WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const { |
2160 std::vector<uint32_t> primary_ssrcs; | 2145 std::vector<uint32_t> primary_ssrcs; |
2161 stream_params_.GetPrimarySsrcs(&primary_ssrcs); | 2146 stream_params_.GetPrimarySsrcs(&primary_ssrcs); |
2162 | 2147 |
2163 if (primary_ssrcs.empty()) { | 2148 if (primary_ssrcs.empty()) { |
2164 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional"; | 2149 LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional"; |
2165 return rtc::Optional<uint32_t>(); | 2150 return rtc::Optional<uint32_t>(); |
2166 } else { | 2151 } else { |
2167 return rtc::Optional<uint32_t>(primary_ssrcs[0]); | 2152 return rtc::Optional<uint32_t>(primary_ssrcs[0]); |
2168 } | 2153 } |
2169 } | 2154 } |
2170 | 2155 |
2171 DecoderFactoryAdapter::AllocatedDecoder | 2156 std::unique_ptr<webrtc::VideoDecoder> |
2172 CricketDecoderFactoryAdapter::CreateVideoDecoder( | 2157 CricketDecoderFactoryAdapter::CreateVideoDecoder( |
2173 webrtc::VideoCodecType type, | 2158 webrtc::VideoCodecType type, |
2174 const VideoDecoderParams& decoder_params) const { | 2159 const VideoDecoderParams& decoder_params) const { |
2175 if (external_decoder_factory_ != nullptr) { | 2160 if (external_decoder_factory_ != nullptr) { |
2176 std::unique_ptr<webrtc::VideoDecoder> external_decoder = | 2161 std::unique_ptr<webrtc::VideoDecoder> external_decoder = |
2177 CreateScopedVideoDecoder(external_decoder_factory_, type, | 2162 CreateScopedVideoDecoder(external_decoder_factory_, type, |
2178 decoder_params); | 2163 decoder_params); |
2179 if (external_decoder) { | 2164 if (external_decoder) { |
2180 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( | 2165 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( |
2181 new webrtc::VideoDecoderSoftwareFallbackWrapper( | 2166 new webrtc::VideoDecoderSoftwareFallbackWrapper( |
2182 type, std::move(external_decoder))); | 2167 type, std::move(external_decoder))); |
2183 return AllocatedDecoder(std::move(internal_decoder), | 2168 return internal_decoder; |
2184 true /* is_hardware_accelerated */); | |
2185 } | 2169 } |
2186 } | 2170 } |
2187 | 2171 |
2188 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( | 2172 std::unique_ptr<webrtc::VideoDecoder> internal_decoder( |
2189 internal_decoder_factory_->CreateVideoDecoderWithParams(type, | 2173 internal_decoder_factory_->CreateVideoDecoderWithParams(type, |
2190 decoder_params)); | 2174 decoder_params)); |
2191 return AllocatedDecoder(std::move(internal_decoder), | 2175 return internal_decoder; |
2192 false /* is_hardware_accelerated */); | |
2193 } | 2176 } |
2194 | 2177 |
2195 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( | 2178 void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs( |
2196 const std::vector<VideoCodecSettings>& recv_codecs, | 2179 const std::vector<VideoCodecSettings>& recv_codecs, |
2197 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>>* | 2180 std::map<webrtc::VideoCodecType, std::unique_ptr<webrtc::VideoDecoder>>* |
2198 old_decoders) { | 2181 old_decoders) { |
2199 *old_decoders = std::move(allocated_decoders_); | 2182 *old_decoders = std::move(allocated_decoders_); |
2200 allocated_decoders_.clear(); | 2183 allocated_decoders_.clear(); |
2201 config_.decoders.clear(); | 2184 config_.decoders.clear(); |
2202 for (size_t i = 0; i < recv_codecs.size(); ++i) { | 2185 for (size_t i = 0; i < recv_codecs.size(); ++i) { |
2203 webrtc::VideoCodecType type = | 2186 webrtc::VideoCodecType type = |
2204 webrtc::PayloadStringToCodecType(recv_codecs[i].codec.name); | 2187 webrtc::PayloadStringToCodecType(recv_codecs[i].codec.name); |
2205 std::unique_ptr<webrtc::VideoDecoder> new_decoder; | 2188 std::unique_ptr<webrtc::VideoDecoder> new_decoder; |
2206 | 2189 |
2207 auto it = old_decoders->find(type); | 2190 auto it = old_decoders->find(type); |
2208 if (it != old_decoders->end()) { | 2191 if (it != old_decoders->end()) { |
2209 new_decoder = std::move(it->second); | 2192 new_decoder = std::move(it->second); |
2210 old_decoders->erase(it); | 2193 old_decoders->erase(it); |
2211 } | 2194 } |
2212 | 2195 |
2213 if (!new_decoder) { | 2196 if (!new_decoder) { |
2214 DecoderFactoryAdapter::AllocatedDecoder new_allocated_decoder = | 2197 new_decoder = |
2215 decoder_factory_->CreateVideoDecoder(type, {stream_params_.id}); | 2198 decoder_factory_->CreateVideoDecoder(type, {stream_params_.id}); |
2216 new_decoder = std::unique_ptr<webrtc::VideoDecoder>( | |
2217 std::move(new_allocated_decoder.decoder)); | |
2218 // TODO(andersc): are we using the is_hardware_accelerated field for | |
2219 // anything? | |
2220 } | 2199 } |
2221 | 2200 |
2222 webrtc::VideoReceiveStream::Decoder decoder; | 2201 webrtc::VideoReceiveStream::Decoder decoder; |
2223 decoder.decoder = new_decoder.get(); | 2202 decoder.decoder = new_decoder.get(); |
2224 decoder.payload_type = recv_codecs[i].codec.id; | 2203 decoder.payload_type = recv_codecs[i].codec.id; |
2225 decoder.payload_name = recv_codecs[i].codec.name; | 2204 decoder.payload_name = recv_codecs[i].codec.name; |
2226 decoder.codec_params = recv_codecs[i].codec.params; | 2205 decoder.codec_params = recv_codecs[i].codec.params; |
2227 config_.decoders.push_back(decoder); | 2206 config_.decoders.push_back(decoder); |
2228 | 2207 |
2229 allocated_decoders_.insert(std::make_pair(type, std::move(new_decoder))); | 2208 allocated_decoders_.insert(std::make_pair(type, std::move(new_decoder))); |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2647 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - | 2626 stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() - |
2648 1); | 2627 1); |
2649 } | 2628 } |
2650 | 2629 |
2651 std::vector<webrtc::VideoStream> streams; | 2630 std::vector<webrtc::VideoStream> streams; |
2652 streams.push_back(stream); | 2631 streams.push_back(stream); |
2653 return streams; | 2632 return streams; |
2654 } | 2633 } |
2655 | 2634 |
2656 } // namespace cricket | 2635 } // namespace cricket |
OLD | NEW |