webrtc/modules/video_coding
Henrik Boström 80850ca477 Fix crash happening when changing from legacy to standard VP9.
Attempting to ship "WebRTC-AllowDisablingLegacyScalability" revealed a
DCHECK that happens when negotiating 3 VP9 streams prior to the
setParameters() call:
1. By default, `scalability_mode` is missing, so those 3 streams
   defaulted to legacy SVC, meaning only a single stream is used.
2. Then, setParameters() was called to make
   `encodings[0].scalability_mode = "L2T2_KEY"` and
   `encodings[1-2].active = false`. The inactive streams were just
   dummies and never expected to exist.

Without simulcast support this is OK, because both 1) and 2) are
interpreted to have a single stream. But with simulcast support, 1) is
interpreted as single stream and 2) as three streams (1 active, 2
inactive). This should be roughly the same setup, but our code treats
them differently.

The DCHECK crash was a mismatch in number of streams in one of the
layers.

The fix is to re-create the streams when the number of streams change
for this reason. The new test revealed other issues and fixes too:
- Support for multiple spatial layers (e.g. "L2T2_KEY") when multiple
  encodings exist but only one encoding is active.
- Allow inactive layers not to have a scalability mode set.

A laundry list (https://crbug.com/webrtc/15028) has been created to
update known places doing "if streams == 1" that need to do "if
active streams == 1" instead.

Credit:
  The RecreateWebRtcStream() fix is based on eshr@'s POC from
  https://webrtc-review.googlesource.com/c/src/+/298565.

Bug: webrtc:15016
Change-Id: I909a3f83a4ef53562894549ade0a870b208cec7e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/298443
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@google.com>
Cr-Commit-Position: refs/heads/main@{#39651}
2023-03-23 10:46:17 +00:00
..
codecs Dump codec input 2023-03-21 16:54:19 +00:00
deprecated Move deprecated EventWrapper to modules/video_coding/deprecated/ 2023-03-10 15:46:58 +00:00
g3doc Remove deprecated VideoStreamDecoderInterface and FrameBuffer2. 2023-02-13 16:25:00 +00:00
include Test that VideoCodecInitializer propagates VP9 resolution alignment. 2023-03-09 13:40:12 +00:00
svc Fix bug in SvcRateAllocator capping to VideoCodec.maxBitrate 2023-03-17 17:08:53 +00:00
test Move deprecated VCMPacket to modules/video_coding/deprecated/ 2023-03-02 12:43:51 +00:00
timing Rename InterFrameDelay -> InterFrameDelayVariationCalculator. 2023-03-03 11:49:37 +00:00
utility Introduce EncodedImage.SimulcastIndex(). 2023-02-15 15:02:57 +00:00
BUILD.gn Move deprecated EventWrapper to modules/video_coding/deprecated/ 2023-03-10 15:46:58 +00:00
chain_diff_calculator.cc Introduce ChainDiffCalculator 2020-05-18 14:22:44 +00:00
chain_diff_calculator.h Introduce ChainDiffCalculator 2020-05-18 14:22:44 +00:00
chain_diff_calculator_unittest.cc Introduce ChainDiffCalculator 2020-05-18 14:22:44 +00:00
decoder_database.cc Move ownership of decoders to VCMDecoderDatabase 2022-09-30 06:21:36 +00:00
decoder_database.h Move ownership of decoders to VCMDecoderDatabase 2022-09-30 06:21:36 +00:00
decoder_database_unittest.cc Move ownership of decoders to VCMDecoderDatabase 2022-09-30 06:21:36 +00:00
DEPS Move VideoEncoderConfig from api/ into video/config 2022-09-29 09:44:43 +00:00
encoded_frame.cc VCMEncodedFrame: add basic support for AV1. 2021-03-30 11:45:00 +00:00
encoded_frame.h Delete unowned buffer in EncodedImage. 2021-03-19 14:12:28 +00:00
fec_controller_default.cc Deprecate and remove usage for WARNING log level 2021-11-27 22:21:54 +00:00
fec_controller_default.h Remove more top-level const from parameters in function declarations 2022-02-01 09:15:50 +00:00
fec_controller_unittest.cc Format almost everything. 2019-07-08 13:45:15 +00:00
fec_rate_table.h
frame_dependencies_calculator.cc Ignore frame type when calculating generic frame dependencies. 2020-11-23 10:52:06 +00:00
frame_dependencies_calculator.h Ignore frame type when calculating generic frame dependencies. 2020-11-23 10:52:06 +00:00
frame_dependencies_calculator_unittest.cc Ignore frame type when calculating generic frame dependencies. 2020-11-23 10:52:06 +00:00
frame_helpers.cc Logging clarification for frame_helpers. 2022-10-13 12:40:36 +00:00
frame_helpers.h Logging clarification for frame_helpers. 2022-10-13 12:40:36 +00:00
frame_helpers_unittest.cc Logging clarification for frame_helpers. 2022-10-13 12:40:36 +00:00
generic_decoder.cc Add powerEfficientDecoder and powerEfficientEncoder stats 2022-10-19 13:15:31 +00:00
generic_decoder.h Add powerEfficientDecoder and powerEfficientEncoder stats 2022-10-19 13:15:31 +00:00
generic_decoder_unittest.cc Replace timestamp map with a deque in generic decoder 2022-08-08 13:22:57 +00:00
h264_packet_buffer.cc Prepare to rename RTC_NOTREACHED to RTC_DCHECK_NOTREACHED 2021-11-15 21:44:59 +00:00
h264_packet_buffer.h [Unwrap] Prepare SequenceNumberUnwrapper for migrations 2023-01-09 11:42:20 +00:00
h264_packet_buffer_unittest.cc Use new CopyOnWriteBuffer ctor/append function in H264PacketBuffer. 2021-09-24 11:18:42 +00:00
h264_sprop_parameter_sets.cc Format almost everything. 2019-07-08 13:45:15 +00:00
h264_sprop_parameter_sets.h Remove RTC_DISALLOW_COPY_AND_ASSIGN from modules/ 2022-01-24 11:50:20 +00:00
h264_sprop_parameter_sets_unittest.cc Fully qualify googletest symbols. 2019-04-09 17:18:20 +00:00
h264_sps_pps_tracker.cc Use backticks not vertical bars to denote variables in comments for /modules/video_coding 2021-08-09 15:26:22 +00:00
h264_sps_pps_tracker.h Use backticks not vertical bars to denote variables in comments for /modules/video_coding 2021-08-09 15:26:22 +00:00
h264_sps_pps_tracker_unittest.cc Move deprecated VCMPacket to modules/video_coding/deprecated/ 2023-03-02 12:43:51 +00:00
histogram.cc [Cleanup] Add missing #include. Remove useless ones. IWYU part 2. 2018-11-28 18:25:07 +00:00
histogram.h
histogram_unittest.cc Format almost everything. 2019-07-08 13:45:15 +00:00
internal_defines.h Remove unused defines and methods in internal_defines.h 2019-01-28 10:31:40 +00:00
jitter_buffer.cc Move deprecated VCMFrameBuffer to modules/video_coding/deprecated/ 2023-03-09 11:05:20 +00:00
jitter_buffer.h Move deprecated EventWrapper to modules/video_coding/deprecated/ 2023-03-10 15:46:58 +00:00
jitter_buffer_unittest.cc Move deprecated VCMFrameBuffer to modules/video_coding/deprecated/ 2023-03-09 11:05:20 +00:00
loss_notification_controller.cc Use backticks not vertical bars to denote variables in comments for /modules/video_coding 2021-08-09 15:26:22 +00:00
loss_notification_controller.h Use backticks not vertical bars to denote variables in comments for /modules/video_coding 2021-08-09 15:26:22 +00:00
loss_notification_controller_unittest.cc Detach LossNotificationController from RtpGenericFrameDescriptor 2020-01-24 11:53:28 +00:00
media_opt_util.cc Use backticks not vertical bars to denote variables in comments for /modules/video_coding 2021-08-09 15:26:22 +00:00
media_opt_util.h Fixes to support building in -std=c++20 mode. 2022-05-05 17:15:58 +00:00
nack_requester.cc NackRequester::ClearUpTo: avoid PostTasks. 2023-03-03 22:57:32 +00:00
nack_requester.h In video replace non-owning pointer to rtc::TaskQueue with non-owning pointer to TaskQueueBase 2022-07-18 13:59:32 +00:00
nack_requester_unittest.cc Migrate pacing and video_coding to absl::AnyInvocable based TaskQueueBase interface 2022-07-06 15:46:04 +00:00
OWNERS Remove wildcard ownership for build files. 2020-02-19 14:05:46 +00:00
packet_buffer.cc Allow video frame gaps in packet buffer for H.264 2023-02-22 13:51:10 +00:00
packet_buffer.h Clean up decoders when stopping video receive stream. 2022-09-29 12:03:13 +00:00
packet_buffer_unittest.cc Allow video frame gaps in packet buffer for H.264 2023-02-22 13:51:10 +00:00
receiver.cc Move deprecated VCMSessionInfo to modules/video_coding/deprecated/. 2023-03-06 14:10:45 +00:00
receiver.h Move deprecated EventWrapper to modules/video_coding/deprecated/ 2023-03-10 15:46:58 +00:00
receiver_unittest.cc Move deprecated VCMSessionInfo to modules/video_coding/deprecated/. 2023-03-06 14:10:45 +00:00
rtp_frame_id_only_ref_finder.cc Move RtpFrameObject and EncodedFrame out of video_coding namespace. 2021-03-23 14:22:47 +00:00
rtp_frame_id_only_ref_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_frame_reference_finder.cc Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_frame_reference_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_frame_reference_finder_unittest.cc Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_generic_ref_finder.cc SVC: Add end to end tests for VP8 and VP9 2022-06-22 11:07:01 +00:00
rtp_generic_ref_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_seq_num_only_ref_finder.cc Replace ABSL_FALLTHROUGH_INTENDED with c++17 attribute 2022-01-17 14:55:02 +00:00
rtp_seq_num_only_ref_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_vp8_ref_finder.cc SVC: Add end to end tests for VP8 and VP9 2022-06-22 11:07:01 +00:00
rtp_vp8_ref_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_vp8_ref_finder_unittest.cc Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_vp9_ref_finder.cc SVC: Add end to end tests for VP8 and VP9 2022-06-22 11:07:01 +00:00
rtp_vp9_ref_finder.h Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
rtp_vp9_ref_finder_unittest.cc Move video video receiver transformable frame to modules/rtc_rtcp/source 2023-02-03 12:59:19 +00:00
video_codec_initializer.cc Fix crash happening when changing from legacy to standard VP9. 2023-03-23 10:46:17 +00:00
video_codec_initializer_unittest.cc Keep SVC max bitrate if number of spatial layers are reduced. 2023-03-21 12:00:17 +00:00
video_coding_defines.cc Add powerEfficientDecoder and powerEfficientEncoder stats 2022-10-19 13:15:31 +00:00
video_coding_impl.cc Fork VCMDecoderDatabase for VideoReceiver. 2022-09-29 19:01:05 +00:00
video_coding_impl.h Move deprecated VCMFrameBuffer to modules/video_coding/deprecated/ 2023-03-09 11:05:20 +00:00
video_receiver.cc Move deprecated VCMPacket to modules/video_coding/deprecated/ 2023-03-02 12:43:51 +00:00
video_receiver2.cc Move ownership of decoders to VCMDecoderDatabase 2022-09-30 06:21:36 +00:00
video_receiver2.h Move ownership of decoders to VCMDecoderDatabase 2022-09-30 06:21:36 +00:00
video_receiver2_unittest.cc Add powerEfficientDecoder and powerEfficientEncoder stats 2022-10-19 13:15:31 +00:00
video_receiver_unittest.cc Add powerEfficientDecoder and powerEfficientEncoder stats 2022-10-19 13:15:31 +00:00