Reland "Replace VideoDecoder with VideoDecoderFactory in VideoReceiveStream config."
This is a reland of 529d0d9795b81dbed5e4231f15d3752a5fc0df32 Original change's description: > Replace VideoDecoder with VideoDecoderFactory in VideoReceiveStream config. > > Preparation for deleting EnableFrameRecordning, and also a step > towards landing of the new VideoStreamDecoder. > > Bug: webrtc:9106 > Change-Id: I50964ee458b08a702ec69b82a62e4995c57cee82 > Reviewed-on: https://webrtc-review.googlesource.com/97660 > Commit-Queue: Niels Moller <nisse@webrtc.org> > Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Reviewed-by: Sebastian Jansson <srte@webrtc.org> > Reviewed-by: Erik Språng <sprang@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#24861} Bug: webrtc:9106 Change-Id: I2eb894773b3f33ff6a980e8008e8248607e32668 Reviewed-on: https://webrtc-review.googlesource.com/102480 Reviewed-by: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24882}
This commit is contained in:
@ -16,14 +16,11 @@
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "api/video/i420_buffer.h"
|
||||
#include "api/video_codecs/sdp_video_format.h"
|
||||
#include "api/video_codecs/video_decoder.h"
|
||||
#include "api/video_codecs/video_decoder_factory.h"
|
||||
#include "api/video_codecs/video_encoder.h"
|
||||
#include "api/video_codecs/video_encoder_factory.h"
|
||||
#include "call/call.h"
|
||||
#include "common_video/h264/profile_level_id.h"
|
||||
#include "media/engine/constants.h"
|
||||
#if defined(USE_BUILTIN_SW_CODECS)
|
||||
#include "media/engine/convert_legacy_video_factory.h" // nogncheck
|
||||
@ -31,7 +28,6 @@
|
||||
#include "media/engine/simulcast.h"
|
||||
#include "media/engine/webrtcmediaengine.h"
|
||||
#include "media/engine/webrtcvoiceengine.h"
|
||||
#include "modules/video_coding/include/video_error_codes.h"
|
||||
#include "rtc_base/copyonwritebuffer.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/strings/string_builder.h"
|
||||
@ -44,36 +40,6 @@ namespace cricket {
|
||||
|
||||
namespace {
|
||||
|
||||
// Video decoder class to be used for unknown codecs. Doesn't support decoding
|
||||
// but logs messages to LS_ERROR.
|
||||
class NullVideoDecoder : public webrtc::VideoDecoder {
|
||||
public:
|
||||
int32_t InitDecode(const webrtc::VideoCodec* codec_settings,
|
||||
int32_t number_of_cores) override {
|
||||
RTC_LOG(LS_ERROR) << "Can't initialize NullVideoDecoder.";
|
||||
return WEBRTC_VIDEO_CODEC_OK;
|
||||
}
|
||||
|
||||
int32_t Decode(const webrtc::EncodedImage& input_image,
|
||||
bool missing_frames,
|
||||
const webrtc::CodecSpecificInfo* codec_specific_info,
|
||||
int64_t render_time_ms) override {
|
||||
RTC_LOG(LS_ERROR) << "The NullVideoDecoder doesn't support decoding.";
|
||||
return WEBRTC_VIDEO_CODEC_OK;
|
||||
}
|
||||
|
||||
int32_t RegisterDecodeCompleteCallback(
|
||||
webrtc::DecodedImageCallback* callback) override {
|
||||
RTC_LOG(LS_ERROR)
|
||||
<< "Can't register decode complete callback on NullVideoDecoder.";
|
||||
return WEBRTC_VIDEO_CODEC_OK;
|
||||
}
|
||||
|
||||
int32_t Release() override { return WEBRTC_VIDEO_CODEC_OK; }
|
||||
|
||||
const char* ImplementationName() const override { return "NullVideoDecoder"; }
|
||||
};
|
||||
|
||||
// If this field trial is enabled, we will enable sending FlexFEC and disable
|
||||
// sending ULPFEC whenever the former has been negotiated in the SDPs.
|
||||
bool IsFlexfecFieldTrialEnabled() {
|
||||
@ -2194,12 +2160,10 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream(
|
||||
first_frame_timestamp_(-1),
|
||||
estimated_remote_start_ntp_time_ms_(0) {
|
||||
config_.renderer = this;
|
||||
DecoderMap old_decoders;
|
||||
ConfigureCodecs(recv_codecs, &old_decoders);
|
||||
ConfigureCodecs(recv_codecs);
|
||||
ConfigureFlexfecCodec(flexfec_config.payload_type);
|
||||
MaybeRecreateWebRtcFlexfecStream();
|
||||
RecreateWebRtcVideoStream();
|
||||
RTC_DCHECK(old_decoders.empty());
|
||||
}
|
||||
|
||||
WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() {
|
||||
@ -2208,7 +2172,6 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() {
|
||||
call_->DestroyFlexfecReceiveStream(flexfec_stream_);
|
||||
}
|
||||
call_->DestroyVideoReceiveStream(stream_);
|
||||
allocated_decoders_.clear();
|
||||
}
|
||||
|
||||
const std::vector<uint32_t>&
|
||||
@ -2247,58 +2210,23 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::GetRtpParameters() const {
|
||||
}
|
||||
|
||||
void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs(
|
||||
const std::vector<VideoCodecSettings>& recv_codecs,
|
||||
DecoderMap* old_decoders) {
|
||||
const std::vector<VideoCodecSettings>& recv_codecs) {
|
||||
RTC_DCHECK(!recv_codecs.empty());
|
||||
*old_decoders = std::move(allocated_decoders_);
|
||||
config_.decoders.clear();
|
||||
config_.rtp.rtx_associated_payload_types.clear();
|
||||
for (const auto& recv_codec : recv_codecs) {
|
||||
webrtc::SdpVideoFormat video_format(recv_codec.codec.name,
|
||||
recv_codec.codec.params);
|
||||
std::unique_ptr<webrtc::VideoDecoder> new_decoder;
|
||||
|
||||
if (allocated_decoders_.count(video_format) > 0) {
|
||||
RTC_LOG(LS_WARNING)
|
||||
<< "VideoReceiveStream configured with duplicate codecs: "
|
||||
<< video_format.name;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto it = old_decoders->find(video_format);
|
||||
if (it != old_decoders->end()) {
|
||||
new_decoder = std::move(it->second);
|
||||
old_decoders->erase(it);
|
||||
}
|
||||
|
||||
if (!new_decoder && decoder_factory_) {
|
||||
new_decoder = decoder_factory_->LegacyCreateVideoDecoder(
|
||||
webrtc::SdpVideoFormat(recv_codec.codec.name,
|
||||
recv_codec.codec.params),
|
||||
stream_params_.id);
|
||||
}
|
||||
|
||||
// If we still have no valid decoder, we have to create a "Null" decoder
|
||||
// that ignores all calls. The reason we can get into this state is that
|
||||
// the old decoder factory interface doesn't have a way to query supported
|
||||
// codecs.
|
||||
if (!new_decoder)
|
||||
new_decoder.reset(new NullVideoDecoder());
|
||||
|
||||
webrtc::VideoReceiveStream::Decoder decoder;
|
||||
decoder.decoder = new_decoder.get();
|
||||
decoder.decoder_factory = decoder_factory_;
|
||||
decoder.video_format = video_format;
|
||||
decoder.payload_type = recv_codec.codec.id;
|
||||
decoder.video_format =
|
||||
webrtc::SdpVideoFormat(recv_codec.codec.name, recv_codec.codec.params);
|
||||
config_.decoders.push_back(decoder);
|
||||
config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] =
|
||||
recv_codec.codec.id;
|
||||
|
||||
const bool did_insert =
|
||||
allocated_decoders_
|
||||
.insert(std::make_pair(video_format, std::move(new_decoder)))
|
||||
.second;
|
||||
RTC_CHECK(did_insert);
|
||||
}
|
||||
|
||||
const auto& codec = recv_codecs.front();
|
||||
@ -2378,9 +2306,8 @@ void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters(
|
||||
const ChangedRecvParameters& params) {
|
||||
bool video_needs_recreation = false;
|
||||
bool flexfec_needs_recreation = false;
|
||||
DecoderMap old_decoders;
|
||||
if (params.codec_settings) {
|
||||
ConfigureCodecs(*params.codec_settings, &old_decoders);
|
||||
ConfigureCodecs(*params.codec_settings);
|
||||
video_needs_recreation = true;
|
||||
}
|
||||
if (params.rtp_header_extensions) {
|
||||
@ -2413,6 +2340,7 @@ void WebRtcVideoChannel::WebRtcVideoReceiveStream::RecreateWebRtcVideoStream() {
|
||||
}
|
||||
webrtc::VideoReceiveStream::Config config = config_.Copy();
|
||||
config.rtp.protected_by_flexfec = (flexfec_stream_ != nullptr);
|
||||
config.stream_id = stream_params_.id;
|
||||
stream_ = call_->CreateVideoReceiveStream(std::move(config));
|
||||
MaybeAssociateFlexfecWithVideo();
|
||||
stream_->Start();
|
||||
|
||||
Reference in New Issue
Block a user