Version in base suite: 0~git20210124.be23804+ds-3 Base version: libtgowt_0~git20210124.be23804+ds-3 Target version: libtgowt_0~git20210627.91d836d+dfsg-3~deb11u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/libt/libtgowt/libtgowt_0~git20210124.be23804+ds-3.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/libt/libtgowt/libtgowt_0~git20210627.91d836d+dfsg-3~deb11u1.dsc .gitmodules | 3 CMakeLists.txt | 395 + cmake/external.cmake | 157 cmake/generate_stubs.cmake | 47 cmake/generate_target.cmake | 14 cmake/init_target.cmake | 8 cmake/libabsl.cmake | 2 cmake/libevent.cmake | 5 cmake/libopenh264.cmake | 17 cmake/libpffft.cmake | 2 cmake/librnnoise.cmake | 2 cmake/libsdkmacos.cmake | 8 cmake/libsrtp.cmake | 2 cmake/libusrsctp.cmake | 8 cmake/libvpx.cmake | 104 cmake/libwebrtcbuild.cmake | 31 cmake/libyuv.cmake | 2 cmake/tg_owtConfig.cmake | 5 debian/changelog | 33 debian/control | 26 debian/copyright | 23 debian/patches/Append-proto-target.patch | 17 debian/patches/Ignore-sanitize-attr.patch | 41 debian/patches/Packaged-PipeWire.patch | 55 debian/patches/Skip-RNNoise.patch | 107 debian/patches/series | 4 debian/rules | 26 debian/watch | 2 src/api/BUILD.gn | 96 src/api/DEPS | 16 src/api/async_dns_resolver.h | 85 src/api/audio/echo_canceller3_config.h | 1 src/api/audio/echo_canceller3_config_json.cc | 5 src/api/audio/echo_control.h | 7 src/api/audio/test/echo_canceller3_config_json_unittest.cc | 4 src/api/audio_codecs/BUILD.gn | 1 src/api/audio_codecs/audio_decoder.h | 2 src/api/audio_codecs/audio_encoder.h | 10 src/api/call/transport.h | 5 src/api/ice_transport_factory.cc | 7 src/api/jsep.h | 1 src/api/jsep_ice_candidate.h | 6 src/api/jsep_session_description.h | 1 src/api/media_stream_proxy.h | 4 src/api/media_stream_track_proxy.h | 16 src/api/peer_connection_factory_proxy.h | 9 src/api/peer_connection_interface.h | 15 src/api/peer_connection_proxy.h | 20 src/api/proxy.h | 184 src/api/rtp_headers.h | 5 src/api/rtp_parameters.cc | 4 src/api/rtp_parameters.h | 4 src/api/rtp_receiver_interface.h | 5 src/api/rtp_sender_interface.h | 4 src/api/rtp_transceiver_interface.h | 7 src/api/scoped_refptr.h | 1 src/api/sctp_transport_interface.h | 2 src/api/sequence_checker.h | 116 src/api/sequence_checker_unittest.cc | 174 src/api/stats/rtcstats_objects.h | 129 src/api/stats_types.h | 6 src/api/task_queue/task_queue_base.h | 7 src/api/test/network_emulation/BUILD.gn | 22 src/api/test/network_emulation/create_cross_traffic.cc | 39 src/api/test/network_emulation/create_cross_traffic.h | 37 src/api/test/network_emulation/cross_traffic.h | 85 src/api/test/network_emulation/network_emulation_interfaces.h | 13 src/api/test/network_emulation_manager.cc | 10 src/api/test/network_emulation_manager.h | 76 src/api/test/peerconnection_quality_test_fixture.h | 8 src/api/test/simulated_network.h | 3 src/api/transport/BUILD.gn | 6 src/api/transport/goog_cc_factory.h | 9 src/api/transport/network_types.h | 1 src/api/transport/stun.cc | 35 src/api/transport/stun.h | 70 src/api/transport/stun_unittest.cc | 70 src/api/uma_metrics.h | 35 src/api/video/BUILD.gn | 38 src/api/video/encoded_frame.cc | 2 src/api/video/encoded_frame.h | 40 src/api/video/encoded_image.cc | 10 src/api/video/encoded_image.h | 37 src/api/video/test/BUILD.gn | 1 src/api/video/video_frame.h | 6 src/api/video/video_frame_buffer.cc | 15 src/api/video/video_frame_buffer.h | 7 src/api/video/video_source_interface.h | 36 src/api/video/video_stream_decoder.h | 6 src/api/video/video_stream_decoder_create_unittest.cc | 1 src/api/video/video_stream_encoder_create.cc | 32 src/api/video/video_stream_encoder_create.h | 37 src/api/video/video_stream_encoder_settings.h | 11 src/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc | 4 src/api/video_codecs/video_decoder.cc | 25 src/api/video_codecs/video_decoder.h | 18 src/api/video_codecs/video_decoder_software_fallback_wrapper.cc | 21 src/api/video_codecs/video_encoder.h | 2 src/api/video_codecs/video_encoder_config.cc | 3 src/api/video_codecs/video_encoder_config.h | 3 src/api/video_codecs/video_encoder_software_fallback_wrapper.cc | 1 src/api/video_track_source_proxy.h | 26 src/api/voip/BUILD.gn | 29 src/api/voip/DEPS | 4 src/api/voip/test/compile_all_headers.cc | 14 src/api/voip/test/mock_voip_engine.h | 124 src/api/voip/test/voip_engine_factory_unittest.cc | 51 src/api/voip/voip_base.h | 4 src/api/voip/voip_engine_factory_unittest.cc | 51 src/api/voip/voip_statistics.h | 52 src/audio/BUILD.gn | 55 src/audio/audio_receive_stream.cc | 44 src/audio/audio_receive_stream.h | 9 src/audio/audio_receive_stream_unittest.cc | 1 src/audio/audio_send_stream.cc | 155 src/audio/audio_send_stream.h | 62 src/audio/audio_state.h | 10 src/audio/channel_receive.cc | 207 src/audio/channel_receive.h | 16 src/audio/channel_receive_frame_transformer_delegate.h | 2 src/audio/channel_send.cc | 65 src/audio/channel_send_frame_transformer_delegate.h | 2 src/audio/mock_voe_channel_proxy.h | 1 src/audio/null_audio_poller.h | 4 src/audio/utility/BUILD.gn | 2 src/audio/utility/audio_frame_operations.h | 8 src/audio/voip/BUILD.gn | 3 src/audio/voip/audio_channel.cc | 19 src/audio/voip/audio_channel.h | 7 src/audio/voip/audio_egress.h | 2 src/audio/voip/audio_ingress.cc | 112 src/audio/voip/audio_ingress.h | 7 src/audio/voip/test/BUILD.gn | 38 src/audio/voip/test/audio_channel_unittest.cc | 196 src/audio/voip/test/mock_task_queue.h | 60 src/audio/voip/voip_core.cc | 13 src/audio/voip/voip_core.h | 2 src/base/compiler_specific.h | 308 + src/build/build_config.h | 232 src/call/BUILD.gn | 286 - src/call/adaptation/BUILD.gn | 4 src/call/adaptation/resource_adaptation_processor.cc | 2 src/call/adaptation/video_stream_adapter.cc | 39 src/call/adaptation/video_stream_adapter.h | 3 src/call/adaptation/video_stream_input_state.cc | 12 src/call/adaptation/video_stream_input_state.h | 4 src/call/adaptation/video_stream_input_state_provider.cc | 5 src/call/adaptation/video_stream_input_state_provider_unittest.cc | 11 src/call/audio_receive_stream.h | 10 src/call/audio_send_stream.cc | 7 src/call/bitrate_allocator.h | 2 src/call/call.cc | 218 src/call/call_config.cc | 4 src/call/call_config.h | 10 src/call/call_factory.h | 2 src/call/call_perf_tests.cc | 33 src/call/call_unittest.cc | 1 src/call/packet_receiver.h | 28 src/call/rtp_demuxer.cc | 12 src/call/rtp_demuxer.h | 11 src/call/rtp_payload_params.cc | 3 src/call/rtp_stream_receiver_controller.cc | 12 src/call/rtp_stream_receiver_controller.h | 21 src/call/rtp_transport_controller_send.cc | 12 src/call/rtp_transport_controller_send.h | 2 src/call/rtp_video_sender.cc | 84 src/call/rtp_video_sender.h | 4 src/call/rtp_video_sender_unittest.cc | 115 src/call/simulated_network.h | 2 src/call/version.cc | 2 src/call/video_receive_stream.h | 21 src/call/video_send_stream.h | 1 src/common_audio/BUILD.gn | 2 src/common_audio/signal_processing/include/signal_processing_library.h | 30 src/common_audio/signal_processing/min_max_operations.c | 32 src/common_audio/signal_processing/min_max_operations_neon.c | 50 src/common_audio/signal_processing/signal_processing_unittest.cc | 48 src/common_audio/signal_processing/splitting_filter.c | 8 src/common_video/BUILD.gn | 8 src/common_video/h264/h264_bitstream_parser.cc | 33 src/common_video/h264/h264_bitstream_parser.h | 5 src/common_video/h264/h264_bitstream_parser_unittest.cc | 38 src/common_video/include/incoming_video_stream.h | 7 src/common_video/include/video_frame_buffer.h | 12 src/common_video/incoming_video_stream.cc | 4 src/common_video/libyuv/include/webrtc_libyuv.h | 5 src/common_video/libyuv/webrtc_libyuv.cc | 22 src/common_video/video_frame_buffer.cc | 20 src/common_video/video_frame_unittest.cc | 1 src/logging/BUILD.gn | 55 src/logging/rtc_event_log/encoder/blob_encoding.cc | 33 src/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc | 8 src/logging/rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc | 38 src/logging/rtc_event_log/encoder/var_int.cc | 7 src/logging/rtc_event_log/encoder/var_int.h | 16 src/logging/rtc_event_log/events/rtc_event_alr_state.cc | 8 src/logging/rtc_event_log/events/rtc_event_alr_state.h | 19 src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.cc | 8 src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h | 21 src/logging/rtc_event_log/events/rtc_event_audio_playout.cc | 8 src/logging/rtc_event_log/events/rtc_event_audio_playout.h | 19 src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.cc | 8 src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h | 24 src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.cc | 8 src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h | 23 src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.cc | 8 src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h | 27 src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.cc | 8 src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h | 27 src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc | 8 src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h | 14 src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc | 8 src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h | 17 src/logging/rtc_event_log/events/rtc_event_frame_decoded.cc | 8 src/logging/rtc_event_log/events/rtc_event_frame_decoded.h | 20 src/logging/rtc_event_log/events/rtc_event_generic_ack_received.cc | 9 src/logging/rtc_event_log/events/rtc_event_generic_ack_received.h | 27 src/logging/rtc_event_log/events/rtc_event_generic_packet_received.cc | 7 src/logging/rtc_event_log/events/rtc_event_generic_packet_received.h | 24 src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.cc | 8 src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.h | 32 src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc | 8 src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h | 27 src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc | 10 src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h | 24 src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.cc | 8 src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h | 30 src/logging/rtc_event_log/events/rtc_event_probe_result_failure.cc | 8 src/logging/rtc_event_log/events/rtc_event_probe_result_failure.h | 22 src/logging/rtc_event_log/events/rtc_event_probe_result_success.cc | 8 src/logging/rtc_event_log/events/rtc_event_probe_result_success.h | 22 src/logging/rtc_event_log/events/rtc_event_remote_estimate.h | 16 src/logging/rtc_event_log/events/rtc_event_route_change.cc | 8 src/logging/rtc_event_log/events/rtc_event_route_change.h | 22 src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc | 8 src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h | 7 src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc | 8 src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h | 7 src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.cc | 8 src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h | 7 src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc | 8 src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h | 7 src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.cc | 8 src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h | 19 src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.cc | 8 src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.h | 18 src/logging/rtc_event_log/fake_rtc_event_log.cc | 29 src/logging/rtc_event_log/fake_rtc_event_log.h | 17 src/logging/rtc_event_log/fake_rtc_event_log_factory.cc | 6 src/logging/rtc_event_log/fake_rtc_event_log_factory.h | 11 src/logging/rtc_event_log/logged_events.h | 347 - src/logging/rtc_event_log/rtc_event_log_impl.h | 2 src/logging/rtc_event_log/rtc_event_log_parser.cc | 143 src/logging/rtc_event_log/rtc_event_log_parser.h | 45 src/logging/rtc_event_log/rtc_event_log_unittest.cc | 13 src/logging/rtc_event_log/rtc_event_log_unittest_helper.cc | 38 src/logging/rtc_event_log/rtc_event_log_unittest_helper.h | 5 src/media/BUILD.gn | 330 - src/media/base/codec.cc | 6 src/media/base/fake_media_engine.h | 2 src/media/base/fake_network_interface.h | 3 src/media/base/media_channel.h | 23 src/media/base/media_constants.cc | 9 src/media/base/media_constants.h | 9 src/media/base/media_engine.h | 10 src/media/base/rtp_data_engine.cc | 4 src/media/base/rtp_data_engine.h | 2 src/media/base/video_broadcaster.cc | 1 src/media/base/video_broadcaster.h | 2 src/media/base/video_source_base.h | 2 src/media/engine/constants.cc | 19 src/media/engine/constants.h | 22 src/media/engine/encoder_simulcast_proxy_unittest.cc | 9 src/media/engine/fake_webrtc_call.cc | 28 src/media/engine/fake_webrtc_call.h | 16 src/media/engine/null_webrtc_video_engine_unittest.cc | 3 src/media/engine/payload_type_mapper.cc | 15 src/media/engine/simulcast.cc | 157 src/media/engine/simulcast_encoder_adapter.cc | 689 +- src/media/engine/simulcast_encoder_adapter.h | 136 src/media/engine/simulcast_encoder_adapter_unittest.cc | 150 src/media/engine/simulcast_unittest.cc | 146 src/media/engine/webrtc_media_engine.cc | 3 src/media/engine/webrtc_media_engine.h | 2 src/media/engine/webrtc_video_engine.cc | 348 - src/media/engine/webrtc_video_engine.h | 39 src/media/engine/webrtc_video_engine_unittest.cc | 486 +- src/media/engine/webrtc_voice_engine.cc | 362 - src/media/engine/webrtc_voice_engine.h | 20 src/media/engine/webrtc_voice_engine_unittest.cc | 5 src/media/sctp/sctp_transport.cc | 377 - src/media/sctp/sctp_transport.h | 22 src/media/sctp/sctp_transport_reliability_unittest.cc | 22 src/media/sctp/sctp_transport_unittest.cc | 55 src/modules/BUILD.gn | 2 src/modules/async_audio_processing/BUILD.gn | 2 src/modules/audio_coding/BUILD.gn | 988 ++-- src/modules/audio_coding/acm2/audio_coding_module_unittest.cc | 62 src/modules/audio_coding/codecs/ilbc/abs_quant.c | 6 src/modules/audio_coding/codecs/ilbc/abs_quant.h | 3 src/modules/audio_coding/codecs/ilbc/abs_quant_loop.c | 4 src/modules/audio_coding/codecs/ilbc/abs_quant_loop.h | 3 src/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h | 1 src/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h | 3 src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c | 5 src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h | 3 src/modules/audio_coding/codecs/ilbc/bw_expand.c | 2 src/modules/audio_coding/codecs/ilbc/bw_expand.h | 3 src/modules/audio_coding/codecs/ilbc/cb_construct.h | 6 src/modules/audio_coding/codecs/ilbc/cb_mem_energy.c | 6 src/modules/audio_coding/codecs/ilbc/cb_mem_energy.h | 3 src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c | 4 src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h | 3 src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c | 2 src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h | 3 src/modules/audio_coding/codecs/ilbc/cb_search.c | 16 src/modules/audio_coding/codecs/ilbc/cb_search.h | 5 src/modules/audio_coding/codecs/ilbc/cb_search_core.c | 4 src/modules/audio_coding/codecs/ilbc/cb_search_core.h | 3 src/modules/audio_coding/codecs/ilbc/cb_update_best_index.c | 3 src/modules/audio_coding/codecs/ilbc/cb_update_best_index.h | 3 src/modules/audio_coding/codecs/ilbc/chebyshev.c | 4 src/modules/audio_coding/codecs/ilbc/chebyshev.h | 3 src/modules/audio_coding/codecs/ilbc/comp_corr.c | 2 src/modules/audio_coding/codecs/ilbc/comp_corr.h | 3 src/modules/audio_coding/codecs/ilbc/constants.c | 3 src/modules/audio_coding/codecs/ilbc/constants.h | 3 src/modules/audio_coding/codecs/ilbc/create_augmented_vec.c | 6 src/modules/audio_coding/codecs/ilbc/create_augmented_vec.h | 3 src/modules/audio_coding/codecs/ilbc/decode.c | 21 src/modules/audio_coding/codecs/ilbc/decode.h | 9 src/modules/audio_coding/codecs/ilbc/decode_residual.c | 10 src/modules/audio_coding/codecs/ilbc/decode_residual.h | 6 src/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.c | 6 src/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.h | 3 src/modules/audio_coding/codecs/ilbc/defines.h | 1 src/modules/audio_coding/codecs/ilbc/do_plc.c | 8 src/modules/audio_coding/codecs/ilbc/do_plc.h | 3 src/modules/audio_coding/codecs/ilbc/encode.c | 21 src/modules/audio_coding/codecs/ilbc/encode.h | 3 src/modules/audio_coding/codecs/ilbc/energy_inverse.h | 3 src/modules/audio_coding/codecs/ilbc/enh_upsample.c | 4 src/modules/audio_coding/codecs/ilbc/enhancer.c | 4 src/modules/audio_coding/codecs/ilbc/enhancer.h | 3 src/modules/audio_coding/codecs/ilbc/enhancer_interface.c | 15 src/modules/audio_coding/codecs/ilbc/enhancer_interface.h | 3 src/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.c | 4 src/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h | 3 src/modules/audio_coding/codecs/ilbc/frame_classify.c | 4 src/modules/audio_coding/codecs/ilbc/frame_classify.h | 5 src/modules/audio_coding/codecs/ilbc/gain_dequant.c | 4 src/modules/audio_coding/codecs/ilbc/gain_dequant.h | 2 src/modules/audio_coding/codecs/ilbc/gain_quant.c | 4 src/modules/audio_coding/codecs/ilbc/gain_quant.h | 2 src/modules/audio_coding/codecs/ilbc/get_cd_vec.c | 2 src/modules/audio_coding/codecs/ilbc/get_cd_vec.h | 5 src/modules/audio_coding/codecs/ilbc/get_lsp_poly.c | 2 src/modules/audio_coding/codecs/ilbc/get_lsp_poly.h | 2 src/modules/audio_coding/codecs/ilbc/get_sync_seq.c | 6 src/modules/audio_coding/codecs/ilbc/get_sync_seq.h | 3 src/modules/audio_coding/codecs/ilbc/hp_input.c | 2 src/modules/audio_coding/codecs/ilbc/hp_input.h | 3 src/modules/audio_coding/codecs/ilbc/hp_output.c | 2 src/modules/audio_coding/codecs/ilbc/hp_output.h | 3 src/modules/audio_coding/codecs/ilbc/ilbc.c | 7 src/modules/audio_coding/codecs/ilbc/index_conv_dec.c | 2 src/modules/audio_coding/codecs/ilbc/index_conv_enc.c | 3 src/modules/audio_coding/codecs/ilbc/index_conv_enc.h | 2 src/modules/audio_coding/codecs/ilbc/init_decode.c | 4 src/modules/audio_coding/codecs/ilbc/init_decode.h | 2 src/modules/audio_coding/codecs/ilbc/init_encode.c | 4 src/modules/audio_coding/codecs/ilbc/init_encode.h | 2 src/modules/audio_coding/codecs/ilbc/interpolate.c | 4 src/modules/audio_coding/codecs/ilbc/interpolate.h | 2 src/modules/audio_coding/codecs/ilbc/interpolate_samples.c | 4 src/modules/audio_coding/codecs/ilbc/interpolate_samples.h | 3 src/modules/audio_coding/codecs/ilbc/lpc_encode.c | 8 src/modules/audio_coding/codecs/ilbc/lpc_encode.h | 3 src/modules/audio_coding/codecs/ilbc/lsf_check.c | 4 src/modules/audio_coding/codecs/ilbc/lsf_check.h | 2 src/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.c | 4 src/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.h | 2 src/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.c | 2 src/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.h | 2 src/modules/audio_coding/codecs/ilbc/lsf_to_lsp.c | 4 src/modules/audio_coding/codecs/ilbc/lsf_to_lsp.h | 2 src/modules/audio_coding/codecs/ilbc/lsf_to_poly.c | 6 src/modules/audio_coding/codecs/ilbc/lsf_to_poly.h | 2 src/modules/audio_coding/codecs/ilbc/lsp_to_lsf.c | 4 src/modules/audio_coding/codecs/ilbc/lsp_to_lsf.h | 2 src/modules/audio_coding/codecs/ilbc/my_corr.c | 2 src/modules/audio_coding/codecs/ilbc/my_corr.h | 3 src/modules/audio_coding/codecs/ilbc/nearest_neighbor.c | 2 src/modules/audio_coding/codecs/ilbc/nearest_neighbor.h | 3 src/modules/audio_coding/codecs/ilbc/pack_bits.c | 2 src/modules/audio_coding/codecs/ilbc/poly_to_lsf.c | 5 src/modules/audio_coding/codecs/ilbc/poly_to_lsf.h | 2 src/modules/audio_coding/codecs/ilbc/poly_to_lsp.c | 5 src/modules/audio_coding/codecs/ilbc/poly_to_lsp.h | 2 src/modules/audio_coding/codecs/ilbc/refiner.c | 3 src/modules/audio_coding/codecs/ilbc/refiner.h | 3 src/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.c | 6 src/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.h | 2 src/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.c | 8 src/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.h | 2 src/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.c | 4 src/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.h | 2 src/modules/audio_coding/codecs/ilbc/simple_lsf_quant.c | 4 src/modules/audio_coding/codecs/ilbc/simple_lsf_quant.h | 2 src/modules/audio_coding/codecs/ilbc/smooth.c | 4 src/modules/audio_coding/codecs/ilbc/smooth.h | 2 src/modules/audio_coding/codecs/ilbc/smooth_out_data.c | 4 src/modules/audio_coding/codecs/ilbc/smooth_out_data.h | 2 src/modules/audio_coding/codecs/ilbc/sort_sq.c | 2 src/modules/audio_coding/codecs/ilbc/sort_sq.h | 2 src/modules/audio_coding/codecs/ilbc/split_vq.c | 4 src/modules/audio_coding/codecs/ilbc/split_vq.h | 2 src/modules/audio_coding/codecs/ilbc/state_construct.c | 4 src/modules/audio_coding/codecs/ilbc/state_construct.h | 3 src/modules/audio_coding/codecs/ilbc/state_search.c | 6 src/modules/audio_coding/codecs/ilbc/state_search.h | 3 src/modules/audio_coding/codecs/ilbc/swap_bytes.c | 2 src/modules/audio_coding/codecs/ilbc/swap_bytes.h | 3 src/modules/audio_coding/codecs/ilbc/unpack_bits.c | 2 src/modules/audio_coding/codecs/ilbc/unpack_bits.h | 2 src/modules/audio_coding/codecs/ilbc/vq3.c | 1 src/modules/audio_coding/codecs/ilbc/vq4.c | 1 src/modules/audio_coding/codecs/ilbc/window32_w32.c | 2 src/modules/audio_coding/codecs/ilbc/window32_w32.h | 3 src/modules/audio_coding/codecs/ilbc/xcorr_coef.c | 2 src/modules/audio_coding/codecs/ilbc/xcorr_coef.h | 3 src/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h | 5 src/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc | 86 src/modules/audio_coding/codecs/opus/opus_inst.h | 3 src/modules/audio_coding/codecs/opus/opus_interface.cc | 79 src/modules/audio_coding/codecs/opus/opus_interface.h | 14 src/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc | 39 src/modules/audio_coding/codecs/red/audio_encoder_copy_red.h | 16 src/modules/audio_coding/include/audio_coding_module_typedefs.h | 2 src/modules/audio_coding/neteq/audio_decoder_unittest.cc | 4 src/modules/audio_coding/neteq/buffer_level_filter.cc | 7 src/modules/audio_coding/neteq/buffer_level_filter.h | 3 src/modules/audio_coding/neteq/cross_correlation.cc | 10 src/modules/audio_coding/neteq/decision_logic.cc | 4 src/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc | 149 src/modules/audio_coding/neteq/neteq_impl.cc | 7 src/modules/audio_coding/neteq/neteq_impl_unittest.cc | 18 src/modules/audio_coding/neteq/neteq_unittest.cc | 48 src/modules/audio_coding/neteq/normal.cc | 8 src/modules/audio_coding/neteq/normal.h | 8 src/modules/audio_coding/neteq/normal_unittest.cc | 8 src/modules/audio_device/BUILD.gn | 9 src/modules/audio_device/android/aaudio_player.h | 6 src/modules/audio_device/android/aaudio_recorder.h | 6 src/modules/audio_device/android/aaudio_wrapper.h | 6 src/modules/audio_device/android/audio_device_template.h | 84 src/modules/audio_device/android/audio_manager.h | 6 src/modules/audio_device/android/audio_record_jni.h | 6 src/modules/audio_device/android/audio_track_jni.h | 6 src/modules/audio_device/android/opensles_player.h | 6 src/modules/audio_device/android/opensles_recorder.h | 6 src/modules/audio_device/audio_device_buffer.cc | 27 src/modules/audio_device/audio_device_buffer.h | 4 src/modules/audio_device/audio_device_impl.cc | 8 src/modules/audio_device/audio_device_unittest.cc | 6 src/modules/audio_device/include/audio_device_data_observer.h | 5 src/modules/audio_device/include/audio_device_defines.h | 1 src/modules/audio_device/linux/audio_device_alsa_linux.cc | 4 src/modules/audio_device/linux/audio_device_pulse_linux.cc | 4 src/modules/audio_device/linux/audio_device_pulse_linux.h | 6 src/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc | 14 src/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc | 16 src/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h | 6 src/modules/audio_device/mac/audio_device_mac.cc | 4 src/modules/audio_device/mac/audio_mixer_manager_mac.cc | 14 src/modules/audio_device/win/audio_device_core_win.cc | 36 src/modules/audio_device/win/audio_device_module_win.cc | 82 src/modules/audio_device/win/core_audio_base_win.cc | 13 src/modules/audio_device/win/core_audio_base_win.h | 6 src/modules/audio_device/win/core_audio_input_win.cc | 4 src/modules/audio_device/win/core_audio_output_win.cc | 5 src/modules/audio_mixer/BUILD.gn | 24 src/modules/audio_mixer/audio_mixer_impl_unittest.cc | 1 src/modules/audio_processing/BUILD.gn | 267 - src/modules/audio_processing/aec3/BUILD.gn | 5 src/modules/audio_processing/aec3/block_processor.cc | 5 src/modules/audio_processing/aec3/block_processor.h | 6 src/modules/audio_processing/aec3/echo_canceller3.cc | 23 src/modules/audio_processing/aec3/echo_canceller3.h | 6 src/modules/audio_processing/aec3/echo_canceller3_unittest.cc | 8 src/modules/audio_processing/aec3/echo_remover.cc | 68 src/modules/audio_processing/aec3/echo_remover.h | 6 src/modules/audio_processing/aec3/mock/mock_block_processor.h | 4 src/modules/audio_processing/aec3/mock/mock_echo_remover.h | 4 src/modules/audio_processing/aec3/transparent_mode.cc | 12 src/modules/audio_processing/aec_dump/aec_dump_impl.cc | 6 src/modules/audio_processing/agc/BUILD.gn | 1 src/modules/audio_processing/agc/agc_manager_direct.cc | 41 src/modules/audio_processing/agc/agc_manager_direct.h | 25 src/modules/audio_processing/agc/agc_manager_direct_unittest.cc | 144 src/modules/audio_processing/agc2/BUILD.gn | 36 src/modules/audio_processing/agc2/adaptive_agc.cc | 135 src/modules/audio_processing/agc2/adaptive_agc.h | 17 src/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc | 91 src/modules/audio_processing/agc2/adaptive_digital_gain_applier.h | 29 src/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc | 199 src/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc | 152 src/modules/audio_processing/agc2/adaptive_mode_level_estimator.h | 18 src/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc | 65 src/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h | 51 src/modules/audio_processing/agc2/adaptive_mode_level_estimator_unittest.cc | 256 - src/modules/audio_processing/agc2/agc2_common.h | 79 src/modules/audio_processing/agc2/agc2_testing_common.cc | 72 src/modules/audio_processing/agc2/agc2_testing_common.h | 70 src/modules/audio_processing/agc2/agc2_testing_common_unittest.cc | 2 src/modules/audio_processing/agc2/down_sampler.cc | 4 src/modules/audio_processing/agc2/down_sampler.h | 2 src/modules/audio_processing/agc2/fixed_digital_level_estimator.cc | 24 src/modules/audio_processing/agc2/fixed_digital_level_estimator.h | 8 src/modules/audio_processing/agc2/fixed_digital_level_estimator_unittest.cc | 13 src/modules/audio_processing/agc2/fixed_gain_controller.cc | 101 src/modules/audio_processing/agc2/interpolated_gain_curve.cc | 13 src/modules/audio_processing/agc2/interpolated_gain_curve.h | 12 src/modules/audio_processing/agc2/interpolated_gain_curve_unittest.cc | 22 src/modules/audio_processing/agc2/limiter.cc | 10 src/modules/audio_processing/agc2/limiter.h | 2 src/modules/audio_processing/agc2/noise_level_estimator.cc | 270 - src/modules/audio_processing/agc2/noise_level_estimator.h | 33 src/modules/audio_processing/agc2/noise_level_estimator_unittest.cc | 117 src/modules/audio_processing/agc2/noise_spectrum_estimator.cc | 4 src/modules/audio_processing/agc2/rnn_vad/BUILD.gn | 54 src/modules/audio_processing/agc2/rnn_vad/rnn_fc_unittest.cc | 6 src/modules/audio_processing/agc2/rnn_vad/rnn_gru_unittest.cc | 9 src/modules/audio_processing/agc2/rnn_vad/rnn_vad_unittest.cc | 3 src/modules/audio_processing/agc2/rnn_vad/vector_math.h | 28 src/modules/audio_processing/agc2/rnn_vad/vector_math_unittest.cc | 3 src/modules/audio_processing/agc2/saturation_protector.cc | 213 src/modules/audio_processing/agc2/saturation_protector.h | 77 src/modules/audio_processing/agc2/saturation_protector_buffer.cc | 77 src/modules/audio_processing/agc2/saturation_protector_buffer.h | 59 src/modules/audio_processing/agc2/saturation_protector_buffer_unittest.cc | 73 src/modules/audio_processing/agc2/saturation_protector_unittest.cc | 279 - src/modules/audio_processing/agc2/signal_classifier.cc | 4 src/modules/audio_processing/agc2/signal_classifier_unittest.cc | 60 src/modules/audio_processing/agc2/vad_with_level.cc | 48 src/modules/audio_processing/agc2/vad_with_level.h | 16 src/modules/audio_processing/agc2/vad_with_level_unittest.cc | 85 src/modules/audio_processing/audio_processing_impl.cc | 440 + src/modules/audio_processing/audio_processing_impl.h | 38 src/modules/audio_processing/audio_processing_impl_unittest.cc | 192 src/modules/audio_processing/audio_processing_unittest.cc | 167 src/modules/audio_processing/capture_levels_adjuster/BUILD.gn | 45 src/modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.cc | 92 src/modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.h | 46 src/modules/audio_processing/capture_levels_adjuster/audio_samples_scaler_unittest.cc | 204 src/modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.cc | 96 src/modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.h | 88 src/modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster_unittest.cc | 187 src/modules/audio_processing/common.h | 4 src/modules/audio_processing/debug.proto | 1 src/modules/audio_processing/gain_controller2.cc | 17 src/modules/audio_processing/gain_controller2.h | 8 src/modules/audio_processing/gain_controller2_unittest.cc | 59 src/modules/audio_processing/include/aec_dump.h | 5 src/modules/audio_processing/include/audio_processing.cc | 150 src/modules/audio_processing/include/audio_processing.h | 112 src/modules/audio_processing/include/mock_audio_processing.h | 1 src/modules/audio_processing/logging/apm_data_dumper.cc | 1 src/modules/audio_processing/logging/apm_data_dumper.h | 146 src/modules/audio_processing/ns/BUILD.gn | 5 src/modules/audio_processing/ns/noise_suppressor.cc | 6 src/modules/audio_processing/ns/noise_suppressor.h | 9 src/modules/audio_processing/test/aec_dump_based_simulator.cc | 132 src/modules/audio_processing/test/aec_dump_based_simulator.h | 9 src/modules/audio_processing/test/audio_buffer_tools.cc | 13 src/modules/audio_processing/test/audio_buffer_tools.h | 6 src/modules/audio_processing/test/audio_processing_simulator.cc | 86 src/modules/audio_processing/test/audio_processing_simulator.h | 20 src/modules/audio_processing/test/audioproc_float_impl.cc | 174 src/modules/audio_processing/test/conversational_speech/BUILD.gn | 30 src/modules/audio_processing/test/echo_control_mock.h | 4 src/modules/audio_processing/test/py_quality_assessment/BUILD.gn | 316 - src/modules/audio_processing/test/wav_based_simulator.cc | 16 src/modules/audio_processing/test/wav_based_simulator.h | 4 src/modules/audio_processing/transient/BUILD.gn | 76 src/modules/congestion_controller/BUILD.gn | 4 src/modules/congestion_controller/goog_cc/BUILD.gn | 96 src/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc | 11 src/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc | 71 src/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.h | 30 src/modules/congestion_controller/goog_cc/probe_controller.h | 18 src/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc | 52 src/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h | 6 src/modules/congestion_controller/pcc/BUILD.gn | 2 src/modules/congestion_controller/receive_side_congestion_controller_unittest.cc | 6 src/modules/congestion_controller/rtp/BUILD.gn | 3 src/modules/congestion_controller/rtp/control_handler.h | 2 src/modules/congestion_controller/rtp/transport_feedback_adapter.h | 2 src/modules/desktop_capture/BUILD.gn | 13 src/modules/desktop_capture/desktop_capturer.cc | 18 src/modules/desktop_capture/desktop_capturer_differ_wrapper.cc | 3 src/modules/desktop_capture/desktop_frame.cc | 17 src/modules/desktop_capture/differ_block.cc | 2 src/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc | 4 src/modules/desktop_capture/linux/base_capturer_pipewire.cc | 38 src/modules/desktop_capture/linux/base_capturer_pipewire.h | 2 src/modules/desktop_capture/linux/screen_capturer_x11.cc | 37 src/modules/desktop_capture/linux/screen_capturer_x11.h | 4 src/modules/desktop_capture/linux/x_error_trap.cc | 28 src/modules/desktop_capture/linux/x_window_property.h | 63 src/modules/desktop_capture/mac/desktop_frame_provider.h | 4 src/modules/desktop_capture/mac/screen_capturer_mac.h | 4 src/modules/desktop_capture/screen_capturer_linux.cc | 4 src/modules/desktop_capture/win/dxgi_duplicator_controller.cc | 16 src/modules/desktop_capture/win/dxgi_duplicator_controller.h | 62 src/modules/desktop_capture/win/screen_capture_utils.cc | 43 src/modules/desktop_capture/win/screen_capture_utils.h | 9 src/modules/desktop_capture/win/screen_capture_utils_unittest.cc | 23 src/modules/desktop_capture/win/test_support/test_window.cc | 24 src/modules/desktop_capture/win/test_support/test_window.h | 8 src/modules/desktop_capture/win/wgc_capture_session.cc | 245 + src/modules/desktop_capture/win/wgc_capture_session.h | 78 src/modules/desktop_capture/win/wgc_capture_source.cc | 127 src/modules/desktop_capture/win/wgc_capture_source.h | 122 src/modules/desktop_capture/win/wgc_capturer_win.cc | 167 src/modules/desktop_capture/win/wgc_capturer_win.h | 131 src/modules/desktop_capture/win/wgc_capturer_win_unittest.cc | 409 + src/modules/desktop_capture/win/wgc_desktop_frame.cc | 25 src/modules/desktop_capture/win/wgc_desktop_frame.h | 46 src/modules/desktop_capture/win/window_capture_utils.cc | 2 src/modules/desktop_capture/win/window_capturer_win_wgc.cc | 137 src/modules/desktop_capture/win/window_capturer_win_wgc.h | 69 src/modules/desktop_capture/window_capturer_linux.cc | 4 src/modules/pacing/BUILD.gn | 2 src/modules/pacing/paced_sender.cc | 35 src/modules/pacing/paced_sender.h | 6 src/modules/pacing/pacing_controller.cc | 4 src/modules/pacing/task_queue_paced_sender.cc | 11 src/modules/pacing/task_queue_paced_sender.h | 11 src/modules/pacing/task_queue_paced_sender_unittest.cc | 38 src/modules/rtp_rtcp/BUILD.gn | 84 src/modules/rtp_rtcp/include/flexfec_receiver.h | 2 src/modules/rtp_rtcp/include/receive_statistics.h | 7 src/modules/rtp_rtcp/include/rtp_header_extension_map.h | 1 src/modules/rtp_rtcp/include/rtp_rtcp.h | 46 src/modules/rtp_rtcp/include/rtp_rtcp_defines.h | 1 src/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h | 8 src/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc | 3 src/modules/rtp_rtcp/source/fec_test_helper.cc | 36 src/modules/rtp_rtcp/source/flexfec_header_reader_writer.cc | 7 src/modules/rtp_rtcp/source/flexfec_header_reader_writer_unittest.cc | 12 src/modules/rtp_rtcp/source/flexfec_receiver_unittest.cc | 16 src/modules/rtp_rtcp/source/forward_error_correction.cc | 20 src/modules/rtp_rtcp/source/forward_error_correction.h | 4 src/modules/rtp_rtcp/source/packet_sequencer.cc | 140 src/modules/rtp_rtcp/source/packet_sequencer.h | 75 src/modules/rtp_rtcp/source/receive_statistics_impl.cc | 114 src/modules/rtp_rtcp/source/receive_statistics_impl.h | 197 src/modules/rtp_rtcp/source/receive_statistics_unittest.cc | 51 src/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h | 1 src/modules/rtp_rtcp/source/rtcp_packet/loss_notification.h | 12 src/modules/rtp_rtcp/source/rtcp_receiver.cc | 47 src/modules/rtp_rtcp/source/rtcp_receiver.h | 22 src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc | 156 src/modules/rtp_rtcp/source/rtcp_sender.cc | 390 - src/modules/rtp_rtcp/source/rtcp_sender.h | 72 src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc | 48 src/modules/rtp_rtcp/source/rtp_fec_unittest.cc | 23 src/modules/rtp_rtcp/source/rtp_header_extension_map.cc | 1 src/modules/rtp_rtcp/source/rtp_header_extensions.cc | 28 src/modules/rtp_rtcp/source/rtp_header_extensions.h | 16 src/modules/rtp_rtcp/source/rtp_packet.cc | 3 src/modules/rtp_rtcp/source/rtp_packet.h | 6 src/modules/rtp_rtcp/source/rtp_packet_received.h | 20 src/modules/rtp_rtcp/source/rtp_packet_to_send.h | 21 src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc | 157 src/modules/rtp_rtcp/source/rtp_rtcp_impl.h | 37 src/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc | 63 src/modules/rtp_rtcp/source/rtp_rtcp_impl2.h | 10 src/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc | 105 src/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc | 103 src/modules/rtp_rtcp/source/rtp_rtcp_interface.h | 30 src/modules/rtp_rtcp/source/rtp_sender.cc | 148 src/modules/rtp_rtcp/source/rtp_sender.h | 26 src/modules/rtp_rtcp/source/rtp_sender_egress.cc | 3 src/modules/rtp_rtcp/source/rtp_sender_egress.h | 2 src/modules/rtp_rtcp/source/rtp_sender_unittest.cc | 238 src/modules/rtp_rtcp/source/rtp_sender_video.cc | 45 src/modules/rtp_rtcp/source/rtp_sender_video.h | 10 src/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc | 80 src/modules/rtp_rtcp/source/rtp_utility.cc | 4 src/modules/rtp_rtcp/source/rtp_video_header.h | 3 src/modules/rtp_rtcp/source/rtp_video_layers_allocation_extension.cc | 27 src/modules/rtp_rtcp/source/rtp_video_layers_allocation_extension_unittest.cc | 32 src/modules/rtp_rtcp/source/ulpfec_header_reader_writer.cc | 4 src/modules/rtp_rtcp/source/ulpfec_header_reader_writer_unittest.cc | 12 src/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc | 32 src/modules/rtp_rtcp/source/ulpfec_receiver_impl.h | 16 src/modules/rtp_rtcp/source/ulpfec_receiver_unittest.cc | 29 src/modules/rtp_rtcp/source/video_rtp_depacketizer_h264.cc | 2 src/modules/rtp_rtcp/source/video_rtp_depacketizer_h265.cc | 5 src/modules/rtp_rtcp/test/testFec/test_fec.cc | 8 src/modules/utility/BUILD.gn | 1 src/modules/utility/include/jvm_android.h | 8 src/modules/utility/source/process_thread_impl.cc | 75 src/modules/utility/source/process_thread_impl.h | 36 src/modules/video_capture/linux/device_info_linux.cc | 4 src/modules/video_capture/windows/device_info_ds.cc | 10 src/modules/video_capture/windows/sink_filter_ds.h | 8 src/modules/video_coding/BUILD.gn | 38 src/modules/video_coding/codecs/av1/BUILD.gn | 2 src/modules/video_coding/codecs/av1/libaom_av1_decoder.cc | 8 src/modules/video_coding/codecs/av1/libaom_av1_encoder.cc | 204 src/modules/video_coding/codecs/av1/libaom_av1_encoder.h | 3 src/modules/video_coding/codecs/av1/libaom_av1_encoder_unittest.cc | 39 src/modules/video_coding/codecs/av1/libaom_av1_unittest.cc | 6 src/modules/video_coding/codecs/h264/h264_decoder_impl.cc | 18 src/modules/video_coding/codecs/h264/h264_encoder_impl.cc | 27 src/modules/video_coding/codecs/h264/h264_encoder_impl.h | 2 src/modules/video_coding/codecs/multiplex/augmented_video_frame_buffer.cc | 8 src/modules/video_coding/codecs/multiplex/include/augmented_video_frame_buffer.h | 6 src/modules/video_coding/codecs/multiplex/multiplex_decoder_adapter.cc | 9 src/modules/video_coding/codecs/multiplex/multiplex_encoder_adapter.cc | 60 src/modules/video_coding/codecs/multiplex/test/multiplex_adapter_unittest.cc | 8 src/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc | 101 src/modules/video_coding/codecs/test/videocodec_test_fixture_impl.h | 5 src/modules/video_coding/codecs/test/videocodec_test_libaom.cc | 7 src/modules/video_coding/codecs/test/videoprocessor.h | 4 src/modules/video_coding/codecs/vp8/default_temporal_layers.cc | 134 src/modules/video_coding/codecs/vp8/default_temporal_layers.h | 58 src/modules/video_coding/codecs/vp8/include/vp8.h | 5 src/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.cc | 7 src/modules/video_coding/codecs/vp8/libvpx_vp8_decoder.h | 1 src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc | 274 - src/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.h | 15 src/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc | 81 src/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc | 16 src/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.h | 1 src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc | 144 src/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.h | 13 src/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc | 413 + src/modules/video_coding/decoder_database.cc | 11 src/modules/video_coding/decoder_database.h | 5 src/modules/video_coding/decoding_state.h | 1 src/modules/video_coding/deprecated/BUILD.gn | 2 src/modules/video_coding/deprecated/nack_module.h | 4 src/modules/video_coding/encoded_frame.cc | 4 src/modules/video_coding/encoded_frame.h | 1 src/modules/video_coding/frame_buffer2.cc | 118 src/modules/video_coding/frame_buffer2.h | 10 src/modules/video_coding/frame_buffer2_unittest.cc | 10 src/modules/video_coding/frame_object.cc | 3 src/modules/video_coding/frame_object.h | 2 src/modules/video_coding/generic_decoder.cc | 113 src/modules/video_coding/generic_decoder.h | 26 src/modules/video_coding/include/video_codec_interface.h | 4 src/modules/video_coding/loss_notification_controller.h | 2 src/modules/video_coding/nack_module2.h | 2 src/modules/video_coding/packet_buffer.cc | 2 src/modules/video_coding/packet_buffer.h | 3 src/modules/video_coding/rtp_frame_id_only_ref_finder.cc | 7 src/modules/video_coding/rtp_frame_id_only_ref_finder.h | 2 src/modules/video_coding/rtp_frame_reference_finder.cc | 4 src/modules/video_coding/rtp_frame_reference_finder.h | 2 src/modules/video_coding/rtp_frame_reference_finder_unittest.cc | 439 - src/modules/video_coding/rtp_generic_ref_finder.cc | 4 src/modules/video_coding/rtp_generic_ref_finder.h | 2 src/modules/video_coding/rtp_seq_num_only_ref_finder.cc | 15 src/modules/video_coding/rtp_seq_num_only_ref_finder.h | 2 src/modules/video_coding/rtp_vp8_ref_finder.cc | 36 src/modules/video_coding/rtp_vp8_ref_finder.h | 2 src/modules/video_coding/rtp_vp8_ref_finder_unittest.cc | 360 + src/modules/video_coding/rtp_vp9_ref_finder.cc | 51 src/modules/video_coding/rtp_vp9_ref_finder.h | 2 src/modules/video_coding/rtp_vp9_ref_finder_unittest.cc | 6 src/modules/video_coding/svc/BUILD.gn | 20 src/modules/video_coding/svc/create_scalability_structure.cc | 23 src/modules/video_coding/svc/scalability_structure_full_svc.cc | 137 src/modules/video_coding/svc/scalability_structure_full_svc.h | 94 src/modules/video_coding/svc/scalability_structure_full_svc_unittest.cc | 102 src/modules/video_coding/svc/scalability_structure_key_svc.cc | 151 src/modules/video_coding/svc/scalability_structure_key_svc.h | 19 src/modules/video_coding/svc/scalability_structure_key_svc_unittest.cc | 117 src/modules/video_coding/svc/scalability_structure_l1t2.cc | 32 src/modules/video_coding/svc/scalability_structure_l1t2.h | 28 src/modules/video_coding/svc/scalability_structure_l1t3.cc | 34 src/modules/video_coding/svc/scalability_structure_l1t3.h | 34 src/modules/video_coding/svc/scalability_structure_l2t1.cc | 33 src/modules/video_coding/svc/scalability_structure_l2t1.h | 31 src/modules/video_coding/svc/scalability_structure_l2t1h.cc | 35 src/modules/video_coding/svc/scalability_structure_l2t1h.h | 27 src/modules/video_coding/svc/scalability_structure_l2t2.cc | 36 src/modules/video_coding/svc/scalability_structure_l2t2.h | 36 src/modules/video_coding/svc/scalability_structure_l3t1.cc | 36 src/modules/video_coding/svc/scalability_structure_l3t1.h | 34 src/modules/video_coding/svc/scalability_structure_l3t3.cc | 49 src/modules/video_coding/svc/scalability_structure_l3t3.h | 29 src/modules/video_coding/svc/scalability_structure_l3t3_unittest.cc | 61 src/modules/video_coding/svc/scalability_structure_s2t1.cc | 97 src/modules/video_coding/svc/scalability_structure_s2t1.h | 45 src/modules/video_coding/svc/scalability_structure_simulcast.cc | 270 + src/modules/video_coding/svc/scalability_structure_simulcast.h | 89 src/modules/video_coding/svc/scalability_structure_unittest.cc | 5 src/modules/video_coding/svc/scalable_video_controller_no_layering.cc | 26 src/modules/video_coding/svc/scalable_video_controller_no_layering.h | 3 src/modules/video_coding/timestamp_map.cc | 19 src/modules/video_coding/timestamp_map.h | 27 src/modules/video_coding/timestamp_map_unittest.cc | 121 src/modules/video_coding/utility/decoded_frames_history.cc | 86 src/modules/video_coding/utility/decoded_frames_history.h | 28 src/modules/video_coding/utility/decoded_frames_history_unittest.cc | 120 src/modules/video_coding/utility/ivf_file_reader.cc | 2 src/modules/video_coding/utility/ivf_file_reader_unittest.cc | 2 src/modules/video_coding/utility/qp_parser.cc | 53 src/modules/video_coding/utility/qp_parser.h | 45 src/modules/video_coding/utility/qp_parser_unittest.cc | 118 src/modules/video_coding/utility/quality_scaler.h | 2 src/modules/video_coding/utility/quality_scaler_unittest.cc | 5 src/modules/video_coding/video_codec_initializer.cc | 6 src/modules/video_coding/video_coding_impl.cc | 4 src/modules/video_coding/video_coding_impl.h | 9 src/modules/video_coding/video_receiver.cc | 5 src/modules/video_coding/video_receiver2.cc | 39 src/modules/video_coding/video_receiver2.h | 7 src/p2p/BUILD.gn | 47 src/p2p/base/basic_async_resolver_factory.cc | 96 src/p2p/base/basic_async_resolver_factory.h | 26 src/p2p/base/basic_async_resolver_factory_unittest.cc | 14 src/p2p/base/basic_packet_socket_factory.cc | 1 src/p2p/base/connection.cc | 7 src/p2p/base/default_ice_transport_factory.h | 2 src/p2p/base/dtls_transport.cc | 30 src/p2p/base/dtls_transport.h | 28 src/p2p/base/dtls_transport_factory.h | 3 src/p2p/base/dtls_transport_internal.h | 45 src/p2p/base/dtls_transport_unittest.cc | 9 src/p2p/base/fake_dtls_transport.h | 20 src/p2p/base/fake_ice_transport.h | 187 src/p2p/base/fake_packet_transport.h | 19 src/p2p/base/fake_port_allocator.h | 9 src/p2p/base/ice_controller_interface.h | 4 src/p2p/base/ice_transport_internal.cc | 44 src/p2p/base/ice_transport_internal.h | 12 src/p2p/base/p2p_transport_channel.cc | 3 src/p2p/base/port.cc | 16 src/p2p/base/port.h | 5 src/p2p/base/port_allocator.h | 4 src/p2p/base/port_interface.h | 5 src/p2p/base/port_unittest.cc | 21 src/p2p/base/stun_port.cc | 2 src/p2p/base/stun_request.cc | 15 src/p2p/base/test_turn_server.h | 4 src/p2p/base/turn_port.cc | 45 src/p2p/base/turn_port.h | 27 src/p2p/base/turn_port_unittest.cc | 86 src/p2p/base/turn_server.cc | 62 src/p2p/base/turn_server.h | 110 src/p2p/client/basic_port_allocator.cc | 14 src/p2p/stunprober/stun_prober.cc | 25 src/p2p/stunprober/stun_prober.h | 13 src/pc/BUILD.gn | 383 + src/pc/audio_rtp_receiver.cc | 20 src/pc/audio_rtp_receiver.h | 12 src/pc/audio_track.h | 4 src/pc/channel.cc | 271 - src/pc/channel.h | 112 src/pc/channel_interface.h | 3 src/pc/channel_manager.cc | 123 src/pc/channel_manager.h | 91 src/pc/channel_manager_unittest.cc | 123 src/pc/channel_unittest.cc | 149 src/pc/composite_rtp_transport.cc | 200 src/pc/composite_rtp_transport.h | 119 src/pc/composite_rtp_transport_test.cc | 389 - src/pc/connection_context.cc | 42 src/pc/connection_context.h | 8 src/pc/data_channel_controller.cc | 122 src/pc/data_channel_controller.h | 30 src/pc/data_channel_integrationtest.cc | 817 +++ src/pc/data_channel_unittest.cc | 6 src/pc/data_channel_utils.cc | 4 src/pc/data_channel_utils.h | 2 src/pc/dtls_srtp_transport.cc | 19 src/pc/dtls_srtp_transport.h | 17 src/pc/dtls_transport.cc | 13 src/pc/dtls_transport.h | 7 src/pc/dtmf_sender.cc | 39 src/pc/dtmf_sender.h | 38 src/pc/ice_server_parsing.cc | 3 src/pc/ice_transport.cc | 3 src/pc/ice_transport.h | 4 src/pc/jitter_buffer_delay.cc | 4 src/pc/jitter_buffer_delay_proxy.h | 4 src/pc/jsep_ice_candidate.cc | 15 src/pc/jsep_session_description.cc | 8 src/pc/jsep_session_description_unittest.cc | 27 src/pc/jsep_transport.cc | 160 src/pc/jsep_transport.h | 180 src/pc/jsep_transport_controller.cc | 248 - src/pc/jsep_transport_controller.h | 217 src/pc/jsep_transport_controller_unittest.cc | 72 src/pc/jsep_transport_unittest.cc | 3 src/pc/media_protocol_names.cc | 3 src/pc/media_session.cc | 14 src/pc/media_session.h | 8 src/pc/media_session_unittest.cc | 118 src/pc/peer_connection.cc | 699 ++ src/pc/peer_connection.h | 94 src/pc/peer_connection_bundle_unittest.cc | 2 src/pc/peer_connection_end_to_end_unittest.cc | 4 src/pc/peer_connection_factory.cc | 29 src/pc/peer_connection_factory.h | 7 src/pc/peer_connection_histogram_unittest.cc | 6 src/pc/peer_connection_ice_unittest.cc | 38 src/pc/peer_connection_integrationtest.cc | 2388 ---------- src/pc/peer_connection_interface_unittest.cc | 31 src/pc/peer_connection_jsep_unittest.cc | 63 src/pc/peer_connection_message_handler.cc | 24 src/pc/peer_connection_message_handler.h | 8 src/pc/peer_connection_rtp_unittest.cc | 54 src/pc/peer_connection_wrapper.cc | 5 src/pc/proxy_unittest.cc | 12 src/pc/remote_audio_source.cc | 22 src/pc/remote_audio_source.h | 25 src/pc/rtc_stats_collector.cc | 234 src/pc/rtc_stats_collector.h | 12 src/pc/rtc_stats_collector_unittest.cc | 236 src/pc/rtc_stats_integrationtest.cc | 131 src/pc/rtc_stats_traversal.cc | 36 src/pc/rtp_data_channel.cc | 4 src/pc/rtp_data_channel.h | 7 src/pc/rtp_media_utils.h | 1 src/pc/rtp_parameters_conversion.cc | 2 src/pc/rtp_receiver.cc | 4 src/pc/rtp_receiver.h | 1 src/pc/rtp_sender.cc | 4 src/pc/rtp_sender.h | 14 src/pc/rtp_sender_receiver_unittest.cc | 34 src/pc/rtp_transceiver.cc | 17 src/pc/rtp_transceiver.h | 23 src/pc/rtp_transceiver_unittest.cc | 32 src/pc/rtp_transmission_manager.cc | 7 src/pc/rtp_transmission_manager.h | 4 src/pc/rtp_transport.cc | 15 src/pc/rtp_transport.h | 15 src/pc/rtp_transport_internal.h | 2 src/pc/sctp_data_channel.cc | 4 src/pc/sctp_data_channel.h | 7 src/pc/sctp_data_channel_transport.cc | 2 src/pc/sctp_data_channel_transport.h | 3 src/pc/sctp_transport.cc | 132 src/pc/sctp_transport.h | 24 src/pc/sctp_utils.cc | 2 src/pc/sctp_utils.h | 1 src/pc/sctp_utils_unittest.cc | 6 src/pc/sdp_offer_answer.cc | 535 +- src/pc/sdp_offer_answer.h | 55 src/pc/sdp_serializer.cc | 4 src/pc/sdp_serializer.h | 1 src/pc/sdp_utils.cc | 2 src/pc/sdp_utils.h | 1 src/pc/session_description.cc | 2 src/pc/session_description.h | 18 src/pc/session_description_unittest.cc | 3 src/pc/simulcast_description.cc | 2 src/pc/simulcast_description.h | 2 src/pc/srtp_filter.cc | 2 src/pc/srtp_filter.h | 5 src/pc/srtp_session.cc | 37 src/pc/srtp_session.h | 10 src/pc/srtp_transport.cc | 9 src/pc/stats_collector.cc | 52 src/pc/stats_collector.h | 4 src/pc/test/fake_audio_capture_module.h | 9 src/pc/test/fake_peer_connection_for_stats.h | 68 src/pc/test/fake_periodic_video_source.h | 2 src/pc/test/integration_test_helpers.cc | 59 src/pc/test/integration_test_helpers.h | 1850 +++++++ src/pc/test/mock_channel_interface.h | 3 src/pc/test/peer_connection_test_wrapper.cc | 2 src/pc/test/peer_connection_test_wrapper.h | 4 src/pc/test/rtc_stats_obtainer.h | 2 src/pc/test/test_sdp_strings.h | 2 src/pc/track_media_info_map.cc | 5 src/pc/track_media_info_map.h | 4 src/pc/transceiver_list.cc | 7 src/pc/transceiver_list.h | 14 src/pc/usage_pattern.h | 2 src/pc/video_rtp_receiver.cc | 4 src/pc/video_rtp_receiver.h | 4 src/pc/video_rtp_track_source.cc | 6 src/pc/video_rtp_track_source.h | 8 src/pc/video_track.cc | 1 src/pc/video_track.h | 4 src/pc/video_track_source.h | 8 src/pc/webrtc_sdp.cc | 78 src/pc/webrtc_sdp.h | 5 src/pc/webrtc_sdp_unittest.cc | 78 src/pc/webrtc_session_description_factory.cc | 7 src/pc/webrtc_session_description_factory.h | 2 src/rtc_base/BUILD.gn | 924 ++- src/rtc_base/async_invoker.cc | 2 src/rtc_base/async_invoker.h | 1 src/rtc_base/async_invoker_inl.h | 1 src/rtc_base/async_resolver.cc | 169 src/rtc_base/async_resolver.h | 59 src/rtc_base/bind.h | 282 - src/rtc_base/bind_unittest.cc | 248 - src/rtc_base/boringssl_certificate.cc | 4 src/rtc_base/buffer_queue.h | 2 src/rtc_base/callback.h | 250 - src/rtc_base/callback.h.pump | 104 src/rtc_base/callback_list_unittest.cc | 3 src/rtc_base/callback_unittest.cc | 147 src/rtc_base/copy_on_write_buffer.cc | 17 src/rtc_base/copy_on_write_buffer.h | 18 src/rtc_base/copy_on_write_buffer_unittest.cc | 46 src/rtc_base/deprecated/signal_thread.cc | 172 src/rtc_base/deprecated/signal_thread.h | 172 src/rtc_base/deprecated/signal_thread_unittest.cc | 226 src/rtc_base/deprecation.h | 45 src/rtc_base/event_tracer.cc | 4 src/rtc_base/experiments/BUILD.gn | 18 src/rtc_base/experiments/balanced_degradation_settings.cc | 3 src/rtc_base/experiments/cpu_speed_experiment.cc | 1 src/rtc_base/experiments/encoder_info_settings.cc | 120 src/rtc_base/experiments/encoder_info_settings.h | 83 src/rtc_base/experiments/encoder_info_settings_unittest.cc | 102 src/rtc_base/experiments/field_trial_parser.cc | 5 src/rtc_base/experiments/keyframe_interval_settings.cc | 16 src/rtc_base/experiments/keyframe_interval_settings.h | 14 src/rtc_base/experiments/keyframe_interval_settings_unittest.cc | 56 src/rtc_base/experiments/quality_scaling_experiment.cc | 18 src/rtc_base/experiments/quality_scaling_experiment_unittest.cc | 19 src/rtc_base/experiments/rate_control_settings.cc | 15 src/rtc_base/experiments/rate_control_settings.h | 2 src/rtc_base/experiments/rate_control_settings_unittest.cc | 29 src/rtc_base/experiments/struct_parameters_parser.cc | 5 src/rtc_base/fake_mdns_responder.h | 15 src/rtc_base/file_rotating_stream.cc | 65 src/rtc_base/file_rotating_stream.h | 31 src/rtc_base/file_rotating_stream_unittest.cc | 16 src/rtc_base/internal/default_socket_server.cc | 33 src/rtc_base/internal/default_socket_server.h | 24 src/rtc_base/ip_address.cc | 3 src/rtc_base/keep_ref_until_done.h | 42 src/rtc_base/log_sinks.cc | 13 src/rtc_base/logging.h | 6 src/rtc_base/logging_unittest.cc | 95 src/rtc_base/memory/BUILD.gn | 5 src/rtc_base/message_digest.h | 3 src/rtc_base/net_helpers.cc | 144 src/rtc_base/net_helpers.h | 50 src/rtc_base/network.cc | 41 src/rtc_base/network.h | 19 src/rtc_base/network_monitor.h | 15 src/rtc_base/network_unittest.cc | 70 src/rtc_base/operations_chain.h | 2 src/rtc_base/operations_chain_unittest.cc | 1 src/rtc_base/physical_socket_server.cc | 109 src/rtc_base/physical_socket_server.h | 10 src/rtc_base/physical_socket_server_unittest.cc | 1 src/rtc_base/platform_thread.h | 6 src/rtc_base/random.h | 3 src/rtc_base/ref_counted_object.h | 24 src/rtc_base/ref_counted_object_unittest.cc | 16 src/rtc_base/rtc_certificate.h | 2 src/rtc_base/signal_thread.h | 19 src/rtc_base/socket.h | 2 src/rtc_base/ssl_identity.h | 1 src/rtc_base/ssl_stream_adapter.h | 1 src/rtc_base/swap_queue.h | 6 src/rtc_base/synchronization/BUILD.gn | 82 src/rtc_base/synchronization/mutex.h | 4 src/rtc_base/synchronization/mutex_abseil.h | 3 src/rtc_base/synchronization/mutex_critical_section.h | 3 src/rtc_base/synchronization/mutex_pthread.h | 3 src/rtc_base/synchronization/sequence_checker.cc | 112 src/rtc_base/synchronization/sequence_checker.h | 187 src/rtc_base/synchronization/sequence_checker_internal.cc | 115 src/rtc_base/synchronization/sequence_checker_internal.h | 93 src/rtc_base/synchronization/sequence_checker_unittest.cc | 175 src/rtc_base/system/BUILD.gn | 14 src/rtc_base/system/arch.h | 37 src/rtc_base/system/file_wrapper.cc | 16 src/rtc_base/system/file_wrapper.h | 6 src/rtc_base/system/file_wrapper_unittest.cc | 69 src/rtc_base/system/no_unique_address.h | 7 src/rtc_base/system/unused.h | 15 src/rtc_base/system_time.cc | 97 src/rtc_base/system_time.h | 22 src/rtc_base/task_queue_libevent.cc | 2 src/rtc_base/task_queue_unittest.cc | 3 src/rtc_base/task_utils/BUILD.gn | 6 src/rtc_base/task_utils/pending_task_safety_flag.cc | 12 src/rtc_base/task_utils/pending_task_safety_flag.h | 89 src/rtc_base/task_utils/to_queued_task.h | 2 src/rtc_base/test_utils.h | 57 src/rtc_base/thread.cc | 75 src/rtc_base/thread.h | 63 src/rtc_base/thread_checker.h | 27 src/rtc_base/thread_checker_unittest.cc | 253 - src/rtc_base/thread_unittest.cc | 133 src/rtc_base/time_utils.cc | 67 src/rtc_base/time_utils.h | 8 src/rtc_base/virtual_socket_server.cc | 335 - src/rtc_base/virtual_socket_server.h | 147 src/rtc_base/virtual_socket_unittest.cc | 5 src/rtc_base/weak_ptr.h | 2 src/rtc_base/win/create_direct3d_device.cc | 57 src/rtc_base/win/create_direct3d_device.h | 34 src/rtc_base/win/get_activation_factory.h | 4 src/rtc_base/win/scoped_com_initializer.cc | 3 src/rtc_base/win/scoped_com_initializer.h | 2 src/sdk/BUILD.gn | 51 src/sdk/android/BUILD.gn | 55 src/sdk/android/OWNERS | 5 src/sdk/android/api/org/webrtc/GlUtil.java | 12 src/sdk/android/api/org/webrtc/PeerConnection.java | 38 src/sdk/android/api/org/webrtc/VideoDecoder.java | 5 src/sdk/android/api/org/webrtc/WrappedNativeVideoDecoder.java | 5 src/sdk/android/native_api/audio_device_module/audio_device_android.cc | 8 src/sdk/android/native_api/jni/java_types.h | 4 src/sdk/android/native_api/video/video_source.cc | 1 src/sdk/android/native_unittests/android_network_monitor_unittest.cc | 59 src/sdk/android/src/java/org/webrtc/AndroidVideoDecoder.java | 25 src/sdk/android/src/java/org/webrtc/EglBase10Impl.java | 48 src/sdk/android/src/java/org/webrtc/GlGenericDrawer.java | 5 src/sdk/android/src/jni/android_network_monitor.cc | 122 src/sdk/android/src/jni/android_network_monitor.h | 34 src/sdk/android/src/jni/android_video_track_source.cc | 8 src/sdk/android/src/jni/audio_device/aaudio_player.h | 7 src/sdk/android/src/jni/audio_device/aaudio_recorder.h | 7 src/sdk/android/src/jni/audio_device/aaudio_wrapper.h | 6 src/sdk/android/src/jni/audio_device/audio_device_module.cc | 160 src/sdk/android/src/jni/audio_device/audio_record_jni.h | 7 src/sdk/android/src/jni/audio_device/audio_track_jni.h | 7 src/sdk/android/src/jni/audio_device/opensles_common.h | 4 src/sdk/android/src/jni/audio_device/opensles_player.h | 7 src/sdk/android/src/jni/audio_device/opensles_recorder.h | 6 src/sdk/android/src/jni/egl_base_10_impl.cc | 23 src/sdk/android/src/jni/pc/peer_connection.cc | 31 src/sdk/android/src/jni/pc/sdp_observer.cc | 34 src/sdk/android/src/jni/pc/sdp_observer.h | 25 src/sdk/android/src/jni/pc/video.cc | 1 src/sdk/android/src/jni/video_decoder_wrapper.cc | 13 src/sdk/android/src/jni/video_decoder_wrapper.h | 9 src/sdk/android/src/jni/video_encoder_wrapper.cc | 19 src/sdk/android/src/jni/video_encoder_wrapper.h | 4 src/sdk/android/src/jni/video_frame.cc | 3 src/sdk/android/src/jni/video_frame.h | 1 src/sdk/objc/api/peerconnection/RTCConfiguration.h | 48 src/sdk/objc/api/peerconnection/RTCConfiguration.mm | 49 src/sdk/objc/api/peerconnection/RTCPeerConnection+Private.h | 21 src/sdk/objc/api/peerconnection/RTCPeerConnection.h | 51 src/sdk/objc/api/peerconnection/RTCPeerConnection.mm | 166 src/sdk/objc/api/peerconnection/RTCPeerConnectionFactory+Native.h | 2 src/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.h | 2 src/sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm | 4 src/sdk/objc/api/video_codec/RTCVideoCodecConstants.h | 5 src/sdk/objc/api/video_codec/RTCVideoCodecConstants.mm | 1 src/sdk/objc/api/video_codec/RTCVideoDecoderAV1.h | 27 src/sdk/objc/api/video_codec/RTCVideoDecoderAV1.mm | 35 src/sdk/objc/api/video_codec/RTCVideoDecoderVP9.h | 2 src/sdk/objc/api/video_codec/RTCVideoDecoderVP9.mm | 14 src/sdk/objc/api/video_codec/RTCVideoEncoderAV1.h | 27 src/sdk/objc/api/video_codec/RTCVideoEncoderAV1.mm | 35 src/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h | 2 src/sdk/objc/api/video_codec/RTCVideoEncoderVP9.mm | 14 src/sdk/objc/components/audio/RTCAudioSession+Configuration.mm | 3 src/sdk/objc/components/audio/RTCAudioSession+Private.h | 2 src/sdk/objc/components/audio/RTCAudioSession.mm | 117 src/sdk/objc/components/capturer/RTCCameraVideoCapturer.h | 2 src/sdk/objc/components/capturer/RTCCameraVideoCapturer.m | 2 src/sdk/objc/components/renderer/metal/RTCMTLRenderer.mm | 11 src/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m | 49 src/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m | 53 src/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm | 6 src/sdk/objc/components/video_codec/UIDevice+H264Profile.mm | 8 src/sdk/objc/helpers/UIDevice+RTCDevice.h | 8 src/sdk/objc/helpers/UIDevice+RTCDevice.mm | 12 src/sdk/objc/native/api/audio_device_module.mm | 2 src/sdk/objc/native/api/network_monitor_factory.mm | 2 src/sdk/objc/native/src/audio/audio_device_ios.h | 10 src/sdk/objc/native/src/audio/audio_device_ios.mm | 26 src/sdk/objc/native/src/audio/audio_device_module_ios.mm | 186 src/sdk/objc/native/src/objc_network_monitor.h | 13 src/sdk/objc/native/src/objc_network_monitor.mm | 12 src/sdk/objc/unittests/RTCAudioSessionTest.mm | 36 src/stats/BUILD.gn | 2 src/stats/rtcstats_objects.cc | 207 src/system_wrappers/BUILD.gn | 5 src/system_wrappers/source/clock.cc | 8 src/third_party/rnnoise/BUILD.gn | 17 src/third_party/rnnoise/COPYING | 31 src/third_party/rnnoise/OWNERS | 3 src/third_party/rnnoise/README.chromium | 29 src/third_party/rnnoise/src/rnn_activations.h | 102 src/third_party/rnnoise/src/rnn_vad_weights.cc | 401 - src/third_party/rnnoise/src/rnn_vad_weights.h | 37 src/tools/generate_stubs/generate_stubs.py | 1202 +++++ src/video/BUILD.gn | 545 +- src/video/adaptation/BUILD.gn | 3 src/video/adaptation/balanced_constraint.cc | 5 src/video/adaptation/balanced_constraint.h | 2 src/video/adaptation/bitrate_constraint.cc | 46 src/video/adaptation/bitrate_constraint.h | 2 src/video/adaptation/bitrate_constraint_unittest.cc | 191 src/video/adaptation/overuse_frame_detector.h | 2 src/video/adaptation/pixel_limit_resource.cc | 2 src/video/adaptation/video_stream_encoder_resource.h | 2 src/video/adaptation/video_stream_encoder_resource_manager.cc | 99 src/video/adaptation/video_stream_encoder_resource_manager.h | 5 src/video/alignment_adjuster.cc | 9 src/video/alignment_adjuster.h | 6 src/video/alignment_adjuster_unittest.cc | 57 src/video/buffered_frame_decryptor.cc | 4 src/video/buffered_frame_decryptor.h | 10 src/video/buffered_frame_decryptor_unittest.cc | 8 src/video/call_stats.h | 6 src/video/call_stats2.cc | 14 src/video/call_stats2.h | 3 src/video/call_stats2_unittest.cc | 5 src/video/encoder_bitrate_adjuster.cc | 9 src/video/encoder_bitrate_adjuster.h | 2 src/video/encoder_bitrate_adjuster_unittest.cc | 9 src/video/end_to_end_tests/extended_reports_tests.cc | 16 src/video/end_to_end_tests/resolution_bitrate_limits_tests.cc | 374 + src/video/frame_dumping_decoder.cc | 6 src/video/pc_full_stack_tests.cc | 4 src/video/quality_scaling_tests.cc | 349 - src/video/receive_statistics_proxy.h | 8 src/video/receive_statistics_proxy2.h | 5 src/video/rtp_streams_synchronizer.h | 4 src/video/rtp_streams_synchronizer2.h | 2 src/video/rtp_video_stream_receiver.cc | 73 src/video/rtp_video_stream_receiver.h | 26 src/video/rtp_video_stream_receiver2.cc | 101 src/video/rtp_video_stream_receiver2.h | 31 src/video/rtp_video_stream_receiver2_unittest.cc | 188 src/video/rtp_video_stream_receiver_frame_transformer_delegate.cc | 11 src/video/rtp_video_stream_receiver_frame_transformer_delegate.h | 7 src/video/rtp_video_stream_receiver_frame_transformer_delegate_unittest.cc | 8 src/video/rtp_video_stream_receiver_unittest.cc | 93 src/video/send_statistics_proxy.cc | 2 src/video/send_statistics_proxy_unittest.cc | 1 src/video/video_analyzer.cc | 1 src/video/video_receive_stream.cc | 23 src/video/video_receive_stream.h | 13 src/video/video_receive_stream2.cc | 136 src/video/video_receive_stream2.h | 20 src/video/video_receive_stream2_unittest.cc | 159 src/video/video_receive_stream_unittest.cc | 32 src/video/video_send_stream.cc | 27 src/video/video_send_stream.h | 4 src/video/video_send_stream_impl.cc | 14 src/video/video_send_stream_tests.cc | 2 src/video/video_source_sink_controller.cc | 22 src/video/video_source_sink_controller.h | 7 src/video/video_stream_decoder_impl.cc | 21 src/video/video_stream_decoder_impl.h | 15 src/video/video_stream_decoder_impl_unittest.cc | 9 src/video/video_stream_encoder.cc | 637 +- src/video/video_stream_encoder.h | 68 src/video/video_stream_encoder_unittest.cc | 1734 ++++++- 1265 files changed, 37373 insertions(+), 22829 deletions(-) diff -Nru libtgowt-0~git20210124.be23804+ds/.gitmodules libtgowt-0~git20210627.91d836d+dfsg/.gitmodules --- libtgowt-0~git20210124.be23804+ds/.gitmodules 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/.gitmodules 2021-06-27 05:27:48.000000000 +0000 @@ -4,3 +4,6 @@ [submodule "src/third_party/libyuv"] path = src/third_party/libyuv url = https://chromium.googlesource.com/libyuv/libyuv +[submodule "src/third_party/pipewire"] + path = src/third_party/pipewire + url = https://github.com/PipeWire/pipewire.git diff -Nru libtgowt-0~git20210124.be23804+ds/CMakeLists.txt libtgowt-0~git20210627.91d836d+dfsg/CMakeLists.txt --- libtgowt-0~git20210124.be23804+ds/CMakeLists.txt 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/CMakeLists.txt 2021-06-27 05:27:48.000000000 +0000 @@ -6,11 +6,7 @@ set(TG_OWT_SPECIAL_TARGET "" CACHE STRING "Use special platform target, like 'macstore' for Mac App Store.") -if (NOT TG_OWT_SPECIAL_TARGET STREQUAL "osx") - set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "Minimum OS X deployment version" FORCE) -else() - set(CMAKE_OSX_DEPLOYMENT_TARGET 10.10 CACHE STRING "Minimum OS X deployment version" FORCE) -endif() +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.11 CACHE STRING "Minimum OS X deployment version" FORCE) if (NOT TG_OWT_SPECIAL_TARGET STREQUAL "") set(TG_OWT_PACKAGED_BUILD 0) @@ -18,8 +14,24 @@ set(TG_OWT_PACKAGED_BUILD 1) endif() +set(not_packaged_build 0) +if (NOT TG_OWT_PACKAGED_BUILD) + set(not_packaged_build 1) +endif() + option(BUILD_SHARED_LIBS "Builds shared libraries instead of static." ${TG_OWT_PACKAGED_BUILD}) option(TG_OWT_USE_PROTOBUF "Use protobuf to generate additional headers. Useful for packaged build." ${BUILD_SHARED_LIBS}) +option(TG_OWT_USE_PIPEWIRE "Use pipewire for desktop capture on non-Apple Unix." ON) +option(TG_OWT_DLOPEN_PIPEWIRE "dlopen pipewire 0.3 for desktop capture on non-Apple Unix." ${not_packaged_build}) +option(TG_OWT_BUILD_AUDIO_BACKENDS "Build webrtc audio backends." ON) + +if (NOT UNIX OR APPLE) + set(TG_OWT_USE_PIPEWIRE OFF) +endif() + +if (BUILD_SHARED_LIBS) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +endif() project(tg_owt LANGUAGES C CXX ASM @@ -30,6 +42,7 @@ get_filename_component(webrtc_loc "src" REALPATH) set(third_party_loc ${webrtc_loc}/third_party) +set(tools_loc ${webrtc_loc}/tools) include(GNUInstallDirs) set(webrtc_includedir ${CMAKE_INSTALL_INCLUDEDIR}/tg_owt) @@ -47,6 +60,7 @@ include(cmake/nice_target_sources.cmake) include(cmake/init_target.cmake) +include(cmake/generate_target.cmake) include(cmake/target_yasm_sources.cmake) include(cmake/external.cmake) include(cmake/libabsl.cmake) @@ -56,7 +70,6 @@ include(cmake/libsrtp.cmake) include(cmake/libusrsctp.cmake) include(cmake/libvpx.cmake) -include(cmake/libwebrtcbuild.cmake) include(cmake/libyuv.cmake) if (NOT WIN32 AND NOT APPLE) include(cmake/libevent.cmake) @@ -74,43 +87,45 @@ add_library(tg_owt) init_target(tg_owt) +if (TG_OWT_USE_PIPEWIRE) + if (TG_OWT_DLOPEN_PIPEWIRE) + include(cmake/generate_stubs.cmake) + set(stubs_loc ${webrtc_loc}/modules/desktop_capture/linux) + generate_stubs(tg_owt + ${stubs_loc}/pipewire_stub_header.fragment + pipewire_stubs + ${stubs_loc}/pipewire03.sigs + ) + target_compile_definitions(tg_owt + PRIVATE + WEBRTC_DLOPEN_PIPEWIRE + ) + target_include_directories(tg_owt + PRIVATE + ${webrtc_loc}/third_party/pipewire/spa/include + ${webrtc_loc}/third_party/pipewire/src + ${webrtc_loc}/third_party/pipewire/build/src + ) + else() + link_pipewire(tg_owt) + endif() +endif() + set_target_properties(tg_owt PROPERTIES SOVERSION 0 VERSION 0.0.0) +target_link_libraries(tg_owt +PRIVATE + tg_owt::libpffft + tg_owt::librnnoise + tg_owt::libsrtp + tg_owt::libyuv +) + if (is_x86 OR is_x64) target_link_libraries(tg_owt - PUBLIC - tg_owt::libwebrtcbuild PRIVATE tg_owt::tg_owt_avx2 tg_owt::tg_owt_sse2 - tg_owt::libabsl - tg_owt::libopenh264 - tg_owt::libpffft - tg_owt::librnnoise - tg_owt::libsrtp - tg_owt::libusrsctp - tg_owt::libvpx - tg_owt::libvpx_mmx - tg_owt::libvpx_sse2 - tg_owt::libvpx_ssse3 - tg_owt::libvpx_sse4 - tg_owt::libvpx_avx - tg_owt::libvpx_avx2 - tg_owt::libyuv - ) -else() - target_link_libraries(tg_owt - PUBLIC - tg_owt::libwebrtcbuild - PRIVATE - tg_owt::libabsl - tg_owt::libopenh264 - tg_owt::libpffft - tg_owt::librnnoise - tg_owt::libsrtp - tg_owt::libusrsctp - tg_owt::libvpx - tg_owt::libyuv ) endif() @@ -127,9 +142,6 @@ ${libopenh264_yasm_objects} ) -if (NOT WIN32 AND NOT APPLE) - target_link_libraries(tg_owt PRIVATE tg_owt::libevent) -endif() if (APPLE) target_link_libraries(tg_owt PUBLIC tg_owt::libsdkmacos) endif() @@ -137,13 +149,29 @@ link_openssl(tg_owt) link_ffmpeg(tg_owt) link_opus(tg_owt) +link_libabsl(tg_owt) +link_libopenh264(tg_owt) +link_libusrsctp(tg_owt) +link_libvpx(tg_owt) -if (UNIX AND NOT APPLE) +if (TG_OWT_BUILD_AUDIO_BACKENDS AND (UNIX AND NOT APPLE)) link_libalsa(tg_owt) link_libpulse(tg_owt) link_dl(tg_owt) endif() +if (NOT WIN32 AND NOT APPLE) + link_libevent(tg_owt) +endif() + +include(cmake/libwebrtcbuild.cmake) +target_link_libraries(tg_owt PUBLIC tg_owt::libwebrtcbuild) + +if (UNIX AND NOT APPLE) + link_x11(tg_owt) + link_glib(tg_owt) +endif() + function(add_sublibrary postfix) add_library(tg_owt_${postfix} OBJECT) init_feature_target(tg_owt_${postfix} ${postfix}) @@ -151,9 +179,8 @@ target_link_libraries(tg_owt_${postfix} PUBLIC tg_owt::libwebrtcbuild - PRIVATE - tg_owt::libabsl ) + link_libabsl(tg_owt_${postfix}) target_include_directories(tg_owt_${postfix} PUBLIC $ @@ -178,6 +205,8 @@ rtc_base/async_packet_socket.h rtc_base/async_resolver_interface.cc rtc_base/async_resolver_interface.h + rtc_base/async_resolver.cc + rtc_base/async_resolver.h rtc_base/async_socket.cc rtc_base/async_socket.h rtc_base/async_tcp_socket.cc @@ -207,7 +236,7 @@ rtc_base/ip_address.h rtc_base/logging.cc rtc_base/logging.h - rtc_base/keep_ref_until_done.h + # rtc_base/keep_ref_until_done.h rtc_base/mdns_responder_interface.h rtc_base/memory/aligned_malloc.cc rtc_base/memory/aligned_malloc.h @@ -298,7 +327,7 @@ rtc_base/thread_message.h rtc_base/unique_id_generator.cc rtc_base/unique_id_generator.h - rtc_base/bind.h + # rtc_base/bind.h rtc_base/bit_buffer.cc rtc_base/bit_buffer.h rtc_base/buffer.h @@ -353,12 +382,16 @@ rtc_base/win/scoped_com_initializer.h rtc_base/win/windows_version.cc rtc_base/win/windows_version.h + rtc_base/win/create_direct3d_device.cc + rtc_base/win/create_direct3d_device.h rtc_base/strings/string_builder.cc rtc_base/strings/string_builder.h rtc_base/strings/string_format.cc rtc_base/strings/string_format.h # rtc_base/experiments/experimental_screenshare_settings.cc # rtc_base/experiments/experimental_screenshare_settings.h + rtc_base/experiments/encoder_info_settings.cc + rtc_base/experiments/encoder_info_settings.h rtc_base/experiments/alr_experiment.cc rtc_base/experiments/balanced_degradation_settings.cc rtc_base/experiments/cpu_speed_experiment.cc @@ -383,7 +416,8 @@ rtc_base/numerics/moving_average.cc rtc_base/numerics/sample_counter.cc rtc_base/numerics/sample_stats.cc - # rtc_base/numerics/samples_stats_counter.cc + api/numerics/samples_stats_counter.cc + api/numerics/samples_stats_counter.h rtc_base/strings/audio_format_to_string.cc rtc_base/strings/string_builder.cc rtc_base/synchronization/mutex.cc @@ -396,8 +430,8 @@ # rtc_base/synchronization/rw_lock_win.h # rtc_base/synchronization/rw_lock_wrapper.cc # rtc_base/synchronization/rw_lock_wrapper.h - rtc_base/synchronization/sequence_checker.cc - rtc_base/synchronization/sequence_checker.h + rtc_base/synchronization/sequence_checker_internal.cc + rtc_base/synchronization/sequence_checker_internal.h rtc_base/synchronization/yield_policy.cc rtc_base/synchronization/yield_policy.h rtc_base/system/file_wrapper.cc @@ -407,6 +441,8 @@ rtc_base/system/cocoa_threading.mm rtc_base/system/gcd_helpers.h rtc_base/system/gcd_helpers.m + rtc_base/system_time.cc + rtc_base/system_time.h rtc_base/task_queue.cc rtc_base/task_queue_gcd.cc rtc_base/task_queue_gcd.h @@ -416,6 +452,8 @@ rtc_base/task_queue_win.h rtc_base/ifaddrs_converter.cc rtc_base/ifaddrs_converter.h + rtc_base/internal/default_socket_server.cc + rtc_base/internal/default_socket_server.h rtc_base/mac_ifaddrs_converter.cc rtc_base/task_utils/repeating_task.cc rtc_base/task_utils/repeating_task.h @@ -456,6 +494,7 @@ api/audio_codecs/opus/audio_encoder_opus_config.cc api/audio_codecs/opus_audio_decoder_factory.cc api/audio_codecs/opus_audio_encoder_factory.cc + api/async_dns_resolver.h api/audio_options.cc api/call/transport.cc api/candidate.cc @@ -473,7 +512,6 @@ api/neteq/neteq.cc api/neteq/tick_timer.cc api/peer_connection_interface.cc - api/proxy.cc api/rtc_error.cc api/rtc_event_log/rtc_event.cc api/rtc_event_log/rtc_event_log.cc @@ -551,7 +589,7 @@ api/video/video_frame_metadata.h api/video/video_source_interface.cc api/video/video_stream_decoder_create.cc - api/video/video_stream_encoder_create.cc + # api/video/video_stream_encoder_create.cc api/video/video_timing.cc api/video/video_stream_encoder_interface.h # api/video/video_stream_encoder_observer.cc @@ -577,8 +615,8 @@ pc/channel_manager.h # pc/composite_data_channel_transport.cc # pc/composite_data_channel_transport.h - pc/composite_rtp_transport.cc - pc/composite_rtp_transport.h + # pc/composite_rtp_transport.cc + # pc/composite_rtp_transport.h # pc/datagram_rtp_transport.cc # pc/datagram_rtp_transport.h pc/dtls_srtp_transport.cc @@ -731,7 +769,7 @@ media/base/video_source_base.cc media/base/vp9_profile.cc media/engine/adm_helpers.cc - media/engine/constants.cc + # media/engine/constants.cc media/engine/encoder_simulcast_proxy.cc media/engine/internal_decoder_factory.cc media/engine/internal_encoder_factory.cc @@ -1092,7 +1130,7 @@ modules/audio_processing/agc2/adaptive_agc.cc modules/audio_processing/agc2/adaptive_digital_gain_applier.cc modules/audio_processing/agc2/adaptive_mode_level_estimator.cc - modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc + # modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc # modules/audio_processing/agc2/agc2_common.cc modules/audio_processing/agc2/agc2_testing_common.cc modules/audio_processing/agc2/biquad_filter.cc @@ -1108,6 +1146,8 @@ modules/audio_processing/agc2/noise_level_estimator.cc modules/audio_processing/agc2/noise_spectrum_estimator.cc modules/audio_processing/agc2/saturation_protector.cc + modules/audio_processing/agc2/saturation_protector_buffer.cc + modules/audio_processing/agc2/saturation_protector_buffer.h modules/audio_processing/agc2/signal_classifier.cc modules/audio_processing/agc2/vad_with_level.cc modules/audio_processing/agc2/vector_float_frame.cc @@ -1127,6 +1167,10 @@ modules/audio_processing/audio_processing_impl.cc modules/audio_processing/audio_processing_impl.h modules/audio_processing/audio_processing_builder_impl.cc + modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.cc + modules/audio_processing/capture_levels_adjuster/audio_samples_scaler.h + modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.cc + modules/audio_processing/capture_levels_adjuster/capture_levels_adjuster.h modules/audio_processing/common.h modules/audio_processing/echo_control_mobile_impl.cc modules/audio_processing/echo_control_mobile_impl.h @@ -1280,6 +1324,8 @@ modules/rtp_rtcp/source/forward_error_correction_internal.h modules/rtp_rtcp/source/packet_loss_stats.cc modules/rtp_rtcp/source/packet_loss_stats.h + modules/rtp_rtcp/source/packet_sequencer.cc + modules/rtp_rtcp/source/packet_sequencer.h modules/rtp_rtcp/source/receive_statistics_impl.cc modules/rtp_rtcp/source/receive_statistics_impl.h modules/rtp_rtcp/source/remote_ntp_time_estimator.cc @@ -1322,6 +1368,8 @@ modules/rtp_rtcp/source/rtp_sender_audio.h modules/rtp_rtcp/source/rtp_sender_egress.cc modules/rtp_rtcp/source/rtp_sender_egress.h + modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc + modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.h modules/rtp_rtcp/source/rtp_sender_video.cc modules/rtp_rtcp/source/rtp_sender_video.h modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -1459,6 +1507,8 @@ modules/video_coding/media_opt_util.h modules/video_coding/histogram.cc modules/video_coding/histogram.h + modules/video_coding/deprecated/nack_module.h + modules/video_coding/deprecated/nack_module.cc modules/video_coding/nack_module2.cc modules/video_coding/nack_module2.h modules/video_coding/encoded_frame.cc @@ -1509,6 +1559,8 @@ modules/video_coding/utility/framerate_controller.cc modules/video_coding/utility/ivf_file_reader.cc modules/video_coding/utility/ivf_file_writer.cc + modules/video_coding/utility/qp_parser.cc + modules/video_coding/utility/qp_parser.h modules/video_coding/utility/quality_scaler.cc modules/video_coding/utility/simulcast_rate_allocator.cc modules/video_coding/utility/simulcast_utility.cc @@ -1536,24 +1588,26 @@ modules/video_coding/svc/scalability_structure_full_svc.h modules/video_coding/svc/scalability_structure_key_svc.cc modules/video_coding/svc/scalability_structure_key_svc.h - modules/video_coding/svc/scalability_structure_l1t2.cc - modules/video_coding/svc/scalability_structure_l1t2.h - modules/video_coding/svc/scalability_structure_l1t3.cc - modules/video_coding/svc/scalability_structure_l1t3.h - modules/video_coding/svc/scalability_structure_l2t1.cc - modules/video_coding/svc/scalability_structure_l2t1.h - modules/video_coding/svc/scalability_structure_l2t1h.cc - modules/video_coding/svc/scalability_structure_l2t1h.h - modules/video_coding/svc/scalability_structure_l2t2.cc - modules/video_coding/svc/scalability_structure_l2t2.h + # modules/video_coding/svc/scalability_structure_l1t2.cc + # modules/video_coding/svc/scalability_structure_l1t2.h + # modules/video_coding/svc/scalability_structure_l1t3.cc + # modules/video_coding/svc/scalability_structure_l1t3.h + # modules/video_coding/svc/scalability_structure_l2t1.cc + # modules/video_coding/svc/scalability_structure_l2t1.h + # modules/video_coding/svc/scalability_structure_l2t1h.cc + # modules/video_coding/svc/scalability_structure_l2t1h.h + # modules/video_coding/svc/scalability_structure_l2t2.cc + # modules/video_coding/svc/scalability_structure_l2t2.h modules/video_coding/svc/scalability_structure_l2t2_key_shift.cc modules/video_coding/svc/scalability_structure_l2t2_key_shift.h - modules/video_coding/svc/scalability_structure_l3t1.cc - modules/video_coding/svc/scalability_structure_l3t1.h - modules/video_coding/svc/scalability_structure_l3t3.cc - modules/video_coding/svc/scalability_structure_l3t3.h - modules/video_coding/svc/scalability_structure_s2t1.cc - modules/video_coding/svc/scalability_structure_s2t1.h + # modules/video_coding/svc/scalability_structure_l3t1.cc + # modules/video_coding/svc/scalability_structure_l3t1.h + # modules/video_coding/svc/scalability_structure_l3t3.cc + # modules/video_coding/svc/scalability_structure_l3t3.h + # modules/video_coding/svc/scalability_structure_s2t1.cc + # modules/video_coding/svc/scalability_structure_s2t1.h + modules/video_coding/svc/scalability_structure_simulcast.cc + modules/video_coding/svc/scalability_structure_simulcast.h modules/video_coding/svc/scalable_video_controller.h modules/video_coding/svc/scalable_video_controller_no_layering.cc modules/video_coding/svc/scalable_video_controller_no_layering.h @@ -1850,6 +1904,8 @@ video/video_send_stream_impl.h video/video_stream_decoder.cc video/video_stream_decoder.h + video/video_stream_decoder_impl.cc + video/video_stream_decoder_impl.h video/video_stream_decoder2.cc video/video_stream_decoder2.h video/alignment_adjuster.cc @@ -1890,13 +1946,16 @@ modules/remote_bitrate_estimator/remote_estimator_proxy.cc sdk/media_constraints.cc - #screen drawer + # screen drawer modules/desktop_capture/screen_drawer.cc modules/desktop_capture/screen_drawer.h modules/desktop_capture/screen_drawer_mac.cc + modules/desktop_capture/screen_drawer_linux.cc + modules/desktop_capture/screen_drawer_lock_posix.cc + modules/desktop_capture/screen_drawer_lock_posix.h + modules/desktop_capture/screen_drawer_win.cc - - #primitives + # primitives modules/desktop_capture/desktop_capture_types.h modules/desktop_capture/desktop_frame.cc modules/desktop_capture/desktop_frame.h @@ -1909,14 +1968,14 @@ modules/desktop_capture/shared_memory.cc modules/desktop_capture/shared_memory.h - - #generic + # generic modules/desktop_capture/blank_detector_desktop_capturer_wrapper.cc modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h modules/desktop_capture/cropped_desktop_frame.cc modules/desktop_capture/cropped_desktop_frame.h modules/desktop_capture/cropping_window_capturer.cc modules/desktop_capture/cropping_window_capturer.h + modules/desktop_capture/cropping_window_capturer_win.cc modules/desktop_capture/desktop_and_cursor_composer.cc modules/desktop_capture/desktop_and_cursor_composer.h modules/desktop_capture/desktop_capture_options.cc @@ -1931,6 +1990,8 @@ modules/desktop_capture/desktop_frame_generator.h modules/desktop_capture/desktop_frame_rotation.cc modules/desktop_capture/desktop_frame_rotation.h + modules/desktop_capture/desktop_frame_win.cc + modules/desktop_capture/desktop_frame_win.h modules/desktop_capture/differ_block.cc modules/desktop_capture/differ_block.h modules/desktop_capture/fake_desktop_capturer.cc @@ -1944,6 +2005,9 @@ modules/desktop_capture/mouse_cursor.cc modules/desktop_capture/mouse_cursor.h modules/desktop_capture/mouse_cursor_monitor.h + modules/desktop_capture/mouse_cursor_monitor_linux.cc + modules/desktop_capture/mouse_cursor_monitor_mac.mm + modules/desktop_capture/mouse_cursor_monitor_win.cc modules/desktop_capture/resolution_tracker.cc modules/desktop_capture/resolution_tracker.h modules/desktop_capture/rgba_color.cc @@ -1951,10 +2015,49 @@ modules/desktop_capture/screen_capture_frame_queue.h modules/desktop_capture/screen_capturer_helper.cc modules/desktop_capture/screen_capturer_helper.h + modules/desktop_capture/screen_capturer_darwin.mm + modules/desktop_capture/screen_capturer_linux.cc + modules/desktop_capture/screen_capturer_win.cc + modules/desktop_capture/window_capturer_linux.cc + modules/desktop_capture/window_capturer_mac.mm + modules/desktop_capture/window_capturer_win.cc modules/desktop_capture/window_finder.cc modules/desktop_capture/window_finder.h + modules/desktop_capture/window_finder_mac.h + modules/desktop_capture/window_finder_mac.mm + modules/desktop_capture/window_finder_win.cc + modules/desktop_capture/window_finder_win.h + + # stubs for non-supported + modules/desktop_capture/mouse_cursor_monitor_null.cc + modules/desktop_capture/screen_capturer_null.cc + modules/desktop_capture/window_capturer_null.cc + + # linux specific + modules/desktop_capture/linux/base_capturer_pipewire.cc + modules/desktop_capture/linux/base_capturer_pipewire.h + modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc + modules/desktop_capture/linux/mouse_cursor_monitor_x11.h + modules/desktop_capture/linux/screen_capturer_x11.cc + modules/desktop_capture/linux/screen_capturer_x11.h + modules/desktop_capture/linux/shared_x_display.cc + modules/desktop_capture/linux/shared_x_display.h + modules/desktop_capture/linux/window_capturer_x11.cc + modules/desktop_capture/linux/window_capturer_x11.h + modules/desktop_capture/linux/window_finder_x11.cc + modules/desktop_capture/linux/window_finder_x11.h + modules/desktop_capture/linux/window_list_utils.cc + modules/desktop_capture/linux/window_list_utils.h + modules/desktop_capture/linux/x_atom_cache.cc + modules/desktop_capture/linux/x_atom_cache.h + modules/desktop_capture/linux/x_error_trap.cc + modules/desktop_capture/linux/x_error_trap.h + modules/desktop_capture/linux/x_server_pixel_buffer.cc + modules/desktop_capture/linux/x_server_pixel_buffer.h + modules/desktop_capture/linux/x_window_property.cc + modules/desktop_capture/linux/x_window_property.h - #mac specific // + # mac specific modules/desktop_capture/mac/desktop_configuration.mm modules/desktop_capture/mac/desktop_frame_cgimage.h modules/desktop_capture/mac/desktop_frame_cgimage.mm @@ -1964,11 +2067,6 @@ modules/desktop_capture/mac/desktop_frame_provider.mm modules/desktop_capture/mac/screen_capturer_mac.h modules/desktop_capture/mac/screen_capturer_mac.mm - modules/desktop_capture/mouse_cursor_monitor_mac.mm - modules/desktop_capture/screen_capturer_darwin.mm - modules/desktop_capture/window_capturer_mac.mm - modules/desktop_capture/window_finder_mac.h - modules/desktop_capture/window_finder_mac.mm modules/desktop_capture/mac/desktop_configuration.h modules/desktop_capture/mac/desktop_configuration_monitor.cc @@ -1978,14 +2076,64 @@ modules/desktop_capture/mac/window_list_utils.cc modules/desktop_capture/mac/window_list_utils.h - - + # win specific + modules/desktop_capture/win/cursor.cc + modules/desktop_capture/win/cursor.h + modules/desktop_capture/win/d3d_device.cc + modules/desktop_capture/win/d3d_device.h + modules/desktop_capture/win/desktop.cc + modules/desktop_capture/win/desktop.h + modules/desktop_capture/win/desktop_capture_utils.cc + modules/desktop_capture/win/desktop_capture_utils.h + modules/desktop_capture/win/display_configuration_monitor.cc + modules/desktop_capture/win/display_configuration_monitor.h + modules/desktop_capture/win/dxgi_adapter_duplicator.cc + modules/desktop_capture/win/dxgi_adapter_duplicator.h + modules/desktop_capture/win/dxgi_context.cc + modules/desktop_capture/win/dxgi_context.h + modules/desktop_capture/win/dxgi_duplicator_controller.cc + modules/desktop_capture/win/dxgi_duplicator_controller.h + modules/desktop_capture/win/dxgi_frame.cc + modules/desktop_capture/win/dxgi_frame.h + modules/desktop_capture/win/dxgi_output_duplicator.cc + modules/desktop_capture/win/dxgi_output_duplicator.h + modules/desktop_capture/win/dxgi_texture.cc + modules/desktop_capture/win/dxgi_texture.h + modules/desktop_capture/win/dxgi_texture_mapping.cc + modules/desktop_capture/win/dxgi_texture_mapping.h + modules/desktop_capture/win/dxgi_texture_staging.cc + modules/desktop_capture/win/dxgi_texture_staging.h + modules/desktop_capture/win/full_screen_win_application_handler.cc + modules/desktop_capture/win/full_screen_win_application_handler.h + modules/desktop_capture/win/scoped_gdi_object.h + modules/desktop_capture/win/scoped_thread_desktop.cc + modules/desktop_capture/win/scoped_thread_desktop.h + modules/desktop_capture/win/screen_capture_utils.cc + modules/desktop_capture/win/screen_capture_utils.h + modules/desktop_capture/win/screen_capturer_win_directx.cc + modules/desktop_capture/win/screen_capturer_win_directx.h + modules/desktop_capture/win/screen_capturer_win_gdi.cc + modules/desktop_capture/win/screen_capturer_win_gdi.h + modules/desktop_capture/win/screen_capturer_win_magnifier.cc + modules/desktop_capture/win/screen_capturer_win_magnifier.h + modules/desktop_capture/win/selected_window_context.cc + modules/desktop_capture/win/selected_window_context.h + modules/desktop_capture/win/wgc_capture_session.cc + modules/desktop_capture/win/wgc_capture_session.h + modules/desktop_capture/win/wgc_capture_source.cc + modules/desktop_capture/win/wgc_capture_source.h + modules/desktop_capture/win/wgc_capturer_win.cc + modules/desktop_capture/win/wgc_capturer_win.h + modules/desktop_capture/win/wgc_desktop_frame.cc + modules/desktop_capture/win/wgc_desktop_frame.h + modules/desktop_capture/win/window_capture_utils.cc + modules/desktop_capture/win/window_capture_utils.h + modules/desktop_capture/win/window_capturer_win_gdi.cc + modules/desktop_capture/win/window_capturer_win_gdi.h stats/rtc_stats_report.cc stats/rtc_stats.cc stats/rtcstats_objects.cc - - ) if (is_x86 OR is_x64) @@ -2013,6 +2161,45 @@ ) endif() +if (NOT TG_OWT_BUILD_AUDIO_BACKENDS) + remove_target_sources(tg_owt ${webrtc_loc} + rtc_base/win/windows_version.cc + rtc_base/win/windows_version.h + modules/audio_device/include/audio_device_factory.cc + modules/audio_device/include/audio_device_factory.h + modules/audio_device/linux/alsasymboltable_linux.cc + modules/audio_device/linux/alsasymboltable_linux.h + modules/audio_device/linux/audio_device_alsa_linux.cc + modules/audio_device/linux/audio_device_alsa_linux.h + modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc + modules/audio_device/linux/audio_mixer_manager_alsa_linux.h + modules/audio_device/linux/latebindingsymboltable_linux.cc + modules/audio_device/linux/latebindingsymboltable_linux.h + modules/audio_device/linux/audio_device_pulse_linux.cc + modules/audio_device/linux/audio_device_pulse_linux.h + modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc + modules/audio_device/linux/audio_mixer_manager_pulse_linux.h + modules/audio_device/linux/pulseaudiosymboltable_linux.cc + modules/audio_device/linux/pulseaudiosymboltable_linux.h + modules/audio_device/mac/audio_device_mac.cc + modules/audio_device/mac/audio_device_mac.h + modules/audio_device/mac/audio_mixer_manager_mac.cc + modules/audio_device/mac/audio_mixer_manager_mac.h + modules/audio_device/win/audio_device_module_win.cc + modules/audio_device/win/audio_device_module_win.h + modules/audio_device/win/core_audio_base_win.cc + modules/audio_device/win/core_audio_base_win.h + modules/audio_device/win/core_audio_input_win.cc + modules/audio_device/win/core_audio_input_win.h + modules/audio_device/win/core_audio_output_win.cc + modules/audio_device/win/core_audio_output_win.h + modules/audio_device/win/core_audio_utility_win.cc + modules/audio_device/win/core_audio_utility_win.h + modules/audio_device/win/audio_device_core_win.cc + modules/audio_device/win/audio_device_core_win.h + ) +endif() + if (NOT WIN32) remove_target_sources(tg_owt ${webrtc_loc} rtc_base/win32.cc @@ -2027,6 +2214,21 @@ ) endif() +if (APPLE OR WIN32 OR UNIX) + remove_target_sources(tg_owt ${webrtc_loc} + modules/desktop_capture/window_capturer_null.cc + modules/desktop_capture/screen_capturer_null.cc + modules/desktop_capture/mouse_cursor_monitor_null.cc + ) +endif() + +if (NOT UNIX) + remove_target_sources(tg_owt ${webrtc_loc} + modules/desktop_capture/screen_drawer_lock_posix.cc + modules/desktop_capture/screen_drawer_lock_posix.h + ) +endif() + if ((NOT is_x86) AND (NOT is_x64)) remove_target_sources(tg_owt ${webrtc_loc} common_audio/fir_filter_sse.cc @@ -2121,7 +2323,7 @@ endif() set(platform_export) -if (NOT WIN32 AND NOT APPLE) +if (NOT WIN32 AND NOT APPLE AND NOT LIBEVENT_FOUND) set(platform_export libevent ) @@ -2154,18 +2356,29 @@ set(export_targets ${tg_owt_export} - libabsl - libopenh264 libpffft librnnoise libsrtp - libusrsctp - libvpx - ${vpx_export} libwebrtcbuild libyuv ${platform_export} ) +if (TG_OWT_USE_PROTOBUF) + list(APPEND export_targets proto) +endif() + +if (NOT absl_FOUND) + list(APPEND export_targets libabsl) +endif() +if (NOT LIBOPENH264_FOUND) + list(APPEND export_targets libopenh264) +endif() +if (NOT LIBUSRSCTP_FOUND) + list(APPEND export_targets libusrsctp) +endif() +if (NOT LIBVPX_FOUND) + list(APPEND export_targets libvpx ${vpx_export}) +endif() export( TARGETS ${export_targets} @@ -2176,7 +2389,7 @@ configure_file( "cmake/tg_owtConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/tg_owtConfig.cmake" - COPYONLY + @ONLY ) target_include_directories(tg_owt diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/external.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/external.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/external.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/external.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -106,7 +106,160 @@ endif() endfunction() -# alsa +# libabsl +# HINT: System abseil should be built with -DCMAKE_CXX_STANDARD=17 +function(link_libabsl target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(absl) + set(absl_FOUND ${absl_FOUND} PARENT_SCOPE) + if (absl_FOUND) + target_link_libraries(${target_name} INTERFACE absl::strings) + endif() + endif() + if (NOT absl_FOUND) + target_link_libraries(${target_name} PRIVATE tg_owt::libabsl) + endif() +endfunction() + +# libopenh264 +function(link_libopenh264 target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBOPENH264 openh264) + set(LIBOPENH264_FOUND ${LIBOPENH264_FOUND} PARENT_SCOPE) + if (LIBOPENH264_FOUND) + target_link_libraries(${target_name} PRIVATE ${LIBOPENH264_LIBRARIES}) + target_include_directories(${target_name} PRIVATE ${LIBOPENH264_INCLUDE_DIRS}) + endif() + endif() + if (NOT LIBOPENH264_FOUND) + target_link_libraries(${target_name} PRIVATE tg_owt::libopenh264) + target_include_directories(${target_name} PRIVATE ${libopenh264_loc}/include) + endif() +endfunction() + +# libusrsctp +function(link_libusrsctp target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBUSRSCTP usrsctp) + set(LIBUSRSCTP_FOUND ${LIBUSRSCTP_FOUND} PARENT_SCOPE) + if (LIBUSRSCTP_FOUND) + target_link_libraries(${target_name} PRIVATE ${LIBUSRSCTP_LIBRARIES}) + target_include_directories(${target_name} PRIVATE ${LIBUSRSCTP_INCLUDE_DIRS}) + endif() + endif() + if (NOT LIBUSRSCTP_FOUND) + target_link_libraries(${target_name} PRIVATE tg_owt::libusrsctp) + endif() +endfunction() + +# libvpx +function(link_libvpx target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBVPX vpx>=1.10.0) + set(LIBVPX_FOUND ${LIBVPX_FOUND} PARENT_SCOPE) + if (LIBVPX_FOUND) + target_link_libraries(${target_name} PRIVATE ${LIBVPX_LIBRARIES}) + target_include_directories(${target_name} PRIVATE ${LIBVPX_INCLUDE_DIRS}) + endif() + endif() + if (NOT LIBVPX_FOUND) + target_link_libraries(${target_name} PRIVATE tg_owt::libvpx) + if (is_x86 OR is_x64) + target_link_libraries(${target_name} + PRIVATE + tg_owt::libvpx_mmx + tg_owt::libvpx_sse2 + tg_owt::libvpx_ssse3 + tg_owt::libvpx_sse4 + tg_owt::libvpx_avx + tg_owt::libvpx_avx2 + ) + endif() + endif() +endfunction() + +# libevent +function(link_libevent target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBEVENT libevent) + set(LIBEVENT_FOUND ${LIBEVENT_FOUND} PARENT_SCOPE) + if (LIBEVENT_FOUND) + target_link_libraries(${target_name} PRIVATE ${LIBEVENT_LIBRARIES}) + target_include_directories(${target_name} PRIVATE ${LIBEVENT_INCLUDE_DIRS}) + endif() + endif() + if (NOT LIBEVENT_FOUND) + target_link_libraries(${target_name} PRIVATE tg_owt::libevent) + endif() +endfunction() + +function(link_glib target_name) + find_package(PkgConfig REQUIRED) + pkg_check_modules(GLIB2 REQUIRED glib-2.0) + pkg_check_modules(GOBJECT REQUIRED gobject-2.0) + pkg_check_modules(GIO REQUIRED gio-2.0) + pkg_check_modules(GIO_UNIX REQUIRED gio-unix-2.0) + target_include_directories(${target_name} + PRIVATE + ${GIO_UNIX_INCLUDE_DIRS} + ${GIO_INCLUDE_DIRS} + ${GOBJECT_INCLUDE_DIRS} + ${GLIB2_INCLUDE_DIRS} + ) + if (TG_OWT_PACKAGED_BUILD) + target_link_libraries(${target_name} + PRIVATE + ${GIO_UNIX_LINK_LIBRARIES} + ${GIO_LINK_LIBRARIES} + ${GOBJECT_LINK_LIBRARIES} + ${GLIB2_LINK_LIBRARIES} + ) + endif() +endfunction() + +# x11 +function(link_x11 target_name) + if (TG_OWT_PACKAGED_BUILD) + find_package(X11 REQUIRED COMPONENTS Xcomposite Xdamage Xext Xfixes Xrender Xrandr Xtst) + target_include_directories(${target_name} + PRIVATE + ${X11_X11_INCLUDE_PATH} + ${X11_Xlib_INCLUDE_PATH} + ${X11_Xcomposite_INCLUDE_PATH} + ${X11_Xdamage_INCLUDE_PATH} + ${X11_Xext_INCLUDE_PATH} + ${X11_Xfixes_INCLUDE_PATH} + ${X11_Xrender_INCLUDE_PATH} + ${X11_Xrandr_INCLUDE_PATH} + ${X11_Xtst_INCLUDE_PATH} + ) + target_link_libraries(${target_name} + PRIVATE + ${X11_X11_LIB} + ${X11_Xcomposite_LIB} + ${X11_Xdamage_LIB} + ${X11_Xext_LIB} + ${X11_Xfixes_LIB} + ${X11_Xrender_LIB} + ${X11_Xrandr_LIB} + ${X11_Xtst_LIB} + ) + endif() +endfunction() + +# PipeWire +function(link_pipewire target_name) + find_package(PkgConfig REQUIRED) + pkg_search_module(PIPEWIRE REQUIRED libpipewire-0.3 libpipewire-0.2) + target_include_directories(${target_name} PRIVATE ${PIPEWIRE_INCLUDE_DIRS}) + target_link_libraries(${target_name} PRIVATE ${PIPEWIRE_LINK_LIBRARIES}) +endfunction() + +# Alsa function(link_libalsa target_name) if (TG_OWT_PACKAGED_BUILD) find_package(ALSA REQUIRED) @@ -114,7 +267,7 @@ endif() endfunction() -# pulseaudio +# PulseAudio function(link_libpulse target_name) if (TG_OWT_PACKAGED_BUILD) find_package(PkgConfig REQUIRED) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/generate_stubs.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/generate_stubs.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/generate_stubs.cmake 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/generate_stubs.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,47 @@ +# This file is part of Desktop App Toolkit, +# a set of libraries for developing nice desktop applications. +# +# For license and copyright information please follow this link: +# https://github.com/desktop-app/legal/blob/master/LEGAL + +function(generate_stubs target_name extra_stub_header output_name sigs_file) + find_package(Python REQUIRED) + + get_filename_component(sigs_file_name ${sigs_file} NAME_WLE) + + set(gen_dst ${CMAKE_CURRENT_BINARY_DIR}/gen) + file(MAKE_DIRECTORY ${gen_dst}) + + set(gen_timestamp ${gen_dst}/${sigs_file_name}_stubs.timestamp) + set(gen_files + ${gen_dst}/${output_name}.cc + ${gen_dst}/modules/desktop_capture/linux/${output_name}.h + ) + add_custom_command( + OUTPUT + ${gen_timestamp} + BYPRODUCTS + ${gen_files} + COMMAND + ${Python_EXECUTABLE} + ${tools_loc}/generate_stubs/generate_stubs.py + --intermediate_dir ${gen_dst} + --output ${gen_dst}/modules/desktop_capture/linux + --type posix_stubs + --extra_stub_header ${extra_stub_header} + --stubfile_name ${output_name} + --path_from_source ${gen_dst} + --path_from_source modules/desktop_capture/linux + --logging-function "\"RTC_LOG(LS_VERBOSE)\"" + --logging-include "rtc_base/logging.h" + ${sigs_file} + COMMAND + touch ${gen_timestamp} + COMMENT "Generating stubs ${sigs_file} (${target_name})" + DEPENDS + ${tools_loc}/generate_stubs/generate_stubs.py + ${extra_stub_header} + ${sigs_file} + ) + generate_target(${target_name} ${sigs_file_name}_stubs ${gen_timestamp} "${gen_files}" ${gen_dst}) +endfunction() diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/generate_target.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/generate_target.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/generate_target.cmake 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/generate_target.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,14 @@ +# This file is part of Desktop App Toolkit, +# a set of libraries for developing nice desktop applications. +# +# For license and copyright information please follow this link: +# https://github.com/desktop-app/legal/blob/master/LEGAL + +function(generate_target parent_name postfix generated_timestamp generated_files gen_dst) + add_custom_target(${parent_name}_${postfix} DEPENDS ${generated_timestamp}) + init_target_folder(${parent_name}_${postfix} "(gen)") + add_dependencies(${parent_name} ${parent_name}_${postfix}) + target_sources(${parent_name} PRIVATE ${generated_files}) + target_include_directories(${parent_name} PRIVATE ${gen_dst}) + source_group("(gen)" FILES ${generated_files}) +endfunction() diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/init_target.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/init_target.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/init_target.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/init_target.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -4,6 +4,12 @@ # For license and copyright information please follow this link: # https://github.com/desktop-app/legal/blob/master/LEGAL +function(init_target_folder target_name folder_name) + if (NOT "${folder_name}" STREQUAL "") + set_target_properties(${target_name} PROPERTIES FOLDER ${folder_name}) + endif() +endfunction() + function(init_target target_name) # init_target(my_target folder_name) if (APPLE) target_compile_features(${target_name} PUBLIC cxx_std_14) @@ -30,6 +36,7 @@ target_compile_definitions(${target_name} PRIVATE HAVE_SCTP + ABSL_ALLOCATOR_NOTHROW=1 ) if (WIN32) target_compile_definitions(${target_name} @@ -38,7 +45,6 @@ HAVE_WINSOCK2_H NOMINMAX HAVE_SSE2 - ABSL_ALLOCATOR_NOTHROW=1 ) target_compile_options(${target_name} diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libabsl.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libabsl.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libabsl.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libabsl.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libabsl OBJECT) +add_library(libabsl OBJECT EXCLUDE_FROM_ALL) init_target(libabsl) add_library(tg_owt::libabsl ALIAS libabsl) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libevent.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libevent.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libevent.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libevent.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libevent OBJECT) +add_library(libevent OBJECT EXCLUDE_FROM_ALL) init_target(libevent) add_library(tg_owt::libevent ALIAS libevent) @@ -40,7 +40,8 @@ ) target_include_directories(libevent +PUBLIC + $ PRIVATE ${webrtc_loc} - ${libevent_loc} ) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libopenh264.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libopenh264.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libopenh264.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libopenh264.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libopenh264 OBJECT) +add_library(libopenh264 OBJECT EXCLUDE_FROM_ALL) init_target(libopenh264) add_library(tg_owt::libopenh264 ALIAS libopenh264) @@ -207,6 +207,21 @@ target_include_directories(libopenh264 PRIVATE ${include_directories}) +# Create include-able wels/ directory for public use of the library +set(GEN_INC ${CMAKE_CURRENT_BINARY_DIR}/openh264_include) +add_custom_command(OUTPUT ${GEN_INC}/wels +COMMAND ${CMAKE_COMMAND} -E make_directory ${GEN_INC}/wels +COMMAND ${CMAKE_COMMAND} -E copy + ${libopenh264_loc}/codec/api/svc/codec_api.h + ${libopenh264_loc}/codec/api/svc/codec_app_def.h + ${libopenh264_loc}/codec/api/svc/codec_def.h + ${libopenh264_loc}/codec/api/svc/codec_ver.h + ${GEN_INC}/wels +VERBATIM +) +target_sources(libopenh264 PRIVATE ${GEN_INC}/wels) +target_include_directories(libopenh264 PUBLIC $) + if (is_x86) set(yasm_defines X86_32) else() diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libpffft.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libpffft.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libpffft.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libpffft.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libpffft OBJECT) +add_library(libpffft OBJECT EXCLUDE_FROM_ALL) init_target(libpffft) add_library(tg_owt::libpffft ALIAS libpffft) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/librnnoise.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/librnnoise.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/librnnoise.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/librnnoise.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(librnnoise OBJECT) +add_library(librnnoise OBJECT EXCLUDE_FROM_ALL) init_target(librnnoise) add_library(tg_owt::librnnoise ALIAS librnnoise) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libsdkmacos.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libsdkmacos.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libsdkmacos.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libsdkmacos.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -18,12 +18,16 @@ api/video_frame_buffer/RTCNativeMutableI420Buffer.mm api/video_codec/RTCVideoCodecConstants.h api/video_codec/RTCVideoCodecConstants.mm + api/video_codec/RTCVideoDecoderAV1.h + api/video_codec/RTCVideoDecoderAV1.mm api/video_codec/RTCVideoDecoderVP8.h api/video_codec/RTCVideoDecoderVP8.mm - api/video_codec/RTCVideoEncoderVP8.h - api/video_codec/RTCVideoEncoderVP8.mm api/video_codec/RTCVideoDecoderVP9.h api/video_codec/RTCVideoDecoderVP9.mm + api/video_codec/RTCVideoEncoderAV1.h + api/video_codec/RTCVideoEncoderAV1.mm + api/video_codec/RTCVideoEncoderVP8.h + api/video_codec/RTCVideoEncoderVP8.mm api/video_codec/RTCVideoEncoderVP9.h api/video_codec/RTCVideoEncoderVP9.mm api/video_codec/RTCWrappedNativeVideoDecoder.h diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libsrtp.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libsrtp.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libsrtp.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libsrtp.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libsrtp OBJECT) +add_library(libsrtp OBJECT EXCLUDE_FROM_ALL) init_target(libsrtp) add_library(tg_owt::libsrtp ALIAS libsrtp) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libusrsctp.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libusrsctp.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libusrsctp.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libusrsctp.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libusrsctp OBJECT) +add_library(libusrsctp OBJECT EXCLUDE_FROM_ALL) init_target(libusrsctp) add_library(tg_owt::libusrsctp ALIAS libusrsctp) @@ -9,6 +9,7 @@ __Userspace__ SCTP_SIMPLE_ALLOCATOR SCTP_PROCESS_LEVEL_LOCKS + HAVE_NETINET_IN_H ) if (WIN32) @@ -20,10 +21,15 @@ target_compile_definitions(libusrsctp PRIVATE __Userspace_os_Darwin + _APPLE_USE_RFC_2292 + HAVE_SA_LEN + HAVE_SCONN_LEN ) target_compile_options(libusrsctp PRIVATE -U__APPLE__ + -UINET + -UINET6 ) else() target_compile_definitions(libusrsctp diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libvpx.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libvpx.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libvpx.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libvpx.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libvpx OBJECT) +add_library(libvpx OBJECT EXCLUDE_FROM_ALL) init_target(libvpx) add_library(tg_owt::libvpx ALIAS libvpx) @@ -9,6 +9,52 @@ ${libvpx_loc}/source/config ) +# Convert the ASM files from the ARM Developer Suite 1.0.1 syntax to syntax +# accepted by the platform's native assembler (e.g. GNU as from binutils). +# +function(target_ads2native_sources target_name src_loc) + find_package(Perl REQUIRED) + + set(list ${ARGV}) + list(REMOVE_AT list 0 1) + + if (WIN32) + set(ads2native ${libvpx_loc}/source/libvpx/build/make/ads2armasm_ms.pl) + elseif (APPLE) + set(ads2native ${libvpx_loc}/source/libvpx/build/make/ads2gas_apple.pl) + else() + set(ads2native ${libvpx_loc}/source/libvpx/build/make/ads2gas.pl) + endif() + + set(full_native_list "") + set(gen_dst ${CMAKE_CURRENT_BINARY_DIR}/gen) + set(include_directories ${include_directories} ${gen_dst} PARENT_SCOPE) + + foreach (entry ${list}) + set(ads_name ${src_loc}/${entry}) + set(native_name ${gen_dst}/${entry}.S) + + get_filename_component(native_name_loc ${native_name} DIRECTORY) + file(MAKE_DIRECTORY ${native_name_loc}) + + add_custom_command( + OUTPUT + ${native_name} + COMMAND + ${PERL_EXECUTABLE} ${ads2native} < ${ads_name} > ${native_name} + DEPENDS + ${ads_name} + VERBATIM + ) + + set_source_files_properties(${native_name} PROPERTIES GENERATED ON) + target_sources(${target_name} PRIVATE ${native_name}) + list(APPEND full_native_list ${native_name}) + endforeach() + + set(${target_name}_ads2native_sources ${full_native_list} PARENT_SCOPE) +endfunction() + if (WIN32) if (is_x86) list(APPEND include_directories @@ -25,7 +71,6 @@ else() message(FATAL_ERROR "Unsupported CPU architecture on Windows.") endif() - set(ASM_SUFFIX ".asm") elseif (APPLE) if (is_x86) list(APPEND include_directories @@ -68,8 +113,6 @@ ${libvpx_loc}/source/config/linux/generic ) endif() - - set(ASM_SUFFIX ".asm.S") endif() foreach(dir ${include_directories}) @@ -660,6 +703,9 @@ source/libvpx/vp9/encoder/arm/neon/vp9_quantize_neon.c source/libvpx/vpx_dsp/arm/deblock_neon.c source/libvpx/vpx_dsp/arm/intrapred_neon.c + source/libvpx/vpx_dsp/arm/vpx_convolve8_neon.h + source/libvpx/vpx_dsp/arm/vpx_convolve8_neon.c + source/libvpx/vpx_dsp/arm/vpx_convolve_neon.c source/libvpx/vpx_dsp/arm/vpx_scaled_convolve8_neon.c source/libvpx/vpx_dsp/arm/fdct_neon.c source/libvpx/vpx_dsp/arm/fdct16x16_neon.c @@ -688,37 +734,33 @@ source/libvpx/vpx_dsp/arm/mem_neon.h source/libvpx/vpx_dsp/arm/sum_neon.h source/libvpx/vpx_dsp/arm/transpose_neon.h - source/libvpx/vpx_dsp/arm/vpx_convolve8_neon.h ) endif() # 32-bit assembly with NEON instructions if (arm_use_neon AND (NOT is_aarch64)) - nice_target_sources(libvpx ${libvpx_loc} - PRIVATE - source/libvpx/vpx_dsp/arm/intrapred_neon_asm${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve_copy_neon_asm${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_horiz_filter_type2_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_vert_filter_type2_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_horiz_filter_type1_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_vert_filter_type1_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_avg_horiz_filter_type2_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_avg_vert_filter_type2_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_avg_horiz_filter_type1_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_avg_vert_filter_type1_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve_avg_neon_asm${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/vpx_convolve8_neon_asm.c - source/libvpx/vpx_dsp/arm/vpx_convolve8_neon_asm.h - source/libvpx/vpx_dsp/arm/vpx_convolve_neon.c - source/libvpx/vpx_dsp/arm/loopfilter_16_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/loopfilter_8_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/loopfilter_4_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/save_reg_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/idct_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/idct4x4_1_add_neon${ASM_SUFFIX} - source/libvpx/vpx_dsp/arm/idct4x4_add_neon${ASM_SUFFIX} - ) + target_ads2native_sources(libvpx ${libvpx_loc}/source/libvpx + + vpx_dsp/arm/intrapred_neon_asm.asm + vpx_dsp/arm/vpx_convolve_copy_neon_asm.asm + vpx_dsp/arm/vpx_convolve8_horiz_filter_type2_neon.asm + vpx_dsp/arm/vpx_convolve8_vert_filter_type2_neon.asm + vpx_dsp/arm/vpx_convolve8_horiz_filter_type1_neon.asm + vpx_dsp/arm/vpx_convolve8_vert_filter_type1_neon.asm + vpx_dsp/arm/vpx_convolve8_avg_horiz_filter_type2_neon.asm + vpx_dsp/arm/vpx_convolve8_avg_vert_filter_type2_neon.asm + vpx_dsp/arm/vpx_convolve8_avg_horiz_filter_type1_neon.asm + vpx_dsp/arm/vpx_convolve8_avg_vert_filter_type1_neon.asm + vpx_dsp/arm/vpx_convolve_avg_neon_asm.asm + vpx_dsp/arm/loopfilter_16_neon.asm + vpx_dsp/arm/loopfilter_8_neon.asm + vpx_dsp/arm/loopfilter_4_neon.asm + vpx_dsp/arm/save_reg_neon.asm + vpx_dsp/arm/idct_neon.asm + vpx_dsp/arm/idct4x4_1_add_neon.asm + vpx_dsp/arm/idct4x4_add_neon.asm + ) # C versions of the above hand-optimized files, when available elseif (arm_use_neon AND is_aarch64) @@ -726,13 +768,11 @@ PRIVATE source/libvpx/vpx_dsp/arm/vpx_convolve_copy_neon.c - source/libvpx/vpx_dsp/arm/vpx_convolve8_neon.c source/libvpx/vpx_dsp/arm/vpx_convolve_avg_neon.c - source/libvpx/vpx_dsp/arm/vpx_convolve_neon.c source/libvpx/vpx_dsp/arm/loopfilter_neon.c source/libvpx/vpx_dsp/arm/idct4x4_1_add_neon.c source/libvpx/vpx_dsp/arm/idct4x4_add_neon.c - ) + ) endif() endif() diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libwebrtcbuild.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libwebrtcbuild.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libwebrtcbuild.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libwebrtcbuild.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -3,9 +3,11 @@ target_link_libraries(libwebrtcbuild INTERFACE - tg_owt::libabsl tg_owt::libyuv ) +if (NOT absl_FOUND) + target_link_libraries(libwebrtcbuild INTERFACE tg_owt::libabsl) +endif() target_compile_definitions(libwebrtcbuild INTERFACE @@ -13,16 +15,38 @@ WEBRTC_APM_DEBUG_DUMP=0 WEBRTC_USE_BUILTIN_ISAC_FLOAT WEBRTC_OPUS_VARIABLE_COMPLEXITY=0 + WEBRTC_OPUS_SUPPORT_120MS_PTIME=1 WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE WEBRTC_USE_H264 WEBRTC_LIBRARY_IMPL WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1 - WEBRTC_ENABLE_LINUX_ALSA - WEBRTC_ENABLE_LINUX_PULSE + NO_MAIN_THREAD_WRAPPING HAVE_WEBRTC_VIDEO RTC_ENABLE_VP9 + RTC_DISABLE_TRACE_EVENTS + BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0 ) +if (TG_OWT_USE_PIPEWIRE) + target_compile_definitions(libwebrtcbuild + INTERFACE + WEBRTC_USE_PIPEWIRE + ) +endif() + +if (NOT TG_OWT_BUILD_AUDIO_BACKENDS) + target_compile_definitions(libwebrtcbuild + INTERFACE + WEBRTC_DUMMY_AUDIO_BUILD + ) +elseif (UNIX AND NOT APPLE) + target_compile_definitions(libwebrtcbuild + INTERFACE + WEBRTC_ENABLE_LINUX_ALSA + WEBRTC_ENABLE_LINUX_PULSE + ) +endif() + if (WIN32) target_compile_definitions(libwebrtcbuild INTERFACE @@ -39,6 +63,7 @@ INTERFACE WEBRTC_POSIX WEBRTC_LINUX + WEBRTC_USE_X11 ) endif() diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/libyuv.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/libyuv.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/libyuv.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/libyuv.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1,4 +1,4 @@ -add_library(libyuv OBJECT) +add_library(libyuv OBJECT EXCLUDE_FROM_ALL) init_target(libyuv) add_library(tg_owt::libyuv ALIAS libyuv) diff -Nru libtgowt-0~git20210124.be23804+ds/cmake/tg_owtConfig.cmake libtgowt-0~git20210627.91d836d+dfsg/cmake/tg_owtConfig.cmake --- libtgowt-0~git20210124.be23804+ds/cmake/tg_owtConfig.cmake 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/cmake/tg_owtConfig.cmake 2021-06-27 05:27:48.000000000 +0000 @@ -1 +1,6 @@ +if (@absl_FOUND@) + include(CMakeFindDependencyMacro) + find_dependency(absl REQUIRED) +endif() + include("${CMAKE_CURRENT_LIST_DIR}/tg_owtTargets.cmake") diff -Nru libtgowt-0~git20210124.be23804+ds/debian/changelog libtgowt-0~git20210627.91d836d+dfsg/debian/changelog --- libtgowt-0~git20210124.be23804+ds/debian/changelog 2021-02-12 12:53:58.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/changelog 2022-01-12 13:56:37.000000000 +0000 @@ -1,3 +1,36 @@ +libtgowt (0~git20210627.91d836d+dfsg-3~deb11u1) bullseye; urgency=medium + + * Full update from bookworm. Needed as a dependency of telegram-desktop. + + -- Nicholas Guriev Wed, 12 Jan 2022 16:56:37 +0300 + +libtgowt (0~git20210627.91d836d+dfsg-3) unstable; urgency=medium + + * Upload to unstable. + * Extend Packaged-PipeWire.patch for 0.2 version for easy backporting. + * Bump Standards-Version to 4.6.0, no related changes. + + -- Nicholas Guriev Thu, 19 Aug 2021 21:14:30 +0300 + +libtgowt (0~git20210627.91d836d+dfsg-2) experimental; urgency=medium + + * Automatically collect transitive dependencies. + * New Ignore-sanitize-attr.patch. + + -- Nicholas Guriev Sun, 01 Aug 2021 11:41:28 +0300 + +libtgowt (0~git20210627.91d836d+dfsg-1) experimental; urgency=medium + + * Update to the latest upstream commit. + * Refine minimal CMake version, 3.16.0. + * New build dependencies, PipeWire, Python, GLib, and X11. + * Update get-orig-source target. + - Repack to exclude RNNoise non-free model. + * Update package metadata to fit the upstream code. + * Update copyright info. + + -- Nicholas Guriev Sat, 31 Jul 2021 16:49:05 +0300 + libtgowt (0~git20210124.be23804+ds-3) unstable; urgency=medium * Mention missing libprotobuf-dev transitive dependency. diff -Nru libtgowt-0~git20210124.be23804+ds/debian/control libtgowt-0~git20210627.91d836d+dfsg/debian/control --- libtgowt-0~git20210124.be23804+ds/debian/control 2021-02-08 09:16:17.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/control 2021-08-19 18:13:38.000000000 +0000 @@ -4,21 +4,31 @@ Maintainer: Nicholas Guriev Build-Depends: debhelper-compat (= 13) Build-Depends-Arch: - cmake, + cmake (>= 3.16.0), libasound2-dev, libavcodec-dev, libavformat-dev, libavutil-dev, + libglib2.0-dev, libjpeg62-turbo-dev | libjpeg62-dev | libjpeg9-dev, libopus-dev, + libpipewire-0.3-dev | libpipewire-0.2-dev, libprotobuf-dev, libpulse-dev, libssl-dev, libswresample-dev, libswscale-dev, + libxcomposite-dev, + libxdamage-dev, + libxext-dev, + libxfixes-dev, + libxrandr-dev, + libxrender-dev, + libxtst-dev, protobuf-compiler, + python3:any, yasm [any-amd64 any-i386 x32], -Standards-Version: 4.5.1 +Standards-Version: 4.6.0 Rules-Requires-Root: no Homepage: https://github.com/desktop-app/tg_owt Vcs-Git: https://salsa.debian.org/debian/libtgowt.git @@ -28,17 +38,7 @@ Section: libdevel Architecture: any Multi-Arch: same -Depends: - libavcodec-dev, - libavformat-dev, - libavutil-dev, - libjpeg62-turbo-dev | libjpeg62-dev | libjpeg9-dev, - libopus-dev, - libprotobuf-dev, - libssl-dev, - libswresample-dev, - libswscale-dev, - ${misc:Depends}, +Depends: ${static:Depends}, ${misc:Depends} Description: telegram related WebRTC fork This supporting package contains a reduced fork of WebRTC source code. It is primarily needed for build support of video calls in Telegram Desktop. WebRTC diff -Nru libtgowt-0~git20210124.be23804+ds/debian/copyright libtgowt-0~git20210627.91d836d+dfsg/debian/copyright --- libtgowt-0~git20210124.be23804+ds/debian/copyright 2021-02-04 16:43:26.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/copyright 2021-07-31 12:31:52.000000000 +0000 @@ -2,13 +2,15 @@ Upstream-Name: tg_owt Upstream-Contact: John Preston Source: https://github.com/desktop-app/tg_owt -Files-Excluded: src/third_party/yasm/* -Comment: Exclude unused yasm binaries for the sake of simplicity of this file. - Similar source code can be found in the qtwebengine-opensource-src package. +Files-Excluded: src/third_party/pipewire/* + src/third_party/rnnoise/* + src/third_party/yasm/* +Comment: Exclude RNNoise non-free model, unused PipeWire code and Yasm binary. + About RNNoise see discussion at https://bugs.debian.org/980839#17 Files: * License: BSD-3-Clause -Copyright: 2004-2020, The WebRTC project authors +Copyright: 2004-2021, The WebRTC project authors Files: cmake/* CMakeLists.txt @@ -17,7 +19,7 @@ Files: debian/* License: BSD-3-Clause -Copyright: 2020, Nicholas Guriev +Copyright: 2020-2021, Nicholas Guriev Files: src/base/third_party/libevent/* License: BSD-3-Clause @@ -164,17 +166,6 @@ License: BSD-3-Clause Copyright: 2019, The Chromium Authors -Files: src/third_party/rnnoise/* -License: BSD-3-Clause -Copyright: 2017, Mozilla - 2007-2017, Jean-Marc Valin - 2005-2017, Xiph.Org Foundation - 2003-2004, Mark Borgerding - -Files: src/third_party/rnnoise/BUILD.gn -License: BSD-3-Clause -Copyright: 2018, The Chromium Authors - Files: src/third_party/usrsctp/* License: BSD-2-Clause Copyright: 2001,2002, Cisco Systems, Inc. diff -Nru libtgowt-0~git20210124.be23804+ds/debian/patches/Append-proto-target.patch libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Append-proto-target.patch --- libtgowt-0~git20210124.be23804+ds/debian/patches/Append-proto-target.patch 2021-02-04 16:58:12.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Append-proto-target.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -Description: Export the "proto" target -Author: Nicholas Guriev -Forwarded: https://github.com/desktop-app/tg_owt/pull/49 -Last-Update: Wed, 03 Feb 2021 13:20:38 +0300 - ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -2166,6 +2166,9 @@ set(export_targets - libyuv - ${platform_export} - ) -+if (TG_OWT_USE_PROTOBUF) -+ list(APPEND export_targets proto) -+endif() - - export( - TARGETS ${export_targets} diff -Nru libtgowt-0~git20210124.be23804+ds/debian/patches/Ignore-sanitize-attr.patch libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Ignore-sanitize-attr.patch --- libtgowt-0~git20210124.be23804+ds/debian/patches/Ignore-sanitize-attr.patch 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Ignore-sanitize-attr.patch 2021-08-01 08:25:23.000000000 +0000 @@ -0,0 +1,41 @@ +Description: Do not put the no_sanitize attribute near generated declarations. + -fsanitize=cfi-icall is supported only by Clang for x86 and x86_64. That is not + our case. Exclude compiler_specific.h that requires hard-coded build_config.h. +Author: Nicholas Guriev +Last-Update: Sun, 01 Aug 2021 11:25:23 +0300 + +--- a/src/tools/generate_stubs/generate_stubs.py ++++ b/src/tools/generate_stubs/generate_stubs.py +@@ -92,7 +92,6 @@ + # arg_list: The arguments used to call the stub function. + STUB_FUNCTION_DEFINITION = ( + """extern %(return_type)s %(name)s(%(params)s) __attribute__((weak)); +-DISABLE_CFI_ICALL + %(return_type)s %(export)s %(name)s(%(params)s) { + %(return_prefix)s%(name)s_ptr(%(arg_list)s); + }""") +@@ -111,7 +110,6 @@ + # argument. + VARIADIC_STUB_FUNCTION_DEFINITION = ( + """extern %(return_type)s %(name)s(%(params)s) __attribute__((weak)); +-DISABLE_CFI_ICALL + %(return_type)s %(export)s %(name)s(%(params)s) { + va_list args___; + va_start(args___, %(last_named_arg)s); +@@ -133,7 +131,6 @@ + # argument. + VOID_VARIADIC_STUB_FUNCTION_DEFINITION = ( + """extern void %(name)s(%(params)s) __attribute__((weak)); +-DISABLE_CFI_ICALL + void %(export)s %(name)s(%(params)s) { + va_list args___; + va_start(args___, %(last_named_arg)s); +@@ -182,8 +179,6 @@ + + #include + #include +- +-#include "base/compiler_specific.h" + """ + + # The start and end templates for the enum definitions used by the Umbrella diff -Nru libtgowt-0~git20210124.be23804+ds/debian/patches/Packaged-PipeWire.patch libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Packaged-PipeWire.patch --- libtgowt-0~git20210124.be23804+ds/debian/patches/Packaged-PipeWire.patch 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Packaged-PipeWire.patch 2021-08-19 18:08:13.000000000 +0000 @@ -0,0 +1,55 @@ +Description: Fix packaged build with dynamic PipeWire +Author: Nicholas Guriev +Forwarded: https://github.com/desktop-app/tg_owt/pull/67 +Last-Update: Thu, 29 Jul 2021 23:04:48 +0300 + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -88,18 +88,7 @@ + init_target(tg_owt) + + if (TG_OWT_USE_PIPEWIRE) +- if (TG_OWT_DLOPEN_PIPEWIRE) +- include(cmake/generate_stubs.cmake) +- set(stubs_loc ${webrtc_loc}/modules/desktop_capture/linux) +- generate_stubs(tg_owt +- ${stubs_loc}/pipewire_stub_header.fragment +- pipewire_stubs +- ${stubs_loc}/pipewire03.sigs +- ) +- target_compile_definitions(tg_owt +- PRIVATE +- WEBRTC_DLOPEN_PIPEWIRE +- ) ++ if (NOT TG_OWT_PACKAGED_BUILD) + target_include_directories(tg_owt + PRIVATE + ${webrtc_loc}/third_party/pipewire/spa/include +@@ -109,6 +98,27 @@ + else() + link_pipewire(tg_owt) + endif() ++ if (TG_OWT_DLOPEN_PIPEWIRE) ++ include(cmake/generate_stubs.cmake) ++ set(stubs_loc ${webrtc_loc}/modules/desktop_capture/linux) ++ if (NOT DEFINED PIPEWIRE_VERSION OR PIPEWIRE_VERSION VERSION_GREATER_EQUAL 0.3) ++ generate_stubs(tg_owt ++ ${stubs_loc}/pipewire_stub_header.fragment ++ pipewire_stubs ++ ${stubs_loc}/pipewire03.sigs ++ ) ++ else() ++ generate_stubs(tg_owt ++ ${stubs_loc}/pipewire_stub_header.fragment ++ pipewire_stubs ++ ${stubs_loc}/pipewire02.sigs ++ ) ++ endif() ++ target_compile_definitions(tg_owt ++ PRIVATE ++ WEBRTC_DLOPEN_PIPEWIRE ++ ) ++ endif() + endif() + + set_target_properties(tg_owt PROPERTIES SOVERSION 0 VERSION 0.0.0) diff -Nru libtgowt-0~git20210124.be23804+ds/debian/patches/Skip-RNNoise.patch libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Skip-RNNoise.patch --- libtgowt-0~git20210124.be23804+ds/debian/patches/Skip-RNNoise.patch 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/patches/Skip-RNNoise.patch 2021-07-31 12:47:13.000000000 +0000 @@ -0,0 +1,107 @@ +Description: Ignore absent RNNoise +Author: Nicholas Guriev +Last-Update: Thu, 29 Jul 2021 23:04:48 +0300 + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -2316,7 +2316,15 @@ if (WIN32) + remove_target_sources(tg_owt ${webrtc_loc} + rtc_base/ifaddrs_converter.cc + ) +-else() ++endif() ++ ++if (NOT TG_OWT_USE_RNNOISE) ++ remove_target_sources(tg_owt ${webrtc_loc} ++ modules/audio_processing/agc2/rnn_vad/rnn_fc.cc ++ modules/audio_processing/agc2/rnn_vad/rnn_fc.h ++ modules/audio_processing/agc2/rnn_vad/rnn_gru.cc ++ modules/audio_processing/agc2/rnn_vad/rnn_gru.h ++ ) + endif() + + set(platform_export) +--- a/cmake/librnnoise.cmake ++++ b/cmake/librnnoise.cmake +@@ -1,3 +1,14 @@ ++if (NOT TG_OWT_USE_RNNOISE) ++ add_library(librnnoise INTERFACE) ++ add_library(tg_owt::librnnoise ALIAS librnnoise) ++ ++ target_compile_definitions(librnnoise ++ INTERFACE ++ WEBRTC_USE_RNNOISE=0 ++ ) ++ return() ++endif() ++ + add_library(librnnoise OBJECT EXCLUDE_FROM_ALL) + init_target(librnnoise) + add_library(tg_owt::librnnoise ALIAS librnnoise) +--- a/src/modules/audio_processing/agc2/rnn_vad/rnn.cc ++++ b/src/modules/audio_processing/agc2/rnn_vad/rnn.cc +@@ -11,10 +11,15 @@ + #include "modules/audio_processing/agc2/rnn_vad/rnn.h" + + #include "rtc_base/checks.h" ++#include "rtc_base/logging.h" ++#if WEBRTC_USE_RNNOISE + #include "third_party/rnnoise/src/rnn_vad_weights.h" ++#endif + + namespace webrtc { + namespace rnn_vad { ++ ++#if WEBRTC_USE_RNNOISE + namespace { + + using ::rnnoise::kInputLayerInputSize; +@@ -87,5 +92,23 @@ float RnnVad::ComputeVadProbability( + return output_.data()[0]; + } + ++#else // WEBRTC_USE_RNNOISE ++ ++RnnVad::RnnVad(const AvailableCpuFeatures& cpu_features) { ++ RTC_LOG(LS_INFO) << "Noise cancellation feature is unavailable"; ++}; ++ ++RnnVad::~RnnVad() {} ++ ++void RnnVad::Reset() {} ++ ++float RnnVad::ComputeVadProbability( ++ rtc::ArrayView feature_vector, ++ bool is_silence) { ++ return is_silence ? 0.f : 1.f; ++} ++ ++#endif // WEBRTC_USE_RNNOISE ++ + } // namespace rnn_vad + } // namespace webrtc +--- a/src/modules/audio_processing/agc2/rnn_vad/rnn.h ++++ b/src/modules/audio_processing/agc2/rnn_vad/rnn.h +@@ -23,6 +23,10 @@ + #include "modules/audio_processing/agc2/rnn_vad/rnn_fc.h" + #include "modules/audio_processing/agc2/rnn_vad/rnn_gru.h" + ++#ifndef WEBRTC_USE_RNNOISE ++#define WEBRTC_USE_RNNOISE 1 ++#endif ++ + namespace webrtc { + namespace rnn_vad { + +@@ -42,9 +46,11 @@ class RnnVad { + bool is_silence); + + private: ++#if WEBRTC_USE_RNNOISE + FullyConnectedLayer input_; + GatedRecurrentLayer hidden_; + FullyConnectedLayer output_; ++#endif + }; + + } // namespace rnn_vad diff -Nru libtgowt-0~git20210124.be23804+ds/debian/patches/series libtgowt-0~git20210627.91d836d+dfsg/debian/patches/series --- libtgowt-0~git20210124.be23804+ds/debian/patches/series 2021-02-04 16:58:12.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/patches/series 2021-08-01 08:25:23.000000000 +0000 @@ -1,3 +1,5 @@ -Append-proto-target.patch Avoid-SSE2-on-i386.patch Convert-endianness.patch +Ignore-sanitize-attr.patch +Packaged-PipeWire.patch +Skip-RNNoise.patch diff -Nru libtgowt-0~git20210124.be23804+ds/debian/rules libtgowt-0~git20210627.91d836d+dfsg/debian/rules --- libtgowt-0~git20210124.be23804+ds/debian/rules 2021-02-12 09:27:33.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/rules 2021-07-31 21:42:58.000000000 +0000 @@ -12,10 +12,11 @@ TEMP_DIR = debian/tmp INSTALL_DIR = debian/libtgowt-dev INCLUDE_DIR = $(INSTALL_DIR)/usr/include/tg_owt +FILES_EXCLUDED = src/third_party/pipewire src/third_party/rnnoise src/third_party/yasm # Do not build the library as shared. That's not supported by upstream and too # difficult to guarantee binary compatibility of C++ code. -EXTRA_CMAKE_VARIABLES += BUILD_SHARED_LIBS=OFF TG_OWT_USE_PROTOBUF=ON +EXTRA_CMAKE_VARIABLES += BUILD_SHARED_LIBS=OFF TG_OWT_USE_PROTOBUF=ON TG_OWT_DLOPEN_PIPEWIRE=ON ifeq ($(DEB_HOST_ARCH_CPU),i386) # Do not force SSE2 extension. Rely on checking via cpuid. @@ -38,19 +39,32 @@ # Skip empty directories to fix package-contains-empty-directory Lintian info diagnostic. find $(INCLUDE_DIR) -empty -type d -delete +# Collect all required packages for linking against the static library. +execute_before_dh_gencontrol: + find $(INSTALL_DIR)/usr -name '*.cmake' | xargs grep -h -o '[^";]*\.so\>' | sort -u | xargs dpkg -S > debian/libtgowt-dev.deps + echo static:Depends=$$(awk -F: '{print $$1 ","}' debian/libtgowt-dev.deps) >> debian/libtgowt-dev.substvars +ifeq ($(filter terse,$(DEB_BUILD_OPTIONS)),) + column -t debian/libtgowt-dev.deps +endif + +execute_after_dh_clean: + $(RM) debian/libtgowt-dev.deps + # Download and repack original source code by hand because of uscan(1) does not # support yet recursive cloning Git repositories. The next script additionally # invokes tar(1) with options to generate reproducible tarball. You can install # archiver tool from PyPI: https://pypi.org/project/git-archive-all/ -.ONESHELL: get-orig-source: @trap 'rm -rf $(TEMP_DIR)' EXIT ; set -e -u -x git clone --depth=1 https://github.com/desktop-app/tg_owt $(TEMP_DIR)/libtgowt.git - git -C $(TEMP_DIR)/libtgowt.git submodule init - git -C $(TEMP_DIR)/libtgowt.git submodule update --depth=1 + git -C $(TEMP_DIR)/libtgowt.git submodule update --init --depth=1 VERSION=`git -C $(TEMP_DIR)/libtgowt.git log -1 --format=0~git%cd.%h --date=format:%Y%m%d` MODIFIED=`git -C $(TEMP_DIR)/libtgowt.git log -1 --format=@%ct` git-archive-all -C $(TEMP_DIR)/libtgowt.git --prefix=libtgowt-$$VERSION/ $(TEMP_DIR)/libtgowt.tar tar -xf $(TEMP_DIR)/libtgowt.tar -C $(TEMP_DIR) - rm -r $(TEMP_DIR)/libtgowt-$$VERSION/src/third_party/yasm - tar --owner=root:0 --group=root:0 --mtime=$$MODIFIED -caf ../libtgowt_$$VERSION+ds.orig.tar.xz -C $(TEMP_DIR) libtgowt-$$VERSION + rm -r $(addprefix $(TEMP_DIR)/libtgowt-$$VERSION/,$(FILES_EXCLUDED)) + tar --sort=name --owner=root:0 --group=root:0 --mtime=$$MODIFIED -caf ../libtgowt_$$VERSION+dfsg.orig.tar.xz -C $(TEMP_DIR) libtgowt-$$VERSION + +ifeq ($(MAKECMDGOALS),get-orig-source) +.ONESHELL: +endif diff -Nru libtgowt-0~git20210124.be23804+ds/debian/watch libtgowt-0~git20210627.91d836d+dfsg/debian/watch --- libtgowt-0~git20210124.be23804+ds/debian/watch 2021-02-04 16:43:26.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/debian/watch 2021-07-31 12:37:32.000000000 +0000 @@ -3,5 +3,5 @@ # the "get-orig-source" target from the debian/rules file. version=4 -opts="mode=git, pretty=0~git%cd.%h, repacksuffix=+ds, dversionmangle=auto" \ +opts="mode=git, pretty=0~git%cd.%h, repacksuffix=+dfsg, dversionmangle=auto" \ https://github.com/desktop-app/tg_owt heads/master debian false diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -52,6 +52,7 @@ "../pc:peerconnection", "../rtc_base", "../rtc_base:rtc_base_approved", + "../rtc_base:threading", "audio:audio_mixer_api", "audio_codecs:audio_codecs_api", "task_queue:default_task_queue_factory", @@ -174,6 +175,8 @@ ":rtp_parameters", ":rtp_transceiver_direction", ":scoped_refptr", + ":sequence_checker", + "../rtc_base:network_constants", "adaptation:resource_adaptation_api", "audio:audio_mixer_api", "audio_codecs:audio_codecs_api", @@ -203,8 +206,10 @@ "../modules/audio_processing:audio_processing_statistics", "../rtc_base", "../rtc_base:checks", - "../rtc_base:deprecation", + "../rtc_base:ip_address", "../rtc_base:rtc_base_approved", + "../rtc_base:socket_address", + "../rtc_base:threading", "../rtc_base/system:rtc_export", ] absl_deps = [ @@ -244,11 +249,14 @@ rtc_source_set("packet_socket_factory") { visibility = [ "*" ] sources = [ + "async_dns_resolver.h", "async_resolver_factory.h", "packet_socket_factory.h", ] deps = [ + "../rtc_base:async_resolver_interface", "../rtc_base:rtc_base", + "../rtc_base:socket_address", "../rtc_base/system:rtc_export", ] } @@ -383,6 +391,7 @@ ":video_quality_analyzer_api", "../media:rtc_media_base", "../rtc_base:rtc_base", + "../rtc_base:threading", "rtc_event_log", "task_queue", "transport:network_control", @@ -427,22 +436,6 @@ } if (rtc_include_tests) { - rtc_library("create_video_quality_test_fixture_api") { - visibility = [ "*" ] - testonly = true - sources = [ - "test/create_video_quality_test_fixture.cc", - "test/create_video_quality_test_fixture.h", - ] - deps = [ - ":fec_controller_api", - ":network_state_predictor_api", - ":scoped_refptr", - ":video_quality_test_fixture_api", - "../video:video_quality_test", - ] - } - # TODO(srte): Move to network_emulation sub directory. rtc_library("create_network_emulation_manager") { visibility = [ "*" ] @@ -457,21 +450,39 @@ ] } - rtc_library("create_peerconnection_quality_test_fixture") { - visibility = [ "*" ] - testonly = true - sources = [ - "test/create_peerconnection_quality_test_fixture.cc", - "test/create_peerconnection_quality_test_fixture.h", - ] + if (!build_with_chromium) { + rtc_library("create_video_quality_test_fixture_api") { + visibility = [ "*" ] + testonly = true + sources = [ + "test/create_video_quality_test_fixture.cc", + "test/create_video_quality_test_fixture.h", + ] + deps = [ + ":fec_controller_api", + ":network_state_predictor_api", + ":scoped_refptr", + ":video_quality_test_fixture_api", + "../video:video_quality_test", + ] + } - deps = [ - ":audio_quality_analyzer_api", - ":peer_connection_quality_test_fixture_api", - ":time_controller", - ":video_quality_analyzer_api", - "../test/pc/e2e:peerconnection_quality_test", - ] + rtc_library("create_peerconnection_quality_test_fixture") { + visibility = [ "*" ] + testonly = true + sources = [ + "test/create_peerconnection_quality_test_fixture.cc", + "test/create_peerconnection_quality_test_fixture.h", + ] + + deps = [ + ":audio_quality_analyzer_api", + ":peer_connection_quality_test_fixture_api", + ":time_controller", + ":video_quality_analyzer_api", + "../test/pc/e2e:peerconnection_quality_test", + ] + } } } @@ -568,6 +579,10 @@ "call/transport.cc", "call/transport.h", ] + deps = [ + ":refcountedbase", + ":scoped_refptr", + ] } rtc_source_set("bitrate_allocation") { @@ -600,6 +615,8 @@ ":time_controller", "../call:simulated_network", "../rtc_base", + "../rtc_base:network_constants", + "../rtc_base:threading", "test/network_emulation", "units:data_rate", "units:data_size", @@ -617,6 +634,7 @@ deps = [ "../modules/utility", "../rtc_base", + "../rtc_base:threading", "../rtc_base/synchronization:yield_policy", "../system_wrappers", "task_queue", @@ -670,6 +688,7 @@ ":scoped_refptr", "../p2p:rtc_p2p", "../rtc_base", + "../rtc_base:threading", "../rtc_base/system:rtc_export", "rtc_event_log:rtc_event_log", ] @@ -689,8 +708,18 @@ deps = [ "../rtc_base:checks" ] } +rtc_source_set("sequence_checker") { + visibility = [ "*" ] + sources = [ "sequence_checker.h" ] + deps = [ + "../rtc_base:checks", + "../rtc_base:macromagic", + "../rtc_base/synchronization:sequence_checker_internal", + ] +} + if (rtc_include_tests) { - if (rtc_enable_protobuf) { + if (rtc_enable_protobuf && !build_with_chromium) { rtc_library("audioproc_f_api") { visibility = [ "*" ] testonly = true @@ -1022,6 +1051,7 @@ "rtp_packet_infos_unittest.cc", "rtp_parameters_unittest.cc", "scoped_refptr_unittest.cc", + "sequence_checker_unittest.cc", "test/create_time_controller_unittest.cc", ] @@ -1035,11 +1065,13 @@ ":rtp_packet_info", ":rtp_parameters", ":scoped_refptr", + ":sequence_checker", ":time_controller", "../rtc_base:checks", "../rtc_base:gunit_helpers", "../rtc_base:rtc_base_approved", "../rtc_base:rtc_task_queue", + "../rtc_base:task_queue_for_test", "../rtc_base/task_utils:repeating_task", "../test:fileutils", "../test:test_support", diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/DEPS libtgowt-0~git20210627.91d836d+dfsg/src/api/DEPS --- libtgowt-0~git20210124.be23804+ds/src/api/DEPS 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/DEPS 2021-06-27 05:27:48.000000000 +0000 @@ -11,10 +11,12 @@ "-common_video", "-data", "-examples", + "-g3doc", "-ios", "-infra", "-logging", "-media", + "-net", "-modules", "-out", "-p2p", @@ -45,7 +47,6 @@ "+rtc_base/system/rtc_export.h", "+rtc_base/system/rtc_export_template.h", "+rtc_base/units/unit_base.h", - "+rtc_base/deprecation.h", ], "array_view\.h": [ @@ -63,6 +64,10 @@ "+rtc_base/async_resolver_interface.h", ], + "async_dns_resolver\.h": [ + "+rtc_base/socket_address.h", + ], + "candidate\.h": [ "+rtc_base/network_constants.h", "+rtc_base/socket_address.h", @@ -120,10 +125,6 @@ "+rtc_base/async_packet_socket.h", ], - "peer_connection_factory_proxy\.h": [ - "+rtc_base/bind.h", - ], - "peer_connection_interface\.h": [ "+media/base/media_config.h", "+media/base/media_engine.h", @@ -281,6 +282,11 @@ "+rtc_base/ref_count.h", ], + "sequence_checker\.h": [ + "+rtc_base/synchronization/sequence_checker_internal.h", + "+rtc_base/thread_annotations.h", + ], + # .cc files in api/ should not be restricted in what they can #include, # so we re-add all the top-level directories here. (That's because .h # files leak their #includes to whoever's #including them, but .cc files diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/async_dns_resolver.h libtgowt-0~git20210627.91d836d+dfsg/src/api/async_dns_resolver.h --- libtgowt-0~git20210124.be23804+ds/src/api/async_dns_resolver.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/async_dns_resolver.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,85 @@ +/* + * Copyright 2021 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef API_ASYNC_DNS_RESOLVER_H_ +#define API_ASYNC_DNS_RESOLVER_H_ + +#include + +#include "rtc_base/socket_address.h" +#include "rtc_base/system/rtc_export.h" + +namespace webrtc { + +// This interface defines the methods to resolve a hostname asynchronously. +// The AsyncDnsResolverInterface class encapsulates a single name query. +// +// Usage: +// std::unique_ptr resolver = +// factory->Create(address-to-be-resolved, [r = resolver.get()]() { +// if (r->result.GetResolvedAddress(AF_INET, &addr) { +// // success +// } else { +// // failure +// error = r->result().GetError(); +// } +// // Release resolver. +// resolver_list.erase(std::remove_if(resolver_list.begin(), +// resolver_list.end(), +// [](refptr) { refptr.get() == r; }); +// }); +// resolver_list.push_back(std::move(resolver)); + +class AsyncDnsResolverResult { + public: + virtual ~AsyncDnsResolverResult() = default; + // Returns true iff the address from |Start| was successfully resolved. + // If the address was successfully resolved, sets |addr| to a copy of the + // address from |Start| with the IP address set to the top most resolved + // address of |family| (|addr| will have both hostname and the resolved ip). + virtual bool GetResolvedAddress(int family, + rtc::SocketAddress* addr) const = 0; + // Returns error from resolver. + virtual int GetError() const = 0; +}; + +class RTC_EXPORT AsyncDnsResolverInterface { + public: + virtual ~AsyncDnsResolverInterface() = default; + + // Start address resolution of the hostname in |addr|. + virtual void Start(const rtc::SocketAddress& addr, + std::function callback) = 0; + virtual const AsyncDnsResolverResult& result() const = 0; +}; + +// An abstract factory for creating AsyncDnsResolverInterfaces. This allows +// client applications to provide WebRTC with their own mechanism for +// performing DNS resolution. +class AsyncDnsResolverFactoryInterface { + public: + virtual ~AsyncDnsResolverFactoryInterface() = default; + + // Creates an AsyncDnsResolver and starts resolving the name. The callback + // will be called when resolution is finished. + // The callback will be called on the thread that the caller runs on. + virtual std::unique_ptr CreateAndResolve( + const rtc::SocketAddress& addr, + std::function callback) = 0; + // Creates an AsyncDnsResolver and does not start it. + // For backwards compatibility, will be deprecated and removed. + // One has to do a separate Start() call on the + // resolver to start name resolution. + virtual std::unique_ptr Create() = 0; +}; + +} // namespace webrtc + +#endif // API_ASYNC_DNS_RESOLVER_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_canceller3_config.h libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_canceller3_config.h --- libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_canceller3_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_canceller3_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -90,6 +90,7 @@ bool conservative_initial_phase = false; bool enable_coarse_filter_output_usage = true; bool use_linear_filter = true; + bool high_pass_filter_echo_reference = false; bool export_linear_aec_output = false; } filter; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_canceller3_config_json.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_canceller3_config_json.cc --- libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_canceller3_config_json.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_canceller3_config_json.cc 2021-06-27 05:27:48.000000000 +0000 @@ -230,6 +230,8 @@ ReadParam(section, "enable_coarse_filter_output_usage", &cfg.filter.enable_coarse_filter_output_usage); ReadParam(section, "use_linear_filter", &cfg.filter.use_linear_filter); + ReadParam(section, "high_pass_filter_echo_reference", + &cfg.filter.high_pass_filter_echo_reference); ReadParam(section, "export_linear_aec_output", &cfg.filter.export_linear_aec_output); } @@ -513,6 +515,9 @@ << ","; ost << "\"use_linear_filter\": " << (config.filter.use_linear_filter ? "true" : "false") << ","; + ost << "\"high_pass_filter_echo_reference\": " + << (config.filter.high_pass_filter_echo_reference ? "true" : "false") + << ","; ost << "\"export_linear_aec_output\": " << (config.filter.export_linear_aec_output ? "true" : "false"); diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_control.h libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_control.h --- libtgowt-0~git20210124.be23804+ds/src/api/audio/echo_control.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/echo_control.h 2021-06-27 05:27:48.000000000 +0000 @@ -48,6 +48,13 @@ // Provides an optional external estimate of the audio buffer delay. virtual void SetAudioBufferDelay(int delay_ms) = 0; + // Specifies whether the capture output will be used. The purpose of this is + // to allow the echo controller to deactivate some of the processing when the + // resulting output is anyway not used, for instance when the endpoint is + // muted. + // TODO(b/177830919): Make pure virtual. + virtual void SetCaptureOutputUsage(bool capture_output_used) {} + // Returns wheter the signal is altered. virtual bool ActiveProcessing() const = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio/test/echo_canceller3_config_json_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/test/echo_canceller3_config_json_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/audio/test/echo_canceller3_config_json_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio/test/echo_canceller3_config_json_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -21,6 +21,8 @@ cfg.delay.log_warning_on_delay_changes = true; cfg.filter.refined.error_floor = 2.f; cfg.filter.coarse_initial.length_blocks = 3u; + cfg.filter.high_pass_filter_echo_reference = + !cfg.filter.high_pass_filter_echo_reference; cfg.comfort_noise.noise_floor_dbfs = 100.f; cfg.echo_model.model_reverb_in_nonlinear_mode = false; cfg.suppressor.normal_tuning.mask_hf.enr_suppress = .5f; @@ -47,6 +49,8 @@ cfg_transformed.filter.coarse_initial.length_blocks); EXPECT_EQ(cfg.filter.refined.error_floor, cfg_transformed.filter.refined.error_floor); + EXPECT_EQ(cfg.filter.high_pass_filter_echo_reference, + cfg_transformed.filter.high_pass_filter_echo_reference); EXPECT_EQ(cfg.comfort_noise.noise_floor_dbfs, cfg_transformed.comfort_noise.noise_floor_dbfs); EXPECT_EQ(cfg.echo_model.model_reverb_in_nonlinear_mode, diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -33,7 +33,6 @@ "..:bitrate_allocation", "..:scoped_refptr", "../../rtc_base:checks", - "../../rtc_base:deprecation", "../../rtc_base:rtc_base_approved", "../../rtc_base:sanitizer", "../../rtc_base/system:rtc_export", diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/audio_decoder.h libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/audio_decoder.h --- libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/audio_decoder.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/audio_decoder.h 2021-06-27 05:27:48.000000000 +0000 @@ -136,7 +136,7 @@ // with the decoded audio on either side of the concealment. // Note: The default implementation of GeneratePlc will be deleted soon. All // implementations must provide their own, which can be a simple as a no-op. - // TODO(bugs.webrtc.org/9676): Remove default impementation. + // TODO(bugs.webrtc.org/9676): Remove default implementation. virtual void GeneratePlc(size_t requested_samples_per_channel, rtc::BufferT* concealment_audio); diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/audio_encoder.h libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/audio_encoder.h --- libtgowt-0~git20210124.be23804+ds/src/api/audio_codecs/audio_encoder.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/audio_codecs/audio_encoder.h 2021-06-27 05:27:48.000000000 +0000 @@ -16,12 +16,12 @@ #include #include +#include "absl/base/attributes.h" #include "absl/types/optional.h" #include "api/array_view.h" #include "api/call/bitrate_allocation.h" #include "api/units/time_delta.h" #include "rtc_base/buffer.h" -#include "rtc_base/deprecation.h" namespace webrtc { @@ -182,12 +182,11 @@ // implementation does nothing. virtual void SetMaxPlaybackRate(int frequency_hz); - // This is to be deprecated. Please use |OnReceivedTargetAudioBitrate| - // instead. // Tells the encoder what average bitrate we'd like it to produce. The // encoder is free to adjust or disregard the given bitrate (the default // implementation does the latter). - RTC_DEPRECATED virtual void SetTargetBitrate(int target_bps); + ABSL_DEPRECATED("Use OnReceivedTargetAudioBitrate instead") + virtual void SetTargetBitrate(int target_bps); // Causes this encoder to let go of any other encoders it contains, and // returns a pointer to an array where they are stored (which is required to @@ -210,7 +209,8 @@ virtual void OnReceivedUplinkPacketLossFraction( float uplink_packet_loss_fraction); - RTC_DEPRECATED virtual void OnReceivedUplinkRecoverablePacketLossFraction( + ABSL_DEPRECATED("") + virtual void OnReceivedUplinkRecoverablePacketLossFraction( float uplink_recoverable_packet_loss_fraction); // Provides target audio bitrate to this encoder to allow it to adapt. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/call/transport.h libtgowt-0~git20210627.91d836d+dfsg/src/api/call/transport.h --- libtgowt-0~git20210124.be23804+ds/src/api/call/transport.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/call/transport.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,7 +14,8 @@ #include #include -#include +#include "api/ref_counted_base.h" +#include "api/scoped_refptr.h" namespace webrtc { @@ -30,7 +31,7 @@ int packet_id = -1; // Additional data bound to the RTP packet for use in application code, // outside of WebRTC. - std::vector application_data; + rtc::scoped_refptr additional_data; // Whether this is a retransmission of an earlier packet. bool is_retransmit = false; bool included_in_feedback = false; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/ice_transport_factory.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/ice_transport_factory.cc --- libtgowt-0~git20210124.be23804+ds/src/api/ice_transport_factory.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/ice_transport_factory.cc 2021-06-27 05:27:48.000000000 +0000 @@ -14,6 +14,7 @@ #include #include "p2p/base/ice_transport_internal.h" +#include "p2p/base/p2p_constants.h" #include "p2p/base/p2p_transport_channel.h" #include "p2p/base/port_allocator.h" #include "rtc_base/thread.h" @@ -41,7 +42,7 @@ } private: - const rtc::ThreadChecker thread_checker_{}; + const SequenceChecker thread_checker_{}; const std::unique_ptr internal_ RTC_GUARDED_BY(thread_checker_); }; @@ -59,8 +60,8 @@ IceTransportInit init) { return new rtc::RefCountedObject( std::make_unique( - "", 0, init.port_allocator(), init.async_resolver_factory(), - init.event_log())); + "", cricket::ICE_CANDIDATE_COMPONENT_RTP, init.port_allocator(), + init.async_resolver_factory(), init.event_log())); } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/jsep.h libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep.h --- libtgowt-0~git20210124.be23804+ds/src/api/jsep.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep.h 2021-06-27 05:27:48.000000000 +0000 @@ -28,7 +28,6 @@ #include "absl/types/optional.h" #include "api/rtc_error.h" -#include "rtc_base/deprecation.h" #include "rtc_base/ref_count.h" #include "rtc_base/system/rtc_export.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/jsep_ice_candidate.h libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep_ice_candidate.h --- libtgowt-0~git20210124.be23804+ds/src/api/jsep_ice_candidate.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep_ice_candidate.h 2021-06-27 05:27:48.000000000 +0000 @@ -34,6 +34,8 @@ JsepIceCandidate(const std::string& sdp_mid, int sdp_mline_index, const cricket::Candidate& candidate); + JsepIceCandidate(const JsepIceCandidate&) = delete; + JsepIceCandidate& operator=(const JsepIceCandidate&) = delete; ~JsepIceCandidate() override; // |err| may be null. bool Initialize(const std::string& sdp, SdpParseError* err); @@ -53,8 +55,6 @@ std::string sdp_mid_; int sdp_mline_index_; cricket::Candidate candidate_; - - RTC_DISALLOW_COPY_AND_ASSIGN(JsepIceCandidate); }; // Implementation of IceCandidateCollection which stores JsepIceCandidates. @@ -64,6 +64,8 @@ // Move constructor is defined so that a vector of JsepCandidateCollections // can be resized. JsepCandidateCollection(JsepCandidateCollection&& o); + // Returns a copy of the candidate collection. + JsepCandidateCollection Clone() const; size_t count() const override; bool HasCandidate(const IceCandidateInterface* candidate) const override; // Adds and takes ownership of the JsepIceCandidate. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/jsep_session_description.h libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep_session_description.h --- libtgowt-0~git20210124.be23804+ds/src/api/jsep_session_description.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/jsep_session_description.h 2021-06-27 05:27:48.000000000 +0000 @@ -23,7 +23,6 @@ #include "api/jsep.h" #include "api/jsep_ice_candidate.h" #include "rtc_base/constructor_magic.h" -#include "rtc_base/deprecation.h" namespace cricket { class SessionDescription; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/media_stream_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/media_stream_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/media_stream_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/media_stream_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,8 +20,8 @@ // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(MediaStream) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PRIMARY_PROXY_MAP(MediaStream) +PROXY_PRIMARY_THREAD_DESTRUCTOR() BYPASS_PROXY_CONSTMETHOD0(std::string, id) PROXY_METHOD0(AudioTrackVector, GetAudioTracks) PROXY_METHOD0(VideoTrackVector, GetVideoTracks) diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/media_stream_track_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/media_stream_track_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/media_stream_track_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/media_stream_track_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -24,8 +24,8 @@ // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(AudioTrack) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PRIMARY_PROXY_MAP(AudioTrack) +PROXY_PRIMARY_THREAD_DESTRUCTOR() BYPASS_PROXY_CONSTMETHOD0(std::string, kind) BYPASS_PROXY_CONSTMETHOD0(std::string, id) PROXY_CONSTMETHOD0(TrackState, state) @@ -41,7 +41,7 @@ END_PROXY_MAP() BEGIN_PROXY_MAP(VideoTrack) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +PROXY_PRIMARY_THREAD_DESTRUCTOR() BYPASS_PROXY_CONSTMETHOD0(std::string, kind) BYPASS_PROXY_CONSTMETHOD0(std::string, id) PROXY_CONSTMETHOD0(TrackState, state) @@ -49,11 +49,11 @@ PROXY_METHOD1(bool, set_enabled, bool) PROXY_CONSTMETHOD0(ContentHint, content_hint) PROXY_METHOD1(void, set_content_hint, ContentHint) -PROXY_WORKER_METHOD2(void, - AddOrUpdateSink, - rtc::VideoSinkInterface*, - const rtc::VideoSinkWants&) -PROXY_WORKER_METHOD1(void, RemoveSink, rtc::VideoSinkInterface*) +PROXY_SECONDARY_METHOD2(void, + AddOrUpdateSink, + rtc::VideoSinkInterface*, + const rtc::VideoSinkWants&) +PROXY_SECONDARY_METHOD1(void, RemoveSink, rtc::VideoSinkInterface*) PROXY_CONSTMETHOD0(VideoTrackSourceInterface*, GetSource) PROXY_METHOD1(void, RegisterObserver, ObserverInterface*) diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_factory_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_factory_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_factory_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_factory_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -17,14 +17,13 @@ #include "api/peer_connection_interface.h" #include "api/proxy.h" -#include "rtc_base/bind.h" namespace webrtc { // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(PeerConnectionFactory) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PROXY_MAP(PeerConnectionFactory) +PROXY_PRIMARY_THREAD_DESTRUCTOR() PROXY_METHOD1(void, SetOptions, const Options&) PROXY_METHOD4(rtc::scoped_refptr, CreatePeerConnection, @@ -60,8 +59,8 @@ CreateAudioTrack, const std::string&, AudioSourceInterface*) -PROXY_METHOD2(bool, StartAecDump, FILE*, int64_t) -PROXY_METHOD0(void, StopAecDump) +PROXY_SECONDARY_METHOD2(bool, StartAecDump, FILE*, int64_t) +PROXY_SECONDARY_METHOD0(void, StopAecDump) END_PROXY_MAP() } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -621,12 +621,8 @@ absl::optional crypto_options; // Configure if we should include the SDP attribute extmap-allow-mixed in - // our offer. Although we currently do support this, it's not included in - // our offer by default due to a previous bug that caused the SDP parser to - // abort parsing if this attribute was present. This is fixed in Chrome 71. - // TODO(webrtc:9985): Change default to true once sufficient time has - // passed. - bool offer_extmap_allow_mixed = false; + // our offer on session level. + bool offer_extmap_allow_mixed = true; // TURN logging identifier. // This identifier is added to a TURN allocation @@ -1060,7 +1056,10 @@ // Removes a group of remote candidates from the ICE agent. Needed mainly for // continual gathering, to avoid an ever-growing list of candidates as - // networks come and go. + // networks come and go. Note that the candidates' transport_name must be set + // to the MID of the m= section that generated the candidate. + // TODO(bugs.webrtc.org/8395): Use IceCandidateInterface instead of + // cricket::Candidate, which would avoid the transport_name oddity. virtual bool RemoveIceCandidates( const std::vector& candidates) = 0; @@ -1296,8 +1295,6 @@ // The heuristics for defining what constitutes "interesting" are // implementation-defined. virtual void OnInterestingUsage(int usage_pattern) {} - - virtual void OnErrorDemuxingPacket(uint32_t ssrc) {} }; // PeerConnectionDependencies holds all of PeerConnections dependencies. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/peer_connection_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/peer_connection_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,10 +20,13 @@ namespace webrtc { +// PeerConnection proxy objects will be constructed with two thread pointers, +// signaling and network. The proxy macros don't have 'network' specific macros +// and support for a secondary thread is provided via 'SECONDARY' macros. // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(PeerConnection) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PROXY_MAP(PeerConnection) +PROXY_PRIMARY_THREAD_DESTRUCTOR() PROXY_METHOD0(rtc::scoped_refptr, local_streams) PROXY_METHOD0(rtc::scoped_refptr, remote_streams) PROXY_METHOD1(bool, AddStream, MediaStreamInterface*) @@ -130,10 +133,15 @@ PROXY_METHOD1(RTCError, SetBitrate, const BitrateSettings&) PROXY_METHOD1(void, SetAudioPlayout, bool) PROXY_METHOD1(void, SetAudioRecording, bool) -PROXY_METHOD1(rtc::scoped_refptr, - LookupDtlsTransportByMid, - const std::string&) -PROXY_CONSTMETHOD0(rtc::scoped_refptr, GetSctpTransport) +// This method will be invoked on the network thread. See +// PeerConnectionFactory::CreatePeerConnectionOrError for more details. +PROXY_SECONDARY_METHOD1(rtc::scoped_refptr, + LookupDtlsTransportByMid, + const std::string&) +// This method will be invoked on the network thread. See +// PeerConnectionFactory::CreatePeerConnectionOrError for more details. +PROXY_SECONDARY_CONSTMETHOD0(rtc::scoped_refptr, + GetSctpTransport) PROXY_METHOD0(SignalingState, signaling_state) PROXY_METHOD0(IceConnectionState, ice_connection_state) PROXY_METHOD0(IceConnectionState, standardized_ice_connection_state) diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,6 +12,13 @@ // PeerConnection classes. // TODO(deadbeef): Move this to pc/; this is part of the implementation. +// The proxied objects are initialized with either one or two thread +// objects that operations can be proxied to: The primary and secondary +// threads. +// In common usage, the primary thread will be the PeerConnection's +// signaling thread, and the secondary thread will be either the +// PeerConnection's worker thread or the PeerConnection's network thread. + // // Example usage: // @@ -29,22 +36,22 @@ // }; // // BEGIN_PROXY_MAP(Test) -// PROXY_SIGNALING_THREAD_DESTRUCTOR() +// PROXY_PRIMARY_THREAD_DESTRUCTOR() // PROXY_METHOD0(std::string, FooA) // PROXY_CONSTMETHOD1(std::string, FooB, arg1) -// PROXY_WORKER_METHOD1(std::string, FooC, arg1) +// PROXY_SECONDARY_METHOD1(std::string, FooC, arg1) // END_PROXY_MAP() // -// Where the destructor and first two methods are invoked on the signaling -// thread, and the third is invoked on the worker thread. +// Where the destructor and first two methods are invoked on the primary +// thread, and the third is invoked on the secondary thread. // // The proxy can be created using // // TestProxy::Create(Thread* signaling_thread, Thread* worker_thread, // TestInterface*). // -// The variant defined with BEGIN_SIGNALING_PROXY_MAP is unaware of -// the worker thread, and invokes all methods on the signaling thread. +// The variant defined with BEGIN_PRIMARY_PROXY_MAP is unaware of +// the secondary thread, and invokes all methods on the primary thread. // // The variant defined with BEGIN_OWNED_PROXY_MAP does not use // refcounting, and instead just takes ownership of the object being proxied. @@ -195,25 +202,25 @@ }; // clang-format on -#define SIGNALING_PROXY_MAP_BOILERPLATE(c) \ +#define PRIMARY_PROXY_MAP_BOILERPLATE(c) \ + protected: \ + c##ProxyWithInternal(rtc::Thread* primary_thread, INTERNAL_CLASS* c) \ + : primary_thread_(primary_thread), c_(c) {} \ + \ + private: \ + mutable rtc::Thread* primary_thread_; + +#define SECONDARY_PROXY_MAP_BOILERPLATE(c) \ protected: \ - c##ProxyWithInternal(rtc::Thread* signaling_thread, INTERNAL_CLASS* c) \ - : signaling_thread_(signaling_thread), c_(c) {} \ + c##ProxyWithInternal(rtc::Thread* primary_thread, \ + rtc::Thread* secondary_thread, INTERNAL_CLASS* c) \ + : primary_thread_(primary_thread), \ + secondary_thread_(secondary_thread), \ + c_(c) {} \ \ private: \ - mutable rtc::Thread* signaling_thread_; - -#define WORKER_PROXY_MAP_BOILERPLATE(c) \ - protected: \ - c##ProxyWithInternal(rtc::Thread* signaling_thread, \ - rtc::Thread* worker_thread, INTERNAL_CLASS* c) \ - : signaling_thread_(signaling_thread), \ - worker_thread_(worker_thread), \ - c_(c) {} \ - \ - private: \ - mutable rtc::Thread* signaling_thread_; \ - mutable rtc::Thread* worker_thread_; + mutable rtc::Thread* primary_thread_; \ + mutable rtc::Thread* secondary_thread_; // Note that the destructor is protected so that the proxy can only be // destroyed via RefCountInterface. @@ -246,89 +253,88 @@ void DestroyInternal() { delete c_; } \ INTERNAL_CLASS* c_; -#define BEGIN_SIGNALING_PROXY_MAP(c) \ - PROXY_MAP_BOILERPLATE(c) \ - SIGNALING_PROXY_MAP_BOILERPLATE(c) \ - REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \ - public: \ - static rtc::scoped_refptr Create( \ - rtc::Thread* signaling_thread, INTERNAL_CLASS* c) { \ - return new rtc::RefCountedObject(signaling_thread, \ - c); \ - } - -#define BEGIN_PROXY_MAP(c) \ - PROXY_MAP_BOILERPLATE(c) \ - WORKER_PROXY_MAP_BOILERPLATE(c) \ - REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \ - public: \ - static rtc::scoped_refptr Create( \ - rtc::Thread* signaling_thread, rtc::Thread* worker_thread, \ - INTERNAL_CLASS* c) { \ - return new rtc::RefCountedObject(signaling_thread, \ - worker_thread, c); \ +#define BEGIN_PRIMARY_PROXY_MAP(c) \ + PROXY_MAP_BOILERPLATE(c) \ + PRIMARY_PROXY_MAP_BOILERPLATE(c) \ + REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \ + public: \ + static rtc::scoped_refptr Create( \ + rtc::Thread* primary_thread, INTERNAL_CLASS* c) { \ + return new rtc::RefCountedObject(primary_thread, c); \ + } + +#define BEGIN_PROXY_MAP(c) \ + PROXY_MAP_BOILERPLATE(c) \ + SECONDARY_PROXY_MAP_BOILERPLATE(c) \ + REFCOUNTED_PROXY_MAP_BOILERPLATE(c) \ + public: \ + static rtc::scoped_refptr Create( \ + rtc::Thread* primary_thread, rtc::Thread* secondary_thread, \ + INTERNAL_CLASS* c) { \ + return new rtc::RefCountedObject( \ + primary_thread, secondary_thread, c); \ } #define BEGIN_OWNED_PROXY_MAP(c) \ PROXY_MAP_BOILERPLATE(c) \ - WORKER_PROXY_MAP_BOILERPLATE(c) \ + SECONDARY_PROXY_MAP_BOILERPLATE(c) \ OWNED_PROXY_MAP_BOILERPLATE(c) \ public: \ static std::unique_ptr Create( \ - rtc::Thread* signaling_thread, rtc::Thread* worker_thread, \ + rtc::Thread* primary_thread, rtc::Thread* secondary_thread, \ std::unique_ptr c) { \ return std::unique_ptr(new c##ProxyWithInternal( \ - signaling_thread, worker_thread, c.release())); \ + primary_thread, secondary_thread, c.release())); \ } -#define PROXY_SIGNALING_THREAD_DESTRUCTOR() \ - private: \ - rtc::Thread* destructor_thread() const { return signaling_thread_; } \ - \ +#define PROXY_PRIMARY_THREAD_DESTRUCTOR() \ + private: \ + rtc::Thread* destructor_thread() const { return primary_thread_; } \ + \ public: // NOLINTNEXTLINE -#define PROXY_WORKER_THREAD_DESTRUCTOR() \ - private: \ - rtc::Thread* destructor_thread() const { return worker_thread_; } \ - \ +#define PROXY_SECONDARY_THREAD_DESTRUCTOR() \ + private: \ + rtc::Thread* destructor_thread() const { return secondary_thread_; } \ + \ public: // NOLINTNEXTLINE -#define PROXY_METHOD0(r, method) \ - r method() override { \ - MethodCall call(c_, &C::method); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ +#define PROXY_METHOD0(r, method) \ + r method() override { \ + MethodCall call(c_, &C::method); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } -#define PROXY_CONSTMETHOD0(r, method) \ - r method() const override { \ - ConstMethodCall call(c_, &C::method); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ +#define PROXY_CONSTMETHOD0(r, method) \ + r method() const override { \ + ConstMethodCall call(c_, &C::method); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_METHOD1(r, method, t1) \ r method(t1 a1) override { \ MethodCall call(c_, &C::method, std::move(a1)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_CONSTMETHOD1(r, method, t1) \ r method(t1 a1) const override { \ ConstMethodCall call(c_, &C::method, std::move(a1)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_METHOD2(r, method, t1, t2) \ r method(t1 a1, t2 a2) override { \ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_METHOD3(r, method, t1, t2, t3) \ r method(t1 a1, t2 a2, t3 a3) override { \ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2), std::move(a3)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_METHOD4(r, method, t1, t2, t3, t4) \ @@ -336,7 +342,7 @@ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2), std::move(a3), \ std::move(a4)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } #define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5) \ @@ -344,60 +350,60 @@ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2), std::move(a3), \ std::move(a4), std::move(a5)); \ - return call.Marshal(RTC_FROM_HERE, signaling_thread_); \ + return call.Marshal(RTC_FROM_HERE, primary_thread_); \ } -// Define methods which should be invoked on the worker thread. -#define PROXY_WORKER_METHOD0(r, method) \ - r method() override { \ - MethodCall call(c_, &C::method); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ +// Define methods which should be invoked on the secondary thread. +#define PROXY_SECONDARY_METHOD0(r, method) \ + r method() override { \ + MethodCall call(c_, &C::method); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_CONSTMETHOD0(r, method) \ - r method() const override { \ - ConstMethodCall call(c_, &C::method); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ +#define PROXY_SECONDARY_CONSTMETHOD0(r, method) \ + r method() const override { \ + ConstMethodCall call(c_, &C::method); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_METHOD1(r, method, t1) \ +#define PROXY_SECONDARY_METHOD1(r, method, t1) \ r method(t1 a1) override { \ MethodCall call(c_, &C::method, std::move(a1)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_CONSTMETHOD1(r, method, t1) \ +#define PROXY_SECONDARY_CONSTMETHOD1(r, method, t1) \ r method(t1 a1) const override { \ ConstMethodCall call(c_, &C::method, std::move(a1)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_METHOD2(r, method, t1, t2) \ +#define PROXY_SECONDARY_METHOD2(r, method, t1, t2) \ r method(t1 a1, t2 a2) override { \ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_CONSTMETHOD2(r, method, t1, t2) \ +#define PROXY_SECONDARY_CONSTMETHOD2(r, method, t1, t2) \ r method(t1 a1, t2 a2) const override { \ ConstMethodCall call(c_, &C::method, std::move(a1), \ std::move(a2)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_METHOD3(r, method, t1, t2, t3) \ +#define PROXY_SECONDARY_METHOD3(r, method, t1, t2, t3) \ r method(t1 a1, t2 a2, t3 a3) override { \ MethodCall call(c_, &C::method, std::move(a1), \ std::move(a2), std::move(a3)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } -#define PROXY_WORKER_CONSTMETHOD3(r, method, t1, t2) \ +#define PROXY_SECONDARY_CONSTMETHOD3(r, method, t1, t2) \ r method(t1 a1, t2 a2, t3 a3) const override { \ ConstMethodCall call(c_, &C::method, std::move(a1), \ std::move(a2), std::move(a3)); \ - return call.Marshal(RTC_FROM_HERE, worker_thread_); \ + return call.Marshal(RTC_FROM_HERE, secondary_thread_); \ } // For use when returning purely const state (set during construction). diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_headers.h libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_headers.h --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_headers.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_headers.h 2021-06-27 05:27:48.000000000 +0000 @@ -144,13 +144,12 @@ VideoPlayoutDelay playout_delay; // For identification of a stream when ssrc is not signaled. See - // https://tools.ietf.org/html/draft-ietf-avtext-rid-09 - // TODO(danilchap): Update url from draft to release version. + // https://tools.ietf.org/html/rfc8852 std::string stream_id; std::string repaired_stream_id; // For identifying the media section used to interpret this RTP packet. See - // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-38 + // https://tools.ietf.org/html/rfc8843 std::string mid; absl::optional color_space; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_parameters.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_parameters.cc --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_parameters.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_parameters.cc 2021-06-27 05:27:48.000000000 +0000 @@ -130,6 +130,7 @@ constexpr char RtpExtension::kMidUri[]; constexpr char RtpExtension::kRidUri[]; constexpr char RtpExtension::kRepairedRidUri[]; +constexpr char RtpExtension::kVideoFrameTrackingIdUri[]; constexpr int RtpExtension::kMinId; constexpr int RtpExtension::kMaxId; @@ -164,7 +165,8 @@ uri == webrtc::RtpExtension::kColorSpaceUri || uri == webrtc::RtpExtension::kRidUri || uri == webrtc::RtpExtension::kRepairedRidUri || - uri == webrtc::RtpExtension::kVideoLayersAllocationUri; + uri == webrtc::RtpExtension::kVideoLayersAllocationUri || + uri == webrtc::RtpExtension::kVideoFrameTrackingIdUri; } bool RtpExtension::IsEncryptionSupported(absl::string_view uri) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_parameters.h libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_parameters.h --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_parameters.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_parameters.h 2021-06-27 05:27:48.000000000 +0000 @@ -353,6 +353,10 @@ static constexpr char kRepairedRidUri[] = "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"; + // Header extension to propagate webrtc::VideoFrame id field + static constexpr char kVideoFrameTrackingIdUri[] = + "http://www.webrtc.org/experiments/rtp-hdrext/video-frame-tracking-id"; + // Inclusive min and max IDs for two-byte header extensions and one-byte // header extensions, per RFC8285 Section 4.2-4.3. static constexpr int kMinId = 1; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_receiver_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_receiver_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_receiver_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_receiver_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -26,7 +26,6 @@ #include "api/rtp_parameters.h" #include "api/scoped_refptr.h" #include "api/transport/rtp/rtp_source.h" -#include "rtc_base/deprecation.h" #include "rtc_base/ref_count.h" #include "rtc_base/system/rtc_export.h" @@ -121,8 +120,8 @@ // Define proxy for RtpReceiverInterface. // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(RtpReceiver) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PRIMARY_PROXY_MAP(RtpReceiver) +PROXY_PRIMARY_THREAD_DESTRUCTOR() PROXY_CONSTMETHOD0(rtc::scoped_refptr, track) PROXY_CONSTMETHOD0(rtc::scoped_refptr, dtls_transport) PROXY_CONSTMETHOD0(std::vector, stream_ids) diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_sender_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_sender_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_sender_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_sender_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -104,8 +104,8 @@ // Define proxy for RtpSenderInterface. // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. -BEGIN_SIGNALING_PROXY_MAP(RtpSender) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +BEGIN_PRIMARY_PROXY_MAP(RtpSender) +PROXY_PRIMARY_THREAD_DESTRUCTOR() PROXY_METHOD1(bool, SetTrack, MediaStreamTrackInterface*) PROXY_CONSTMETHOD0(rtc::scoped_refptr, track) PROXY_CONSTMETHOD0(rtc::scoped_refptr, dtls_transport) diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/rtp_transceiver_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_transceiver_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/rtp_transceiver_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/rtp_transceiver_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,6 +14,7 @@ #include #include +#include "absl/base/attributes.h" #include "absl/types/optional.h" #include "api/array_view.h" #include "api/media_types.h" @@ -111,8 +112,8 @@ // https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-direction // TODO(hta): Deprecate SetDirection without error and rename // SetDirectionWithError to SetDirection, remove default implementations. - RTC_DEPRECATED virtual void SetDirection( - RtpTransceiverDirection new_direction); + ABSL_DEPRECATED("Use SetDirectionWithError instead") + virtual void SetDirection(RtpTransceiverDirection new_direction); virtual RTCError SetDirectionWithError(RtpTransceiverDirection new_direction); // The current_direction attribute indicates the current direction negotiated @@ -140,7 +141,7 @@ // This is an internal function, and is exposed for historical reasons. // https://w3c.github.io/webrtc-pc/#dfn-stop-the-rtcrtptransceiver virtual void StopInternal(); - RTC_DEPRECATED virtual void Stop(); + ABSL_DEPRECATED("Use StopStandard instead") virtual void Stop(); // The SetCodecPreferences method overrides the default codec preferences used // by WebRTC for this transceiver. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/scoped_refptr.h libtgowt-0~git20210627.91d836d+dfsg/src/api/scoped_refptr.h --- libtgowt-0~git20210124.be23804+ds/src/api/scoped_refptr.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/scoped_refptr.h 2021-06-27 05:27:48.000000000 +0000 @@ -104,6 +104,7 @@ T* get() const { return ptr_; } operator T*() const { return ptr_; } + T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } // Returns the (possibly null) raw pointer, and makes the scoped_refptr hold a diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/sctp_transport_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/sctp_transport_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/sctp_transport_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/sctp_transport_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -35,6 +35,8 @@ // http://w3c.github.io/webrtc-pc/#rtcsctptransport-interface class RTC_EXPORT SctpTransportInformation { public: + SctpTransportInformation() = default; + SctpTransportInformation(const SctpTransportInformation&) = default; explicit SctpTransportInformation(SctpTransportState state); SctpTransportInformation( SctpTransportState state, diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/sequence_checker.h libtgowt-0~git20210627.91d836d+dfsg/src/api/sequence_checker.h --- libtgowt-0~git20210124.be23804+ds/src/api/sequence_checker.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/sequence_checker.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,116 @@ +/* + * Copyright 2019 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef API_SEQUENCE_CHECKER_H_ +#define API_SEQUENCE_CHECKER_H_ + +#include "rtc_base/checks.h" +#include "rtc_base/synchronization/sequence_checker_internal.h" +#include "rtc_base/thread_annotations.h" + +namespace webrtc { + +// SequenceChecker is a helper class used to help verify that some methods +// of a class are called on the same task queue or thread. A +// SequenceChecker is bound to a a task queue if the object is +// created on a task queue, or a thread otherwise. +// +// +// Example: +// class MyClass { +// public: +// void Foo() { +// RTC_DCHECK_RUN_ON(sequence_checker_); +// ... (do stuff) ... +// } +// +// private: +// SequenceChecker sequence_checker_; +// } +// +// In Release mode, IsCurrent will always return true. +class RTC_LOCKABLE SequenceChecker +#if RTC_DCHECK_IS_ON + : public webrtc_sequence_checker_internal::SequenceCheckerImpl { + using Impl = webrtc_sequence_checker_internal::SequenceCheckerImpl; +#else + : public webrtc_sequence_checker_internal::SequenceCheckerDoNothing { + using Impl = webrtc_sequence_checker_internal::SequenceCheckerDoNothing; +#endif + public: + // Returns true if sequence checker is attached to the current sequence. + bool IsCurrent() const { return Impl::IsCurrent(); } + // Detaches checker from sequence to which it is attached. Next attempt + // to do a check with this checker will result in attaching this checker + // to the sequence on which check was performed. + void Detach() { Impl::Detach(); } +}; + +} // namespace webrtc + +// RTC_RUN_ON/RTC_GUARDED_BY/RTC_DCHECK_RUN_ON macros allows to annotate +// variables are accessed from same thread/task queue. +// Using tools designed to check mutexes, it checks at compile time everywhere +// variable is access, there is a run-time dcheck thread/task queue is correct. +// +// class SequenceCheckerExample { +// public: +// int CalledFromPacer() RTC_RUN_ON(pacer_sequence_checker_) { +// return var2_; +// } +// +// void CallMeFromPacer() { +// RTC_DCHECK_RUN_ON(&pacer_sequence_checker_) +// << "Should be called from pacer"; +// CalledFromPacer(); +// } +// +// private: +// int pacer_var_ RTC_GUARDED_BY(pacer_sequence_checker_); +// SequenceChecker pacer_sequence_checker_; +// }; +// +// class TaskQueueExample { +// public: +// class Encoder { +// public: +// rtc::TaskQueueBase& Queue() { return encoder_queue_; } +// void Encode() { +// RTC_DCHECK_RUN_ON(&encoder_queue_); +// DoSomething(var_); +// } +// +// private: +// rtc::TaskQueueBase& encoder_queue_; +// Frame var_ RTC_GUARDED_BY(encoder_queue_); +// }; +// +// void Encode() { +// // Will fail at runtime when DCHECK is enabled: +// // encoder_->Encode(); +// // Will work: +// rtc::scoped_refptr encoder = encoder_; +// encoder_->Queue().PostTask([encoder] { encoder->Encode(); }); +// } +// +// private: +// rtc::scoped_refptr encoder_; +// } + +// Document if a function expected to be called from same thread/task queue. +#define RTC_RUN_ON(x) \ + RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(x)) + +#define RTC_DCHECK_RUN_ON(x) \ + webrtc::webrtc_sequence_checker_internal::SequenceCheckerScope \ + seq_check_scope(x); \ + RTC_DCHECK((x)->IsCurrent()) \ + << webrtc::webrtc_sequence_checker_internal::ExpectationToString(x) + +#endif // API_SEQUENCE_CHECKER_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/sequence_checker_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/sequence_checker_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/sequence_checker_unittest.cc 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/sequence_checker_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "api/sequence_checker.h" + +#include +#include + +#include "api/function_view.h" +#include "rtc_base/event.h" +#include "rtc_base/platform_thread.h" +#include "rtc_base/task_queue_for_test.h" +#include "test/gtest.h" + +namespace webrtc { +namespace { + +// This class is dead code, but its purpose is to make sure that +// SequenceChecker is compatible with the RTC_GUARDED_BY and RTC_RUN_ON +// attributes that are checked at compile-time. +class CompileTimeTestForGuardedBy { + public: + int CalledOnSequence() RTC_RUN_ON(sequence_checker_) { return guarded_; } + + void CallMeFromSequence() { + RTC_DCHECK_RUN_ON(&sequence_checker_); + guarded_ = 41; + } + + private: + int guarded_ RTC_GUARDED_BY(sequence_checker_); + ::webrtc::SequenceChecker sequence_checker_; +}; + +void RunOnDifferentThread(rtc::FunctionView run) { + struct Object { + static void Run(void* obj) { + auto* me = static_cast(obj); + me->run(); + me->thread_has_run_event.Set(); + } + + rtc::FunctionView run; + rtc::Event thread_has_run_event; + } object{run}; + + rtc::PlatformThread thread(&Object::Run, &object, "thread"); + thread.Start(); + EXPECT_TRUE(object.thread_has_run_event.Wait(1000)); + thread.Stop(); +} + +} // namespace + +TEST(SequenceCheckerTest, CallsAllowedOnSameThread) { + SequenceChecker sequence_checker; + EXPECT_TRUE(sequence_checker.IsCurrent()); +} + +TEST(SequenceCheckerTest, DestructorAllowedOnDifferentThread) { + auto sequence_checker = std::make_unique(); + RunOnDifferentThread([&] { + // Verify that the destructor doesn't assert when called on a different + // thread. + sequence_checker.reset(); + }); +} + +TEST(SequenceCheckerTest, Detach) { + SequenceChecker sequence_checker; + sequence_checker.Detach(); + RunOnDifferentThread([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); }); +} + +TEST(SequenceCheckerTest, DetachFromThreadAndUseOnTaskQueue) { + SequenceChecker sequence_checker; + sequence_checker.Detach(); + TaskQueueForTest queue; + queue.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); }, + RTC_FROM_HERE); +} + +TEST(SequenceCheckerTest, DetachFromTaskQueueAndUseOnThread) { + TaskQueueForTest queue; + queue.SendTask( + [] { + SequenceChecker sequence_checker; + sequence_checker.Detach(); + RunOnDifferentThread( + [&] { EXPECT_TRUE(sequence_checker.IsCurrent()); }); + }, + RTC_FROM_HERE); +} + +TEST(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadInDebug) { + SequenceChecker sequence_checker; + RunOnDifferentThread( + [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); }); +} + +TEST(SequenceCheckerTest, MethodNotAllowedOnDifferentTaskQueueInDebug) { + SequenceChecker sequence_checker; + TaskQueueForTest queue; + queue.SendTask( + [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); }, + RTC_FROM_HERE); +} + +TEST(SequenceCheckerTest, DetachFromTaskQueueInDebug) { + SequenceChecker sequence_checker; + sequence_checker.Detach(); + + TaskQueueForTest queue1; + queue1.SendTask([&] { EXPECT_TRUE(sequence_checker.IsCurrent()); }, + RTC_FROM_HERE); + + // IsCurrent should return false in debug builds after moving to + // another task queue. + TaskQueueForTest queue2; + queue2.SendTask( + [&] { EXPECT_EQ(sequence_checker.IsCurrent(), !RTC_DCHECK_IS_ON); }, + RTC_FROM_HERE); +} + +class TestAnnotations { + public: + TestAnnotations() : test_var_(false) {} + + void ModifyTestVar() { + RTC_DCHECK_RUN_ON(&checker_); + test_var_ = true; + } + + private: + bool test_var_ RTC_GUARDED_BY(&checker_); + SequenceChecker checker_; +}; + +TEST(SequenceCheckerTest, TestAnnotations) { + TestAnnotations annotations; + annotations.ModifyTestVar(); +} + +#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) + +void TestAnnotationsOnWrongQueue() { + TestAnnotations annotations; + TaskQueueForTest queue; + queue.SendTask([&] { annotations.ModifyTestVar(); }, RTC_FROM_HERE); +} + +#if RTC_DCHECK_IS_ON +// Note: Ending the test suite name with 'DeathTest' is important as it causes +// gtest to order this test before any other non-death-tests, to avoid potential +// global process state pollution such as shared worker threads being started +// (e.g. a side effect of calling InitCocoaMultiThreading() on Mac causes one or +// two additional threads to be created). +TEST(SequenceCheckerDeathTest, TestAnnotationsOnWrongQueueDebug) { + ASSERT_DEATH({ TestAnnotationsOnWrongQueue(); }, ""); +} +#else +TEST(SequenceCheckerTest, TestAnnotationsOnWrongQueueRelease) { + TestAnnotationsOnWrongQueue(); +} +#endif +#endif // GTEST_HAS_DEATH_TEST +} // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/stats/rtcstats_objects.h libtgowt-0~git20210627.91d836d+dfsg/src/api/stats/rtcstats_objects.h --- libtgowt-0~git20210124.be23804+ds/src/api/stats/rtcstats_objects.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/stats/rtcstats_objects.h 2021-06-27 05:27:48.000000000 +0000 @@ -161,6 +161,7 @@ // TODO(hbos): Support enum types? // "RTCStatsMember"? RTCStatsMember state; + // Obsolete: priority RTCStatsMember priority; RTCStatsMember nominated; // TODO(hbos): Collect this the way the spec describes it. We have a value for @@ -208,9 +209,11 @@ ~RTCIceCandidateStats() override; RTCStatsMember transport_id; + // Obsolete: is_remote RTCStatsMember is_remote; RTCStatsMember network_type; RTCStatsMember ip; + RTCStatsMember address; RTCStatsMember port; RTCStatsMember protocol; RTCStatsMember relay_protocol; @@ -219,9 +222,6 @@ RTCStatsMember priority; // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/632723 RTCStatsMember url; - // TODO(hbos): |deleted = true| case is not supported by |RTCStatsCollector|. - // crbug.com/632723 - RTCStatsMember deleted; // = false protected: RTCIceCandidateStats(const std::string& id, @@ -374,34 +374,64 @@ ~RTCRTPStreamStats() override; RTCStatsMember ssrc; - // TODO(hbos): Remote case not supported by |RTCStatsCollector|. - // crbug.com/657855, 657856 - RTCStatsMember is_remote; // = false - RTCStatsMember media_type; // renamed to kind. RTCStatsMember kind; + // Obsolete: track_id RTCStatsMember track_id; RTCStatsMember transport_id; RTCStatsMember codec_id; - // FIR and PLI counts are only defined for |media_type == "video"|. - RTCStatsMember fir_count; - RTCStatsMember pli_count; - // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both - // audio and video but is only defined in the "video" case. crbug.com/657856 - RTCStatsMember nack_count; - // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/657854 - // SLI count is only defined for |media_type == "video"|. - RTCStatsMember sli_count; - RTCStatsMember qp_sum; + + // Obsolete + RTCStatsMember media_type; // renamed to kind. protected: RTCRTPStreamStats(const std::string& id, int64_t timestamp_us); RTCRTPStreamStats(std::string&& id, int64_t timestamp_us); }; +// https://www.w3.org/TR/webrtc-stats/#receivedrtpstats-dict* +class RTC_EXPORT RTCReceivedRtpStreamStats : public RTCRTPStreamStats { + public: + WEBRTC_RTCSTATS_DECL(); + + RTCReceivedRtpStreamStats(const RTCReceivedRtpStreamStats& other); + ~RTCReceivedRtpStreamStats() override; + + // TODO(hbos) The following fields need to be added and migrated + // both from RTCInboundRtpStreamStats and RTCRemoteInboundRtpStreamStats: + // packetsReceived, packetsDiscarded, packetsRepaired, burstPacketsLost, + // burstPacketDiscarded, burstLossCount, burstDiscardCount, burstLossRate, + // burstDiscardRate, gapLossRate, gapDiscardRate, framesDropped, + // partialFramesLost, fullFramesLost + // crbug.com/webrtc/12532 + RTCStatsMember jitter; + RTCStatsMember packets_lost; // Signed per RFC 3550 + + protected: + RTCReceivedRtpStreamStats(const std::string&& id, int64_t timestamp_us); + RTCReceivedRtpStreamStats(std::string&& id, int64_t timestamp_us); +}; + +// https://www.w3.org/TR/webrtc-stats/#sentrtpstats-dict* +class RTC_EXPORT RTCSentRtpStreamStats : public RTCRTPStreamStats { + public: + WEBRTC_RTCSTATS_DECL(); + + RTCSentRtpStreamStats(const RTCSentRtpStreamStats& other); + ~RTCSentRtpStreamStats() override; + + RTCStatsMember packets_sent; + RTCStatsMember bytes_sent; + + protected: + RTCSentRtpStreamStats(const std::string&& id, int64_t timestamp_us); + RTCSentRtpStreamStats(std::string&& id, int64_t timestamp_us); +}; + // https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict* // TODO(hbos): Support the remote case |is_remote = true|. // https://bugs.webrtc.org/7065 -class RTC_EXPORT RTCInboundRTPStreamStats final : public RTCRTPStreamStats { +class RTC_EXPORT RTCInboundRTPStreamStats final + : public RTCReceivedRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); @@ -410,16 +440,13 @@ RTCInboundRTPStreamStats(const RTCInboundRTPStreamStats& other); ~RTCInboundRTPStreamStats() override; + RTCStatsMember remote_id; RTCStatsMember packets_received; RTCStatsMember fec_packets_received; RTCStatsMember fec_packets_discarded; RTCStatsMember bytes_received; RTCStatsMember header_bytes_received; - RTCStatsMember packets_lost; // Signed per RFC 3550 RTCStatsMember last_packet_received_timestamp; - // TODO(hbos): Collect and populate this value for both "audio" and "video", - // currently not collected for "video". https://bugs.webrtc.org/7065 - RTCStatsMember jitter; RTCStatsMember jitter_buffer_delay; RTCStatsMember jitter_buffer_emitted_count; RTCStatsMember total_samples_received; @@ -471,6 +498,13 @@ // TODO(hbos): This is only implemented for video; implement it for audio as // well. RTCStatsMember decoder_implementation; + // FIR and PLI counts are only defined for |media_type == "video"|. + RTCStatsMember fir_count; + RTCStatsMember pli_count; + // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both + // audio and video but is only defined in the "video" case. crbug.com/657856 + RTCStatsMember nack_count; + RTCStatsMember qp_sum; }; // https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict* @@ -519,18 +553,18 @@ // TODO(hbos): This is only implemented for video; implement it for audio as // well. RTCStatsMember encoder_implementation; + // FIR and PLI counts are only defined for |media_type == "video"|. + RTCStatsMember fir_count; + RTCStatsMember pli_count; + // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both + // audio and video but is only defined in the "video" case. crbug.com/657856 + RTCStatsMember nack_count; + RTCStatsMember qp_sum; }; -// TODO(https://crbug.com/webrtc/10671): Refactor the stats dictionaries to have -// the same hierarchy as in the spec; implement RTCReceivedRtpStreamStats. -// Several metrics are shared between "outbound-rtp", "remote-inbound-rtp", -// "inbound-rtp" and "remote-outbound-rtp". In the spec there is a hierarchy of -// dictionaries that minimizes defining the same metrics in multiple places. -// From JavaScript this hierarchy is not observable and the spec's hierarchy is -// purely editorial. In C++ non-final classes in the hierarchy could be used to -// refer to different stats objects within the hierarchy. // https://w3c.github.io/webrtc-stats/#remoteinboundrtpstats-dict* -class RTC_EXPORT RTCRemoteInboundRtpStreamStats final : public RTCStats { +class RTC_EXPORT RTCRemoteInboundRtpStreamStats final + : public RTCReceivedRtpStreamStats { public: WEBRTC_RTCSTATS_DECL(); @@ -539,17 +573,6 @@ RTCRemoteInboundRtpStreamStats(const RTCRemoteInboundRtpStreamStats& other); ~RTCRemoteInboundRtpStreamStats() override; - // In the spec RTCRemoteInboundRtpStreamStats inherits from RTCRtpStreamStats - // and RTCReceivedRtpStreamStats. The members here are listed based on where - // they are defined in the spec. - // RTCRtpStreamStats - RTCStatsMember ssrc; - RTCStatsMember kind; - RTCStatsMember transport_id; - RTCStatsMember codec_id; - // RTCReceivedRtpStreamStats - RTCStatsMember packets_lost; - RTCStatsMember jitter; // TODO(hbos): The following RTCReceivedRtpStreamStats metrics should also be // implemented: packetsReceived, packetsDiscarded, packetsRepaired, // burstPacketsLost, burstPacketsDiscarded, burstLossCount, burstDiscardCount, @@ -557,8 +580,25 @@ // RTCRemoteInboundRtpStreamStats RTCStatsMember local_id; RTCStatsMember round_trip_time; - // TODO(hbos): The following RTCRemoteInboundRtpStreamStats metric should also - // be implemented: fractionLost. + RTCStatsMember fraction_lost; + RTCStatsMember total_round_trip_time; + RTCStatsMember round_trip_time_measurements; +}; + +// https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* +class RTC_EXPORT RTCRemoteOutboundRtpStreamStats final + : public RTCSentRtpStreamStats { + public: + WEBRTC_RTCSTATS_DECL(); + + RTCRemoteOutboundRtpStreamStats(const std::string& id, int64_t timestamp_us); + RTCRemoteOutboundRtpStreamStats(std::string&& id, int64_t timestamp_us); + RTCRemoteOutboundRtpStreamStats(const RTCRemoteOutboundRtpStreamStats& other); + ~RTCRemoteOutboundRtpStreamStats() override; + + RTCStatsMember local_id; + RTCStatsMember remote_timestamp; + RTCStatsMember reports_sent; }; // https://w3c.github.io/webrtc-stats/#dom-rtcmediasourcestats @@ -604,7 +644,6 @@ RTCStatsMember width; RTCStatsMember height; - // TODO(hbos): Implement this metric. RTCStatsMember frames; RTCStatsMember frames_per_second; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/stats_types.h libtgowt-0~git20210627.91d836d+dfsg/src/api/stats_types.h --- libtgowt-0~git20210124.be23804+ds/src/api/stats_types.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/stats_types.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,11 +21,11 @@ #include #include "api/scoped_refptr.h" +#include "api/sequence_checker.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/ref_count.h" #include "rtc_base/string_encode.h" #include "rtc_base/system/rtc_export.h" -#include "rtc_base/thread_checker.h" namespace webrtc { @@ -344,7 +344,7 @@ const StatsValueName name; private: - rtc::ThreadChecker thread_checker_; + webrtc::SequenceChecker thread_checker_; mutable int ref_count_ RTC_GUARDED_BY(thread_checker_) = 0; const Type type_; @@ -447,7 +447,7 @@ private: Container list_; - rtc::ThreadChecker thread_checker_; + webrtc::SequenceChecker thread_checker_; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/task_queue/task_queue_base.h libtgowt-0~git20210627.91d836d+dfsg/src/api/task_queue/task_queue_base.h --- libtgowt-0~git20210124.be23804+ds/src/api/task_queue/task_queue_base.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/task_queue/task_queue_base.h 2021-06-27 05:27:48.000000000 +0000 @@ -27,12 +27,14 @@ // Starts destruction of the task queue. // On return ensures no task are running and no new tasks are able to start // on the task queue. - // Responsible for deallocation. Deallocation may happen syncrhoniously during + // Responsible for deallocation. Deallocation may happen synchronously during // Delete or asynchronously after Delete returns. // Code not running on the TaskQueue should not make any assumption when // TaskQueue is deallocated and thus should not call any methods after Delete. // Code running on the TaskQueue should not call Delete, but can assume // TaskQueue still exists and may call other methods, e.g. PostTask. + // Should be called on the same task queue or thread that this task queue + // was created on. virtual void Delete() = 0; // Schedules a task to execute. Tasks are executed in FIFO order. @@ -43,17 +45,20 @@ // TaskQueue or it may happen asynchronously after TaskQueue is deleted. // This may vary from one implementation to the next so assumptions about // lifetimes of pending tasks should not be made. + // May be called on any thread or task queue, including this task queue. virtual void PostTask(std::unique_ptr task) = 0; // Schedules a task to execute a specified number of milliseconds from when // the call is made. The precision should be considered as "best effort" // and in some cases, such as on Windows when all high precision timers have // been used up, can be off by as much as 15 millseconds. + // May be called on any thread or task queue, including this task queue. virtual void PostDelayedTask(std::unique_ptr task, uint32_t milliseconds) = 0; // Returns the task queue that is running the current thread. // Returns nullptr if this thread is not associated with any task queue. + // May be called on any thread or task queue, including this task queue. static TaskQueueBase* Current(); bool IsCurrent() const { return Current() == this; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -12,6 +12,7 @@ visibility = [ "*" ] sources = [ + "cross_traffic.h", "network_emulation_interfaces.cc", "network_emulation_interfaces.h", ] @@ -20,11 +21,32 @@ "../..:array_view", "../../../rtc_base", "../../../rtc_base:checks", + "../../../rtc_base:ip_address", "../../../rtc_base:rtc_base_approved", + "../../../rtc_base:socket_address", "../../numerics", + "../../task_queue", "../../units:data_rate", "../../units:data_size", + "../../units:time_delta", "../../units:timestamp", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } + +rtc_library("create_cross_traffic") { + visibility = [ "*" ] + testonly = true + + sources = [ + "create_cross_traffic.cc", + "create_cross_traffic.h", + ] + + deps = [ + ":network_emulation", + "../..:network_emulation_manager_api", + "../../../rtc_base/task_utils:repeating_task", + "../../../test/network:emulated_network", + ] +} diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/create_cross_traffic.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/create_cross_traffic.cc --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/create_cross_traffic.cc 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/create_cross_traffic.cc 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#include "api/test/network_emulation/create_cross_traffic.h" + +#include + +#include "rtc_base/task_utils/repeating_task.h" +#include "test/network/cross_traffic.h" + +namespace webrtc { + +std::unique_ptr CreateRandomWalkCrossTraffic( + CrossTrafficRoute* traffic_route, + RandomWalkConfig config) { + return std::make_unique(config, traffic_route); +} + +std::unique_ptr CreatePulsedPeaksCrossTraffic( + CrossTrafficRoute* traffic_route, + PulsedPeaksConfig config) { + return std::make_unique(config, traffic_route); +} + +std::unique_ptr CreateFakeTcpCrossTraffic( + EmulatedRoute* send_route, + EmulatedRoute* ret_route, + FakeTcpConfig config) { + return std::make_unique(config, send_route, + ret_route); +} + +} // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/create_cross_traffic.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/create_cross_traffic.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/create_cross_traffic.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/create_cross_traffic.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef API_TEST_NETWORK_EMULATION_CREATE_CROSS_TRAFFIC_H_ +#define API_TEST_NETWORK_EMULATION_CREATE_CROSS_TRAFFIC_H_ + +#include + +#include "api/test/network_emulation/cross_traffic.h" +#include "api/test/network_emulation_manager.h" + +namespace webrtc { + +// This API is still in development and can be changed without prior notice. + +std::unique_ptr CreateRandomWalkCrossTraffic( + CrossTrafficRoute* traffic_route, + RandomWalkConfig config); + +std::unique_ptr CreatePulsedPeaksCrossTraffic( + CrossTrafficRoute* traffic_route, + PulsedPeaksConfig config); + +std::unique_ptr CreateFakeTcpCrossTraffic( + EmulatedRoute* send_route, + EmulatedRoute* ret_route, + FakeTcpConfig config); + +} // namespace webrtc + +#endif // API_TEST_NETWORK_EMULATION_CREATE_CROSS_TRAFFIC_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/cross_traffic.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/cross_traffic.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/cross_traffic.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/cross_traffic.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_ +#define API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_ + +#include "api/task_queue/task_queue_base.h" +#include "api/test/network_emulation/network_emulation_interfaces.h" +#include "api/units/data_rate.h" +#include "api/units/data_size.h" +#include "api/units/time_delta.h" +#include "api/units/timestamp.h" + +namespace webrtc { + +// This API is still in development and can be changed without prior notice. + +// Represents the endpoint for cross traffic that is going through the network. +// It can be used to emulate unexpected network load. +class CrossTrafficRoute { + public: + virtual ~CrossTrafficRoute() = default; + + // Triggers sending of dummy packets with size |packet_size| bytes. + virtual void TriggerPacketBurst(size_t num_packets, size_t packet_size) = 0; + // Sends a packet over the nodes. The content of the packet is unspecified; + // only the size metter for the emulation purposes. + virtual void SendPacket(size_t packet_size) = 0; + // Sends a packet over the nodes and runs |action| when it has been delivered. + virtual void NetworkDelayedAction(size_t packet_size, + std::function action) = 0; +}; + +// Describes a way of generating cross traffic on some route. Used by +// NetworkEmulationManager to produce cross traffic during some period of time. +class CrossTrafficGenerator { + public: + virtual ~CrossTrafficGenerator() = default; + + // Time between Process calls. + virtual TimeDelta GetProcessInterval() const = 0; + + // Called periodically by NetworkEmulationManager. Generates traffic on the + // route. + virtual void Process(Timestamp at_time) = 0; +}; + +// Config of a cross traffic generator. Generated traffic rises and falls +// randomly. +struct RandomWalkConfig { + int random_seed = 1; + DataRate peak_rate = DataRate::KilobitsPerSec(100); + DataSize min_packet_size = DataSize::Bytes(200); + TimeDelta min_packet_interval = TimeDelta::Millis(1); + TimeDelta update_interval = TimeDelta::Millis(200); + double variance = 0.6; + double bias = -0.1; +}; + +// Config of a cross traffic generator. Generated traffic has form of periodic +// peaks alternating with periods of silence. +struct PulsedPeaksConfig { + DataRate peak_rate = DataRate::KilobitsPerSec(100); + DataSize min_packet_size = DataSize::Bytes(200); + TimeDelta min_packet_interval = TimeDelta::Millis(1); + TimeDelta send_duration = TimeDelta::Millis(100); + TimeDelta hold_duration = TimeDelta::Millis(2000); +}; + +struct FakeTcpConfig { + DataSize packet_size = DataSize::Bytes(1200); + DataSize send_limit = DataSize::PlusInfinity(); + TimeDelta process_interval = TimeDelta::Millis(200); + TimeDelta packet_timeout = TimeDelta::Seconds(1); +}; + +} // namespace webrtc + +#endif // API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/network_emulation_interfaces.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/network_emulation_interfaces.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation/network_emulation_interfaces.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation/network_emulation_interfaces.h 2021-06-27 05:27:48.000000000 +0000 @@ -222,10 +222,23 @@ // |desired_port| != 0 and is free or will be the one, selected by endpoint) // or absl::nullopt if desired_port in used. Also fails if there are no more // free ports to bind to. + // + // The Bind- and Unbind-methods must not be called from within a bound + // receiver's OnPacketReceived method. virtual absl::optional BindReceiver( uint16_t desired_port, EmulatedNetworkReceiverInterface* receiver) = 0; + // Unbinds receiver from the specified port. Do nothing if no receiver was + // bound before. After this method returns, no more packets can be delivered + // to the receiver, and it is safe to destroy it. virtual void UnbindReceiver(uint16_t port) = 0; + // Binds receiver that will accept all packets which arrived on any port + // for which there are no bound receiver. + virtual void BindDefaultReceiver( + EmulatedNetworkReceiverInterface* receiver) = 0; + // Unbinds default receiver. Do nothing if no default receiver was bound + // before. + virtual void UnbindDefaultReceiver() = 0; virtual rtc::IPAddress GetPeerLocalAddress() const = 0; private: diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation_manager.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation_manager.cc --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation_manager.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation_manager.cc 2021-06-27 05:27:48.000000000 +0000 @@ -56,18 +56,20 @@ } NetworkEmulationManager::SimulatedNetworkNode -NetworkEmulationManager::SimulatedNetworkNode::Builder::Build() const { +NetworkEmulationManager::SimulatedNetworkNode::Builder::Build( + uint64_t random_seed) const { RTC_CHECK(net_); - return Build(net_); + return Build(net_, random_seed); } NetworkEmulationManager::SimulatedNetworkNode NetworkEmulationManager::SimulatedNetworkNode::Builder::Build( - NetworkEmulationManager* net) const { + NetworkEmulationManager* net, + uint64_t random_seed) const { RTC_CHECK(net); RTC_CHECK(net_ == nullptr || net_ == net); SimulatedNetworkNode res; - auto behavior = std::make_unique(config_); + auto behavior = std::make_unique(config_, random_seed); res.simulation = behavior.get(); res.node = net->CreateEmulatedNode(std::move(behavior)); return res; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation_manager.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation_manager.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/network_emulation_manager.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/network_emulation_manager.h 2021-06-27 05:27:48.000000000 +0000 @@ -17,6 +17,7 @@ #include #include "api/array_view.h" +#include "api/test/network_emulation/cross_traffic.h" #include "api/test/network_emulation/network_emulation_interfaces.h" #include "api/test/simulated_network.h" #include "api/test/time_controller.h" @@ -55,6 +56,8 @@ kDebug }; + // If specified will be used to name endpoint for logging purposes. + absl::optional name = absl::nullopt; IpAddressFamily generated_ip_family = IpAddressFamily::kIpv4; // If specified will be used as IP address for endpoint node. Must be unique // among all created nodes. @@ -65,6 +68,14 @@ // Network type which will be used to represent endpoint to WebRTC. rtc::AdapterType type = rtc::AdapterType::ADAPTER_TYPE_UNKNOWN; StatsGatheringMode stats_gathering_mode = StatsGatheringMode::kDefault; + // Allow endpoint to send packets specifying source IP address different to + // the current endpoint IP address. If false endpoint will crash if attempt + // to send such packet will be done. + bool allow_send_packet_with_different_source_ip = false; + // Allow endpoint to receive packet with destination IP address different to + // the current endpoint IP address. If false endpoint will crash if such + // packet will arrive. + bool allow_receive_packets_with_different_dest_ip = false; }; struct EmulatedTURNServerConfig { @@ -152,8 +163,9 @@ Builder& capacity_Mbps(int link_capacity_Mbps); Builder& loss(double loss_rate); Builder& packet_queue_length(int max_queue_length_in_packets); - SimulatedNetworkNode Build() const; - SimulatedNetworkNode Build(NetworkEmulationManager* net) const; + SimulatedNetworkNode Build(uint64_t random_seed = 1) const; + SimulatedNetworkNode Build(NetworkEmulationManager* net, + uint64_t random_seed = 1) const; private: NetworkEmulationManager* const net_; @@ -163,11 +175,19 @@ virtual ~NetworkEmulationManager() = default; virtual TimeController* time_controller() = 0; + // Returns a mode in which underlying time controller operates. + virtual TimeMode time_mode() const = 0; // Creates an emulated network node, which represents single network in - // the emulated network layer. + // the emulated network layer. Uses default implementation on network behavior + // which can be configured with |config|. |random_seed| can be provided to + // alter randomization behavior. virtual EmulatedNetworkNode* CreateEmulatedNode( - BuiltInNetworkBehaviorConfig config) = 0; + BuiltInNetworkBehaviorConfig config, + uint64_t random_seed = 1) = 0; + // Creates an emulated network node, which represents single network in + // the emulated network layer. |network_behavior| determines how created node + // will forward incoming packets to the next receiver. virtual EmulatedNetworkNode* CreateEmulatedNode( std::unique_ptr network_behavior) = 0; @@ -214,9 +234,39 @@ virtual EmulatedRoute* CreateRoute( const std::vector& via_nodes) = 0; + // Creates a default route between endpoints going through specified network + // nodes. Default route is used for packet when there is no known route for + // packet's destination IP. + // + // This route is single direction only and describe how traffic that was + // sent by network interface |from| have to be delivered in case if routing + // was unspecified. Return object can be used to remove created route. The + // route must contains at least one network node inside it. + // + // Assume that E{0-9} are endpoints and N{0-9} are network nodes, then + // creation of the route have to follow these rules: + // 1. A route consists of a source endpoint, an ordered list of one or + // more network nodes, and a destination endpoint. + // 2. If (E1, ..., E2) is a route, then E1 != E2. + // In other words, the source and the destination may not be the same. + // 3. Given two simultaneously existing routes (E1, ..., E2) and + // (E3, ..., E4), either E1 != E3 or E2 != E4. + // In other words, there may be at most one route from any given source + // endpoint to any given destination endpoint. + // 4. Given two simultaneously existing routes (E1, ..., N1, ..., E2) + // and (E3, ..., N2, ..., E4), either N1 != N2 or E2 != E4. + // In other words, a network node may not belong to two routes that lead + // to the same destination endpoint. + // 5. Any node N can belong to only one default route. + virtual EmulatedRoute* CreateDefaultRoute( + EmulatedEndpoint* from, + const std::vector& via_nodes, + EmulatedEndpoint* to) = 0; + // Removes route previously created by CreateRoute(...). // Caller mustn't call this function with route, that have been already - // removed earlier. + // removed earlier. Removing a route that is currently in use will lead to + // packets being dropped. virtual void ClearRoute(EmulatedRoute* route) = 0; // Creates a simulated TCP connection using |send_route| for traffic and @@ -226,6 +276,20 @@ virtual TcpMessageRoute* CreateTcpRoute(EmulatedRoute* send_route, EmulatedRoute* ret_route) = 0; + // Creates a route over the given |via_nodes|. Returns an object that can be + // used to emulate network load with cross traffic over the created route. + virtual CrossTrafficRoute* CreateCrossTrafficRoute( + const std::vector& via_nodes) = 0; + + // Starts generating cross traffic using given |generator|. Takes ownership + // over the generator. + virtual CrossTrafficGenerator* StartCrossTraffic( + std::unique_ptr generator) = 0; + + // Stops generating cross traffic that was started using given |generator|. + // The |generator| shouldn't be used after and the reference may be invalid. + virtual void StopCrossTraffic(CrossTrafficGenerator* generator) = 0; + // Creates EmulatedNetworkManagerInterface which can be used then to inject // network emulation layer into PeerConnection. |endpoints| - are available // network interfaces for PeerConnection. If endpoint is enabled, it will be @@ -239,7 +303,7 @@ // |stats_callback|. Callback will be executed on network emulation // internal task queue. virtual void GetStats( - rtc::ArrayView endpoints, + rtc::ArrayView endpoints, std::function)> stats_callback) = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/peerconnection_quality_test_fixture.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/peerconnection_quality_test_fixture.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/peerconnection_quality_test_fixture.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/peerconnection_quality_test_fixture.h 2021-06-27 05:27:48.000000000 +0000 @@ -220,11 +220,19 @@ // was captured during the test for this video stream on sender side. // It is useful when generator is used as input. absl::optional input_dump_file_name; + // Used only if |input_dump_file_name| is set. Specifies the module for the + // video frames to be dumped. Modulo equals X means every Xth frame will be + // written to the dump file. The value must be greater than 0. + int input_dump_sampling_modulo = 1; // If specified this file will be used as output on the receiver side for // this stream. If multiple streams will be produced by input stream, // output files will be appended with indexes. The produced files contains // what was rendered for this video stream on receiver side. absl::optional output_dump_file_name; + // Used only if |output_dump_file_name| is set. Specifies the module for the + // video frames to be dumped. Modulo equals X means every Xth frame will be + // written to the dump file. The value must be greater than 0. + int output_dump_sampling_modulo = 1; // If true will display input and output video on the user's screen. bool show_on_screen = false; // If specified, determines a sync group to which this video stream belongs. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/test/simulated_network.h libtgowt-0~git20210627.91d836d+dfsg/src/api/test/simulated_network.h --- libtgowt-0~git20210124.be23804+ds/src/api/test/simulated_network.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/test/simulated_network.h 2021-06-27 05:27:48.000000000 +0000 @@ -46,8 +46,7 @@ // for built-in network behavior that will be used by WebRTC if no custom // NetworkBehaviorInterface is provided. struct BuiltInNetworkBehaviorConfig { - BuiltInNetworkBehaviorConfig() {} - // Queue length in number of packets. + // Queue length in number of packets. size_t queue_length_packets = 0; // Delay in addition to capacity induced delay. int queue_delay_ms = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/transport/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -33,7 +33,6 @@ deps = [ ":webrtc_key_value_config", - "../../rtc_base:deprecation", "../rtc_event_log", "../units:data_rate", "../units:data_size", @@ -89,8 +88,8 @@ ":webrtc_key_value_config", "..:network_state_predictor_api", "../../modules/congestion_controller/goog_cc", - "../../rtc_base:deprecation", ] + absl_deps = [ "//third_party/abseil-cpp/absl/base:core_headers" ] } rtc_source_set("sctp_transport_factory_interface") { @@ -108,8 +107,10 @@ deps = [ "../../api:array_view", "../../rtc_base:checks", + "../../rtc_base:ip_address", "../../rtc_base:rtc_base", "../../rtc_base:rtc_base_approved", + "../../rtc_base:socket_address", ] absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } @@ -147,6 +148,7 @@ ":stun_types", "../../rtc_base", "../../rtc_base:rtc_base_approved", + "../../rtc_base:socket_address", "../../test:test_support", "//testing/gtest", ] diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/goog_cc_factory.h libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/goog_cc_factory.h --- libtgowt-0~git20210124.be23804+ds/src/api/transport/goog_cc_factory.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/goog_cc_factory.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,9 +12,9 @@ #define API_TRANSPORT_GOOG_CC_FACTORY_H_ #include +#include "absl/base/attributes.h" #include "api/network_state_predictor.h" #include "api/transport/network_control.h" -#include "rtc_base/deprecation.h" namespace webrtc { class RtcEventLog; @@ -31,8 +31,8 @@ : public NetworkControllerFactoryInterface { public: GoogCcNetworkControllerFactory() = default; - explicit RTC_DEPRECATED GoogCcNetworkControllerFactory( - RtcEventLog* event_log); + ABSL_DEPRECATED("") + explicit GoogCcNetworkControllerFactory(RtcEventLog* event_log); explicit GoogCcNetworkControllerFactory( NetworkStatePredictorFactoryInterface* network_state_predictor_factory); @@ -49,7 +49,8 @@ // Deprecated, use GoogCcFactoryConfig to enable feedback only mode instead. // Factory to create packet feedback only GoogCC, this can be used for // connections providing packet receive time feedback but no other reports. -class RTC_DEPRECATED GoogCcFeedbackNetworkControllerFactory +class ABSL_DEPRECATED("use GoogCcFactoryConfig instead") + GoogCcFeedbackNetworkControllerFactory : public GoogCcNetworkControllerFactory { public: explicit GoogCcFeedbackNetworkControllerFactory(RtcEventLog* event_log); diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/network_types.h libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/network_types.h --- libtgowt-0~git20210124.be23804+ds/src/api/transport/network_types.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/network_types.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,6 @@ #include "api/units/data_size.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" -#include "rtc_base/deprecation.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/stun.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun.cc --- libtgowt-0~git20210124.be23804+ds/src/api/transport/stun.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun.cc 2021-06-27 05:27:48.000000000 +0000 @@ -246,6 +246,31 @@ GetAttribute(STUN_ATTR_UNKNOWN_ATTRIBUTES)); } +StunMessage::IntegrityStatus StunMessage::ValidateMessageIntegrity( + const std::string& password) { + password_ = password; + if (GetByteString(STUN_ATTR_MESSAGE_INTEGRITY)) { + if (ValidateMessageIntegrityOfType( + STUN_ATTR_MESSAGE_INTEGRITY, kStunMessageIntegritySize, + buffer_.c_str(), buffer_.size(), password)) { + integrity_ = IntegrityStatus::kIntegrityOk; + } else { + integrity_ = IntegrityStatus::kIntegrityBad; + } + } else if (GetByteString(STUN_ATTR_GOOG_MESSAGE_INTEGRITY_32)) { + if (ValidateMessageIntegrityOfType( + STUN_ATTR_GOOG_MESSAGE_INTEGRITY_32, kStunMessageIntegrity32Size, + buffer_.c_str(), buffer_.size(), password)) { + integrity_ = IntegrityStatus::kIntegrityOk; + } else { + integrity_ = IntegrityStatus::kIntegrityBad; + } + } else { + integrity_ = IntegrityStatus::kNoIntegrity; + } + return integrity_; +} + bool StunMessage::ValidateMessageIntegrity(const char* data, size_t size, const std::string& password) { @@ -353,11 +378,6 @@ password.size()); } -bool StunMessage::AddMessageIntegrity(const char* key, size_t keylen) { - return AddMessageIntegrityOfType(STUN_ATTR_MESSAGE_INTEGRITY, - kStunMessageIntegritySize, key, keylen); -} - bool StunMessage::AddMessageIntegrity32(absl::string_view password) { return AddMessageIntegrityOfType(STUN_ATTR_GOOG_MESSAGE_INTEGRITY_32, kStunMessageIntegrity32Size, password.data(), @@ -395,6 +415,8 @@ // Insert correct HMAC into the attribute. msg_integrity_attr->CopyBytes(hmac, attr_size); + password_.assign(key, keylen); + integrity_ = IntegrityStatus::kIntegrityOk; return true; } @@ -473,6 +495,9 @@ } bool StunMessage::Read(ByteBufferReader* buf) { + // Keep a copy of the buffer data around for later verification. + buffer_.assign(buf->Data(), buf->Length()); + if (!buf->ReadUInt16(&type_)) { return false; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/stun.h libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun.h --- libtgowt-0~git20210124.be23804+ds/src/api/transport/stun.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun.h 2021-06-27 05:27:48.000000000 +0000 @@ -16,6 +16,7 @@ #include #include + #include #include #include @@ -149,15 +150,24 @@ StunMessage(); virtual ~StunMessage(); + // The verification status of the message. This is checked on parsing, + // or set by AddMessageIntegrity. + enum class IntegrityStatus { + kNotSet, + kNoIntegrity, // Message-integrity attribute missing + kIntegrityOk, // Message-integrity checked OK + kIntegrityBad, // Message-integrity verification failed + }; + int type() const { return type_; } size_t length() const { return length_; } const std::string& transaction_id() const { return transaction_id_; } uint32_t reduced_transaction_id() const { return reduced_transaction_id_; } // Returns true if the message confirms to RFC3489 rather than - // RFC5389. The main difference between two version of the STUN + // RFC5389. The main difference between the two versions of the STUN // protocol is the presence of the magic cookie and different length - // of transaction ID. For outgoing packets version of the protocol + // of transaction ID. For outgoing packets the version of the protocol // is determined by the lengths of the transaction ID. bool IsLegacy() const; @@ -191,19 +201,27 @@ // Remote all attributes and releases them. void ClearAttributes(); - // Validates that a raw STUN message has a correct MESSAGE-INTEGRITY value. - // This can't currently be done on a StunMessage, since it is affected by - // padding data (which we discard when reading a StunMessage). - static bool ValidateMessageIntegrity(const char* data, - size_t size, - const std::string& password); - static bool ValidateMessageIntegrity32(const char* data, - size_t size, - const std::string& password); + // Validates that a STUN message has a correct MESSAGE-INTEGRITY value. + // This uses the buffered raw-format message stored by Read(). + IntegrityStatus ValidateMessageIntegrity(const std::string& password); + + // Returns the current integrity status of the message. + IntegrityStatus integrity() const { return integrity_; } + + // Shortcut for checking if integrity is verified. + bool IntegrityOk() const { + return integrity_ == IntegrityStatus::kIntegrityOk; + } + + // Returns the password attribute used to set or check the integrity. + // Can only be called after adding or checking the integrity. + std::string password() const { + RTC_DCHECK(integrity_ != IntegrityStatus::kNotSet); + return password_; + } // Adds a MESSAGE-INTEGRITY attribute that is valid for the current message. bool AddMessageIntegrity(const std::string& password); - bool AddMessageIntegrity(const char* key, size_t keylen); // Adds a STUN_ATTR_GOOG_MESSAGE_INTEGRITY_32 attribute that is valid for the // current message. @@ -244,6 +262,30 @@ bool EqualAttributes(const StunMessage* other, std::function attribute_type_mask) const; + // Expose raw-buffer ValidateMessageIntegrity function for testing. + static bool ValidateMessageIntegrityForTesting(const char* data, + size_t size, + const std::string& password) { + return ValidateMessageIntegrity(data, size, password); + } + // Expose raw-buffer ValidateMessageIntegrity function for testing. + static bool ValidateMessageIntegrity32ForTesting( + const char* data, + size_t size, + const std::string& password) { + return ValidateMessageIntegrity32(data, size, password); + } + // Validates that a STUN message in byte buffer form + // has a correct MESSAGE-INTEGRITY value. + // These functions are not recommended and will be deprecated; use + // ValidateMessageIntegrity(password) on the parsed form instead. + static bool ValidateMessageIntegrity(const char* data, + size_t size, + const std::string& password); + static bool ValidateMessageIntegrity32(const char* data, + size_t size, + const std::string& password); + protected: // Verifies that the given attribute is allowed for this message. virtual StunAttributeValueType GetAttributeValueType(int type) const; @@ -269,6 +311,10 @@ std::string transaction_id_; uint32_t reduced_transaction_id_; uint32_t stun_magic_cookie_; + // The original buffer for messages created by Read(). + std::string buffer_; + IntegrityStatus integrity_ = IntegrityStatus::kNotSet; + std::string password_; }; // Base class for all STUN/TURN attributes. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/transport/stun_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/transport/stun_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/transport/stun_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -1196,24 +1196,24 @@ // Check our STUN message validation code against the RFC5769 test messages. TEST_F(StunTest, ValidateMessageIntegrity) { // Try the messages from RFC 5769. - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleRequest), sizeof(kRfc5769SampleRequest), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleRequest), sizeof(kRfc5769SampleRequest), "InvalidPassword")); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleResponse), sizeof(kRfc5769SampleResponse), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleResponse), sizeof(kRfc5769SampleResponse), "InvalidPassword")); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleResponseIPv6), sizeof(kRfc5769SampleResponseIPv6), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleResponseIPv6), sizeof(kRfc5769SampleResponseIPv6), "InvalidPassword")); @@ -1222,40 +1222,40 @@ ComputeStunCredentialHash(kRfc5769SampleMsgWithAuthUsername, kRfc5769SampleMsgWithAuthRealm, kRfc5769SampleMsgWithAuthPassword, &key); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleRequestLongTermAuth), sizeof(kRfc5769SampleRequestLongTermAuth), key)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kRfc5769SampleRequestLongTermAuth), sizeof(kRfc5769SampleRequestLongTermAuth), "InvalidPassword")); // Try some edge cases. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithZeroLength), sizeof(kStunMessageWithZeroLength), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithExcessLength), sizeof(kStunMessageWithExcessLength), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithSmallLength), sizeof(kStunMessageWithSmallLength), kRfc5769SampleMsgPassword)); // Again, but with the lengths matching what is claimed in the headers. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithZeroLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithZeroLength[2]), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithExcessLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithExcessLength[2]), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithSmallLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithSmallLength[2]), kRfc5769SampleMsgPassword)); // Check that a too-short HMAC doesn't cause buffer overflow. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(kStunMessageWithBadHmacAtEnd), sizeof(kStunMessageWithBadHmacAtEnd), kRfc5769SampleMsgPassword)); @@ -1268,8 +1268,8 @@ if (i > 0) buf[i - 1] ^= 0x01; EXPECT_EQ(i >= sizeof(buf) - 8, - StunMessage::ValidateMessageIntegrity(buf, sizeof(buf), - kRfc5769SampleMsgPassword)); + StunMessage::ValidateMessageIntegrityForTesting( + buf, sizeof(buf), kRfc5769SampleMsgPassword)); } } @@ -1291,7 +1291,7 @@ rtc::ByteBufferWriter buf1; EXPECT_TRUE(msg.Write(&buf1)); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), kRfc5769SampleMsgPassword)); @@ -1309,7 +1309,7 @@ rtc::ByteBufferWriter buf3; EXPECT_TRUE(msg2.Write(&buf3)); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(buf3.Data()), buf3.Length(), kRfc5769SampleMsgPassword)); } @@ -1317,40 +1317,40 @@ // Check our STUN message validation code against the RFC5769 test messages. TEST_F(StunTest, ValidateMessageIntegrity32) { // Try the messages from RFC 5769. - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kSampleRequestMI32), sizeof(kSampleRequestMI32), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kSampleRequestMI32), sizeof(kSampleRequestMI32), "InvalidPassword")); // Try some edge cases. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithZeroLength), sizeof(kStunMessageWithZeroLength), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithExcessLength), sizeof(kStunMessageWithExcessLength), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithSmallLength), sizeof(kStunMessageWithSmallLength), kRfc5769SampleMsgPassword)); // Again, but with the lengths matching what is claimed in the headers. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithZeroLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithZeroLength[2]), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithExcessLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithExcessLength[2]), kRfc5769SampleMsgPassword)); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithSmallLength), kStunHeaderSize + rtc::GetBE16(&kStunMessageWithSmallLength[2]), kRfc5769SampleMsgPassword)); // Check that a too-short HMAC doesn't cause buffer overflow. - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(kStunMessageWithBadHmacAtEnd), sizeof(kStunMessageWithBadHmacAtEnd), kRfc5769SampleMsgPassword)); @@ -1363,7 +1363,7 @@ if (i > 0) buf[i - 1] ^= 0x01; EXPECT_EQ(i >= sizeof(buf) - 8, - StunMessage::ValidateMessageIntegrity32( + StunMessage::ValidateMessageIntegrity32ForTesting( buf, sizeof(buf), kRfc5769SampleMsgPassword)); } } @@ -1384,7 +1384,7 @@ rtc::ByteBufferWriter buf1; EXPECT_TRUE(msg.Write(&buf1)); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), kRfc5769SampleMsgPassword)); @@ -1402,7 +1402,7 @@ rtc::ByteBufferWriter buf3; EXPECT_TRUE(msg2.Write(&buf3)); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(buf3.Data()), buf3.Length(), kRfc5769SampleMsgPassword)); } @@ -1420,14 +1420,14 @@ rtc::ByteBufferWriter buf1; EXPECT_TRUE(msg.Write(&buf1)); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), "password1")); - EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( + EXPECT_TRUE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), "password2")); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrity32ForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), "password2")); - EXPECT_FALSE(StunMessage::ValidateMessageIntegrity( + EXPECT_FALSE(StunMessage::ValidateMessageIntegrityForTesting( reinterpret_cast(buf1.Data()), buf1.Length(), "password1")); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/uma_metrics.h libtgowt-0~git20210627.91d836d+dfsg/src/api/uma_metrics.h --- libtgowt-0~git20210124.be23804+ds/src/api/uma_metrics.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/uma_metrics.h 2021-06-27 05:27:48.000000000 +0000 @@ -167,6 +167,41 @@ kSimulcastApiVersionMax }; +// Metrics for reporting usage of BUNDLE. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum BundleUsage { + // There are no m-lines in the SDP, only a session description. + kBundleUsageEmpty = 0, + // Only a data channel is negotiated but BUNDLE is not negotiated. + kBundleUsageNoBundleDatachannelOnly = 1, + // BUNDLE is not negotiated and there is at most one m-line per media type, + kBundleUsageNoBundleSimple = 2, + // BUNDLE is not negotiated and there are multiple m-lines per media type, + kBundleUsageNoBundleComplex = 3, + // Only a data channel is negotiated and BUNDLE is negotiated. + kBundleUsageBundleDatachannelOnly = 4, + // BUNDLE is negotiated but there is at most one m-line per media type, + kBundleUsageBundleSimple = 5, + // BUNDLE is negotiated and there are multiple m-lines per media type, + kBundleUsageBundleComplex = 6, + // Legacy plan-b metrics. + kBundleUsageNoBundlePlanB = 7, + kBundleUsageBundlePlanB = 8, + kBundleUsageMax +}; + +// Metrics for reporting configured BUNDLE policy, mapping directly to +// https://w3c.github.io/webrtc-pc/#rtcbundlepolicy-enum +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum BundlePolicyUsage { + kBundlePolicyUsageBalanced = 0, + kBundlePolicyUsageMaxBundle = 1, + kBundlePolicyUsageMaxCompat = 2, + kBundlePolicyUsageMax +}; + // When adding new metrics please consider using the style described in // https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#usage // instead of the legacy enums used above. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/video/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/video/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -43,6 +43,8 @@ sources = [ "i420_buffer.cc", "i420_buffer.h", + "nv12_buffer.cc", + "nv12_buffer.h", "video_codec_type.h", "video_frame.cc", "video_frame.h", @@ -90,23 +92,6 @@ ] } -rtc_library("video_frame_nv12") { - visibility = [ "*" ] - sources = [ - "nv12_buffer.cc", - "nv12_buffer.h", - ] - deps = [ - ":video_frame", - "..:scoped_refptr", - "../../rtc_base", - "../../rtc_base:checks", - "../../rtc_base/memory:aligned_malloc", - "../../rtc_base/system:rtc_export", - "//third_party/libyuv", - ] -} - rtc_source_set("recordable_encoded_frame") { visibility = [ "*" ] sources = [ "recordable_encoded_frame.h" ] @@ -142,7 +127,6 @@ "..:rtp_packet_info", "..:scoped_refptr", "../../rtc_base:checks", - "../../rtc_base:deprecation", "../../rtc_base:rtc_base_approved", "../../rtc_base/system:rtc_export", ] @@ -299,24 +283,6 @@ ] } -rtc_library("video_stream_encoder_create") { - visibility = [ "*" ] - sources = [ - "video_stream_encoder_create.cc", - "video_stream_encoder_create.h", - ] - - deps = [ - ":video_frame", - ":video_stream_encoder", - "../../api:scoped_refptr", - "../../video:video_stream_encoder_impl", - "../../video/adaptation:video_adaptation", - "../task_queue", - "../video_codecs:video_codecs_api", - ] -} - rtc_library("builtin_video_bitrate_allocator_factory") { visibility = [ "*" ] sources = [ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_frame.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_frame.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_frame.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_frame.cc 2021-06-27 05:27:48.000000000 +0000 @@ -11,11 +11,9 @@ #include "api/video/encoded_frame.h" namespace webrtc { -namespace video_coding { bool EncodedFrame::delayed_by_retransmission() const { return 0; } -} // namespace video_coding } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_frame.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_frame.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_frame.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_frame.h 2021-06-27 05:27:48.000000000 +0000 @@ -17,37 +17,6 @@ #include "modules/video_coding/encoded_frame.h" namespace webrtc { -namespace video_coding { - -// NOTE: This class is still under development and may change without notice. -struct VideoLayerFrameId { - // TODO(philipel): The default ctor is currently used internaly, but have a - // look if we can remove it. - VideoLayerFrameId() : picture_id(-1), spatial_layer(0) {} - VideoLayerFrameId(int64_t picture_id, uint8_t spatial_layer) - : picture_id(picture_id), spatial_layer(spatial_layer) {} - - bool operator==(const VideoLayerFrameId& rhs) const { - return picture_id == rhs.picture_id && spatial_layer == rhs.spatial_layer; - } - - bool operator!=(const VideoLayerFrameId& rhs) const { - return !(*this == rhs); - } - - bool operator<(const VideoLayerFrameId& rhs) const { - if (picture_id == rhs.picture_id) - return spatial_layer < rhs.spatial_layer; - return picture_id < rhs.picture_id; - } - - bool operator<=(const VideoLayerFrameId& rhs) const { return !(rhs < *this); } - bool operator>(const VideoLayerFrameId& rhs) const { return rhs < *this; } - bool operator>=(const VideoLayerFrameId& rhs) const { return rhs <= *this; } - - int64_t picture_id; - uint8_t spatial_layer; -}; // TODO(philipel): Remove webrtc::VCMEncodedFrame inheritance. // TODO(philipel): Move transport specific info out of EncodedFrame. @@ -73,7 +42,8 @@ bool is_keyframe() const { return num_references == 0; } - VideoLayerFrameId id; + void SetId(int64_t id) { id_ = id; } + int64_t Id() const { return id_; } // TODO(philipel): Add simple modify/access functions to prevent adding too // many |references|. @@ -82,9 +52,13 @@ // Is this subframe the last one in the superframe (In RTP stream that would // mean that the last packet has a marker bit set). bool is_last_spatial_layer = true; + + private: + // The ID of the frame is determined from RTP level information. The IDs are + // used to describe order and dependencies between frames. + int64_t id_ = -1; }; -} // namespace video_coding } // namespace webrtc #endif // API_VIDEO_ENCODED_FRAME_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_image.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_image.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_image.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_image.cc 2021-06-27 05:27:48.000000000 +0000 @@ -66,21 +66,11 @@ EncodedImage::EncodedImage(EncodedImage&&) = default; EncodedImage::EncodedImage(const EncodedImage&) = default; -EncodedImage::EncodedImage(uint8_t* buffer, size_t size, size_t capacity) - : size_(size), buffer_(buffer), capacity_(capacity) {} - EncodedImage::~EncodedImage() = default; EncodedImage& EncodedImage::operator=(EncodedImage&&) = default; EncodedImage& EncodedImage::operator=(const EncodedImage&) = default; -void EncodedImage::Retain() { - if (buffer_) { - encoded_data_ = EncodedImageBuffer::Create(buffer_, size_); - buffer_ = nullptr; - } -} - void EncodedImage::SetEncodeTime(int64_t encode_start_ms, int64_t encode_finish_ms) { timing_.encode_start_ms = encode_start_ms; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_image.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_image.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/encoded_image.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/encoded_image.h 2021-06-27 05:27:48.000000000 +0000 @@ -26,7 +26,6 @@ #include "api/video/video_rotation.h" #include "api/video/video_timing.h" #include "rtc_base/checks.h" -#include "rtc_base/deprecation.h" #include "rtc_base/ref_count.h" #include "rtc_base/system/rtc_export.h" @@ -73,12 +72,10 @@ EncodedImage(); EncodedImage(EncodedImage&&); EncodedImage(const EncodedImage&); - RTC_DEPRECATED EncodedImage(uint8_t* buffer, size_t length, size_t capacity); ~EncodedImage(); EncodedImage& operator=(EncodedImage&&); - // Discouraged: potentially expensive. EncodedImage& operator=(const EncodedImage&); // TODO(nisse): Change style to timestamp(), set_timestamp(), for consistency @@ -112,6 +109,15 @@ color_space_ = color_space; } + // These methods along with the private member video_frame_tracking_id_ are + // meant for media quality testing purpose only. + absl::optional VideoFrameTrackingId() const { + return video_frame_tracking_id_; + } + void SetVideoFrameTrackingId(absl::optional tracking_id) { + video_frame_tracking_id_ = tracking_id; + } + const RtpPacketInfos& PacketInfos() const { return packet_infos_; } void SetPacketInfos(RtpPacketInfos packet_infos) { packet_infos_ = std::move(packet_infos); @@ -128,34 +134,26 @@ RTC_DCHECK_LE(new_size, new_size == 0 ? 0 : capacity()); size_ = new_size; } + void SetEncodedData( rtc::scoped_refptr encoded_data) { encoded_data_ = encoded_data; size_ = encoded_data->size(); - buffer_ = nullptr; } void ClearEncodedData() { encoded_data_ = nullptr; size_ = 0; - buffer_ = nullptr; - capacity_ = 0; } rtc::scoped_refptr GetEncodedData() const { - RTC_DCHECK(buffer_ == nullptr); return encoded_data_; } const uint8_t* data() const { - return buffer_ ? buffer_ - : (encoded_data_ ? encoded_data_->data() : nullptr); + return encoded_data_ ? encoded_data_->data() : nullptr; } - // Hack to workaround lack of ownership of the encoded data. If we don't - // already own the underlying data, make an owned copy. - void Retain(); - uint32_t _encodedWidth = 0; uint32_t _encodedHeight = 0; // NTP time of the capture time in local timebase in milliseconds. @@ -185,22 +183,17 @@ } timing_; private: - size_t capacity() const { - return buffer_ ? capacity_ : (encoded_data_ ? encoded_data_->size() : 0); - } + size_t capacity() const { return encoded_data_ ? encoded_data_->size() : 0; } - // TODO(bugs.webrtc.org/9378): We're transitioning to always owning the - // encoded data. rtc::scoped_refptr encoded_data_; size_t size_ = 0; // Size of encoded frame data. - // Non-null when used with an un-owned buffer. - uint8_t* buffer_ = nullptr; - // Allocated size of _buffer; relevant only if it's non-null. - size_t capacity_ = 0; uint32_t timestamp_rtp_ = 0; absl::optional spatial_index_; std::map spatial_layer_frame_size_bytes_; absl::optional color_space_; + // This field is meant for media quality testing purpose only. When enabled it + // carries the webrtc::VideoFrame id field from the sender to the receiver. + absl::optional video_frame_tracking_id_; // Information about packets used to assemble this video frame. This is needed // by |SourceTracker| when the frame is delivered to the RTCRtpReceiver's // MediaStreamTrack, in order to implement getContributingSources(). See: diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/test/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/video/test/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/video/test/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/test/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -20,7 +20,6 @@ "..:video_adaptation", "..:video_bitrate_allocation", "..:video_frame", - "..:video_frame_nv12", "..:video_rtp_headers", "../../../test:frame_utils", "../../../test:test_support", diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame.h 2021-06-27 05:27:48.000000000 +0000 @@ -134,11 +134,11 @@ // Get frame size in pixels. uint32_t size() const; - // Get frame ID. Returns 0 if ID is not set. Not guarantee to be transferred - // from the sender to the receiver, but preserved on single side. The id + // Get frame ID. Returns 0 if ID is not set. Not guaranteed to be transferred + // from the sender to the receiver, but preserved on the sender side. The id // should be propagated between all frame modifications during its lifetime // from capturing to sending as encoded image. It is intended to be unique - // over a time window of a few minutes for peer connection, to which + // over a time window of a few minutes for the peer connection to which the // corresponding video stream belongs to. uint16_t id() const { return id_; } void set_id(uint16_t id) { id_ = id; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame_buffer.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame_buffer.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame_buffer.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame_buffer.cc 2021-06-27 05:27:48.000000000 +0000 @@ -11,6 +11,7 @@ #include "api/video/video_frame_buffer.h" #include "api/video/i420_buffer.h" +#include "api/video/nv12_buffer.h" #include "rtc_base/checks.h" namespace webrtc { @@ -139,4 +140,18 @@ int NV12BufferInterface::ChromaHeight() const { return (height() + 1) / 2; } + +rtc::scoped_refptr NV12BufferInterface::CropAndScale( + int offset_x, + int offset_y, + int crop_width, + int crop_height, + int scaled_width, + int scaled_height) { + rtc::scoped_refptr result = + NV12Buffer::Create(scaled_width, scaled_height); + result->CropAndScaleFrom(*this, offset_x, offset_y, crop_width, crop_height); + return result; +} + } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame_buffer.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame_buffer.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_frame_buffer.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_frame_buffer.h 2021-06-27 05:27:48.000000000 +0000 @@ -242,6 +242,13 @@ int ChromaWidth() const final; int ChromaHeight() const final; + rtc::scoped_refptr CropAndScale(int offset_x, + int offset_y, + int crop_width, + int crop_height, + int scaled_width, + int scaled_height) override; + protected: ~NV12BufferInterface() override {} }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_source_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_source_interface.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_source_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_source_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,6 +12,7 @@ #define API_VIDEO_VIDEO_SOURCE_INTERFACE_H_ #include +#include #include "absl/types/optional.h" #include "api/video/video_sink_interface.h" @@ -22,6 +23,15 @@ // VideoSinkWants is used for notifying the source of properties a video frame // should have when it is delivered to a certain sink. struct RTC_EXPORT VideoSinkWants { + struct FrameSize { + FrameSize(int width, int height) : width(width), height(height) {} + FrameSize(const FrameSize&) = default; + ~FrameSize() = default; + + int width; + int height; + }; + VideoSinkWants(); VideoSinkWants(const VideoSinkWants&); ~VideoSinkWants(); @@ -49,8 +59,34 @@ // Note that this field is unrelated to any horizontal or vertical stride // requirements the encoder has on the incoming video frame buffers. int resolution_alignment = 1; + + // The resolutions that sink is configured to consume. If the sink is an + // encoder this is what the encoder is configured to encode. In singlecast we + // only encode one resolution, but in simulcast and SVC this can mean multiple + // resolutions per frame. + // + // The sink is always configured to consume a subset of the + // webrtc::VideoFrame's resolution. In the case of encoding, we usually encode + // at webrtc::VideoFrame's resolution but this may not always be the case due + // to scaleResolutionDownBy or turning off simulcast or SVC layers. + // + // For example, we may capture at 720p and due to adaptation (e.g. applying + // |max_pixel_count| constraints) create webrtc::VideoFrames of size 480p, but + // if we do scaleResolutionDownBy:2 then the only resolution we end up + // encoding is 240p. In this case we still need to provide webrtc::VideoFrames + // of size 480p but we can optimize internal buffers for 240p, avoiding + // downsampling to 480p if possible. + // + // Note that the |resolutions| can change while frames are in flight and + // should only be used as a hint when constructing the webrtc::VideoFrame. + std::vector resolutions; }; +inline bool operator==(const VideoSinkWants::FrameSize& a, + const VideoSinkWants::FrameSize& b) { + return a.width == b.width && a.height == b.height; +} + template class VideoSourceInterface { public: diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_decoder.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_decoder.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_decoder.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_decoder.h 2021-06-27 05:27:48.000000000 +0000 @@ -38,9 +38,7 @@ // Called when the VideoStreamDecoder enters a non-decodable state. virtual void OnNonDecodableState() = 0; - // Called with the last continuous frame. - virtual void OnContinuousUntil( - const video_coding::VideoLayerFrameId& key) = 0; + virtual void OnContinuousUntil(int64_t frame_id) {} virtual void OnDecodedFrame(VideoFrame frame, const FrameInfo& frame_info) = 0; @@ -48,7 +46,7 @@ virtual ~VideoStreamDecoderInterface() = default; - virtual void OnFrame(std::unique_ptr frame) = 0; + virtual void OnFrame(std::unique_ptr frame) = 0; virtual void SetMinPlayoutDelay(TimeDelta min_delay) = 0; virtual void SetMaxPlayoutDelay(TimeDelta max_delay) = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_decoder_create_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_decoder_create_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_decoder_create_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_decoder_create_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -21,7 +21,6 @@ public: ~NullCallbacks() override = default; void OnNonDecodableState() override {} - void OnContinuousUntil(const video_coding::VideoLayerFrameId& key) override {} void OnDecodedFrame(VideoFrame frame, const VideoStreamDecoderInterface::Callbacks::FrameInfo& frame_info) override {} diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_create.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_create.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_create.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_create.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "api/video/video_stream_encoder_create.h" - -#include - -#include "video/adaptation/overuse_frame_detector.h" -#include "video/video_stream_encoder.h" - -namespace webrtc { - -std::unique_ptr CreateVideoStreamEncoder( - Clock* clock, - TaskQueueFactory* task_queue_factory, - uint32_t number_of_cores, - VideoStreamEncoderObserver* encoder_stats_observer, - const VideoStreamEncoderSettings& settings) { - return std::make_unique( - clock, number_of_cores, encoder_stats_observer, settings, - std::make_unique(encoder_stats_observer), - task_queue_factory); -} - -} // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_create.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_create.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_create.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_create.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef API_VIDEO_VIDEO_STREAM_ENCODER_CREATE_H_ -#define API_VIDEO_VIDEO_STREAM_ENCODER_CREATE_H_ - -#include - -#include - -#include "api/task_queue/task_queue_factory.h" -#include "api/video/video_frame.h" -#include "api/video/video_sink_interface.h" -#include "api/video/video_stream_encoder_interface.h" -#include "api/video/video_stream_encoder_observer.h" -#include "api/video/video_stream_encoder_settings.h" - -namespace webrtc { -// TODO(srte): Find a way to avoid this forward declaration. -class Clock; - -std::unique_ptr CreateVideoStreamEncoder( - Clock* clock, - TaskQueueFactory* task_queue_factory, - uint32_t number_of_cores, - VideoStreamEncoderObserver* encoder_stats_observer, - const VideoStreamEncoderSettings& settings); -} // namespace webrtc - -#endif // API_VIDEO_VIDEO_STREAM_ENCODER_CREATE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_settings.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_settings.h --- libtgowt-0~git20210124.be23804+ds/src/api/video/video_stream_encoder_settings.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video/video_stream_encoder_settings.h 2021-06-27 05:27:48.000000000 +0000 @@ -39,12 +39,6 @@ }; struct VideoStreamEncoderSettings { - enum class BitrateAllocationCallbackType { - kVideoBitrateAllocation, - kVideoBitrateAllocationWhenScreenSharing, - kVideoLayersAllocation - }; - explicit VideoStreamEncoderSettings( const VideoEncoder::Capabilities& capabilities) : capabilities(capabilities) {} @@ -65,11 +59,6 @@ // Negotiated capabilities which the VideoEncoder may expect the other // side to use. VideoEncoder::Capabilities capabilities; - - // TODO(bugs.webrtc.org/12000): Reporting of VideoBitrateAllocation is beeing - // deprecated. Instead VideoLayersAllocation should be reported. - BitrateAllocationCallbackType allocation_cb_type = - BitrateAllocationCallbackType::kVideoBitrateAllocationWhenScreenSharing; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -613,13 +613,13 @@ EncodeFrameAndVerifyLastName("libvpx"); // Re-initialize encoder with invalid setting, expect no fallback. - codec_.VP8()->numberOfTemporalLayers = 2; + codec_.numberOfSimulcastStreams = 2; InitEncode(kWidth, kHeight); EXPECT_EQ(1, fake_encoder_->init_encode_count_); EncodeFrameAndVerifyLastName("fake-encoder"); // Re-initialize encoder with valid setting. - codec_.VP8()->numberOfTemporalLayers = 1; + codec_.numberOfSimulcastStreams = 1; InitEncode(kWidth, kHeight); EXPECT_EQ(1, fake_encoder_->init_encode_count_); EncodeFrameAndVerifyLastName("libvpx"); diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder.cc 2021-06-27 05:27:48.000000000 +0000 @@ -10,6 +10,8 @@ #include "api/video_codecs/video_decoder.h" +#include "rtc_base/strings/string_builder.h" + namespace webrtc { int32_t DecodedImageCallback::Decoded(VideoFrame& decodedImage, @@ -24,12 +26,31 @@ Decoded(decodedImage, decode_time_ms.value_or(-1)); } -bool VideoDecoder::PrefersLateDecoding() const { - return true; +VideoDecoder::DecoderInfo VideoDecoder::GetDecoderInfo() const { + DecoderInfo info; + info.implementation_name = ImplementationName(); + return info; } const char* VideoDecoder::ImplementationName() const { return "unknown"; } +std::string VideoDecoder::DecoderInfo::ToString() const { + char string_buf[2048]; + rtc::SimpleStringBuilder oss(string_buf); + + oss << "DecoderInfo { " + << "prefers_late_decoding = " + << "implementation_name = '" << implementation_name << "', " + << "is_hardware_accelerated = " + << (is_hardware_accelerated ? "true" : "false") << " }"; + return oss.str(); +} + +bool VideoDecoder::DecoderInfo::operator==(const DecoderInfo& rhs) const { + return is_hardware_accelerated == rhs.is_hardware_accelerated && + implementation_name == rhs.implementation_name; +} + } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder.h --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder.h 2021-06-27 05:27:48.000000000 +0000 @@ -42,6 +42,18 @@ class RTC_EXPORT VideoDecoder { public: + struct DecoderInfo { + // Descriptive name of the decoder implementation. + std::string implementation_name; + + // True if the decoder is backed by hardware acceleration. + bool is_hardware_accelerated = false; + + std::string ToString() const; + bool operator==(const DecoderInfo& rhs) const; + bool operator!=(const DecoderInfo& rhs) const { return !(*this == rhs); } + }; + virtual ~VideoDecoder() {} virtual int32_t InitDecode(const VideoCodec* codec_settings, @@ -56,11 +68,9 @@ virtual int32_t Release() = 0; - // Returns true if the decoder prefer to decode frames late. - // That is, it can not decode infinite number of frames before the decoded - // frame is consumed. - virtual bool PrefersLateDecoding() const; + virtual DecoderInfo GetDecoderInfo() const; + // Deprecated, use GetDecoderInfo().implementation_name instead. virtual const char* ImplementationName() const; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder_software_fallback_wrapper.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder_software_fallback_wrapper.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_decoder_software_fallback_wrapper.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_decoder_software_fallback_wrapper.cc 2021-06-27 05:27:48.000000000 +0000 @@ -50,8 +50,8 @@ DecodedImageCallback* callback) override; int32_t Release() override; - bool PrefersLateDecoding() const override; + DecoderInfo GetDecoderInfo() const override; const char* ImplementationName() const override; private: @@ -268,14 +268,23 @@ return status; } -bool VideoDecoderSoftwareFallbackWrapper::PrefersLateDecoding() const { - return active_decoder().PrefersLateDecoding(); +VideoDecoder::DecoderInfo VideoDecoderSoftwareFallbackWrapper::GetDecoderInfo() + const { + DecoderInfo info = active_decoder().GetDecoderInfo(); + if (decoder_type_ == DecoderType::kFallback) { + // Cached "A (fallback from B)" string. + info.implementation_name = fallback_implementation_name_; + } + return info; } const char* VideoDecoderSoftwareFallbackWrapper::ImplementationName() const { - return decoder_type_ == DecoderType::kFallback - ? fallback_implementation_name_.c_str() - : hw_decoder_->ImplementationName(); + if (decoder_type_ == DecoderType::kFallback) { + // Cached "A (fallback from B)" string. + return fallback_implementation_name_.c_str(); + } else { + return hw_decoder_->ImplementationName(); + } } VideoDecoder& VideoDecoderSoftwareFallbackWrapper::active_decoder() const { diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder.h --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder.h 2021-06-27 05:27:48.000000000 +0000 @@ -367,7 +367,7 @@ // TODO(bugs.webrtc.org/10720): After updating downstream projects and posting // an announcement to discuss-webrtc, remove the three-parameters variant // and make the two-parameters variant pure-virtual. - /* RTC_DEPRECATED */ virtual int32_t InitEncode( + /* ABSL_DEPRECATED("bugs.webrtc.org/10720") */ virtual int32_t InitEncode( const VideoCodec* codec_settings, int32_t number_of_cores, size_t max_payload_size); diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_config.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -57,7 +57,8 @@ max_bitrate_bps(0), bitrate_priority(1.0), number_of_streams(0), - legacy_conference_mode(false) {} + legacy_conference_mode(false), + is_quality_scaling_allowed(false) {} VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default; diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_config.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_config.h --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -194,6 +194,9 @@ // Legacy Google conference mode flag for simulcast screenshare bool legacy_conference_mode; + // Indicates whether quality scaling can be used or not. + bool is_quality_scaling_allowed; + private: // Access to the copy constructor is private to force use of the Copy() // method for those exceptional cases where we do use it. diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_software_fallback_wrapper.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_software_fallback_wrapper.cc --- libtgowt-0~git20210124.be23804+ds/src/api/video_codecs/video_encoder_software_fallback_wrapper.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_codecs/video_encoder_software_fallback_wrapper.cc 2021-06-27 05:27:48.000000000 +0000 @@ -50,7 +50,6 @@ return enable_resolution_based_switch && codec.codecType == kVideoCodecVP8 && codec.numberOfSimulcastStreams <= 1 && - codec.VP8().numberOfTemporalLayers == 1 && codec.width * codec.height <= max_pixels; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/video_track_source_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/api/video_track_source_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/api/video_track_source_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/video_track_source_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,27 +21,27 @@ // TODO(deadbeef): Move this to .cc file and out of api/. What threads methods // are called on is an implementation detail. BEGIN_PROXY_MAP(VideoTrackSource) -PROXY_SIGNALING_THREAD_DESTRUCTOR() +PROXY_PRIMARY_THREAD_DESTRUCTOR() PROXY_CONSTMETHOD0(SourceState, state) BYPASS_PROXY_CONSTMETHOD0(bool, remote) BYPASS_PROXY_CONSTMETHOD0(bool, is_screencast) PROXY_CONSTMETHOD0(absl::optional, needs_denoising) PROXY_METHOD1(bool, GetStats, Stats*) -PROXY_WORKER_METHOD2(void, - AddOrUpdateSink, - rtc::VideoSinkInterface*, - const rtc::VideoSinkWants&) -PROXY_WORKER_METHOD1(void, RemoveSink, rtc::VideoSinkInterface*) +PROXY_SECONDARY_METHOD2(void, + AddOrUpdateSink, + rtc::VideoSinkInterface*, + const rtc::VideoSinkWants&) +PROXY_SECONDARY_METHOD1(void, RemoveSink, rtc::VideoSinkInterface*) PROXY_METHOD1(void, RegisterObserver, ObserverInterface*) PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*) PROXY_CONSTMETHOD0(bool, SupportsEncodedOutput) -PROXY_WORKER_METHOD0(void, GenerateKeyFrame) -PROXY_WORKER_METHOD1(void, - AddEncodedSink, - rtc::VideoSinkInterface*) -PROXY_WORKER_METHOD1(void, - RemoveEncodedSink, - rtc::VideoSinkInterface*) +PROXY_SECONDARY_METHOD0(void, GenerateKeyFrame) +PROXY_SECONDARY_METHOD1(void, + AddEncodedSink, + rtc::VideoSinkInterface*) +PROXY_SECONDARY_METHOD1(void, + RemoveEncodedSink, + rtc::VideoSinkInterface*) END_PROXY_MAP() } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/api/voip/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -21,11 +21,13 @@ ] deps = [ "..:array_view", - "../../rtc_base/system:unused", "../audio_codecs:audio_codecs_api", "../neteq:neteq_api", ] - absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/types:optional", + ] } rtc_library("voip_engine_factory") { @@ -47,9 +49,21 @@ } if (rtc_include_tests) { + rtc_source_set("mock_voip_engine") { + testonly = true + visibility = [ "*" ] + sources = [ "test/mock_voip_engine.h" ] + deps = [ + ":voip_api", + "..:array_view", + "../../test:test_support", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] + } + rtc_library("voip_engine_factory_unittests") { testonly = true - sources = [ "voip_engine_factory_unittest.cc" ] + sources = [ "test/voip_engine_factory_unittest.cc" ] deps = [ ":voip_engine_factory", "../../modules/audio_device:mock_audio_device", @@ -59,4 +73,13 @@ "../task_queue:default_task_queue_factory", ] } + + rtc_library("compile_all_headers") { + testonly = true + sources = [ "test/compile_all_headers.cc" ] + deps = [ + ":mock_voip_engine", + "../../test:test_support", + ] + } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/DEPS libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/DEPS --- libtgowt-0~git20210124.be23804+ds/src/api/voip/DEPS 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/DEPS 2021-06-27 05:27:48.000000000 +0000 @@ -3,10 +3,6 @@ "+third_party/absl/types/optional.h", ], - "voip_base.h": [ - "+rtc_base/system/unused.h", - ], - "voip_engine_factory.h": [ "+modules/audio_device/include/audio_device.h", "+modules/audio_processing/include/audio_processing.h", diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/test/compile_all_headers.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/compile_all_headers.cc --- libtgowt-0~git20210124.be23804+ds/src/api/voip/test/compile_all_headers.cc 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/compile_all_headers.cc 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +// This file verifies that all include files in this directory can be +// compiled without errors or other required includes. + +#include "api/voip/test/mock_voip_engine.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/test/mock_voip_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/mock_voip_engine.h --- libtgowt-0~git20210124.be23804+ds/src/api/voip/test/mock_voip_engine.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/mock_voip_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef API_VOIP_TEST_MOCK_VOIP_ENGINE_H_ +#define API_VOIP_TEST_MOCK_VOIP_ENGINE_H_ + +#include + +#include "absl/types/optional.h" +#include "api/array_view.h" +#include "api/voip/voip_base.h" +#include "api/voip/voip_codec.h" +#include "api/voip/voip_dtmf.h" +#include "api/voip/voip_engine.h" +#include "api/voip/voip_network.h" +#include "api/voip/voip_statistics.h" +#include "api/voip/voip_volume_control.h" +#include "test/gmock.h" + +namespace webrtc { + +class MockVoipBase : public VoipBase { + public: + MOCK_METHOD(ChannelId, + CreateChannel, + (Transport*, absl::optional), + (override)); + MOCK_METHOD(VoipResult, ReleaseChannel, (ChannelId), (override)); + MOCK_METHOD(VoipResult, StartSend, (ChannelId), (override)); + MOCK_METHOD(VoipResult, StopSend, (ChannelId), (override)); + MOCK_METHOD(VoipResult, StartPlayout, (ChannelId), (override)); + MOCK_METHOD(VoipResult, StopPlayout, (ChannelId), (override)); +}; + +class MockVoipCodec : public VoipCodec { + public: + MOCK_METHOD(VoipResult, + SetSendCodec, + (ChannelId, int, const SdpAudioFormat&), + (override)); + MOCK_METHOD(VoipResult, + SetReceiveCodecs, + (ChannelId, (const std::map&)), + (override)); +}; + +class MockVoipDtmf : public VoipDtmf { + public: + MOCK_METHOD(VoipResult, + RegisterTelephoneEventType, + (ChannelId, int, int), + (override)); + MOCK_METHOD(VoipResult, + SendDtmfEvent, + (ChannelId, DtmfEvent, int), + (override)); +}; + +class MockVoipNetwork : public VoipNetwork { + public: + MOCK_METHOD(VoipResult, + ReceivedRTPPacket, + (ChannelId channel_id, rtc::ArrayView rtp_packet), + (override)); + MOCK_METHOD(VoipResult, + ReceivedRTCPPacket, + (ChannelId channel_id, rtc::ArrayView rtcp_packet), + (override)); +}; + +class MockVoipStatistics : public VoipStatistics { + public: + MOCK_METHOD(VoipResult, + GetIngressStatistics, + (ChannelId, IngressStatistics&), + (override)); + MOCK_METHOD(VoipResult, + GetChannelStatistics, + (ChannelId channel_id, ChannelStatistics&), + (override)); +}; + +class MockVoipVolumeControl : public VoipVolumeControl { + public: + MOCK_METHOD(VoipResult, SetInputMuted, (ChannelId, bool), (override)); + + MOCK_METHOD(VoipResult, + GetInputVolumeInfo, + (ChannelId, VolumeInfo&), + (override)); + MOCK_METHOD(VoipResult, + GetOutputVolumeInfo, + (ChannelId, VolumeInfo&), + (override)); +}; + +class MockVoipEngine : public VoipEngine { + public: + VoipBase& Base() override { return base_; } + VoipNetwork& Network() override { return network_; } + VoipCodec& Codec() override { return codec_; } + VoipDtmf& Dtmf() override { return dtmf_; } + VoipStatistics& Statistics() override { return statistics_; } + VoipVolumeControl& VolumeControl() override { return volume_; } + + // Direct access to underlying members are required for testing. + MockVoipBase base_; + MockVoipNetwork network_; + MockVoipCodec codec_; + MockVoipDtmf dtmf_; + MockVoipStatistics statistics_; + MockVoipVolumeControl volume_; +}; + +} // namespace webrtc + +#endif // API_VOIP_TEST_MOCK_VOIP_ENGINE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/test/voip_engine_factory_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/voip_engine_factory_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/voip/test/voip_engine_factory_unittest.cc 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/test/voip_engine_factory_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include + +#include "api/task_queue/default_task_queue_factory.h" +#include "api/voip/voip_engine_factory.h" +#include "modules/audio_device/include/mock_audio_device.h" +#include "modules/audio_processing/include/mock_audio_processing.h" +#include "test/gtest.h" +#include "test/mock_audio_decoder_factory.h" +#include "test/mock_audio_encoder_factory.h" + +namespace webrtc { +namespace { + +// Create voip engine with mock modules as normal use case. +TEST(VoipEngineFactoryTest, CreateEngineWithMockModules) { + VoipEngineConfig config; + config.encoder_factory = new rtc::RefCountedObject(); + config.decoder_factory = new rtc::RefCountedObject(); + config.task_queue_factory = CreateDefaultTaskQueueFactory(); + config.audio_processing = + new rtc::RefCountedObject>(); + config.audio_device_module = test::MockAudioDeviceModule::CreateNice(); + + auto voip_engine = CreateVoipEngine(std::move(config)); + EXPECT_NE(voip_engine, nullptr); +} + +// Create voip engine without setting audio processing as optional component. +TEST(VoipEngineFactoryTest, UseNoAudioProcessing) { + VoipEngineConfig config; + config.encoder_factory = new rtc::RefCountedObject(); + config.decoder_factory = new rtc::RefCountedObject(); + config.task_queue_factory = CreateDefaultTaskQueueFactory(); + config.audio_device_module = test::MockAudioDeviceModule::CreateNice(); + + auto voip_engine = CreateVoipEngine(std::move(config)); + EXPECT_NE(voip_engine, nullptr); +} + +} // namespace +} // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_base.h libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_base.h --- libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_base.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_base.h 2021-06-27 05:27:48.000000000 +0000 @@ -11,8 +11,8 @@ #ifndef API_VOIP_VOIP_BASE_H_ #define API_VOIP_VOIP_BASE_H_ +#include "absl/base/attributes.h" #include "absl/types/optional.h" -#include "rtc_base/system/unused.h" namespace webrtc { @@ -36,7 +36,7 @@ enum class ChannelId : int {}; -enum class RTC_WARN_UNUSED_RESULT VoipResult { +enum class ABSL_MUST_USE_RESULT VoipResult { // kOk indicates the function was successfully invoked with no error. kOk, // kInvalidArgument indicates the caller specified an invalid argument, such diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_engine_factory_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_engine_factory_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_engine_factory_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_engine_factory_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include - -#include "api/task_queue/default_task_queue_factory.h" -#include "api/voip/voip_engine_factory.h" -#include "modules/audio_device/include/mock_audio_device.h" -#include "modules/audio_processing/include/mock_audio_processing.h" -#include "test/gtest.h" -#include "test/mock_audio_decoder_factory.h" -#include "test/mock_audio_encoder_factory.h" - -namespace webrtc { -namespace { - -// Create voip engine with mock modules as normal use case. -TEST(VoipEngineFactoryTest, CreateEngineWithMockModules) { - VoipEngineConfig config; - config.encoder_factory = new rtc::RefCountedObject(); - config.decoder_factory = new rtc::RefCountedObject(); - config.task_queue_factory = CreateDefaultTaskQueueFactory(); - config.audio_processing = - new rtc::RefCountedObject>(); - config.audio_device_module = test::MockAudioDeviceModule::CreateNice(); - - auto voip_engine = CreateVoipEngine(std::move(config)); - EXPECT_NE(voip_engine, nullptr); -} - -// Create voip engine without setting audio processing as optional component. -TEST(VoipEngineFactoryTest, UseNoAudioProcessing) { - VoipEngineConfig config; - config.encoder_factory = new rtc::RefCountedObject(); - config.decoder_factory = new rtc::RefCountedObject(); - config.task_queue_factory = CreateDefaultTaskQueueFactory(); - config.audio_device_module = test::MockAudioDeviceModule::CreateNice(); - - auto voip_engine = CreateVoipEngine(std::move(config)); - EXPECT_NE(voip_engine, nullptr); -} - -} // namespace -} // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_statistics.h libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_statistics.h --- libtgowt-0~git20210124.be23804+ds/src/api/voip/voip_statistics.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/api/voip/voip_statistics.h 2021-06-27 05:27:48.000000000 +0000 @@ -26,6 +26,51 @@ double total_duration = 0.0; }; +// Remote statistics obtained via remote RTCP SR/RR report received. +struct RemoteRtcpStatistics { + // Jitter as defined in RFC 3550 [6.4.1] expressed in seconds. + double jitter = 0.0; + + // Cumulative packets lost as defined in RFC 3550 [6.4.1] + int64_t packets_lost = 0; + + // Fraction lost as defined in RFC 3550 [6.4.1] expressed as a floating + // pointer number. + double fraction_lost = 0.0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcremoteinboundrtpstreamstats-roundtriptime + absl::optional round_trip_time; + + // Last time (not RTP timestamp) when RTCP report received in milliseconds. + int64_t last_report_received_timestamp_ms; +}; + +struct ChannelStatistics { + // https://w3c.github.io/webrtc-stats/#dom-rtcsentrtpstreamstats-packetssent + uint64_t packets_sent = 0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcsentrtpstreamstats-bytessent + uint64_t bytes_sent = 0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsreceived + uint64_t packets_received = 0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-bytesreceived + uint64_t bytes_received = 0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-jitter + double jitter = 0.0; + + // https://w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetslost + int64_t packets_lost = 0; + + // SSRC from remote media endpoint as indicated either by RTP header in RFC + // 3550 [5.1] or RTCP SSRC of sender in RFC 3550 [6.4.1]. + absl::optional remote_ssrc; + + absl::optional remote_rtcp; +}; + // VoipStatistics interface provides the interfaces for querying metrics around // the jitter buffer (NetEq) performance. class VoipStatistics { @@ -37,6 +82,13 @@ virtual VoipResult GetIngressStatistics(ChannelId channel_id, IngressStatistics& ingress_stats) = 0; + // Gets the channel statistics by |channel_stats| reference. + // Returns following VoipResult; + // kOk - successfully set provided ChannelStatistics reference. + // kInvalidArgument - |channel_id| is invalid. + virtual VoipResult GetChannelStatistics(ChannelId channel_id, + ChannelStatistics& channel_stats) = 0; + protected: virtual ~VoipStatistics() = default; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/audio/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/audio/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -47,6 +47,7 @@ "../api:rtp_headers", "../api:rtp_parameters", "../api:scoped_refptr", + "../api:sequence_checker", "../api:transport_api", "../api/audio:aec3_factory", "../api/audio:audio_frame_api", @@ -90,9 +91,9 @@ "../rtc_base:rtc_base_approved", "../rtc_base:rtc_task_queue", "../rtc_base:safe_minmax", + "../rtc_base:threading", "../rtc_base/experiments:field_trial_parser", "../rtc_base/synchronization:mutex", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:no_unique_address", "../rtc_base/task_utils:to_queued_task", "../system_wrappers", @@ -191,7 +192,7 @@ ] } - if (rtc_enable_protobuf) { + if (rtc_enable_protobuf && !build_with_chromium) { rtc_test("low_bandwidth_audio_test") { testonly = true @@ -219,8 +220,8 @@ "../test:test_support", "../test/pc/e2e:network_quality_metrics_reporter", "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", ] + absl_deps = [ "//third_party/abseil-cpp/absl/flags:flag" ] if (is_android) { deps += [ "//testing/android/native_test:native_test_native_code" ] } @@ -278,30 +279,32 @@ } } - rtc_library("audio_perf_tests") { - testonly = true + if (!build_with_chromium) { + rtc_library("audio_perf_tests") { + testonly = true - sources = [ - "test/audio_bwe_integration_test.cc", - "test/audio_bwe_integration_test.h", - ] - deps = [ - "../api:simulated_network_api", - "../api/task_queue", - "../call:fake_network", - "../call:simulated_network", - "../common_audio", - "../rtc_base:rtc_base_approved", - "../rtc_base:task_queue_for_test", - "../system_wrappers", - "../test:field_trial", - "../test:fileutils", - "../test:test_common", - "../test:test_main", - "../test:test_support", - "//testing/gtest", - ] + sources = [ + "test/audio_bwe_integration_test.cc", + "test/audio_bwe_integration_test.h", + ] + deps = [ + "../api:simulated_network_api", + "../api/task_queue", + "../call:fake_network", + "../call:simulated_network", + "../common_audio", + "../rtc_base:rtc_base_approved", + "../rtc_base:task_queue_for_test", + "../system_wrappers", + "../test:field_trial", + "../test:fileutils", + "../test:test_common", + "../test:test_main", + "../test:test_support", + "//testing/gtest", + ] - data = [ "//resources/voice_engine/audio_dtx16.wav" ] + data = [ "//resources/voice_engine/audio_dtx16.wav" ] + } } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream.cc 2021-06-27 05:27:48.000000000 +0000 @@ -24,6 +24,7 @@ #include "audio/conversion.h" #include "call/rtp_config.h" #include "call/rtp_stream_receiver_controller_interface.h" +#include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/strings/string_builder.h" @@ -118,21 +119,24 @@ webrtc::RtcEventLog* event_log, std::unique_ptr channel_receive) : audio_state_(audio_state), - channel_receive_(std::move(channel_receive)), - source_tracker_(clock) { + source_tracker_(clock), + channel_receive_(std::move(channel_receive)) { RTC_LOG(LS_INFO) << "AudioReceiveStream: " << config.rtp.remote_ssrc; RTC_DCHECK(config.decoder_factory); RTC_DCHECK(config.rtcp_send_transport); RTC_DCHECK(audio_state_); RTC_DCHECK(channel_receive_); - module_process_thread_checker_.Detach(); - RTC_DCHECK(receiver_controller); RTC_DCHECK(packet_router); // Configure bandwidth estimation. channel_receive_->RegisterReceiverCongestionControlObjects(packet_router); + // When output is muted, ChannelReceive will directly notify the source + // tracker of "delivered" frames, so RtpReceiver information will continue to + // be updated. + channel_receive_->SetSourceTracker(&source_tracker_); + // Register with transport. rtp_stream_receiver_ = receiver_controller->CreateReceiver( config.rtp.remote_ssrc, channel_receive_.get()); @@ -173,6 +177,11 @@ audio_state()->RemoveReceivingStream(this); } +bool AudioReceiveStream::IsRunning() const { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + return playing_; +} + webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats( bool get_and_clear_legacy_stats) const { RTC_DCHECK_RUN_ON(&worker_thread_checker_); @@ -253,6 +262,14 @@ stats.decoding_plc_cng = ds.decoded_plc_cng; stats.decoding_muted_output = ds.decoded_muted_output; + stats.last_sender_report_timestamp_ms = + call_stats.last_sender_report_timestamp_ms; + stats.last_sender_report_remote_timestamp_ms = + call_stats.last_sender_report_remote_timestamp_ms; + stats.sender_reports_packets_sent = call_stats.sender_reports_packets_sent; + stats.sender_reports_bytes_sent = call_stats.sender_reports_bytes_sent; + stats.sender_reports_reports_count = call_stats.sender_reports_reports_count; + return stats; } @@ -306,14 +323,10 @@ } absl::optional AudioReceiveStream::GetInfo() const { - RTC_DCHECK_RUN_ON(&module_process_thread_checker_); - absl::optional info = channel_receive_->GetSyncInfo(); - - if (!info) - return absl::nullopt; - - info->current_delay_ms = channel_receive_->GetDelayEstimate(); - return info; + // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer, + // expect to be called on the network thread. + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + return channel_receive_->GetSyncInfo(); } bool AudioReceiveStream::GetPlayoutRtpTimestamp(uint32_t* rtp_timestamp, @@ -331,11 +344,14 @@ } bool AudioReceiveStream::SetMinimumPlayoutDelay(int delay_ms) { - RTC_DCHECK_RUN_ON(&module_process_thread_checker_); + // TODO(bugs.webrtc.org/11993): This is called via RtpStreamsSynchronizer, + // expect to be called on the network thread. + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return channel_receive_->SetMinimumPlayoutDelay(delay_ms); } void AudioReceiveStream::AssociateSendStream(AudioSendStream* send_stream) { + // TODO(bugs.webrtc.org/11993): Expect to be called on the network thread. RTC_DCHECK_RUN_ON(&worker_thread_checker_); channel_receive_->SetAssociatedSendChannel( send_stream ? send_stream->GetChannel() : nullptr); @@ -357,6 +373,8 @@ const AudioSendStream* AudioReceiveStream::GetAssociatedSendStreamForTesting() const { + // TODO(bugs.webrtc.org/11993): Expect to be called on the network thread or + // remove test method and |associated_send_stream_| variable. RTC_DCHECK_RUN_ON(&worker_thread_checker_); return associated_send_stream_; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream.h --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -17,11 +17,11 @@ #include "api/audio/audio_mixer.h" #include "api/neteq/neteq_factory.h" #include "api/rtp_headers.h" +#include "api/sequence_checker.h" #include "audio/audio_state.h" #include "call/audio_receive_stream.h" #include "call/syncable.h" #include "modules/rtp_rtcp/source/source_tracker.h" -#include "rtc_base/thread_checker.h" #include "system_wrappers/include/clock.h" namespace webrtc { @@ -71,6 +71,8 @@ void Reconfigure(const webrtc::AudioReceiveStream::Config& config) override; void Start() override; void Stop() override; + bool IsRunning() const override; + webrtc::AudioReceiveStream::Stats GetStats( bool get_and_clear_legacy_stats) const override; void SetSink(AudioSinkInterface* sink) override; @@ -106,12 +108,11 @@ AudioState* audio_state() const; - rtc::ThreadChecker worker_thread_checker_; - rtc::ThreadChecker module_process_thread_checker_; + SequenceChecker worker_thread_checker_; webrtc::AudioReceiveStream::Config config_; rtc::scoped_refptr audio_state_; - const std::unique_ptr channel_receive_; SourceTracker source_tracker_; + const std::unique_ptr channel_receive_; AudioSendStream* associated_send_stream_ = nullptr; bool playing_ RTC_GUARDED_BY(worker_thread_checker_) = false; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_receive_stream_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_receive_stream_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -106,6 +106,7 @@ })); EXPECT_CALL(*channel_receive_, SetDepacketizerToDecoderFrameTransformer(_)) .Times(1); + EXPECT_CALL(*channel_receive_, SetSourceTracker(_)); stream_config_.rtp.local_ssrc = kLocalSsrc; stream_config_.rtp.remote_ssrc = kRemoteSsrc; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_send_stream.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_send_stream.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_send_stream.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_send_stream.cc 2021-06-27 05:27:48.000000000 +0000 @@ -168,13 +168,14 @@ RTC_DCHECK(rtp_rtcp_module_); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); ConfigureStream(config, true); - + UpdateCachedTargetAudioBitrateConstraints(); pacer_thread_checker_.Detach(); } AudioSendStream::~AudioSendStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_LOG(LS_INFO) << "~AudioSendStream: " << config_.rtp.ssrc; RTC_DCHECK(!sending_); channel_send_->ResetSenderCongestionControlObjects(); @@ -186,13 +187,13 @@ } const webrtc::AudioSendStream::Config& AudioSendStream::GetConfig() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return config_; } void AudioSendStream::Reconfigure( const webrtc::AudioSendStream::Config& new_config) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); ConfigureStream(new_config, false); } @@ -351,20 +352,22 @@ } channel_send_->CallEncoder([this](AudioEncoder* encoder) { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (!encoder) { return; } - worker_queue_->PostTask( - [this, length_range = encoder->GetFrameLengthRange()] { - RTC_DCHECK_RUN_ON(worker_queue_); - frame_length_range_ = length_range; - }); + frame_length_range_ = encoder->GetFrameLengthRange(); + UpdateCachedTargetAudioBitrateConstraints(); }); if (sending_) { ReconfigureBitrateObserver(new_config); } + config_ = new_config; + if (!first_time) { + UpdateCachedTargetAudioBitrateConstraints(); + } } void AudioSendStream::Start() { @@ -379,13 +382,7 @@ if (send_side_bwe_with_overhead_) rtp_transport_->IncludeOverheadInPacedSender(); rtp_rtcp_module_->SetAsPartOfAllocation(true); - rtc::Event thread_sync_event; - worker_queue_->PostTask([&] { - RTC_DCHECK_RUN_ON(worker_queue_); - ConfigureBitrateObserver(); - thread_sync_event.Set(); - }); - thread_sync_event.Wait(rtc::Event::kForever); + ConfigureBitrateObserver(); } else { rtp_rtcp_module_->SetAsPartOfAllocation(false); } @@ -396,7 +393,7 @@ } void AudioSendStream::Stop() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (!sending_) { return; } @@ -431,14 +428,14 @@ int payload_frequency, int event, int duration_ms) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); channel_send_->SetSendTelephoneEventPayloadType(payload_type, payload_frequency); return channel_send_->SendTelephoneEventOutband(event, duration_ms); } void AudioSendStream::SetMuted(bool muted) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); channel_send_->SetInputMute(muted); } @@ -448,7 +445,7 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats( bool has_remote_tracks) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); webrtc::AudioSendStream::Stats stats; stats.local_ssrc = config_.rtp.ssrc; stats.target_bitrate_bps = channel_send_->GetBitrate(); @@ -509,12 +506,14 @@ void AudioSendStream::DeliverRtcp(const uint8_t* packet, size_t length) { RTC_DCHECK_RUN_ON(&worker_thread_checker_); channel_send_->ReceivedRTCPPacket(packet, length); - worker_queue_->PostTask([&]() { + + { // Poll if overhead has changed, which it can do if ack triggers us to stop // sending mid/rid. MutexLock lock(&overhead_per_packet_lock_); UpdateOverheadForEncoder(); - }); + } + UpdateCachedTargetAudioBitrateConstraints(); } uint32_t AudioSendStream::OnBitrateUpdated(BitrateAllocationUpdate update) { @@ -523,9 +522,11 @@ // Pick a target bitrate between the constraints. Overrules the allocator if // it 1) allocated a bitrate of zero to disable the stream or 2) allocated a // higher than max to allow for e.g. extra FEC. - auto constraints = GetMinMaxBitrateConstraints(); - update.target_bitrate.Clamp(constraints.min, constraints.max); - update.stable_target_bitrate.Clamp(constraints.min, constraints.max); + RTC_DCHECK(cached_constraints_.has_value()); + update.target_bitrate.Clamp(cached_constraints_->min, + cached_constraints_->max); + update.stable_target_bitrate.Clamp(cached_constraints_->min, + cached_constraints_->max); channel_send_->OnBitrateAllocation(update); @@ -536,13 +537,17 @@ void AudioSendStream::SetTransportOverhead( int transport_overhead_per_packet_bytes) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); - MutexLock lock(&overhead_per_packet_lock_); - transport_overhead_per_packet_bytes_ = transport_overhead_per_packet_bytes; - UpdateOverheadForEncoder(); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + { + MutexLock lock(&overhead_per_packet_lock_); + transport_overhead_per_packet_bytes_ = transport_overhead_per_packet_bytes; + UpdateOverheadForEncoder(); + } + UpdateCachedTargetAudioBitrateConstraints(); } void AudioSendStream::UpdateOverheadForEncoder() { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); size_t overhead_per_packet_bytes = GetPerPacketOverheadBytes(); if (overhead_per_packet_ == overhead_per_packet_bytes) { return; @@ -552,19 +557,11 @@ channel_send_->CallEncoder([&](AudioEncoder* encoder) { encoder->OnReceivedOverhead(overhead_per_packet_bytes); }); - auto update_task = [this, overhead_per_packet_bytes] { - RTC_DCHECK_RUN_ON(worker_queue_); - if (total_packet_overhead_bytes_ != overhead_per_packet_bytes) { - total_packet_overhead_bytes_ = overhead_per_packet_bytes; - if (registered_with_allocator_) { - ConfigureBitrateObserver(); - } + if (total_packet_overhead_bytes_ != overhead_per_packet_bytes) { + total_packet_overhead_bytes_ = overhead_per_packet_bytes; + if (registered_with_allocator_) { + ConfigureBitrateObserver(); } - }; - if (worker_queue_->IsCurrent()) { - update_task(); - } else { - worker_queue_->PostTask(update_task); } } @@ -602,7 +599,6 @@ void AudioSendStream::StoreEncoderProperties(int sample_rate_hz, size_t num_channels) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); encoder_sample_rate_hz_ = sample_rate_hz; encoder_num_channels_ = num_channels; if (sending_) { @@ -800,7 +796,6 @@ void AudioSendStream::ReconfigureBitrateObserver( const webrtc::AudioSendStream::Config& new_config) { - RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Since the Config's default is for both of these to be -1, this test will // allow us to configure the bitrate observer if the new config has bitrate // limits set, but would only have us call RemoveBitrateObserver if we were @@ -819,20 +814,13 @@ rtp_transport_->AccountForAudioPacketsInPacedSender(true); if (send_side_bwe_with_overhead_) rtp_transport_->IncludeOverheadInPacedSender(); - rtc::Event thread_sync_event; - worker_queue_->PostTask([&] { - RTC_DCHECK_RUN_ON(worker_queue_); - // We may get a callback immediately as the observer is registered, so - // make - // sure the bitrate limits in config_ are up-to-date. - config_.min_bitrate_bps = new_config.min_bitrate_bps; - config_.max_bitrate_bps = new_config.max_bitrate_bps; + // We may get a callback immediately as the observer is registered, so + // make sure the bitrate limits in config_ are up-to-date. + config_.min_bitrate_bps = new_config.min_bitrate_bps; + config_.max_bitrate_bps = new_config.max_bitrate_bps; - config_.bitrate_priority = new_config.bitrate_priority; - ConfigureBitrateObserver(); - thread_sync_event.Set(); - }); - thread_sync_event.Wait(rtc::Event::kForever); + config_.bitrate_priority = new_config.bitrate_priority; + ConfigureBitrateObserver(); rtp_rtcp_module_->SetAsPartOfAllocation(true); } else { rtp_transport_->AccountForAudioPacketsInPacedSender(false); @@ -845,6 +833,7 @@ // This either updates the current observer or adds a new observer. // TODO(srte): Add overhead compensation here. auto constraints = GetMinMaxBitrateConstraints(); + RTC_DCHECK(constraints.has_value()); DataRate priority_bitrate = allocation_settings_.priority_bitrate; if (send_side_bwe_with_overhead_) { @@ -866,30 +855,40 @@ if (allocation_settings_.priority_bitrate_raw) priority_bitrate = *allocation_settings_.priority_bitrate_raw; - bitrate_allocator_->AddObserver( - this, - MediaStreamAllocationConfig{ - constraints.min.bps(), constraints.max.bps(), 0, - priority_bitrate.bps(), true, - allocation_settings_.bitrate_priority.value_or( - config_.bitrate_priority)}); + worker_queue_->PostTask([this, constraints, priority_bitrate, + config_bitrate_priority = config_.bitrate_priority] { + RTC_DCHECK_RUN_ON(worker_queue_); + bitrate_allocator_->AddObserver( + this, + MediaStreamAllocationConfig{ + constraints->min.bps(), constraints->max.bps(), + 0, priority_bitrate.bps(), true, + allocation_settings_.bitrate_priority.value_or( + config_bitrate_priority)}); + }); registered_with_allocator_ = true; } void AudioSendStream::RemoveBitrateObserver() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + registered_with_allocator_ = false; rtc::Event thread_sync_event; worker_queue_->PostTask([this, &thread_sync_event] { RTC_DCHECK_RUN_ON(worker_queue_); - registered_with_allocator_ = false; bitrate_allocator_->RemoveObserver(this); thread_sync_event.Set(); }); thread_sync_event.Wait(rtc::Event::kForever); } -AudioSendStream::TargetAudioBitrateConstraints +absl::optional AudioSendStream::GetMinMaxBitrateConstraints() const { + if (config_.min_bitrate_bps < 0 || config_.max_bitrate_bps < 0) { + RTC_LOG(LS_WARNING) << "Config is invalid: min_bitrate_bps=" + << config_.min_bitrate_bps + << "; max_bitrate_bps=" << config_.max_bitrate_bps + << "; both expected greater or equal to 0"; + return absl::nullopt; + } TargetAudioBitrateConstraints constraints{ DataRate::BitsPerSec(config_.min_bitrate_bps), DataRate::BitsPerSec(config_.max_bitrate_bps)}; @@ -902,7 +901,11 @@ RTC_DCHECK_GE(constraints.min, DataRate::Zero()); RTC_DCHECK_GE(constraints.max, DataRate::Zero()); - RTC_DCHECK_GE(constraints.max, constraints.min); + if (constraints.max < constraints.min) { + RTC_LOG(LS_WARNING) << "TargetAudioBitrateConstraints::max is less than " + << "TargetAudioBitrateConstraints::min"; + return absl::nullopt; + } if (send_side_bwe_with_overhead_) { if (use_legacy_overhead_calculation_) { // OverheadPerPacket = Ipv4(20B) + UDP(8B) + SRTP(10B) + RTP(12) @@ -913,7 +916,10 @@ constraints.min += kMinOverhead; constraints.max += kMinOverhead; } else { - RTC_DCHECK(frame_length_range_); + if (!frame_length_range_.has_value()) { + RTC_LOG(LS_WARNING) << "frame_length_range_ is not set"; + return absl::nullopt; + } const DataSize kOverheadPerPacket = DataSize::Bytes(total_packet_overhead_bytes_); constraints.min += kOverheadPerPacket / frame_length_range_->second; @@ -927,5 +933,18 @@ int clockrate_hz) { channel_send_->RegisterCngPayloadType(payload_type, clockrate_hz); } + +void AudioSendStream::UpdateCachedTargetAudioBitrateConstraints() { + absl::optional + new_constraints = GetMinMaxBitrateConstraints(); + if (!new_constraints.has_value()) { + return; + } + worker_queue_->PostTask([this, new_constraints]() { + RTC_DCHECK_RUN_ON(worker_queue_); + cached_constraints_ = new_constraints; + }); +} + } // namespace internal } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_send_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_send_stream.h --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_send_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_send_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,6 +15,7 @@ #include #include +#include "api/sequence_checker.h" #include "audio/audio_level.h" #include "audio/channel_send.h" #include "call/audio_send_stream.h" @@ -25,7 +26,6 @@ #include "rtc_base/race_checker.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/task_queue.h" -#include "rtc_base/thread_checker.h" namespace webrtc { class RtcEventLog; @@ -121,22 +121,29 @@ internal::AudioState* audio_state(); const internal::AudioState* audio_state() const; - void StoreEncoderProperties(int sample_rate_hz, size_t num_channels); + void StoreEncoderProperties(int sample_rate_hz, size_t num_channels) + RTC_RUN_ON(worker_thread_checker_); - void ConfigureStream(const Config& new_config, bool first_time); - bool SetupSendCodec(const Config& new_config); - bool ReconfigureSendCodec(const Config& new_config); - void ReconfigureANA(const Config& new_config); - void ReconfigureCNG(const Config& new_config); - void ReconfigureBitrateObserver(const Config& new_config); + void ConfigureStream(const Config& new_config, bool first_time) + RTC_RUN_ON(worker_thread_checker_); + bool SetupSendCodec(const Config& new_config) + RTC_RUN_ON(worker_thread_checker_); + bool ReconfigureSendCodec(const Config& new_config) + RTC_RUN_ON(worker_thread_checker_); + void ReconfigureANA(const Config& new_config) + RTC_RUN_ON(worker_thread_checker_); + void ReconfigureCNG(const Config& new_config) + RTC_RUN_ON(worker_thread_checker_); + void ReconfigureBitrateObserver(const Config& new_config) + RTC_RUN_ON(worker_thread_checker_); - void ConfigureBitrateObserver() RTC_RUN_ON(worker_queue_); - void RemoveBitrateObserver(); + void ConfigureBitrateObserver() RTC_RUN_ON(worker_thread_checker_); + void RemoveBitrateObserver() RTC_RUN_ON(worker_thread_checker_); // Returns bitrate constraints, maybe including overhead when enabled by // field trial. - TargetAudioBitrateConstraints GetMinMaxBitrateConstraints() const - RTC_RUN_ON(worker_queue_); + absl::optional GetMinMaxBitrateConstraints() + const RTC_RUN_ON(worker_thread_checker_); // Sets per-packet overhead on encoded (for ANA) based on current known values // of transport and packetization overheads. @@ -147,11 +154,16 @@ size_t GetPerPacketOverheadBytes() const RTC_EXCLUSIVE_LOCKS_REQUIRED(overhead_per_packet_lock_); - void RegisterCngPayloadType(int payload_type, int clockrate_hz); + void RegisterCngPayloadType(int payload_type, int clockrate_hz) + RTC_RUN_ON(worker_thread_checker_); + + void UpdateCachedTargetAudioBitrateConstraints() + RTC_RUN_ON(worker_thread_checker_); + Clock* clock_; - rtc::ThreadChecker worker_thread_checker_; - rtc::ThreadChecker pacer_thread_checker_; + SequenceChecker worker_thread_checker_; + SequenceChecker pacer_thread_checker_; rtc::RaceChecker audio_capture_race_checker_; rtc::TaskQueue* worker_queue_; @@ -161,15 +173,16 @@ const bool send_side_bwe_with_overhead_; const AudioAllocationConfig allocation_settings_; - webrtc::AudioSendStream::Config config_; + webrtc::AudioSendStream::Config config_ + RTC_GUARDED_BY(worker_thread_checker_); rtc::scoped_refptr audio_state_; const std::unique_ptr channel_send_; RtcEventLog* const event_log_; const bool use_legacy_overhead_calculation_; - int encoder_sample_rate_hz_ = 0; - size_t encoder_num_channels_ = 0; - bool sending_ = false; + int encoder_sample_rate_hz_ RTC_GUARDED_BY(worker_thread_checker_) = 0; + size_t encoder_num_channels_ RTC_GUARDED_BY(worker_thread_checker_) = 0; + bool sending_ RTC_GUARDED_BY(worker_thread_checker_) = false; mutable Mutex audio_level_lock_; // Keeps track of audio level, total audio energy and total samples duration. // https://w3c.github.io/webrtc-stats/#dom-rtcaudiohandlerstats-totalaudioenergy @@ -177,6 +190,9 @@ BitrateAllocatorInterface* const bitrate_allocator_ RTC_GUARDED_BY(worker_queue_); + // Constrains cached to be accessed from |worker_queue_|. + absl::optional + cached_constraints_ RTC_GUARDED_BY(worker_queue_) = absl::nullopt; RtpTransportControllerSendInterface* const rtp_transport_; RtpRtcpInterface* const rtp_rtcp_module_; @@ -205,10 +221,12 @@ size_t transport_overhead_per_packet_bytes_ RTC_GUARDED_BY(overhead_per_packet_lock_) = 0; - bool registered_with_allocator_ RTC_GUARDED_BY(worker_queue_) = false; - size_t total_packet_overhead_bytes_ RTC_GUARDED_BY(worker_queue_) = 0; + bool registered_with_allocator_ RTC_GUARDED_BY(worker_thread_checker_) = + false; + size_t total_packet_overhead_bytes_ RTC_GUARDED_BY(worker_thread_checker_) = + 0; absl::optional> frame_length_range_ - RTC_GUARDED_BY(worker_queue_); + RTC_GUARDED_BY(worker_thread_checker_); }; } // namespace internal } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/audio_state.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_state.h --- libtgowt-0~git20210124.be23804+ds/src/audio/audio_state.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/audio_state.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,11 +15,11 @@ #include #include +#include "api/sequence_checker.h" #include "audio/audio_transport_impl.h" #include "audio/null_audio_poller.h" #include "call/audio_state.h" #include "rtc_base/ref_count.h" -#include "rtc_base/thread_checker.h" namespace webrtc { @@ -60,13 +60,17 @@ int sample_rate_hz, size_t num_channels); void RemoveSendingStream(webrtc::AudioSendStream* stream); + + rtc::scoped_refptr GetAudioMixer() { + return config_.audio_mixer; + } private: void UpdateAudioTransportWithSendingStreams(); void UpdateNullAudioPollerState(); - rtc::ThreadChecker thread_checker_; - rtc::ThreadChecker process_thread_checker_; + SequenceChecker thread_checker_; + SequenceChecker process_thread_checker_; const webrtc::AudioState::Config config_; bool recording_enabled_ = true; bool playout_enabled_ = true; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive.cc 2021-06-27 05:27:48.000000000 +0000 @@ -22,6 +22,7 @@ #include "api/crypto/frame_decryptor_interface.h" #include "api/frame_transformer_interface.h" #include "api/rtc_event_log/rtc_event_log.h" +#include "api/sequence_checker.h" #include "audio/audio_level.h" #include "audio/channel_receive_frame_transformer_delegate.h" #include "audio/channel_send.h" @@ -46,7 +47,6 @@ #include "rtc_base/numerics/safe_minmax.h" #include "rtc_base/race_checker.h" #include "rtc_base/synchronization/mutex.h" -#include "rtc_base/thread_checker.h" #include "rtc_base/time_utils.h" #include "system_wrappers/include/metrics.h" @@ -162,6 +162,8 @@ int PreferredSampleRate() const override; + void SetSourceTracker(SourceTracker* source_tracker) override; + // Associate to a send channel. // Used for obtaining RTT for a receive-only channel. void SetAssociatedSendChannel(const ChannelSendInterface* channel) override; @@ -197,8 +199,8 @@ // we know about. The goal is to eventually split up voe::ChannelReceive into // parts with single-threaded semantics, and thereby reduce the need for // locks. - rtc::ThreadChecker worker_thread_checker_; - rtc::ThreadChecker module_process_thread_checker_; + SequenceChecker worker_thread_checker_; + // Methods accessed from audio and video threads are checked for sequential- // only access. We don't necessarily own and control these threads, so thread // checkers cannot be used. E.g. Chromium may transfer "ownership" from one @@ -219,6 +221,7 @@ std::unique_ptr rtp_receive_statistics_; std::unique_ptr rtp_rtcp_; const uint32_t remote_ssrc_; + SourceTracker* source_tracker_ = nullptr; // Info for GetSyncInfo is updated on network or worker thread, and queried on // the worker thread. @@ -233,6 +236,7 @@ AudioSinkInterface* audio_sink_ = nullptr; AudioLevel _outputAudioLevel; + Clock* const clock_; RemoteNtpTimeEstimator ntp_estimator_ RTC_GUARDED_BY(ts_stats_lock_); // Timestamp of the audio pulled from NetEq. @@ -257,19 +261,16 @@ // frame. int64_t capture_start_ntp_time_ms_ RTC_GUARDED_BY(ts_stats_lock_); - // uses - ProcessThread* _moduleProcessThreadPtr; + ProcessThread* const module_process_thread_; AudioDeviceModule* _audioDeviceModulePtr; float _outputGain RTC_GUARDED_BY(volume_settings_mutex_); - // An associated send channel. - mutable Mutex assoc_send_channel_lock_; const ChannelSendInterface* associated_send_channel_ - RTC_GUARDED_BY(assoc_send_channel_lock_); + RTC_GUARDED_BY(worker_thread_checker_); PacketRouter* packet_router_ = nullptr; - rtc::ThreadChecker construction_thread_; + SequenceChecker construction_thread_; // E2EE Audio Frame Decryption rtc::scoped_refptr frame_decryptor_; @@ -287,6 +288,21 @@ if (!Playing()) { // Avoid inserting into NetEQ when we are not playing. Count the // packet as discarded. + + // If we have a source_tracker_, tell it that the frame has been + // "delivered". Normally, this happens in AudioReceiveStream when audio + // frames are pulled out, but when playout is muted, nothing is pulling + // frames. The downside of this approach is that frames delivered this way + // won't be delayed for playout, and therefore will be unsynchronized with + // (a) audio delay when playing and (b) any audio/video synchronization. But + // the alternative is that muting playout also stops the SourceTracker from + // updating RtpSource information. + if (source_tracker_) { + RtpPacketInfos::vector_type packet_vector = { + RtpPacketInfo(rtpHeader, clock_->TimeInMilliseconds())}; + source_tracker_->OnFrameDelivered(RtpPacketInfos(packet_vector)); + } + return; } @@ -442,6 +458,10 @@ acm_receiver_.last_output_sample_rate_hz()); } +void ChannelReceive::SetSourceTracker(SourceTracker* source_tracker) { + source_tracker_ = source_tracker; +} + ChannelReceive::ChannelReceive( Clock* clock, ProcessThread* module_process_thread, @@ -469,23 +489,21 @@ jitter_buffer_max_packets, jitter_buffer_fast_playout)), _outputAudioLevel(), + clock_(clock), ntp_estimator_(clock), playout_timestamp_rtp_(0), playout_delay_ms_(0), rtp_ts_wraparound_handler_(new rtc::TimestampWrapAroundHandler()), capture_start_rtp_time_stamp_(-1), capture_start_ntp_time_ms_(-1), - _moduleProcessThreadPtr(module_process_thread), + module_process_thread_(module_process_thread), _audioDeviceModulePtr(audio_device_module), _outputGain(1.0f), associated_send_channel_(nullptr), frame_decryptor_(frame_decryptor), crypto_options_(crypto_options), absolute_capture_time_receiver_(clock) { - // TODO(nisse): Use _moduleProcessThreadPtr instead? - module_process_thread_checker_.Detach(); - - RTC_DCHECK(module_process_thread); + RTC_DCHECK(module_process_thread_); RTC_DCHECK(audio_device_module); acm_receiver_.ResetInitialDelay(); @@ -512,39 +530,43 @@ rtp_rtcp_->SetSendingMediaStatus(false); rtp_rtcp_->SetRemoteSSRC(remote_ssrc_); - _moduleProcessThreadPtr->RegisterModule(rtp_rtcp_.get(), RTC_FROM_HERE); - // Ensure that RTCP is enabled for the created channel. rtp_rtcp_->SetRTCPStatus(RtcpMode::kCompound); + + // TODO(tommi): This should be an implementation detail of ModuleRtpRtcpImpl2 + // and the pointer to the process thread should be there (which also localizes + // the problem of getting rid of that dependency). + module_process_thread_->RegisterModule(rtp_rtcp_.get(), RTC_FROM_HERE); } ChannelReceive::~ChannelReceive() { RTC_DCHECK(construction_thread_.IsCurrent()); + // Unregister the module before stopping playout etc, to match the order + // things were set up in the ctor. + module_process_thread_->DeRegisterModule(rtp_rtcp_.get()); + // Resets the delegate's callback to ChannelReceive::OnReceivedPayloadData. if (frame_transformer_delegate_) frame_transformer_delegate_->Reset(); StopPlayout(); - - if (_moduleProcessThreadPtr) - _moduleProcessThreadPtr->DeRegisterModule(rtp_rtcp_.get()); } void ChannelReceive::SetSink(AudioSinkInterface* sink) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); MutexLock lock(&callback_mutex_); audio_sink_ = sink; } void ChannelReceive::StartPlayout() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); MutexLock lock(&playing_lock_); playing_ = true; } void ChannelReceive::StopPlayout() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); MutexLock lock(&playing_lock_); playing_ = false; _outputAudioLevel.ResetLevelFullRange(); @@ -552,13 +574,13 @@ absl::optional> ChannelReceive::GetReceiveCodec() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return acm_receiver_.LastDecoder(); } void ChannelReceive::SetReceiveCodecs( const std::map& codecs) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); for (const auto& kv : codecs) { RTC_DCHECK_GE(kv.second.clockrate_hz, 1000); payload_type_frequencies_[kv.first] = kv.second.clockrate_hz; @@ -566,8 +588,11 @@ acm_receiver_.SetCodecs(codecs); } -// May be called on either worker thread or network thread. void ChannelReceive::OnRtpPacket(const RtpPacketReceived& packet) { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + // TODO(bugs.webrtc.org/11993): Expect to be called exclusively on the + // network thread. Once that's done, the same applies to + // UpdatePlayoutTimestamp and int64_t now_ms = rtc::TimeMillis(); { @@ -654,8 +679,11 @@ } } -// May be called on either worker thread or network thread. void ChannelReceive::ReceivedRTCPPacket(const uint8_t* data, size_t length) { + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + // TODO(bugs.webrtc.org/11993): Expect to be called exclusively on the + // network thread. + // Store playout timestamp for the received RTCP packet UpdatePlayoutTimestamp(true, rtc::TimeMillis()); @@ -671,8 +699,10 @@ uint32_t ntp_secs = 0; uint32_t ntp_frac = 0; uint32_t rtp_timestamp = 0; - if (0 != - rtp_rtcp_->RemoteNTP(&ntp_secs, &ntp_frac, NULL, NULL, &rtp_timestamp)) { + if (rtp_rtcp_->RemoteNTP(&ntp_secs, &ntp_frac, + /*rtcp_arrival_time_secs=*/nullptr, + /*rtcp_arrival_time_frac=*/nullptr, + &rtp_timestamp) != 0) { // Waiting for RTCP. return; } @@ -680,33 +710,39 @@ { MutexLock lock(&ts_stats_lock_); ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp); + absl::optional remote_to_local_clock_offset_ms = + ntp_estimator_.EstimateRemoteToLocalClockOffsetMs(); + if (remote_to_local_clock_offset_ms.has_value()) { + absolute_capture_time_receiver_.SetRemoteToLocalClockOffset( + Int64MsToQ32x32(*remote_to_local_clock_offset_ms)); + } } } int ChannelReceive::GetSpeechOutputLevelFullRange() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return _outputAudioLevel.LevelFullRange(); } double ChannelReceive::GetTotalOutputEnergy() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return _outputAudioLevel.TotalEnergy(); } double ChannelReceive::GetTotalOutputDuration() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return _outputAudioLevel.TotalDuration(); } void ChannelReceive::SetChannelOutputVolumeScaling(float scaling) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); MutexLock lock(&volume_settings_mutex_); _outputGain = scaling; } void ChannelReceive::RegisterReceiverCongestionControlObjects( PacketRouter* packet_router) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(packet_router); RTC_DCHECK(!packet_router_); constexpr bool remb_candidate = false; @@ -715,19 +751,18 @@ } void ChannelReceive::ResetReceiverCongestionControlObjects() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(packet_router_); packet_router_->RemoveReceiveRtpModule(rtp_rtcp_.get()); packet_router_ = nullptr; } CallReceiveStatistics ChannelReceive::GetRTCPStatistics() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); - // --- RtcpStatistics + RTC_DCHECK_RUN_ON(&worker_thread_checker_); CallReceiveStatistics stats; - // The jitter statistics is updated for each received RTP packet and is - // based on received packets. + // The jitter statistics is updated for each received RTP packet and is based + // on received packets. RtpReceiveStats rtp_stats; StreamStatistician* statistician = rtp_receive_statistics_->GetStatistician(remote_ssrc_); @@ -738,10 +773,9 @@ stats.cumulativeLost = rtp_stats.packets_lost; stats.jitterSamples = rtp_stats.jitter; - // --- RTT stats.rttMs = GetRTT(); - // --- Data counters + // Data counters. if (statistician) { stats.payload_bytes_rcvd = rtp_stats.packet_counter.payload_bytes; @@ -758,16 +792,33 @@ stats.last_packet_received_timestamp_ms = absl::nullopt; } - // --- Timestamps + // Timestamps. { MutexLock lock(&ts_stats_lock_); stats.capture_start_ntp_time_ms_ = capture_start_ntp_time_ms_; } + + absl::optional rtcp_sr_stats = + rtp_rtcp_->GetSenderReportStats(); + if (rtcp_sr_stats.has_value()) { + // Number of seconds since 1900 January 1 00:00 GMT (see + // https://tools.ietf.org/html/rfc868). + constexpr int64_t kNtpJan1970Millisecs = + 2208988800 * rtc::kNumMillisecsPerSec; + stats.last_sender_report_timestamp_ms = + rtcp_sr_stats->last_arrival_timestamp.ToMs() - kNtpJan1970Millisecs; + stats.last_sender_report_remote_timestamp_ms = + rtcp_sr_stats->last_remote_timestamp.ToMs() - kNtpJan1970Millisecs; + stats.sender_reports_packets_sent = rtcp_sr_stats->packets_sent; + stats.sender_reports_bytes_sent = rtcp_sr_stats->bytes_sent; + stats.sender_reports_reports_count = rtcp_sr_stats->reports_count; + } + return stats; } void ChannelReceive::SetNACKStatus(bool enable, int max_packets) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // None of these functions can fail. if (enable) { rtp_receive_statistics_->SetMaxReorderingThreshold(max_packets); @@ -787,14 +838,14 @@ void ChannelReceive::SetAssociatedSendChannel( const ChannelSendInterface* channel) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); - MutexLock lock(&assoc_send_channel_lock_); + // TODO(bugs.webrtc.org/11993): Expect to be called on the network thread. + RTC_DCHECK_RUN_ON(&worker_thread_checker_); associated_send_channel_ = channel; } void ChannelReceive::SetDepacketizerToDecoderFrameTransformer( rtc::scoped_refptr frame_transformer) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Depending on when the channel is created, the transformer might be set // twice. Don't replace the delegate if it was already initialized. if (!frame_transformer || frame_transformer_delegate_) @@ -804,28 +855,36 @@ NetworkStatistics ChannelReceive::GetNetworkStatistics( bool get_and_clear_legacy_stats) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); NetworkStatistics stats; acm_receiver_.GetNetworkStatistics(&stats, get_and_clear_legacy_stats); return stats; } AudioDecodingCallStats ChannelReceive::GetDecodingCallStatistics() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); AudioDecodingCallStats stats; acm_receiver_.GetDecodingCallStatistics(&stats); return stats; } uint32_t ChannelReceive::GetDelayEstimate() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent() || - module_process_thread_checker_.IsCurrent()); - MutexLock lock(&video_sync_lock_); - return acm_receiver_.FilteredCurrentDelayMs() + playout_delay_ms_; + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + + uint32_t playout_delay; + { + MutexLock lock(&video_sync_lock_); + playout_delay = playout_delay_ms_; + } + // Return the current jitter buffer delay + playout delay. + return acm_receiver_.FilteredCurrentDelayMs() + playout_delay; } bool ChannelReceive::SetMinimumPlayoutDelay(int delay_ms) { - RTC_DCHECK(module_process_thread_checker_.IsCurrent()); + // TODO(bugs.webrtc.org/11993): This should run on the network thread. + // We get here via RtpStreamsSynchronizer. Once that's done, many (all?) of + // these locks aren't needed. + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Limit to range accepted by both VoE and ACM, so we're at least getting as // close as possible, instead of failing. delay_ms = rtc::SafeClamp(delay_ms, kVoiceEngineMinMinPlayoutDelayMs, @@ -861,7 +920,7 @@ absl::optional ChannelReceive::GetCurrentEstimatedPlayoutNtpTimestampMs(int64_t now_ms) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); MutexLock lock(&video_sync_lock_); if (!playout_timestamp_ntp_ || !playout_timestamp_ntp_time_ms_) return absl::nullopt; @@ -879,13 +938,19 @@ } absl::optional ChannelReceive::GetSyncInfo() const { - RTC_DCHECK(module_process_thread_checker_.IsCurrent()); + // TODO(bugs.webrtc.org/11993): This should run on the network thread. + // We get here via RtpStreamsSynchronizer. Once that's done, many of + // these locks aren't needed. + RTC_DCHECK_RUN_ON(&worker_thread_checker_); Syncable::Info info; if (rtp_rtcp_->RemoteNTP(&info.capture_time_ntp_secs, - &info.capture_time_ntp_frac, nullptr, nullptr, + &info.capture_time_ntp_frac, + /*rtcp_arrival_time_secs=*/nullptr, + /*rtcp_arrival_time_frac=*/nullptr, &info.capture_time_source_clock) != 0) { return absl::nullopt; } + { MutexLock lock(&sync_info_lock_); if (!last_received_rtp_timestamp_ || !last_received_rtp_system_time_ms_) { @@ -894,10 +959,20 @@ info.latest_received_capture_timestamp = *last_received_rtp_timestamp_; info.latest_receive_time_ms = *last_received_rtp_system_time_ms_; } + + int jitter_buffer_delay = acm_receiver_.FilteredCurrentDelayMs(); + { + MutexLock lock(&video_sync_lock_); + info.current_delay_ms = jitter_buffer_delay + playout_delay_ms_; + } + return info; } void ChannelReceive::UpdatePlayoutTimestamp(bool rtcp, int64_t now_ms) { + // TODO(bugs.webrtc.org/11993): Expect to be called exclusively on the + // network thread. Once that's done, we won't need video_sync_lock_. + jitter_buffer_playout_timestamp_ = acm_receiver_.GetPlayoutTimestamp(); if (!jitter_buffer_playout_timestamp_) { @@ -945,30 +1020,26 @@ } int64_t ChannelReceive::GetRTT() const { - std::vector report_blocks; - rtp_rtcp_->RemoteRTCPStat(&report_blocks); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + std::vector report_blocks = + rtp_rtcp_->GetLatestReportBlockData(); - // TODO(nisse): Could we check the return value from the ->RTT() call below, - // instead of checking if we have any report blocks? if (report_blocks.empty()) { - MutexLock lock(&assoc_send_channel_lock_); - // Tries to get RTT from an associated channel. + // Try fall back on an RTT from an associated channel. if (!associated_send_channel_) { return 0; } return associated_send_channel_->GetRTT(); } - int64_t rtt = 0; - int64_t avg_rtt = 0; - int64_t max_rtt = 0; - int64_t min_rtt = 0; // TODO(nisse): This method computes RTT based on sender reports, even though // a receive stream is not supposed to do that. - if (rtp_rtcp_->RTT(remote_ssrc_, &rtt, &avg_rtt, &min_rtt, &max_rtt) != 0) { - return 0; + for (const ReportBlockData& data : report_blocks) { + if (data.report_block().sender_ssrc == remote_ssrc_) { + return data.last_rtt_ms(); + } } - return rtt; + return 0; } } // namespace diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive.h --- libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive.h 2021-06-27 05:27:48.000000000 +0000 @@ -28,6 +28,7 @@ #include "call/rtp_packet_sink_interface.h" #include "call/syncable.h" #include "modules/audio_coding/include/audio_coding_module_typedefs.h" +#include "modules/rtp_rtcp/source/source_tracker.h" #include "system_wrappers/include/clock.h" // TODO(solenberg, nisse): This file contains a few NOLINT marks, to silence @@ -57,13 +58,22 @@ int64_t payload_bytes_rcvd = 0; int64_t header_and_padding_bytes_rcvd = 0; int packetsReceived; - // The capture ntp time (in local timebase) of the first played out audio + // The capture NTP time (in local timebase) of the first played out audio // frame. int64_t capture_start_ntp_time_ms_; // The timestamp at which the last packet was received, i.e. the time of the // local clock when it was received - not the RTP timestamp of that packet. // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp absl::optional last_packet_received_timestamp_ms; + // Remote outbound stats derived by the received RTCP sender reports. + // Note that the timestamps below correspond to the time elapsed since the + // Unix epoch. + // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* + absl::optional last_sender_report_timestamp_ms; + absl::optional last_sender_report_remote_timestamp_ms; + uint32_t sender_reports_packets_sent = 0; + uint64_t sender_reports_bytes_sent = 0; + uint64_t sender_reports_reports_count = 0; }; namespace voe { @@ -135,6 +145,10 @@ virtual int PreferredSampleRate() const = 0; + // Sets the source tracker to notify about "delivered" packets when output is + // muted. + virtual void SetSourceTracker(SourceTracker* source_tracker) = 0; + // Associate to a send channel. // Used for obtaining RTT for a receive-only channel. virtual void SetAssociatedSendChannel( diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive_frame_transformer_delegate.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive_frame_transformer_delegate.h --- libtgowt-0~git20210124.be23804+ds/src/audio/channel_receive_frame_transformer_delegate.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_receive_frame_transformer_delegate.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,7 +14,7 @@ #include #include "api/frame_transformer_interface.h" -#include "rtc_base/synchronization/sequence_checker.h" +#include "api/sequence_checker.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/task_queue.h" #include "rtc_base/thread.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/channel_send.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_send.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/channel_send.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_send.cc 2021-06-27 05:27:48.000000000 +0000 @@ -21,6 +21,7 @@ #include "api/call/transport.h" #include "api/crypto/frame_encryptor_interface.h" #include "api/rtc_event_log/rtc_event_log.h" +#include "api/sequence_checker.h" #include "audio/channel_send_frame_transformer_delegate.h" #include "audio/utility/audio_frame_operations.h" #include "call/rtp_transport_controller_send_interface.h" @@ -41,7 +42,6 @@ #include "rtc_base/rate_limiter.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/task_queue.h" -#include "rtc_base/thread_checker.h" #include "rtc_base/time_utils.h" #include "system_wrappers/include/clock.h" #include "system_wrappers/include/field_trial.h" @@ -179,8 +179,8 @@ // specific threads we know about. The goal is to eventually split up // voe::Channel into parts with single-threaded semantics, and thereby reduce // the need for locks. - rtc::ThreadChecker worker_thread_checker_; - rtc::ThreadChecker module_process_thread_checker_; + SequenceChecker worker_thread_checker_; + SequenceChecker module_process_thread_checker_; // Methods accessed from audio and video threads are checked for sequential- // only access. We don't necessarily own and control these threads, so thread // checkers cannot be used. E.g. Chromium may transfer "ownership" from one @@ -218,8 +218,7 @@ const std::unique_ptr rtp_packet_pacer_proxy_; const std::unique_ptr retransmission_rate_limiter_; - rtc::ThreadChecker construction_thread_; - + SequenceChecker construction_thread_; bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_) = false; @@ -241,6 +240,8 @@ // Defined last to ensure that there are no running tasks when the other // members are destroyed. rtc::TaskQueue encoder_queue_; + + const bool fixing_timestamp_stall_; }; const int kTelephoneEventAttenuationdB = 10; @@ -262,7 +263,7 @@ } private: - rtc::ThreadChecker thread_checker_; + SequenceChecker thread_checker_; Mutex mutex_; RtpPacketSender* rtp_packet_pacer_ RTC_GUARDED_BY(&mutex_); }; @@ -471,7 +472,9 @@ crypto_options_(crypto_options), encoder_queue_(task_queue_factory->CreateTaskQueue( "AudioEncoder", - TaskQueueFactory::Priority::NORMAL)) { + TaskQueueFactory::Priority::NORMAL)), + fixing_timestamp_stall_( + !field_trial::IsDisabled("WebRTC-Audio-FixTimestampStall")) { RTC_DCHECK(module_process_thread); module_process_thread_checker_.Detach(); @@ -746,25 +749,20 @@ // Get the report blocks from the latest received RTCP Sender or Receiver // Report. Each element in the vector contains the sender's SSRC and a // report block according to RFC 3550. - std::vector rtcp_report_blocks; - - int ret = rtp_rtcp_->RemoteRTCPStat(&rtcp_report_blocks); - RTC_DCHECK_EQ(0, ret); - std::vector report_blocks; - - std::vector::const_iterator it = rtcp_report_blocks.begin(); - for (; it != rtcp_report_blocks.end(); ++it) { + for (const ReportBlockData& data : rtp_rtcp_->GetLatestReportBlockData()) { ReportBlock report_block; - report_block.sender_SSRC = it->sender_ssrc; - report_block.source_SSRC = it->source_ssrc; - report_block.fraction_lost = it->fraction_lost; - report_block.cumulative_num_packets_lost = it->packets_lost; + report_block.sender_SSRC = data.report_block().sender_ssrc; + report_block.source_SSRC = data.report_block().source_ssrc; + report_block.fraction_lost = data.report_block().fraction_lost; + report_block.cumulative_num_packets_lost = data.report_block().packets_lost; report_block.extended_highest_sequence_number = - it->extended_highest_sequence_number; - report_block.interarrival_jitter = it->jitter; - report_block.last_SR_timestamp = it->last_sender_report_timestamp; - report_block.delay_since_last_SR = it->delay_since_last_sender_report; + data.report_block().extended_highest_sequence_number; + report_block.interarrival_jitter = data.report_block().jitter; + report_block.last_SR_timestamp = + data.report_block().last_sender_report_timestamp; + report_block.delay_since_last_SR = + data.report_block().delay_since_last_sender_report; report_blocks.push_back(report_block); } return report_blocks; @@ -808,6 +806,10 @@ [this, audio_frame = std::move(audio_frame)]() mutable { RTC_DCHECK_RUN_ON(&encoder_queue_); if (!encoder_queue_is_active_) { + if (fixing_timestamp_stall_) { + _timeStamp += + static_cast(audio_frame->samples_per_channel_); + } return; } // Measure time between when the audio frame is added to the task queue @@ -861,24 +863,15 @@ } int64_t ChannelSend::GetRTT() const { - std::vector report_blocks; - rtp_rtcp_->RemoteRTCPStat(&report_blocks); - + std::vector report_blocks = + rtp_rtcp_->GetLatestReportBlockData(); if (report_blocks.empty()) { return 0; } - int64_t rtt = 0; - int64_t avg_rtt = 0; - int64_t max_rtt = 0; - int64_t min_rtt = 0; // We don't know in advance the remote ssrc used by the other end's receiver - // reports, so use the SSRC of the first report block for calculating the RTT. - if (rtp_rtcp_->RTT(report_blocks[0].sender_ssrc, &rtt, &avg_rtt, &min_rtt, - &max_rtt) != 0) { - return 0; - } - return rtt; + // reports, so use the first report block for the RTT. + return report_blocks.front().last_rtt_ms(); } void ChannelSend::SetFrameEncryptor( diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/channel_send_frame_transformer_delegate.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_send_frame_transformer_delegate.h --- libtgowt-0~git20210124.be23804+ds/src/audio/channel_send_frame_transformer_delegate.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/channel_send_frame_transformer_delegate.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,10 +14,10 @@ #include #include "api/frame_transformer_interface.h" +#include "api/sequence_checker.h" #include "modules/audio_coding/include/audio_coding_module_typedefs.h" #include "rtc_base/buffer.h" #include "rtc_base/synchronization/mutex.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/task_queue.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/mock_voe_channel_proxy.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/mock_voe_channel_proxy.h --- libtgowt-0~git20210124.be23804+ds/src/audio/mock_voe_channel_proxy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/mock_voe_channel_proxy.h 2021-06-27 05:27:48.000000000 +0000 @@ -59,6 +59,7 @@ (int sample_rate_hz, AudioFrame*), (override)); MOCK_METHOD(int, PreferredSampleRate, (), (const, override)); + MOCK_METHOD(void, SetSourceTracker, (SourceTracker*), (override)); MOCK_METHOD(void, SetAssociatedSendChannel, (const voe::ChannelSendInterface*), diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/null_audio_poller.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/null_audio_poller.h --- libtgowt-0~git20210124.be23804+ds/src/audio/null_audio_poller.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/null_audio_poller.h 2021-06-27 05:27:48.000000000 +0000 @@ -13,9 +13,9 @@ #include +#include "api/sequence_checker.h" #include "modules/audio_device/include/audio_device_defines.h" #include "rtc_base/message_handler.h" -#include "rtc_base/thread_checker.h" namespace webrtc { namespace internal { @@ -29,7 +29,7 @@ void OnMessage(rtc::Message* msg) override; private: - rtc::ThreadChecker thread_checker_; + SequenceChecker thread_checker_; AudioTransport* const audio_transport_; int64_t reschedule_at_; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/utility/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/audio/utility/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/audio/utility/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/utility/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -26,10 +26,10 @@ "../../api/audio:audio_frame_api", "../../common_audio", "../../rtc_base:checks", - "../../rtc_base:deprecation", "../../rtc_base:rtc_base_approved", "../../system_wrappers:field_trial", ] + absl_deps = [ "//third_party/abseil-cpp/absl/base:core_headers" ] } if (rtc_include_tests) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/utility/audio_frame_operations.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/utility/audio_frame_operations.h --- libtgowt-0~git20210124.be23804+ds/src/audio/utility/audio_frame_operations.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/utility/audio_frame_operations.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,8 +14,8 @@ #include #include +#include "absl/base/attributes.h" #include "api/audio/audio_frame.h" -#include "rtc_base/deprecation.h" namespace webrtc { @@ -36,12 +36,14 @@ // |frame.num_channels_| will be updated. This version checks for sufficient // buffer size and that |num_channels_| is mono. Use UpmixChannels // instead. TODO(bugs.webrtc.org/8649): remove. - RTC_DEPRECATED static int MonoToStereo(AudioFrame* frame); + ABSL_DEPRECATED("bugs.webrtc.org/8649") + static int MonoToStereo(AudioFrame* frame); // |frame.num_channels_| will be updated. This version checks that // |num_channels_| is stereo. Use DownmixChannels // instead. TODO(bugs.webrtc.org/8649): remove. - RTC_DEPRECATED static int StereoToMono(AudioFrame* frame); + ABSL_DEPRECATED("bugs.webrtc.org/8649") + static int StereoToMono(AudioFrame* frame); // Downmixes 4 channels |src_audio| to stereo |dst_audio|. This is an in-place // operation, meaning |src_audio| and |dst_audio| may point to the same diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -67,6 +67,7 @@ "../../api:transport_api", "../../api/audio:audio_mixer_api", "../../api/audio_codecs:audio_codecs_api", + "../../api/voip:voip_api", "../../modules/audio_coding", "../../modules/rtp_rtcp", "../../modules/rtp_rtcp:rtp_rtcp_format", @@ -88,6 +89,7 @@ ] deps = [ "..:audio", + "../../api:sequence_checker", "../../api/audio_codecs:audio_codecs_api", "../../api/task_queue", "../../call:audio_sender_interface", @@ -96,7 +98,6 @@ "../../modules/rtp_rtcp:rtp_rtcp_format", "../../rtc_base:logging", "../../rtc_base:rtc_task_queue", - "../../rtc_base:thread_checker", "../../rtc_base:timeutils", "../../rtc_base/synchronization:mutex", "../../rtc_base/system:no_unique_address", diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_channel.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_channel.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_channel.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_channel.cc 2021-06-27 05:27:48.000000000 +0000 @@ -79,6 +79,12 @@ } audio_mixer_->RemoveSource(ingress_.get()); + + // AudioEgress could hold current global TaskQueueBase that we need to clear + // before ProcessThread::DeRegisterModule. + egress_.reset(); + ingress_.reset(); + process_thread_->DeRegisterModule(rtp_rtcp_.get()); } @@ -159,4 +165,17 @@ return ingress_stats; } +ChannelStatistics AudioChannel::GetChannelStatistics() { + ChannelStatistics channel_stat = ingress_->GetChannelStatistics(); + + StreamDataCounters rtp_stats, rtx_stats; + rtp_rtcp_->GetSendStreamDataCounters(&rtp_stats, &rtx_stats); + channel_stat.bytes_sent = + rtp_stats.transmitted.payload_bytes + rtx_stats.transmitted.payload_bytes; + channel_stat.packets_sent = + rtp_stats.transmitted.packets + rtx_stats.transmitted.packets; + + return channel_stat; +} + } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_channel.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_channel.h --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_channel.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_channel.h 2021-06-27 05:27:48.000000000 +0000 @@ -84,6 +84,7 @@ ingress_->SetReceiveCodecs(codecs); } IngressStatistics GetIngressStatistics(); + ChannelStatistics GetChannelStatistics(); // See comments on the methods used from AudioEgress and AudioIngress. // Conversion to double is following what is done in @@ -106,6 +107,12 @@ return ingress_->GetOutputTotalDuration(); } + // Internal API for testing purpose. + void SendRTCPReportForTesting(RTCPPacketType type) { + int32_t result = rtp_rtcp_->SendRTCP(type); + RTC_DCHECK(result == 0); + } + private: // ChannelId that this audio channel belongs for logging purpose. ChannelId id_; diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_egress.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_egress.h --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_egress.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_egress.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,6 +15,7 @@ #include #include "api/audio_codecs/audio_format.h" +#include "api/sequence_checker.h" #include "api/task_queue/task_queue_factory.h" #include "audio/audio_level.h" #include "audio/utility/audio_frame_operations.h" @@ -25,7 +26,6 @@ #include "modules/rtp_rtcp/source/rtp_sender_audio.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/task_queue.h" -#include "rtc_base/thread_checker.h" #include "rtc_base/time_utils.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_ingress.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_ingress.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_ingress.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_ingress.cc 2021-06-27 05:27:48.000000000 +0000 @@ -17,6 +17,10 @@ #include "api/audio_codecs/audio_format.h" #include "audio/utility/audio_frame_operations.h" #include "modules/audio_coding/include/audio_coding_module.h" +#include "modules/rtp_rtcp/source/byte_io.h" +#include "modules/rtp_rtcp/source/rtcp_packet/common_header.h" +#include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" +#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" #include "rtc_base/logging.h" #include "rtc_base/numerics/safe_minmax.h" @@ -153,6 +157,12 @@ rtp_packet_received.set_payload_type_frequency(it->second); } + // Track current remote SSRC. + if (rtp_packet_received.Ssrc() != remote_ssrc_) { + rtp_rtcp_->SetRemoteSSRC(rtp_packet_received.Ssrc()); + remote_ssrc_.store(rtp_packet_received.Ssrc()); + } + rtp_receive_statistics_->OnRtpPacket(rtp_packet_received); RTPHeader header; @@ -181,11 +191,28 @@ void AudioIngress::ReceivedRTCPPacket( rtc::ArrayView rtcp_packet) { - // Deliver RTCP packet to RTP/RTCP module for parsing. + rtcp::CommonHeader rtcp_header; + if (rtcp_header.Parse(rtcp_packet.data(), rtcp_packet.size()) && + (rtcp_header.type() == rtcp::SenderReport::kPacketType || + rtcp_header.type() == rtcp::ReceiverReport::kPacketType)) { + RTC_DCHECK_GE(rtcp_packet.size(), 8); + + uint32_t sender_ssrc = + ByteReader::ReadBigEndian(rtcp_packet.data() + 4); + + // If we don't have remote ssrc at this point, it's likely that remote + // endpoint is receive-only or it could have restarted the media. + if (sender_ssrc != remote_ssrc_) { + rtp_rtcp_->SetRemoteSSRC(sender_ssrc); + remote_ssrc_.store(sender_ssrc); + } + } + + // Deliver RTCP packet to RTP/RTCP module for parsing and processing. rtp_rtcp_->IncomingRtcpPacket(rtcp_packet.data(), rtcp_packet.size()); - absl::optional rtt = GetRoundTripTime(); - if (!rtt.has_value()) { + int64_t rtt = 0; + if (rtp_rtcp_->RTT(remote_ssrc_, &rtt, nullptr, nullptr, nullptr) != 0) { // Waiting for valid RTT. return; } @@ -199,38 +226,69 @@ { MutexLock lock(&lock_); - ntp_estimator_.UpdateRtcpTimestamp(*rtt, ntp_secs, ntp_frac, rtp_timestamp); + ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp); } } -absl::optional AudioIngress::GetRoundTripTime() { - const std::vector& report_data = - rtp_rtcp_->GetLatestReportBlockData(); - - // If we do not have report block which means remote RTCP hasn't be received - // yet, return -1 as to indicate uninitialized value. - if (report_data.empty()) { - return absl::nullopt; - } - - // We don't know in advance the remote SSRC used by the other end's receiver - // reports, so use the SSRC of the first report block as remote SSRC for now. - // TODO(natim@webrtc.org): handle the case where remote end is changing ssrc - // and update accordingly here. - const ReportBlockData& block_data = report_data[0]; - - const uint32_t sender_ssrc = block_data.report_block().sender_ssrc; +ChannelStatistics AudioIngress::GetChannelStatistics() { + ChannelStatistics channel_stats; - if (sender_ssrc != remote_ssrc_.load()) { - remote_ssrc_.store(sender_ssrc); - rtp_rtcp_->SetRemoteSSRC(sender_ssrc); + // Get clockrate for current decoder ahead of jitter calculation. + uint32_t clockrate_hz = 0; + absl::optional> decoder = + acm_receiver_.LastDecoder(); + if (decoder) { + clockrate_hz = decoder->second.clockrate_hz; + } + + StreamStatistician* statistician = + rtp_receive_statistics_->GetStatistician(remote_ssrc_); + if (statistician) { + RtpReceiveStats stats = statistician->GetStats(); + channel_stats.packets_lost = stats.packets_lost; + channel_stats.packets_received = stats.packet_counter.packets; + channel_stats.bytes_received = stats.packet_counter.payload_bytes; + channel_stats.remote_ssrc = remote_ssrc_; + if (clockrate_hz > 0) { + channel_stats.jitter = static_cast(stats.jitter) / clockrate_hz; + } } - if (!block_data.has_rtt()) { - return absl::nullopt; + // Get RTCP report using remote SSRC. + const std::vector& report_data = + rtp_rtcp_->GetLatestReportBlockData(); + for (const ReportBlockData& block_data : report_data) { + const RTCPReportBlock& rtcp_report = block_data.report_block(); + if (rtp_rtcp_->SSRC() != rtcp_report.source_ssrc || + remote_ssrc_ != rtcp_report.sender_ssrc) { + continue; + } + RemoteRtcpStatistics remote_stat; + remote_stat.packets_lost = rtcp_report.packets_lost; + remote_stat.fraction_lost = + static_cast(rtcp_report.fraction_lost) / (1 << 8); + if (clockrate_hz > 0) { + remote_stat.jitter = + static_cast(rtcp_report.jitter) / clockrate_hz; + } + if (block_data.has_rtt()) { + remote_stat.round_trip_time = + static_cast(block_data.last_rtt_ms()) / + rtc::kNumMillisecsPerSec; + } + remote_stat.last_report_received_timestamp_ms = + block_data.report_block_timestamp_utc_us() / + rtc::kNumMicrosecsPerMillisec; + channel_stats.remote_rtcp = remote_stat; + + // Receive only channel won't send any RTP packets. + if (!channel_stats.remote_ssrc.has_value()) { + channel_stats.remote_ssrc = remote_ssrc_; + } + break; } - return block_data.last_rtt_ms(); + return channel_stats; } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_ingress.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_ingress.h --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/audio_ingress.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/audio_ingress.h 2021-06-27 05:27:48.000000000 +0000 @@ -22,6 +22,7 @@ #include "api/audio/audio_mixer.h" #include "api/rtp_headers.h" #include "api/scoped_refptr.h" +#include "api/voip/voip_statistics.h" #include "audio/audio_level.h" #include "modules/audio_coding/acm2/acm_receiver.h" #include "modules/audio_coding/include/audio_coding_module.h" @@ -86,6 +87,8 @@ return stats; } + ChannelStatistics GetChannelStatistics(); + // Implementation of AudioMixer::Source interface. AudioMixer::Source::AudioFrameInfo GetAudioFrameWithInfo( int sampling_rate, @@ -102,10 +105,6 @@ } private: - // Returns network round trip time (RTT) measued by RTCP exchange with - // remote media endpoint. Returns absl::nullopt when it's not initialized. - absl::optional GetRoundTripTime(); - // Indicates AudioIngress status as caller invokes Start/StopPlaying. // If not playing, incoming RTP data processing is skipped, thus // producing no data to output device. diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -9,39 +9,51 @@ import("../../../webrtc.gni") if (rtc_include_tests) { - rtc_library("voip_core_unittests") { + rtc_source_set("mock_task_queue") { testonly = true - sources = [ "voip_core_unittest.cc" ] + visibility = [ "*" ] + sources = [ "mock_task_queue.h" ] deps = [ - "..:voip_core", - "../../../api/audio_codecs:builtin_audio_decoder_factory", - "../../../api/audio_codecs:builtin_audio_encoder_factory", - "../../../api/task_queue:default_task_queue_factory", - "../../../modules/audio_device:mock_audio_device", - "../../../modules/audio_processing:mocks", - "../../../modules/utility:mock_process_thread", - "../../../test:audio_codec_mocks", - "../../../test:mock_transport", + "../../../api/task_queue:task_queue", "../../../test:test_support", ] } + if (!build_with_chromium) { + rtc_library("voip_core_unittests") { + testonly = true + sources = [ "voip_core_unittest.cc" ] + deps = [ + "..:voip_core", + "../../../api/audio_codecs:builtin_audio_decoder_factory", + "../../../api/audio_codecs:builtin_audio_encoder_factory", + "../../../api/task_queue:default_task_queue_factory", + "../../../modules/audio_device:mock_audio_device", + "../../../modules/audio_processing:mocks", + "../../../modules/utility:mock_process_thread", + "../../../test:audio_codec_mocks", + "../../../test:mock_transport", + "../../../test:test_support", + ] + } + } + rtc_library("audio_channel_unittests") { testonly = true sources = [ "audio_channel_unittest.cc" ] deps = [ + ":mock_task_queue", "..:audio_channel", "../../../api:transport_api", "../../../api/audio_codecs:builtin_audio_decoder_factory", "../../../api/audio_codecs:builtin_audio_encoder_factory", - "../../../api/task_queue:default_task_queue_factory", + "../../../api/task_queue:task_queue", "../../../modules/audio_mixer:audio_mixer_impl", "../../../modules/audio_mixer:audio_mixer_test_utils", "../../../modules/rtp_rtcp:rtp_rtcp", "../../../modules/rtp_rtcp:rtp_rtcp_format", "../../../modules/utility", "../../../rtc_base:logging", - "../../../rtc_base:rtc_event", "../../../test:mock_transport", "../../../test:test_support", ] diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/audio_channel_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/audio_channel_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/audio_channel_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/audio_channel_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -12,12 +12,12 @@ #include "api/audio_codecs/builtin_audio_decoder_factory.h" #include "api/audio_codecs/builtin_audio_encoder_factory.h" #include "api/call/transport.h" -#include "api/task_queue/default_task_queue_factory.h" +#include "api/task_queue/task_queue_factory.h" +#include "audio/voip/test/mock_task_queue.h" #include "modules/audio_mixer/audio_mixer_impl.h" #include "modules/audio_mixer/sine_wave_generator.h" #include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "modules/utility/include/process_thread.h" -#include "rtc_base/event.h" #include "rtc_base/logging.h" #include "test/gmock.h" #include "test/gtest.h" @@ -28,6 +28,7 @@ using ::testing::Invoke; using ::testing::NiceMock; +using ::testing::Return; using ::testing::Unused; constexpr uint64_t kStartTime = 123456789; @@ -41,30 +42,39 @@ AudioChannelTest() : fake_clock_(kStartTime), wave_generator_(1000.0, kAudioLevel) { + task_queue_factory_ = std::make_unique(&task_queue_); process_thread_ = ProcessThread::Create("ModuleProcessThread"); audio_mixer_ = AudioMixerImpl::Create(); - task_queue_factory_ = CreateDefaultTaskQueueFactory(); encoder_factory_ = CreateBuiltinAudioEncoderFactory(); decoder_factory_ = CreateBuiltinAudioDecoderFactory(); - } - void SetUp() override { - audio_channel_ = new rtc::RefCountedObject( - &transport_, kLocalSsrc, task_queue_factory_.get(), - process_thread_.get(), audio_mixer_.get(), decoder_factory_); - - audio_channel_->SetEncoder(kPcmuPayload, kPcmuFormat, - encoder_factory_->MakeAudioEncoder( - kPcmuPayload, kPcmuFormat, absl::nullopt)); - audio_channel_->SetReceiveCodecs({{kPcmuPayload, kPcmuFormat}}); - audio_channel_->StartSend(); - audio_channel_->StartPlay(); + // By default, run the queued task immediately. + ON_CALL(task_queue_, PostTask) + .WillByDefault( + Invoke([&](std::unique_ptr task) { task->Run(); })); } - void TearDown() override { - audio_channel_->StopSend(); - audio_channel_->StopPlay(); - audio_channel_ = nullptr; + void SetUp() override { audio_channel_ = CreateAudioChannel(kLocalSsrc); } + + void TearDown() override { audio_channel_ = nullptr; } + + rtc::scoped_refptr CreateAudioChannel(uint32_t ssrc) { + // Use same audio mixer here for simplicity sake as we are not checking + // audio activity of RTP in our testcases. If we need to do test on audio + // signal activity then we need to assign audio mixer for each channel. + // Also this uses the same transport object for different audio channel to + // simplify network routing logic. + rtc::scoped_refptr audio_channel = + new rtc::RefCountedObject( + &transport_, ssrc, task_queue_factory_.get(), process_thread_.get(), + audio_mixer_.get(), decoder_factory_); + audio_channel->SetEncoder(kPcmuPayload, kPcmuFormat, + encoder_factory_->MakeAudioEncoder( + kPcmuPayload, kPcmuFormat, absl::nullopt)); + audio_channel->SetReceiveCodecs({{kPcmuPayload, kPcmuFormat}}); + audio_channel->StartSend(); + audio_channel->StartPlay(); + return audio_channel; } std::unique_ptr GetAudioFrame(int order) { @@ -80,6 +90,7 @@ SimulatedClock fake_clock_; SineWaveGenerator wave_generator_; NiceMock transport_; + NiceMock task_queue_; std::unique_ptr task_queue_factory_; rtc::scoped_refptr audio_mixer_; rtc::scoped_refptr decoder_factory_; @@ -92,11 +103,9 @@ // Resulted RTP packet is looped back into AudioChannel and gets decoded into // audio frame to see if it has some signal to indicate its validity. TEST_F(AudioChannelTest, PlayRtpByLocalLoop) { - rtc::Event event; auto loop_rtp = [&](const uint8_t* packet, size_t length, Unused) { audio_channel_->ReceivedRTPPacket( rtc::ArrayView(packet, length)); - event.Set(); return true; }; EXPECT_CALL(transport_, SendRtp).WillOnce(Invoke(loop_rtp)); @@ -105,8 +114,6 @@ audio_sender->SendAudioData(GetAudioFrame(0)); audio_sender->SendAudioData(GetAudioFrame(1)); - event.Wait(/*ms=*/1000); - AudioFrame empty_frame, audio_frame; empty_frame.Mute(); empty_frame.mutable_data(); // This will zero out the data. @@ -122,10 +129,8 @@ // Validate assigned local SSRC is resulted in RTP packet. TEST_F(AudioChannelTest, VerifyLocalSsrcAsAssigned) { RtpPacketReceived rtp; - rtc::Event event; auto loop_rtp = [&](const uint8_t* packet, size_t length, Unused) { rtp.Parse(packet, length); - event.Set(); return true; }; EXPECT_CALL(transport_, SendRtp).WillOnce(Invoke(loop_rtp)); @@ -134,18 +139,14 @@ audio_sender->SendAudioData(GetAudioFrame(0)); audio_sender->SendAudioData(GetAudioFrame(1)); - event.Wait(/*ms=*/1000); - EXPECT_EQ(rtp.Ssrc(), kLocalSsrc); } // Check metrics after processing an RTP packet. TEST_F(AudioChannelTest, TestIngressStatistics) { - auto event = std::make_unique(); auto loop_rtp = [&](const uint8_t* packet, size_t length, Unused) { audio_channel_->ReceivedRTPPacket( rtc::ArrayView(packet, length)); - event->Set(); return true; }; EXPECT_CALL(transport_, SendRtp).WillRepeatedly(Invoke(loop_rtp)); @@ -153,7 +154,6 @@ auto audio_sender = audio_channel_->GetAudioSender(); audio_sender->SendAudioData(GetAudioFrame(0)); audio_sender->SendAudioData(GetAudioFrame(1)); - event->Wait(/*give_up_after_ms=*/1000); AudioFrame audio_frame; audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); @@ -182,10 +182,8 @@ audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); // Send another RTP packet to intentionally break PLC. - event = std::make_unique(); audio_sender->SendAudioData(GetAudioFrame(2)); audio_sender->SendAudioData(GetAudioFrame(3)); - event->Wait(/*give_up_after_ms=*/1000); ingress_stats = audio_channel_->GetIngressStatistics(); EXPECT_TRUE(ingress_stats); @@ -222,5 +220,139 @@ EXPECT_DOUBLE_EQ(ingress_stats->total_duration, 0.06); } +// Check ChannelStatistics metric after processing RTP and RTCP packets. +TEST_F(AudioChannelTest, TestChannelStatistics) { + auto loop_rtp = [&](const uint8_t* packet, size_t length, Unused) { + audio_channel_->ReceivedRTPPacket( + rtc::ArrayView(packet, length)); + return true; + }; + auto loop_rtcp = [&](const uint8_t* packet, size_t length) { + audio_channel_->ReceivedRTCPPacket( + rtc::ArrayView(packet, length)); + return true; + }; + EXPECT_CALL(transport_, SendRtp).WillRepeatedly(Invoke(loop_rtp)); + EXPECT_CALL(transport_, SendRtcp).WillRepeatedly(Invoke(loop_rtcp)); + + // Simulate microphone giving audio frame (10 ms). This will trigger tranport + // to send RTP as handled in loop_rtp above. + auto audio_sender = audio_channel_->GetAudioSender(); + audio_sender->SendAudioData(GetAudioFrame(0)); + audio_sender->SendAudioData(GetAudioFrame(1)); + + // Simulate speaker requesting audio frame (10 ms). This will trigger VoIP + // engine to fetch audio samples from RTP packets stored in jitter buffer. + AudioFrame audio_frame; + audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); + audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); + + // Force sending RTCP SR report in order to have remote_rtcp field available + // in channel statistics. This will trigger tranport to send RTCP as handled + // in loop_rtcp above. + audio_channel_->SendRTCPReportForTesting(kRtcpSr); + + absl::optional channel_stats = + audio_channel_->GetChannelStatistics(); + EXPECT_TRUE(channel_stats); + + EXPECT_EQ(channel_stats->packets_sent, 1ULL); + EXPECT_EQ(channel_stats->bytes_sent, 160ULL); + + EXPECT_EQ(channel_stats->packets_received, 1ULL); + EXPECT_EQ(channel_stats->bytes_received, 160ULL); + EXPECT_EQ(channel_stats->jitter, 0); + EXPECT_EQ(channel_stats->packets_lost, 0); + EXPECT_EQ(channel_stats->remote_ssrc.value(), kLocalSsrc); + + EXPECT_TRUE(channel_stats->remote_rtcp.has_value()); + + EXPECT_EQ(channel_stats->remote_rtcp->jitter, 0); + EXPECT_EQ(channel_stats->remote_rtcp->packets_lost, 0); + EXPECT_EQ(channel_stats->remote_rtcp->fraction_lost, 0); + EXPECT_GT(channel_stats->remote_rtcp->last_report_received_timestamp_ms, 0); + EXPECT_FALSE(channel_stats->remote_rtcp->round_trip_time.has_value()); +} + +// Check ChannelStatistics RTT metric after processing RTP and RTCP packets +// using three audio channels where each represents media endpoint. +// +// 1) AC1 <- RTP/RTCP -> AC2 +// 2) AC1 <- RTP/RTCP -> AC3 +// +// During step 1), AC1 should be able to check RTT from AC2's SSRC. +// During step 2), AC1 should be able to check RTT from AC3's SSRC. +TEST_F(AudioChannelTest, RttIsAvailableAfterChangeOfRemoteSsrc) { + // Create AC2 and AC3. + constexpr uint32_t kAc2Ssrc = 0xdeadbeef; + constexpr uint32_t kAc3Ssrc = 0xdeafbeef; + + auto ac_2 = CreateAudioChannel(kAc2Ssrc); + auto ac_3 = CreateAudioChannel(kAc3Ssrc); + + auto send_recv_rtp = [&](rtc::scoped_refptr rtp_sender, + rtc::scoped_refptr rtp_receiver) { + // Setup routing logic via transport_. + auto route_rtp = [&](const uint8_t* packet, size_t length, Unused) { + rtp_receiver->ReceivedRTPPacket(rtc::MakeArrayView(packet, length)); + return true; + }; + ON_CALL(transport_, SendRtp).WillByDefault(route_rtp); + + // This will trigger route_rtp callback via transport_. + rtp_sender->GetAudioSender()->SendAudioData(GetAudioFrame(0)); + rtp_sender->GetAudioSender()->SendAudioData(GetAudioFrame(1)); + + // Process received RTP in receiver. + AudioFrame audio_frame; + audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); + audio_mixer_->Mix(/*number_of_channels=*/1, &audio_frame); + + // Revert to default to avoid using reference in route_rtp lambda. + ON_CALL(transport_, SendRtp).WillByDefault(Return(true)); + }; + + auto send_recv_rtcp = [&](rtc::scoped_refptr rtcp_sender, + rtc::scoped_refptr rtcp_receiver) { + // Setup routing logic via transport_. + auto route_rtcp = [&](const uint8_t* packet, size_t length) { + rtcp_receiver->ReceivedRTCPPacket(rtc::MakeArrayView(packet, length)); + return true; + }; + ON_CALL(transport_, SendRtcp).WillByDefault(route_rtcp); + + // This will trigger route_rtcp callback via transport_. + rtcp_sender->SendRTCPReportForTesting(kRtcpSr); + + // Revert to default to avoid using reference in route_rtcp lambda. + ON_CALL(transport_, SendRtcp).WillByDefault(Return(true)); + }; + + // AC1 <-- RTP/RTCP --> AC2 + send_recv_rtp(audio_channel_, ac_2); + send_recv_rtp(ac_2, audio_channel_); + send_recv_rtcp(audio_channel_, ac_2); + send_recv_rtcp(ac_2, audio_channel_); + + absl::optional channel_stats = + audio_channel_->GetChannelStatistics(); + ASSERT_TRUE(channel_stats); + EXPECT_EQ(channel_stats->remote_ssrc, kAc2Ssrc); + ASSERT_TRUE(channel_stats->remote_rtcp); + EXPECT_GT(channel_stats->remote_rtcp->round_trip_time, 0.0); + + // AC1 <-- RTP/RTCP --> AC3 + send_recv_rtp(audio_channel_, ac_3); + send_recv_rtp(ac_3, audio_channel_); + send_recv_rtcp(audio_channel_, ac_3); + send_recv_rtcp(ac_3, audio_channel_); + + channel_stats = audio_channel_->GetChannelStatistics(); + ASSERT_TRUE(channel_stats); + EXPECT_EQ(channel_stats->remote_ssrc, kAc3Ssrc); + ASSERT_TRUE(channel_stats->remote_rtcp); + EXPECT_GT(channel_stats->remote_rtcp->round_trip_time, 0.0); +} + } // namespace } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/mock_task_queue.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/mock_task_queue.h --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/test/mock_task_queue.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/test/mock_task_queue.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_ +#define AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_ + +#include + +#include "api/task_queue/task_queue_factory.h" +#include "test/gmock.h" + +namespace webrtc { + +// MockTaskQueue enables immediate task run from global TaskQueueBase. +// It's necessary for some tests depending on TaskQueueBase internally. +class MockTaskQueue : public TaskQueueBase { + public: + MockTaskQueue() : current_(this) {} + + // Delete is deliberately defined as no-op as MockTaskQueue is expected to + // hold onto current global TaskQueueBase throughout the testing. + void Delete() override {} + + MOCK_METHOD(void, PostTask, (std::unique_ptr), (override)); + MOCK_METHOD(void, + PostDelayedTask, + (std::unique_ptr, uint32_t), + (override)); + + private: + CurrentTaskQueueSetter current_; +}; + +class MockTaskQueueFactory : public TaskQueueFactory { + public: + explicit MockTaskQueueFactory(MockTaskQueue* task_queue) + : task_queue_(task_queue) {} + + std::unique_ptr CreateTaskQueue( + absl::string_view name, + Priority priority) const override { + // Default MockTaskQueue::Delete is no-op, therefore it's safe to pass the + // raw pointer. + return std::unique_ptr(task_queue_); + } + + private: + MockTaskQueue* task_queue_; +}; + +} // namespace webrtc + +#endif // AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/voip_core.cc libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/voip_core.cc --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/voip_core.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/voip_core.cc 2021-06-27 05:27:48.000000000 +0000 @@ -458,6 +458,19 @@ return VoipResult::kOk; } +VoipResult VoipCore::GetChannelStatistics(ChannelId channel_id, + ChannelStatistics& channel_stats) { + rtc::scoped_refptr channel = GetChannel(channel_id); + + if (!channel) { + return VoipResult::kInvalidArgument; + } + + channel_stats = channel->GetChannelStatistics(); + + return VoipResult::kOk; +} + VoipResult VoipCore::SetInputMuted(ChannelId channel_id, bool enable) { rtc::scoped_refptr channel = GetChannel(channel_id); diff -Nru libtgowt-0~git20210124.be23804+ds/src/audio/voip/voip_core.h libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/voip_core.h --- libtgowt-0~git20210124.be23804+ds/src/audio/voip/voip_core.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/audio/voip/voip_core.h 2021-06-27 05:27:48.000000000 +0000 @@ -109,6 +109,8 @@ // Implements VoipStatistics interfaces. VoipResult GetIngressStatistics(ChannelId channel_id, IngressStatistics& ingress_stats) override; + VoipResult GetChannelStatistics(ChannelId channe_id, + ChannelStatistics& channel_stats) override; // Implements VoipVolumeControl interfaces. VoipResult SetInputMuted(ChannelId channel_id, bool enable) override; diff -Nru libtgowt-0~git20210124.be23804+ds/src/base/compiler_specific.h libtgowt-0~git20210627.91d836d+dfsg/src/base/compiler_specific.h --- libtgowt-0~git20210124.be23804+ds/src/base/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/base/compiler_specific.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,308 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_COMPILER_SPECIFIC_H_ +#define BASE_COMPILER_SPECIFIC_H_ + +#include "build/build_config.h" + +#if defined(COMPILER_MSVC) && !defined(__clang__) +#error "Only clang-cl is supported on Windows, see https://crbug.com/988071" +#endif + +// Annotate a variable indicating it's ok if the variable is not used. +// (Typically used to silence a compiler warning when the assignment +// is important for some other reason.) +// Use like: +// int x = ...; +// ALLOW_UNUSED_LOCAL(x); +#define ALLOW_UNUSED_LOCAL(x) (void)x + +// Annotate a typedef or function indicating it's ok if it's not used. +// Use like: +// typedef Foo Bar ALLOW_UNUSED_TYPE; +#if defined(COMPILER_GCC) || defined(__clang__) +#define ALLOW_UNUSED_TYPE __attribute__((unused)) +#else +#define ALLOW_UNUSED_TYPE +#endif + +// Annotate a function indicating it should not be inlined. +// Use like: +// NOINLINE void DoStuff() { ... } +#if defined(COMPILER_GCC) +#define NOINLINE __attribute__((noinline)) +#elif defined(COMPILER_MSVC) +#define NOINLINE __declspec(noinline) +#else +#define NOINLINE +#endif + +#if defined(COMPILER_GCC) && defined(NDEBUG) +#define ALWAYS_INLINE inline __attribute__((__always_inline__)) +#elif defined(COMPILER_MSVC) && defined(NDEBUG) +#define ALWAYS_INLINE __forceinline +#else +#define ALWAYS_INLINE inline +#endif + +// Annotate a function indicating it should never be tail called. Useful to make +// sure callers of the annotated function are never omitted from call-stacks. +// To provide the complementary behavior (prevent the annotated function from +// being omitted) look at NOINLINE. Also note that this doesn't prevent code +// folding of multiple identical caller functions into a single signature. To +// prevent code folding, see base::debug::Alias. +// Use like: +// void NOT_TAIL_CALLED FooBar(); +#if defined(__clang__) && __has_attribute(not_tail_called) +#define NOT_TAIL_CALLED __attribute__((not_tail_called)) +#else +#define NOT_TAIL_CALLED +#endif + +// Specify memory alignment for structs, classes, etc. +// Use like: +// class ALIGNAS(16) MyClass { ... } +// ALIGNAS(16) int array[4]; +// +// In most places you can use the C++11 keyword "alignas", which is preferred. +// +// But compilers have trouble mixing __attribute__((...)) syntax with +// alignas(...) syntax. +// +// Doesn't work in clang or gcc: +// struct alignas(16) __attribute__((packed)) S { char c; }; +// Works in clang but not gcc: +// struct __attribute__((packed)) alignas(16) S2 { char c; }; +// Works in clang and gcc: +// struct alignas(16) S3 { char c; } __attribute__((packed)); +// +// There are also some attributes that must be specified *before* a class +// definition: visibility (used for exporting functions/classes) is one of +// these attributes. This means that it is not possible to use alignas() with a +// class that is marked as exported. +#if defined(COMPILER_MSVC) +#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) +#elif defined(COMPILER_GCC) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#endif + +// Annotate a function indicating the caller must examine the return value. +// Use like: +// int foo() WARN_UNUSED_RESULT; +// To explicitly ignore a result, see |ignore_result()| in base/macros.h. +#undef WARN_UNUSED_RESULT +#if defined(COMPILER_GCC) || defined(__clang__) +#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +#define WARN_UNUSED_RESULT +#endif + +// Tell the compiler a function is using a printf-style format string. +// |format_param| is the one-based index of the format string parameter; +// |dots_param| is the one-based index of the "..." parameter. +// For v*printf functions (which take a va_list), pass 0 for dots_param. +// (This is undocumented but matches what the system C headers do.) +// For member functions, the implicit this parameter counts as index 1. +#if defined(COMPILER_GCC) || defined(__clang__) +#define PRINTF_FORMAT(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#else +#define PRINTF_FORMAT(format_param, dots_param) +#endif + +// WPRINTF_FORMAT is the same, but for wide format strings. +// This doesn't appear to yet be implemented in any compiler. +// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 . +#define WPRINTF_FORMAT(format_param, dots_param) +// If available, it would look like: +// __attribute__((format(wprintf, format_param, dots_param))) + +// Sanitizers annotations. +#if defined(__has_attribute) +#if __has_attribute(no_sanitize) +#define NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#endif +#if !defined(NO_SANITIZE) +#define NO_SANITIZE(what) +#endif + +// MemorySanitizer annotations. +#if defined(MEMORY_SANITIZER) && !defined(OS_NACL) +#include + +// Mark a memory region fully initialized. +// Use this to annotate code that deliberately reads uninitialized data, for +// example a GC scavenging root set pointers from the stack. +#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size) + +// Check a memory region for initializedness, as if it was being used here. +// If any bits are uninitialized, crash with an MSan report. +// Use this to sanitize data which MSan won't be able to track, e.g. before +// passing data to another process via shared memory. +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \ + __msan_check_mem_is_initialized(p, size) +#else // MEMORY_SANITIZER +#define MSAN_UNPOISON(p, size) +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) +#endif // MEMORY_SANITIZER + +// DISABLE_CFI_PERF -- Disable Control Flow Integrity for perf reasons. +#if !defined(DISABLE_CFI_PERF) +#if defined(__clang__) && defined(OFFICIAL_BUILD) +#define DISABLE_CFI_PERF __attribute__((no_sanitize("cfi"))) +#else +#define DISABLE_CFI_PERF +#endif +#endif + +// DISABLE_CFI_ICALL -- Disable Control Flow Integrity indirect call checks. +#if !defined(DISABLE_CFI_ICALL) +#if defined(OS_WIN) +// Windows also needs __declspec(guard(nocf)). +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") __declspec(guard(nocf)) +#else +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") +#endif +#endif +#if !defined(DISABLE_CFI_ICALL) +#define DISABLE_CFI_ICALL +#endif + +// Macro useful for writing cross-platform function pointers. +#if !defined(CDECL) +#if defined(OS_WIN) +#define CDECL __cdecl +#else // defined(OS_WIN) +#define CDECL +#endif // defined(OS_WIN) +#endif // !defined(CDECL) + +// Macro for hinting that an expression is likely to be false. +#if !defined(UNLIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define UNLIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(UNLIKELY) + +#if !defined(LIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define LIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(LIKELY) + +// Compiler feature-detection. +// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension +#if defined(__has_feature) +#define HAS_FEATURE(FEATURE) __has_feature(FEATURE) +#else +#define HAS_FEATURE(FEATURE) 0 +#endif + +// Macro for telling -Wimplicit-fallthrough that a fallthrough is intentional. +#if defined(__clang__) +#define FALLTHROUGH [[clang::fallthrough]] +#else +#define FALLTHROUGH +#endif + +#if defined(COMPILER_GCC) +#define PRETTY_FUNCTION __PRETTY_FUNCTION__ +#elif defined(COMPILER_MSVC) +#define PRETTY_FUNCTION __FUNCSIG__ +#else +// See https://en.cppreference.com/w/c/language/function_definition#func +#define PRETTY_FUNCTION __func__ +#endif + +#if !defined(CPU_ARM_NEON) +#if defined(__arm__) +#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \ + !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID) +#error Chromium does not support middle endian architecture +#endif +#if defined(__ARM_NEON__) +#define CPU_ARM_NEON 1 +#endif +#endif // defined(__arm__) +#endif // !defined(CPU_ARM_NEON) + +#if !defined(HAVE_MIPS_MSA_INTRINSICS) +#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) +#define HAVE_MIPS_MSA_INTRINSICS 1 +#endif +#endif + +#if defined(__clang__) && __has_attribute(uninitialized) +// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for +// the specified variable. +// Library-wide alternative is +// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn +// file. +// +// See "init_stack_vars" in build/config/compiler/BUILD.gn and +// http://crbug.com/977230 +// "init_stack_vars" is enabled for non-official builds and we hope to enable it +// in official build in 2020 as well. The flag writes fixed pattern into +// uninitialized parts of all local variables. In rare cases such initialization +// is undesirable and attribute can be used: +// 1. Degraded performance +// In most cases compiler is able to remove additional stores. E.g. if memory is +// never accessed or properly initialized later. Preserved stores mostly will +// not affect program performance. However if compiler failed on some +// performance critical code we can get a visible regression in a benchmark. +// 2. memset, memcpy calls +// Compiler may replaces some memory writes with memset or memcpy calls. This is +// not -ftrivial-auto-var-init specific, but it can happen more likely with the +// flag. It can be a problem if code is not linked with C run-time library. +// +// Note: The flag is security risk mitigation feature. So in future the +// attribute uses should be avoided when possible. However to enable this +// mitigation on the most of the code we need to be less strict now and minimize +// number of exceptions later. So if in doubt feel free to use attribute, but +// please document the problem for someone who is going to cleanup it later. +// E.g. platform, bot, benchmark or test name in patch description or next to +// the attribute. +#define STACK_UNINITIALIZED __attribute__((uninitialized)) +#else +#define STACK_UNINITIALIZED +#endif + +// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints +// to Clang which control what code paths are statically analyzed, +// and is meant to be used in conjunction with assert & assert-like functions. +// The expression is passed straight through if analysis isn't enabled. +// +// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current +// codepath and any other branching codepaths that might follow. +#if defined(__clang_analyzer__) + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +inline constexpr bool AnalyzerAssumeTrue(bool arg) { + // AnalyzerNoReturn() is invoked and analysis is terminated if |arg| is + // false. + return arg || AnalyzerNoReturn(); +} + +#define ANALYZER_ASSUME_TRUE(arg) ::AnalyzerAssumeTrue(!!(arg)) +#define ANALYZER_SKIP_THIS_PATH() static_cast(::AnalyzerNoReturn()) +#define ANALYZER_ALLOW_UNUSED(var) static_cast(var); + +#else // !defined(__clang_analyzer__) + +#define ANALYZER_ASSUME_TRUE(arg) (arg) +#define ANALYZER_SKIP_THIS_PATH() +#define ANALYZER_ALLOW_UNUSED(var) static_cast(var); + +#endif // defined(__clang_analyzer__) + +#endif // BASE_COMPILER_SPECIFIC_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/build/build_config.h libtgowt-0~git20210627.91d836d+dfsg/src/build/build_config.h --- libtgowt-0~git20210124.be23804+ds/src/build/build_config.h 1970-01-01 00:00:00.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/build/build_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -0,0 +1,232 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file adds defines about the platform we're currently building on. +// +// Operating System: +// OS_AIX / OS_ANDROID / OS_ASMJS / OS_FREEBSD / OS_FUCHSIA / OS_IOS / +// OS_LINUX / OS_MAC / OS_NACL (SFI or NONSFI) / OS_NETBSD / OS_OPENBSD / +// OS_QNX / OS_SOLARIS / OS_WIN +// Operating System family: +// OS_APPLE: IOS or MAC +// OS_BSD: FREEBSD or NETBSD or OPENBSD +// OS_POSIX: AIX or ANDROID or ASMJS or CHROMEOS or FREEBSD or IOS or LINUX +// or MAC or NACL or NETBSD or OPENBSD or QNX or SOLARIS +// +// /!\ Note: OS_CHROMEOS is set by the build system, not this file +// +// Compiler: +// COMPILER_MSVC / COMPILER_GCC +// +// Processor: +// ARCH_CPU_ARM64 / ARCH_CPU_ARMEL / ARCH_CPU_MIPS / ARCH_CPU_MIPS64 / +// ARCH_CPU_MIPS64EL / ARCH_CPU_MIPSEL / ARCH_CPU_PPC64 / ARCH_CPU_S390 / +// ARCH_CPU_S390X / ARCH_CPU_X86 / ARCH_CPU_X86_64 +// Processor family: +// ARCH_CPU_ARM_FAMILY: ARMEL or ARM64 +// ARCH_CPU_MIPS_FAMILY: MIPS64EL or MIPSEL or MIPS64 or MIPS +// ARCH_CPU_PPC64_FAMILY: PPC64 +// ARCH_CPU_S390_FAMILY: S390 or S390X +// ARCH_CPU_X86_FAMILY: X86 or X86_64 +// Processor features: +// ARCH_CPU_31_BITS / ARCH_CPU_32_BITS / ARCH_CPU_64_BITS +// ARCH_CPU_BIG_ENDIAN / ARCH_CPU_LITTLE_ENDIAN + +#ifndef BUILD_BUILD_CONFIG_H_ +#define BUILD_BUILD_CONFIG_H_ + +// A set of macros to use for platform detection. +#if defined(__native_client__) +// __native_client__ must be first, so that other OS_ defines are not set. +#define OS_NACL 1 +// OS_NACL comes in two sandboxing technology flavors, SFI or Non-SFI. +// PNaCl toolchain defines __native_client_nonsfi__ macro in Non-SFI build +// mode, while it does not in SFI build mode. +#if defined(__native_client_nonsfi__) +#define OS_NACL_NONSFI +#else +#define OS_NACL_SFI +#endif +#elif defined(ANDROID) +#define OS_ANDROID 1 +#elif defined(__APPLE__) +// Only include TargetConditionals after testing ANDROID as some Android builds +// on the Mac have this header available and it's not needed unless the target +// is really an Apple platform. +#include +#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +#define OS_IOS 1 +#else +#define OS_MAC 1 +#endif // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE +#elif defined(__linux__) +#if !defined(OS_CHROMEOS) +// Do not define OS_LINUX on Chrome OS build. +// The OS_CHROMEOS macro is defined in GN. +#define OS_LINUX 1 +#endif // !defined(OS_CHROMEOS) +// Include a system header to pull in features.h for glibc/uclibc macros. +#include +#if defined(__GLIBC__) && !defined(__UCLIBC__) +// We really are using glibc, not uClibc pretending to be glibc. +#define LIBC_GLIBC 1 +#endif +#elif defined(_WIN32) +#define OS_WIN 1 +#elif defined(__Fuchsia__) +#define OS_FUCHSIA 1 +#elif defined(__FreeBSD__) +#define OS_FREEBSD 1 +#elif defined(__NetBSD__) +#define OS_NETBSD 1 +#elif defined(__OpenBSD__) +#define OS_OPENBSD 1 +#elif defined(__sun) +#define OS_SOLARIS 1 +#elif defined(__QNXNTO__) +#define OS_QNX 1 +#elif defined(_AIX) +#define OS_AIX 1 +#elif defined(__asmjs__) || defined(__wasm__) +#define OS_ASMJS 1 +#else +#error Please add support for your platform in build/build_config.h +#endif +// NOTE: Adding a new port? Please follow +// https://chromium.googlesource.com/chromium/src/+/master/docs/new_port_policy.md + +#if defined(OS_MAC) || defined(OS_IOS) +#define OS_APPLE 1 +#endif + +// For access to standard BSD features, use OS_BSD instead of a +// more specific macro. +#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD) +#define OS_BSD 1 +#endif + +// For access to standard POSIXish features, use OS_POSIX instead of a +// more specific macro. +#if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) || \ + defined(OS_FREEBSD) || defined(OS_IOS) || defined(OS_LINUX) || \ + defined(OS_CHROMEOS) || defined(OS_MAC) || defined(OS_NACL) || \ + defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_QNX) || \ + defined(OS_SOLARIS) +#define OS_POSIX 1 +#endif + +// Compiler detection. Note: clang masquerades as GCC on POSIX and as MSVC on +// Windows. +#if defined(__GNUC__) +#define COMPILER_GCC 1 +#elif defined(_MSC_VER) +#define COMPILER_MSVC 1 +#else +#error Please add support for your compiler in build/build_config.h +#endif + +// Processor architecture detection. For more info on what's defined, see: +// http://msdn.microsoft.com/en-us/library/b0084kay.aspx +// http://www.agner.org/optimize/calling_conventions.pdf +// or with gcc, run: "echo | gcc -E -dM -" +#if defined(_M_X64) || defined(__x86_64__) +#define ARCH_CPU_X86_FAMILY 1 +#define ARCH_CPU_X86_64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(_M_IX86) || defined(__i386__) +#define ARCH_CPU_X86_FAMILY 1 +#define ARCH_CPU_X86 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__s390x__) +#define ARCH_CPU_S390_FAMILY 1 +#define ARCH_CPU_S390X 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 +#elif defined(__s390__) +#define ARCH_CPU_S390_FAMILY 1 +#define ARCH_CPU_S390 1 +#define ARCH_CPU_31_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 +#elif (defined(__PPC64__) || defined(__PPC__)) && defined(__BIG_ENDIAN__) +#define ARCH_CPU_PPC64_FAMILY 1 +#define ARCH_CPU_PPC64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 +#elif defined(__PPC64__) +#define ARCH_CPU_PPC64_FAMILY 1 +#define ARCH_CPU_PPC64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__ARMEL__) +#define ARCH_CPU_ARM_FAMILY 1 +#define ARCH_CPU_ARMEL 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__aarch64__) || defined(_M_ARM64) +#define ARCH_CPU_ARM_FAMILY 1 +#define ARCH_CPU_ARM64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__pnacl__) || defined(__asmjs__) || defined(__wasm__) +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#elif defined(__MIPSEL__) +#if defined(__LP64__) +#define ARCH_CPU_MIPS_FAMILY 1 +#define ARCH_CPU_MIPS64EL 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#else +#define ARCH_CPU_MIPS_FAMILY 1 +#define ARCH_CPU_MIPSEL 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_LITTLE_ENDIAN 1 +#endif +#elif defined(__MIPSEB__) +#if defined(__LP64__) +#define ARCH_CPU_MIPS_FAMILY 1 +#define ARCH_CPU_MIPS64 1 +#define ARCH_CPU_64_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 +#else +#define ARCH_CPU_MIPS_FAMILY 1 +#define ARCH_CPU_MIPS 1 +#define ARCH_CPU_32_BITS 1 +#define ARCH_CPU_BIG_ENDIAN 1 +#endif +#else +#error Please add support for your architecture in build/build_config.h +#endif + +// Type detection for wchar_t. +#if defined(OS_WIN) +#define WCHAR_T_IS_UTF16 +#elif defined(OS_FUCHSIA) +#define WCHAR_T_IS_UTF32 +#elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ + (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff) +#define WCHAR_T_IS_UTF32 +#elif defined(OS_POSIX) && defined(COMPILER_GCC) && defined(__WCHAR_MAX__) && \ + (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff) +// On Posix, we'll detect short wchar_t, but projects aren't guaranteed to +// compile in this mode (in particular, Chrome doesn't). This is intended for +// other projects using base who manage their own dependencies and make sure +// short wchar works for them. +#define WCHAR_T_IS_UTF16 +#else +#error Please add support for your compiler in build/build_config.h +#endif + +#if defined(OS_ANDROID) +// The compiler thinks std::string::const_iterator and "const char*" are +// equivalent types. +#define STD_STRING_ITERATOR_IS_CHAR_POINTER +// The compiler thinks base::string16::const_iterator and "char16*" are +// equivalent types. +#define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER +#endif + +#endif // BUILD_BUILD_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/call/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/call/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -132,6 +132,7 @@ ":rtp_interfaces", "../api:array_view", "../api:rtp_headers", + "../api:sequence_checker", "../modules/rtp_rtcp", "../modules/rtp_rtcp:rtp_rtcp_format", "../rtc_base:checks", @@ -158,6 +159,7 @@ "../api:fec_controller_api", "../api:network_state_predictor_api", "../api:rtp_parameters", + "../api:sequence_checker", "../api:transport_api", "../api/rtc_event_log", "../api/transport:field_trial_based_config", @@ -226,13 +228,13 @@ ] deps = [ "../api:bitrate_allocation", + "../api:sequence_checker", "../api/transport:network_control", "../api/units:data_rate", "../api/units:time_delta", "../rtc_base:checks", "../rtc_base:rtc_base_approved", "../rtc_base:safe_minmax", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:no_unique_address", "../system_wrappers", "../system_wrappers:field_trial", @@ -269,6 +271,7 @@ "../api:fec_controller_api", "../api:rtp_headers", "../api:rtp_parameters", + "../api:sequence_checker", "../api:simulated_network_api", "../api:transport_api", "../api/rtc_event_log", @@ -293,7 +296,6 @@ "../rtc_base:safe_minmax", "../rtc_base/experiments:field_trial_parser", "../rtc_base/network:sent_packet", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:no_unique_address", "../rtc_base/task_utils:pending_task_safety_flag", "../system_wrappers", @@ -344,6 +346,7 @@ "simulated_network.h", ] deps = [ + "../api:sequence_checker", "../api:simulated_network_api", "../api/units:data_rate", "../api/units:data_size", @@ -352,7 +355,6 @@ "../rtc_base:checks", "../rtc_base:rtc_base_approved", "../rtc_base/synchronization:mutex", - "../rtc_base/synchronization:sequence_checker", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } @@ -375,153 +377,159 @@ ":simulated_network", ":simulated_packet_receiver", "../api:rtp_parameters", + "../api:sequence_checker", "../api:simulated_network_api", "../api:transport_api", "../modules/utility", "../rtc_base:checks", "../rtc_base:rtc_base_approved", "../rtc_base/synchronization:mutex", - "../rtc_base/synchronization:sequence_checker", "../system_wrappers", ] } if (rtc_include_tests) { - rtc_library("call_tests") { - testonly = true - - sources = [ - "bitrate_allocator_unittest.cc", - "bitrate_estimator_tests.cc", - "call_unittest.cc", - "flexfec_receive_stream_unittest.cc", - "receive_time_calculator_unittest.cc", - "rtp_bitrate_configurator_unittest.cc", - "rtp_demuxer_unittest.cc", - "rtp_payload_params_unittest.cc", - "rtp_video_sender_unittest.cc", - "rtx_receive_stream_unittest.cc", - ] - deps = [ - ":bitrate_allocator", - ":bitrate_configurator", - ":call", - ":call_interfaces", - ":mock_rtp_interfaces", - ":rtp_interfaces", - ":rtp_receiver", - ":rtp_sender", - ":simulated_network", - "../api:array_view", - "../api:create_frame_generator", - "../api:mock_audio_mixer", - "../api:rtp_headers", - "../api:rtp_parameters", - "../api:transport_api", - "../api/audio_codecs:builtin_audio_decoder_factory", - "../api/rtc_event_log", - "../api/task_queue:default_task_queue_factory", - "../api/test/video:function_video_factory", - "../api/transport:field_trial_based_config", - "../api/video:builtin_video_bitrate_allocator_factory", - "../api/video:video_frame", - "../api/video:video_rtp_headers", - "../audio", - "../modules/audio_device:mock_audio_device", - "../modules/audio_mixer", - "../modules/audio_mixer:audio_mixer_impl", - "../modules/audio_processing:mocks", - "../modules/congestion_controller", - "../modules/pacing", - "../modules/rtp_rtcp", - "../modules/rtp_rtcp:mock_rtp_rtcp", - "../modules/rtp_rtcp:rtp_rtcp_format", - "../modules/utility:mock_process_thread", - "../modules/video_coding", - "../modules/video_coding:codec_globals_headers", - "../modules/video_coding:video_codec_interface", - "../rtc_base:checks", - "../rtc_base:rate_limiter", - "../rtc_base:rtc_base_approved", - "../rtc_base:task_queue_for_test", - "../rtc_base/synchronization:mutex", - "../system_wrappers", - "../test:audio_codec_mocks", - "../test:direct_transport", - "../test:encoder_settings", - "../test:fake_video_codecs", - "../test:field_trial", - "../test:mock_frame_transformer", - "../test:mock_transport", - "../test:test_common", - "../test:test_support", - "../test:video_test_common", - "../test/time_controller:time_controller", - "../video", - "../test/scenario:scenario", - "//testing/gmock", - "//testing/gtest", - ] - absl_deps = [ - "//third_party/abseil-cpp/absl/container:inlined_vector", - "//third_party/abseil-cpp/absl/memory", - "//third_party/abseil-cpp/absl/types:optional", - "//third_party/abseil-cpp/absl/types:variant", - ] - } - - rtc_library("call_perf_tests") { - testonly = true - - sources = [ - "call_perf_tests.cc", - "rampup_tests.cc", - "rampup_tests.h", - ] - deps = [ - ":call_interfaces", - ":simulated_network", - ":video_stream_api", - "../api:rtc_event_log_output_file", - "../api:simulated_network_api", - "../api/audio_codecs:builtin_audio_encoder_factory", - "../api/rtc_event_log", - "../api/rtc_event_log:rtc_event_log_factory", - "../api/task_queue", - "../api/task_queue:default_task_queue_factory", - "../api/video:builtin_video_bitrate_allocator_factory", - "../api/video:video_bitrate_allocation", - "../api/video_codecs:video_codecs_api", - "../modules/audio_coding", - "../modules/audio_device", - "../modules/audio_device:audio_device_impl", - "../modules/audio_mixer:audio_mixer_impl", - "../modules/rtp_rtcp", - "../modules/rtp_rtcp:rtp_rtcp_format", - "../rtc_base", - "../rtc_base:checks", - "../rtc_base:rtc_base_approved", - "../rtc_base:task_queue_for_test", - "../rtc_base:task_queue_for_test", - "../rtc_base/synchronization:mutex", - "../rtc_base/task_utils:repeating_task", - "../system_wrappers", - "../system_wrappers:metrics", - "../test:direct_transport", - "../test:encoder_settings", - "../test:fake_video_codecs", - "../test:field_trial", - "../test:fileutils", - "../test:null_transport", - "../test:perf_test", - "../test:rtp_test_utils", - "../test:test_common", - "../test:test_support", - "../test:video_test_common", - "../video", - "//testing/gtest", - ] - absl_deps = [ "//third_party/abseil-cpp/absl/flags:flag" ] + if (!build_with_chromium) { + rtc_library("call_tests") { + testonly = true + + sources = [ + "bitrate_allocator_unittest.cc", + "bitrate_estimator_tests.cc", + "call_unittest.cc", + "flexfec_receive_stream_unittest.cc", + "receive_time_calculator_unittest.cc", + "rtp_bitrate_configurator_unittest.cc", + "rtp_demuxer_unittest.cc", + "rtp_payload_params_unittest.cc", + "rtp_video_sender_unittest.cc", + "rtx_receive_stream_unittest.cc", + ] + deps = [ + ":bitrate_allocator", + ":bitrate_configurator", + ":call", + ":call_interfaces", + ":mock_rtp_interfaces", + ":rtp_interfaces", + ":rtp_receiver", + ":rtp_sender", + ":simulated_network", + "../api:array_view", + "../api:create_frame_generator", + "../api:mock_audio_mixer", + "../api:rtp_headers", + "../api:rtp_parameters", + "../api:transport_api", + "../api/audio_codecs:builtin_audio_decoder_factory", + "../api/rtc_event_log", + "../api/task_queue:default_task_queue_factory", + "../api/test/video:function_video_factory", + "../api/transport:field_trial_based_config", + "../api/video:builtin_video_bitrate_allocator_factory", + "../api/video:video_frame", + "../api/video:video_rtp_headers", + "../audio", + "../modules:module_api", + "../modules/audio_device:mock_audio_device", + "../modules/audio_mixer", + "../modules/audio_mixer:audio_mixer_impl", + "../modules/audio_processing:mocks", + "../modules/congestion_controller", + "../modules/pacing", + "../modules/rtp_rtcp", + "../modules/rtp_rtcp:mock_rtp_rtcp", + "../modules/rtp_rtcp:rtp_rtcp_format", + "../modules/utility:mock_process_thread", + "../modules/video_coding", + "../modules/video_coding:codec_globals_headers", + "../modules/video_coding:video_codec_interface", + "../rtc_base:checks", + "../rtc_base:logging", + "../rtc_base:rate_limiter", + "../rtc_base:rtc_base_approved", + "../rtc_base:task_queue_for_test", + "../rtc_base/synchronization:mutex", + "../system_wrappers", + "../test:audio_codec_mocks", + "../test:direct_transport", + "../test:encoder_settings", + "../test:fake_video_codecs", + "../test:field_trial", + "../test:mock_frame_transformer", + "../test:mock_transport", + "../test:test_common", + "../test:test_support", + "../test:video_test_common", + "../test/scenario", + "../test/time_controller:time_controller", + "../video", + "adaptation:resource_adaptation_test_utilities", + "//testing/gmock", + "//testing/gtest", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/container:inlined_vector", + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/types:optional", + "//third_party/abseil-cpp/absl/types:variant", + ] + } + + rtc_library("call_perf_tests") { + testonly = true + + sources = [ + "call_perf_tests.cc", + "rampup_tests.cc", + "rampup_tests.h", + ] + deps = [ + ":call_interfaces", + ":simulated_network", + ":video_stream_api", + "../api:rtc_event_log_output_file", + "../api:simulated_network_api", + "../api/audio_codecs:builtin_audio_encoder_factory", + "../api/rtc_event_log", + "../api/rtc_event_log:rtc_event_log_factory", + "../api/task_queue", + "../api/task_queue:default_task_queue_factory", + "../api/video:builtin_video_bitrate_allocator_factory", + "../api/video:video_bitrate_allocation", + "../api/video_codecs:video_codecs_api", + "../modules/audio_coding", + "../modules/audio_device", + "../modules/audio_device:audio_device_impl", + "../modules/audio_mixer:audio_mixer_impl", + "../modules/rtp_rtcp", + "../modules/rtp_rtcp:rtp_rtcp_format", + "../rtc_base", + "../rtc_base:checks", + "../rtc_base:rtc_base_approved", + "../rtc_base:task_queue_for_test", + "../rtc_base:task_queue_for_test", + "../rtc_base:threading", + "../rtc_base/synchronization:mutex", + "../rtc_base/task_utils:repeating_task", + "../system_wrappers", + "../system_wrappers:metrics", + "../test:direct_transport", + "../test:encoder_settings", + "../test:fake_video_codecs", + "../test:field_trial", + "../test:fileutils", + "../test:null_transport", + "../test:perf_test", + "../test:rtp_test_utils", + "../test:test_common", + "../test:test_support", + "../test:video_test_common", + "../video", + "//testing/gtest", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/flags:flag" ] + } } # TODO(eladalon): This should be moved, as with the TODO for |rtp_interfaces|. diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -34,6 +34,7 @@ deps = [ "../../api:rtp_parameters", "../../api:scoped_refptr", + "../../api:sequence_checker", "../../api/adaptation:resource_adaptation_api", "../../api/task_queue:task_queue", "../../api/video:video_adaptation", @@ -46,7 +47,6 @@ "../../rtc_base:rtc_task_queue", "../../rtc_base/experiments:balanced_degradation_settings", "../../rtc_base/synchronization:mutex", - "../../rtc_base/synchronization:sequence_checker", "../../rtc_base/system:no_unique_address", "../../rtc_base/task_utils:to_queued_task", ] @@ -108,11 +108,11 @@ deps = [ ":resource_adaptation", "../../api:scoped_refptr", + "../../api:sequence_checker", "../../api/adaptation:resource_adaptation_api", "../../api/task_queue:task_queue", "../../api/video:video_stream_encoder", "../../rtc_base:rtc_base_approved", - "../../rtc_base/synchronization:sequence_checker", "../../rtc_base/task_utils:to_queued_task", "../../test:test_support", ] diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/resource_adaptation_processor.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/resource_adaptation_processor.cc --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/resource_adaptation_processor.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/resource_adaptation_processor.cc 2021-06-27 05:27:48.000000000 +0000 @@ -15,12 +15,12 @@ #include #include "absl/algorithm/container.h" +#include "api/sequence_checker.h" #include "api/video/video_adaptation_counters.h" #include "call/adaptation/video_stream_adapter.h" #include "rtc_base/logging.h" #include "rtc_base/ref_counted_object.h" #include "rtc_base/strings/string_builder.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/task_utils/to_queued_task.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_adapter.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_adapter.cc --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_adapter.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_adapter.cc 2021-06-27 05:27:48.000000000 +0000 @@ -16,6 +16,7 @@ #include "absl/types/optional.h" #include "absl/types/variant.h" +#include "api/sequence_checker.h" #include "api/video/video_adaptation_counters.h" #include "api/video/video_adaptation_reason.h" #include "api/video_codecs/video_encoder.h" @@ -25,7 +26,6 @@ #include "rtc_base/constructor_magic.h" #include "rtc_base/logging.h" #include "rtc_base/numerics/safe_conversions.h" -#include "rtc_base/synchronization/sequence_checker.h" namespace webrtc { @@ -62,13 +62,14 @@ } bool CanDecreaseResolutionTo(int target_pixels, + int target_pixels_min, const VideoStreamInputState& input_state, const VideoSourceRestrictions& restrictions) { int max_pixels_per_frame = rtc::dchecked_cast(restrictions.max_pixels_per_frame().value_or( std::numeric_limits::max())); return target_pixels < max_pixels_per_frame && - target_pixels >= input_state.min_pixels_per_frame(); + target_pixels_min >= input_state.min_pixels_per_frame(); } bool CanIncreaseResolutionTo(int target_pixels, @@ -96,6 +97,11 @@ } bool MinPixelLimitReached(const VideoStreamInputState& input_state) { + if (input_state.single_active_stream_pixels().has_value()) { + return GetLowerResolutionThan( + input_state.single_active_stream_pixels().value()) < + input_state.min_pixels_per_frame(); + } return input_state.frame_size_pixels().has_value() && GetLowerResolutionThan(input_state.frame_size_pixels().value()) < input_state.min_pixels_per_frame(); @@ -470,7 +476,11 @@ const RestrictionsWithCounters& current_restrictions) { int target_pixels = GetLowerResolutionThan(input_state.frame_size_pixels().value()); - if (!CanDecreaseResolutionTo(target_pixels, input_state, + // Use single active stream if set, this stream could be lower than the input. + int target_pixels_min = + GetLowerResolutionThan(input_state.single_active_stream_pixels().value_or( + input_state.frame_size_pixels().value())); + if (!CanDecreaseResolutionTo(target_pixels, target_pixels_min, input_state, current_restrictions.restrictions)) { return Adaptation::Status::kLimitReached; } @@ -693,4 +703,27 @@ : pixels_increased(pixels_increased), frame_size_pixels(frame_size_pixels) {} +absl::optional VideoStreamAdapter::GetSingleActiveLayerPixels( + const VideoCodec& codec) { + int num_active = 0; + absl::optional pixels; + if (codec.codecType == VideoCodecType::kVideoCodecVP9) { + for (int i = 0; i < codec.VP9().numberOfSpatialLayers; ++i) { + if (codec.spatialLayers[i].active) { + ++num_active; + pixels = codec.spatialLayers[i].width * codec.spatialLayers[i].height; + } + } + } else { + for (int i = 0; i < codec.numberOfSimulcastStreams; ++i) { + if (codec.simulcastStream[i].active) { + ++num_active; + pixels = + codec.simulcastStream[i].width * codec.simulcastStream[i].height; + } + } + } + return (num_active > 1) ? absl::nullopt : pixels; +} + } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_adapter.h libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_adapter.h --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_adapter.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_adapter.h 2021-06-27 05:27:48.000000000 +0000 @@ -163,6 +163,9 @@ VideoAdaptationCounters counters; }; + static absl::optional GetSingleActiveLayerPixels( + const VideoCodec& codec); + private: void BroadcastVideoRestrictionsUpdate( const VideoStreamInputState& input_state, diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state.cc --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state.cc 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ frame_size_pixels_(absl::nullopt), frames_per_second_(0), video_codec_type_(VideoCodecType::kVideoCodecGeneric), - min_pixels_per_frame_(kDefaultMinPixelsPerFrame) {} + min_pixels_per_frame_(kDefaultMinPixelsPerFrame), + single_active_stream_pixels_(absl::nullopt) {} void VideoStreamInputState::set_has_input(bool has_input) { has_input_ = has_input; @@ -43,6 +44,11 @@ min_pixels_per_frame_ = min_pixels_per_frame; } +void VideoStreamInputState::set_single_active_stream_pixels( + absl::optional single_active_stream_pixels) { + single_active_stream_pixels_ = single_active_stream_pixels; +} + bool VideoStreamInputState::has_input() const { return has_input_; } @@ -63,6 +69,10 @@ return min_pixels_per_frame_; } +absl::optional VideoStreamInputState::single_active_stream_pixels() const { + return single_active_stream_pixels_; +} + bool VideoStreamInputState::HasInputFrameSizeAndFramesPerSecond() const { return has_input_ && frame_size_pixels_.has_value(); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state.h libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state.h --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state.h 2021-06-27 05:27:48.000000000 +0000 @@ -27,12 +27,15 @@ void set_frames_per_second(int frames_per_second); void set_video_codec_type(VideoCodecType video_codec_type); void set_min_pixels_per_frame(int min_pixels_per_frame); + void set_single_active_stream_pixels( + absl::optional single_active_stream_pixels); bool has_input() const; absl::optional frame_size_pixels() const; int frames_per_second() const; VideoCodecType video_codec_type() const; int min_pixels_per_frame() const; + absl::optional single_active_stream_pixels() const; bool HasInputFrameSizeAndFramesPerSecond() const; @@ -42,6 +45,7 @@ int frames_per_second_; VideoCodecType video_codec_type_; int min_pixels_per_frame_; + absl::optional single_active_stream_pixels_; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state_provider.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state_provider.cc --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state_provider.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state_provider.cc 2021-06-27 05:27:48.000000000 +0000 @@ -10,6 +10,8 @@ #include "call/adaptation/video_stream_input_state_provider.h" +#include "call/adaptation/video_stream_adapter.h" + namespace webrtc { VideoStreamInputStateProvider::VideoStreamInputStateProvider( @@ -36,6 +38,9 @@ encoder_settings.encoder_config().codec_type); input_state_.set_min_pixels_per_frame( encoder_settings.encoder_info().scaling_settings.min_pixels_per_frame); + input_state_.set_single_active_stream_pixels( + VideoStreamAdapter::GetSingleActiveLayerPixels( + encoder_settings.video_codec())); } VideoStreamInputState VideoStreamInputStateProvider::InputState() { diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state_provider_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state_provider_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/call/adaptation/video_stream_input_state_provider_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/adaptation/video_stream_input_state_provider_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -28,6 +28,7 @@ EXPECT_EQ(0, input_state.frames_per_second()); EXPECT_EQ(VideoCodecType::kVideoCodecGeneric, input_state.video_codec_type()); EXPECT_EQ(kDefaultMinPixelsPerFrame, input_state.min_pixels_per_frame()); + EXPECT_EQ(absl::nullopt, input_state.single_active_stream_pixels()); } TEST(VideoStreamInputStateProviderTest, ValuesSet) { @@ -40,14 +41,22 @@ encoder_info.scaling_settings.min_pixels_per_frame = 1337; VideoEncoderConfig encoder_config; encoder_config.codec_type = VideoCodecType::kVideoCodecVP9; + VideoCodec video_codec; + video_codec.codecType = VideoCodecType::kVideoCodecVP8; + video_codec.numberOfSimulcastStreams = 2; + video_codec.simulcastStream[0].active = false; + video_codec.simulcastStream[1].active = true; + video_codec.simulcastStream[1].width = 111; + video_codec.simulcastStream[1].height = 222; input_state_provider.OnEncoderSettingsChanged(EncoderSettings( - std::move(encoder_info), std::move(encoder_config), VideoCodec())); + std::move(encoder_info), std::move(encoder_config), video_codec)); VideoStreamInputState input_state = input_state_provider.InputState(); EXPECT_EQ(true, input_state.has_input()); EXPECT_EQ(42, input_state.frame_size_pixels()); EXPECT_EQ(123, input_state.frames_per_second()); EXPECT_EQ(VideoCodecType::kVideoCodecVP9, input_state.video_codec_type()); EXPECT_EQ(1337, input_state.min_pixels_per_frame()); + EXPECT_EQ(111 * 222, input_state.single_active_stream_pixels()); } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/audio_receive_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/call/audio_receive_stream.h --- libtgowt-0~git20210124.be23804+ds/src/call/audio_receive_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/audio_receive_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -90,6 +90,13 @@ int32_t total_interruption_duration_ms = 0; // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-estimatedplayouttimestamp absl::optional estimated_playout_ntp_timestamp_ms; + // Remote outbound stats derived by the received RTCP sender reports. + // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* + absl::optional last_sender_report_timestamp_ms; + absl::optional last_sender_report_remote_timestamp_ms; + uint32_t sender_reports_packets_sent = 0; + uint64_t sender_reports_bytes_sent = 0; + uint64_t sender_reports_reports_count = 0; }; struct Config { @@ -167,6 +174,9 @@ // When a stream is stopped, it can't receive, process or deliver packets. virtual void Stop() = 0; + // Returns true if the stream has been started. + virtual bool IsRunning() const = 0; + virtual Stats GetStats(bool get_and_clear_legacy_stats) const = 0; Stats GetStats() { return GetStats(/*get_and_clear_legacy_stats=*/true); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/audio_send_stream.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/audio_send_stream.cc --- libtgowt-0~git20210124.be23804+ds/src/call/audio_send_stream.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/audio_send_stream.cc 2021-06-27 05:27:48.000000000 +0000 @@ -27,8 +27,7 @@ AudioSendStream::Config::~Config() = default; std::string AudioSendStream::Config::ToString() const { - char buf[1024]; - rtc::SimpleStringBuilder ss(buf); + rtc::StringBuilder ss; ss << "{rtp: " << rtp.ToString(); ss << ", rtcp_report_interval_ms: " << rtcp_report_interval_ms; ss << ", send_transport: " << (send_transport ? "(Transport)" : "null"); @@ -39,8 +38,8 @@ ss << ", has_dscp: " << (has_dscp ? "true" : "false"); ss << ", send_codec_spec: " << (send_codec_spec ? send_codec_spec->ToString() : ""); - ss << '}'; - return ss.str(); + ss << "}"; + return ss.Release(); } AudioSendStream::Config::Rtp::Rtp() = default; diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/bitrate_allocator.h libtgowt-0~git20210627.91d836d+dfsg/src/call/bitrate_allocator.h --- libtgowt-0~git20210124.be23804+ds/src/call/bitrate_allocator.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/bitrate_allocator.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,8 +20,8 @@ #include #include "api/call/bitrate_allocation.h" +#include "api/sequence_checker.h" #include "api/transport/network_types.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/system/no_unique_address.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/call.cc --- libtgowt-0~git20210124.be23804+ds/src/call/call.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call.cc 2021-06-27 05:27:48.000000000 +0000 @@ -21,6 +21,7 @@ #include "absl/types/optional.h" #include "api/rtc_event_log/rtc_event_log.h" +#include "api/sequence_checker.h" #include "api/transport/network_control.h" #include "audio/audio_receive_stream.h" #include "audio/audio_send_stream.h" @@ -51,7 +52,6 @@ #include "rtc_base/location.h" #include "rtc_base/logging.h" #include "rtc_base/strings/string_builder.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/task_utils/pending_task_safety_flag.h" #include "rtc_base/thread_annotations.h" @@ -167,6 +167,34 @@ return current; } +// Called from the destructor of Call to report the collected send histograms. +void UpdateSendHistograms(Timestamp now, + Timestamp first_sent_packet, + AvgCounter& estimated_send_bitrate_kbps_counter, + AvgCounter& pacer_bitrate_kbps_counter) { + TimeDelta elapsed = now - first_sent_packet; + if (elapsed.seconds() < metrics::kMinRunTimeInSeconds) + return; + + const int kMinRequiredPeriodicSamples = 5; + AggregatedStats send_bitrate_stats = + estimated_send_bitrate_kbps_counter.ProcessAndGetStats(); + if (send_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) { + RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps", + send_bitrate_stats.average); + RTC_LOG(LS_INFO) << "WebRTC.Call.EstimatedSendBitrateInKbps, " + << send_bitrate_stats.ToString(); + } + AggregatedStats pacer_bitrate_stats = + pacer_bitrate_kbps_counter.ProcessAndGetStats(); + if (pacer_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) { + RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps", + pacer_bitrate_stats.average); + RTC_LOG(LS_INFO) << "WebRTC.Call.PacerBitrateInKbps, " + << pacer_bitrate_stats.ToString(); + } +} + } // namespace namespace internal { @@ -268,6 +296,10 @@ DeliveryStatus DeliverPacket(MediaType media_type, rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) override; + void DeliverPacketAsync(MediaType media_type, + rtc::CopyOnWriteBuffer packet, + int64_t packet_time_us, + PacketCallback callback) override; // Implements RecoveredPacketReceiver. void OnRecoveredPacket(const uint8_t* packet, size_t length) override; @@ -304,10 +336,7 @@ MediaType media_type) RTC_SHARED_LOCKS_REQUIRED(worker_thread_); - void UpdateSendHistograms(Timestamp first_sent_packet) - RTC_EXCLUSIVE_LOCKS_REQUIRED(worker_thread_); void UpdateReceiveHistograms(); - void UpdateHistograms(); void UpdateAggregateNetworkState(); // Ensure that necessary process threads are started, and any required @@ -321,6 +350,7 @@ Clock* const clock_; TaskQueueFactory* const task_queue_factory_; TaskQueueBase* const worker_thread_; + TaskQueueBase* const network_thread_; const int num_cpu_cores_; const rtc::scoped_refptr module_process_thread_; @@ -330,15 +360,18 @@ NetworkState audio_network_state_; NetworkState video_network_state_; + // TODO(bugs.webrtc.org/11993): Move aggregate_network_up_ over to the + // network thread. bool aggregate_network_up_ RTC_GUARDED_BY(worker_thread_); // Audio, Video, and FlexFEC receive streams are owned by the client that // creates them. + // TODO(bugs.webrtc.org/11993): Move audio_receive_streams_, + // video_receive_streams_ and sync_stream_mapping_ over to the network thread. std::set audio_receive_streams_ RTC_GUARDED_BY(worker_thread_); std::set video_receive_streams_ RTC_GUARDED_BY(worker_thread_); - std::map sync_stream_mapping_ RTC_GUARDED_BY(worker_thread_); @@ -373,6 +406,9 @@ // send side BWE are negotiated. const bool use_send_side_bwe; }; + + // TODO(bugs.webrtc.org/11993): Move receive_rtp_config_ over to the + // network thread. std::map receive_rtp_config_ RTC_GUARDED_BY(worker_thread_); @@ -597,6 +633,10 @@ : clock_(clock), task_queue_factory_(task_queue_factory), worker_thread_(GetCurrentTaskQueueOrThread()), + // If |network_task_queue_| was set to nullptr, network related calls + // must be made on |worker_thread_| (i.e. they're one and the same). + network_thread_(config.network_task_queue_ ? config.network_task_queue_ + : worker_thread_), num_cpu_cores_(CpuInfo::DetectNumberOfCores()), module_process_thread_(std::move(module_process_thread)), call_stats_(new CallStats(clock_, worker_thread_)), @@ -623,6 +663,7 @@ transport_send_(std::move(transport_send)) { RTC_DCHECK(config.event_log != nullptr); RTC_DCHECK(config.trials != nullptr); + RTC_DCHECK(network_thread_); RTC_DCHECK(worker_thread_->IsCurrent()); // Do not remove this call; it is here to convince the compiler that the @@ -651,17 +692,23 @@ module_process_thread_->process_thread()->DeRegisterModule(&receive_side_cc_); call_stats_->DeregisterStatsObserver(&receive_side_cc_); - absl::optional first_sent_packet_ms = + absl::optional first_sent_packet_time = transport_send_->GetFirstPacketTime(); + Timestamp now = clock_->CurrentTime(); + // Only update histograms after process threads have been shut down, so that // they won't try to concurrently update stats. - if (first_sent_packet_ms) { - UpdateSendHistograms(*first_sent_packet_ms); + if (first_sent_packet_time) { + UpdateSendHistograms(now, *first_sent_packet_time, + estimated_send_bitrate_kbps_counter_, + pacer_bitrate_kbps_counter_); } UpdateReceiveHistograms(); - UpdateHistograms(); + + RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.LifetimeInSeconds", + (now.ms() - start_ms_) / 1000); } void Call::EnsureStarted() { @@ -670,6 +717,8 @@ } is_started_ = true; + call_stats_->EnsureStarted(); + // This call seems to kick off a number of things, so probably better left // off being kicked off on request rather than in the ctor. transport_send_ptr_->RegisterTargetTransferRateObserver(this); @@ -683,37 +732,6 @@ GetTransportControllerSend()->SetClientBitratePreferences(preferences); } -void Call::UpdateHistograms() { - RTC_HISTOGRAM_COUNTS_100000( - "WebRTC.Call.LifetimeInSeconds", - (clock_->TimeInMilliseconds() - start_ms_) / 1000); -} - -// Called from the dtor. -void Call::UpdateSendHistograms(Timestamp first_sent_packet) { - int64_t elapsed_sec = - (clock_->TimeInMilliseconds() - first_sent_packet.ms()) / 1000; - if (elapsed_sec < metrics::kMinRunTimeInSeconds) - return; - const int kMinRequiredPeriodicSamples = 5; - AggregatedStats send_bitrate_stats = - estimated_send_bitrate_kbps_counter_.ProcessAndGetStats(); - if (send_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) { - RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps", - send_bitrate_stats.average); - RTC_LOG(LS_INFO) << "WebRTC.Call.EstimatedSendBitrateInKbps, " - << send_bitrate_stats.ToString(); - } - AggregatedStats pacer_bitrate_stats = - pacer_bitrate_kbps_counter_.ProcessAndGetStats(); - if (pacer_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) { - RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps", - pacer_bitrate_stats.average); - RTC_LOG(LS_INFO) << "WebRTC.Call.PacerBitrateInKbps, " - << pacer_bitrate_stats.ToString(); - } -} - void Call::UpdateReceiveHistograms() { if (first_received_rtp_audio_ms_) { RTC_HISTOGRAM_COUNTS_100000( @@ -761,7 +779,6 @@ } PacketReceiver* Call::Receiver() { - RTC_DCHECK_RUN_ON(worker_thread_); return this; } @@ -791,6 +808,8 @@ audio_send_ssrcs_.end()); audio_send_ssrcs_[config.rtp.ssrc] = send_stream; + // TODO(bugs.webrtc.org/11993): call AssociateSendStream and + // UpdateAggregateNetworkState asynchronously on the network thread. for (AudioReceiveStream* stream : audio_receive_streams_) { if (stream->config().rtp.local_ssrc == config.rtp.ssrc) { stream->AssociateSendStream(send_stream); @@ -798,6 +817,7 @@ } UpdateAggregateNetworkState(); + return send_stream; } @@ -816,6 +836,8 @@ size_t num_deleted = audio_send_ssrcs_.erase(ssrc); RTC_DCHECK_EQ(1, num_deleted); + // TODO(bugs.webrtc.org/11993): call AssociateSendStream and + // UpdateAggregateNetworkState asynchronously on the network thread. for (AudioReceiveStream* stream : audio_receive_streams_) { if (stream->config().rtp.local_ssrc == ssrc) { stream->AssociateSendStream(nullptr); @@ -823,6 +845,7 @@ } UpdateAggregateNetworkState(); + delete send_stream; } @@ -833,11 +856,19 @@ EnsureStarted(); event_log_->Log(std::make_unique( CreateRtcLogStreamConfig(config))); + + // TODO(bugs.webrtc.org/11993): Move the registration between |receive_stream| + // and |audio_receiver_controller_| out of AudioReceiveStream construction and + // set it up asynchronously on the network thread (the registration and + // |audio_receiver_controller_| need to live on the network thread). AudioReceiveStream* receive_stream = new AudioReceiveStream( clock_, &audio_receiver_controller_, transport_send_ptr_->packet_router(), module_process_thread_->process_thread(), config_.neteq_factory, config, config_.audio_state, event_log_); + // TODO(bugs.webrtc.org/11993): Update the below on the network thread. + // We could possibly set up the audio_receiver_controller_ association up + // as part of the async setup. receive_rtp_config_.emplace(config.rtp.remote_ssrc, ReceiveRtpConfig(config)); audio_receive_streams_.insert(receive_stream); @@ -864,8 +895,12 @@ uint32_t ssrc = config.rtp.remote_ssrc; receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config)) ->RemoveStream(ssrc); + + // TODO(bugs.webrtc.org/11993): Access the map, rtp config, call ConfigureSync + // and UpdateAggregateNetworkState on the network thread. audio_receive_streams_.erase(audio_receive_stream); const std::string& sync_group = audio_receive_stream->config().sync_group; + const auto it = sync_stream_mapping_.find(sync_group); if (it != sync_stream_mapping_.end() && it->second == audio_receive_stream) { sync_stream_mapping_.erase(it); @@ -874,6 +909,9 @@ receive_rtp_config_.erase(ssrc); UpdateAggregateNetworkState(); + // TODO(bugs.webrtc.org/11993): Consider if deleting |audio_receive_stream| + // on the network thread would be better or if we'd need to tear down the + // state in two phases. delete audio_receive_stream; } @@ -986,13 +1024,15 @@ EnsureStarted(); - TaskQueueBase* current = GetCurrentTaskQueueOrThread(); - RTC_CHECK(current); + // TODO(bugs.webrtc.org/11993): Move the registration between |receive_stream| + // and |video_receiver_controller_| out of VideoReceiveStream2 construction + // and set it up asynchronously on the network thread (the registration and + // |video_receiver_controller_| need to live on the network thread). VideoReceiveStream2* receive_stream = new VideoReceiveStream2( - task_queue_factory_, current, &video_receiver_controller_, num_cpu_cores_, - transport_send_ptr_->packet_router(), std::move(configuration), - module_process_thread_->process_thread(), call_stats_.get(), clock_, - new VCMTiming(clock_)); + task_queue_factory_, worker_thread_, &video_receiver_controller_, + num_cpu_cores_, transport_send_ptr_->packet_router(), + std::move(configuration), module_process_thread_->process_thread(), + call_stats_.get(), clock_, new VCMTiming(clock_)); const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); if (config.rtp.rtx_ssrc) { @@ -1125,34 +1165,54 @@ } void Call::SignalChannelNetworkState(MediaType media, NetworkState state) { - RTC_DCHECK_RUN_ON(worker_thread_); - switch (media) { - case MediaType::AUDIO: + RTC_DCHECK_RUN_ON(network_thread_); + RTC_DCHECK(media == MediaType::AUDIO || media == MediaType::VIDEO); + + auto closure = [this, media, state]() { + // TODO(bugs.webrtc.org/11993): Move this over to the network thread. + RTC_DCHECK_RUN_ON(worker_thread_); + if (media == MediaType::AUDIO) { audio_network_state_ = state; - break; - case MediaType::VIDEO: + } else { + RTC_DCHECK_EQ(media, MediaType::VIDEO); video_network_state_ = state; - break; - case MediaType::ANY: - case MediaType::DATA: - RTC_NOTREACHED(); - break; - } + } - UpdateAggregateNetworkState(); - for (VideoReceiveStream2* video_receive_stream : video_receive_streams_) { - video_receive_stream->SignalNetworkState(video_network_state_); + // TODO(tommi): Is it necessary to always do this, including if there + // was no change in state? + UpdateAggregateNetworkState(); + + // TODO(tommi): Is it right to do this if media == AUDIO? + for (VideoReceiveStream2* video_receive_stream : video_receive_streams_) { + video_receive_stream->SignalNetworkState(video_network_state_); + } + }; + + if (network_thread_ == worker_thread_) { + closure(); + } else { + // TODO(bugs.webrtc.org/11993): Remove workaround when we no longer need to + // post to the worker thread. + worker_thread_->PostTask(ToQueuedTask(task_safety_, std::move(closure))); } } void Call::OnAudioTransportOverheadChanged(int transport_overhead_per_packet) { - RTC_DCHECK_RUN_ON(worker_thread_); - for (auto& kv : audio_send_ssrcs_) { - kv.second->SetTransportOverhead(transport_overhead_per_packet); - } + RTC_DCHECK_RUN_ON(network_thread_); + worker_thread_->PostTask( + ToQueuedTask(task_safety_, [this, transport_overhead_per_packet]() { + // TODO(bugs.webrtc.org/11993): Move this over to the network thread. + RTC_DCHECK_RUN_ON(worker_thread_); + for (auto& kv : audio_send_ssrcs_) { + kv.second->SetTransportOverhead(transport_overhead_per_packet); + } + })); } void Call::UpdateAggregateNetworkState() { + // TODO(bugs.webrtc.org/11993): Move this over to the network thread. + // RTC_DCHECK_RUN_ON(network_thread_); + RTC_DCHECK_RUN_ON(worker_thread_); bool have_audio = @@ -1232,6 +1292,7 @@ } void Call::ConfigureSync(const std::string& sync_group) { + // TODO(bugs.webrtc.org/11993): Expect to be called on the network thread. // Set sync only if there was no previous one. if (sync_group.empty()) return; @@ -1418,7 +1479,34 @@ return DeliverRtp(media_type, std::move(packet), packet_time_us); } +void Call::DeliverPacketAsync(MediaType media_type, + rtc::CopyOnWriteBuffer packet, + int64_t packet_time_us, + PacketCallback callback) { + RTC_DCHECK_RUN_ON(network_thread_); + + TaskQueueBase* network_thread = rtc::Thread::Current(); + RTC_DCHECK(network_thread); + + worker_thread_->PostTask(ToQueuedTask( + task_safety_, [this, network_thread, media_type, p = std::move(packet), + packet_time_us, cb = std::move(callback)] { + RTC_DCHECK_RUN_ON(worker_thread_); + DeliveryStatus status = DeliverPacket(media_type, p, packet_time_us); + if (cb) { + network_thread->PostTask( + ToQueuedTask([cb = std::move(cb), status, media_type, + p = std::move(p), packet_time_us]() { + cb(status, media_type, std::move(p), packet_time_us); + })); + } + })); +} + void Call::OnRecoveredPacket(const uint8_t* packet, size_t length) { + // TODO(bugs.webrtc.org/11993): Expect to be called on the network thread. + // This method is called synchronously via |OnRtpPacket()| (see DeliverRtp) + // on the same thread. RTC_DCHECK_RUN_ON(worker_thread_); RtpPacketReceived parsed_packet; if (!parsed_packet.Parse(packet, length)) diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/call_config.cc --- libtgowt-0~git20210124.be23804+ds/src/call/call_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -14,7 +14,9 @@ namespace webrtc { -CallConfig::CallConfig(RtcEventLog* event_log) : event_log(event_log) { +CallConfig::CallConfig(RtcEventLog* event_log, + TaskQueueBase* network_task_queue /* = nullptr*/) + : event_log(event_log), network_task_queue_(network_task_queue) { RTC_DCHECK(event_log); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call_config.h libtgowt-0~git20210627.91d836d+dfsg/src/call/call_config.h --- libtgowt-0~git20210124.be23804+ds/src/call/call_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -26,7 +26,11 @@ class RtcEventLog; struct CallConfig { - explicit CallConfig(RtcEventLog* event_log); + // If |network_task_queue| is set to nullptr, Call will assume that network + // related callbacks will be made on the same TQ as the Call instance was + // constructed on. + explicit CallConfig(RtcEventLog* event_log, + TaskQueueBase* network_task_queue = nullptr); CallConfig(const CallConfig&); ~CallConfig(); @@ -42,7 +46,7 @@ // RtcEventLog to use for this call. Required. // Use webrtc::RtcEventLog::CreateNull() for a null implementation. - RtcEventLog* event_log = nullptr; + RtcEventLog* const event_log = nullptr; // FecController to use for this call. FecControllerFactoryInterface* fec_controller_factory = nullptr; @@ -63,6 +67,8 @@ // Key-value mapping of internal configurations to apply, // e.g. field trials. const WebRtcKeyValueConfig* trials = nullptr; + + TaskQueueBase* const network_task_queue_ = nullptr; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call_factory.h libtgowt-0~git20210627.91d836d+dfsg/src/call/call_factory.h --- libtgowt-0~git20210124.be23804+ds/src/call/call_factory.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call_factory.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,9 +12,9 @@ #define CALL_CALL_FACTORY_H_ #include "api/call/call_factory_interface.h" +#include "api/sequence_checker.h" #include "call/call.h" #include "call/call_config.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/system/no_unique_address.h" namespace webrtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call_perf_tests.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/call_perf_tests.cc --- libtgowt-0~git20210124.be23804+ds/src/call/call_perf_tests.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call_perf_tests.cc 2021-06-27 05:27:48.000000000 +0000 @@ -312,14 +312,18 @@ DestroyStreams(); - video_send_transport.reset(); - audio_send_transport.reset(); - receive_transport.reset(); - sender_call_->DestroyAudioSendStream(audio_send_stream); receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); DestroyCalls(); + // Call may post periodic rtcp packet to the transport on the process + // thread, thus transport should be destroyed after the call objects. + // Though transports keep pointers to the call objects, transports handle + // packets on the task_queue() and thus wouldn't create a race while current + // destruction happens in the same task as destruction of the call objects. + video_send_transport.reset(); + audio_send_transport.reset(); + receive_transport.reset(); }); observer->PrintResults(); @@ -357,10 +361,8 @@ DriftingClock::PercentsFaster(30.0f), "_audio_faster"); } -// TODO(bugs.webrtc.org/12199): Disabled because flaky. -TEST_F( - CallPerfTest, - DISABLED_Synchronization_PlaysOutAudioAndVideoWithVideoFasterThanAudioDrift) { // NOLINT(whitespace/line_length) +TEST_F(CallPerfTest, + Synchronization_PlaysOutAudioAndVideoWithVideoFasterThanAudioDrift) { TestAudioVideoSync(FecMode::kOn, CreateOrder::kVideoFirst, DriftingClock::kNoDrift, DriftingClock::PercentsFaster(30.0f), @@ -559,6 +561,18 @@ // TODO(sprang): Add integration test for maintain-framerate mode? void OnSinkWantsChanged(rtc::VideoSinkInterface* sink, const rtc::VideoSinkWants& wants) override { + // The sink wants can change either because an adaptation happened (i.e. + // the pixels or frame rate changed) or for other reasons, such as encoded + // resolutions being communicated (happens whenever we capture a new frame + // size). In this test, we only care about adaptations. + bool did_adapt = + last_wants_.max_pixel_count != wants.max_pixel_count || + last_wants_.target_pixel_count != wants.target_pixel_count || + last_wants_.max_framerate_fps != wants.max_framerate_fps; + last_wants_ = wants; + if (!did_adapt) { + return; + } // At kStart expect CPU overuse. Then expect CPU underuse when the encoder // delay has been decreased. switch (test_phase_) { @@ -623,6 +637,9 @@ kAdaptedDown, kAdaptedUp } test_phase_; + + private: + rtc::VideoSinkWants last_wants_; } test; RunBaseTest(&test); diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/call_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/call_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/call/call_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/call_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -30,6 +30,7 @@ #include "call/audio_state.h" #include "modules/audio_device/include/mock_audio_device.h" #include "modules/audio_processing/include/mock_audio_processing.h" +#include "modules/include/module.h" #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" #include "test/fake_encoder.h" #include "test/gtest.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/packet_receiver.h libtgowt-0~git20210627.91d836d+dfsg/src/call/packet_receiver.h --- libtgowt-0~git20210124.be23804+ds/src/call/packet_receiver.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/packet_receiver.h 2021-06-27 05:27:48.000000000 +0000 @@ -11,8 +11,10 @@ #define CALL_PACKET_RECEIVER_H_ #include +#include #include #include +#include #include #include "api/media_types.h" @@ -28,6 +30,32 @@ DELIVERY_PACKET_ERROR, }; + // Definition of the callback to execute when packet delivery is complete. + // The callback will be issued on the same thread as called DeliverPacket. + typedef std::function< + void(DeliveryStatus, MediaType, rtc::CopyOnWriteBuffer, int64_t)> + PacketCallback; + + // Asynchronously handle packet delivery and report back to the caller when + // delivery of the packet has completed. + // Note that if the packet is invalid or can be processed without the need of + // asynchronous operations that the |callback| may have been called before + // the function returns. + // TODO(bugs.webrtc.org/11993): This function is meant to be called on the + // network thread exclusively but while the code is being updated to align + // with those goals, it may be called either on the worker or network threads. + // Update docs etc when the work has been completed. Once we're done with the + // updates, we might be able to go back to returning the status from this + // function instead of having to report it via a callback. + virtual void DeliverPacketAsync(MediaType media_type, + rtc::CopyOnWriteBuffer packet, + int64_t packet_time_us, + PacketCallback callback) { + DeliveryStatus status = DeliverPacket(media_type, packet, packet_time_us); + if (callback) + callback(status, media_type, std::move(packet), packet_time_us); + } + virtual DeliveryStatus DeliverPacket(MediaType media_type, rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_demuxer.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_demuxer.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_demuxer.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_demuxer.cc 2021-06-27 05:27:48.000000000 +0000 @@ -53,6 +53,16 @@ RtpDemuxerCriteria::RtpDemuxerCriteria() = default; RtpDemuxerCriteria::~RtpDemuxerCriteria() = default; +bool RtpDemuxerCriteria::operator==(const RtpDemuxerCriteria& other) const { + return this->mid == other.mid && this->rsid == other.rsid && + this->ssrcs == other.ssrcs && + this->payload_types == other.payload_types; +} + +bool RtpDemuxerCriteria::operator!=(const RtpDemuxerCriteria& other) const { + return !(*this == other); +} + std::string RtpDemuxerCriteria::ToString() const { rtc::StringBuilder sb; sb << "{mid: " << (mid.empty() ? "" : mid) @@ -91,7 +101,7 @@ return sb.Release(); } -RtpDemuxer::RtpDemuxer() = default; +RtpDemuxer::RtpDemuxer(bool use_mid /* = true*/) : use_mid_(use_mid) {} RtpDemuxer::~RtpDemuxer() { RTC_DCHECK(sink_by_mid_.empty()); diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_demuxer.h libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_demuxer.h --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_demuxer.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_demuxer.h 2021-06-27 05:27:48.000000000 +0000 @@ -28,6 +28,9 @@ RtpDemuxerCriteria(); ~RtpDemuxerCriteria(); + bool operator==(const RtpDemuxerCriteria& other) const; + bool operator!=(const RtpDemuxerCriteria& other) const; + // If not the empty string, will match packets with this MID. std::string mid; @@ -94,7 +97,7 @@ // relevant for demuxing. static std::string DescribePacket(const RtpPacketReceived& packet); - RtpDemuxer(); + explicit RtpDemuxer(bool use_mid = true); ~RtpDemuxer(); RtpDemuxer(const RtpDemuxer&) = delete; @@ -132,10 +135,6 @@ // if the packet was forwarded and false if the packet was dropped. bool OnRtpPacket(const RtpPacketReceived& packet); - // Configure whether to look at the MID header extension when demuxing - // incoming RTP packets. By default this is enabled. - void set_use_mid(bool use_mid) { use_mid_ = use_mid; } - private: // Returns true if adding a sink with the given criteria would cause conflicts // with the existing criteria and should be rejected. @@ -191,7 +190,7 @@ // Adds a binding from the SSRC to the given sink. void AddSsrcSinkBinding(uint32_t ssrc, RtpPacketSinkInterface* sink); - bool use_mid_ = true; + const bool use_mid_; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_payload_params.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_payload_params.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_payload_params.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_payload_params.cc 2021-06-27 05:27:48.000000000 +0000 @@ -164,7 +164,7 @@ PopulateRtpWithCodecSpecifics(*codec_specific_info, image.SpatialIndex(), &rtp_video_header); } - rtp_video_header.frame_type = image._frameType, + rtp_video_header.frame_type = image._frameType; rtp_video_header.rotation = image.rotation_; rtp_video_header.content_type = image.content_type_; rtp_video_header.playout_delay = image.playout_delay_; @@ -173,6 +173,7 @@ rtp_video_header.color_space = image.ColorSpace() ? absl::make_optional(*image.ColorSpace()) : absl::nullopt; + rtp_video_header.video_frame_tracking_id = image.VideoFrameTrackingId(); SetVideoTiming(image, &rtp_video_header.video_timing); const bool is_keyframe = image._frameType == VideoFrameType::kVideoFrameKey; diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_stream_receiver_controller.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_stream_receiver_controller.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_stream_receiver_controller.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_stream_receiver_controller.cc 2021-06-27 05:27:48.000000000 +0000 @@ -37,11 +37,7 @@ controller_->RemoveSink(sink_); } -RtpStreamReceiverController::RtpStreamReceiverController() { - // At this level the demuxer is only configured to demux by SSRC, so don't - // worry about MIDs (MIDs are handled by upper layers). - demuxer_.set_use_mid(false); -} +RtpStreamReceiverController::RtpStreamReceiverController() {} RtpStreamReceiverController::~RtpStreamReceiverController() = default; @@ -52,19 +48,19 @@ } bool RtpStreamReceiverController::OnRtpPacket(const RtpPacketReceived& packet) { - rtc::CritScope cs(&lock_); + RTC_DCHECK_RUN_ON(&demuxer_sequence_); return demuxer_.OnRtpPacket(packet); } bool RtpStreamReceiverController::AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) { - rtc::CritScope cs(&lock_); + RTC_DCHECK_RUN_ON(&demuxer_sequence_); return demuxer_.AddSink(ssrc, sink); } size_t RtpStreamReceiverController::RemoveSink( const RtpPacketSinkInterface* sink) { - rtc::CritScope cs(&lock_); + RTC_DCHECK_RUN_ON(&demuxer_sequence_); return demuxer_.RemoveSink(sink); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_stream_receiver_controller.h libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_stream_receiver_controller.h --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_stream_receiver_controller.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_stream_receiver_controller.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,9 +12,9 @@ #include +#include "api/sequence_checker.h" #include "call/rtp_demuxer.h" #include "call/rtp_stream_receiver_controller_interface.h" -#include "rtc_base/deprecated/recursive_critical_section.h" namespace webrtc { @@ -58,13 +58,18 @@ RtpPacketSinkInterface* const sink_; }; - // TODO(nisse): Move to a TaskQueue for synchronization. When used - // by Call, we expect construction and all methods but OnRtpPacket - // to be called on the same thread, and OnRtpPacket to be called - // by a single, but possibly distinct, thread. But applications not - // using Call may have use threads differently. - rtc::RecursiveCriticalSection lock_; - RtpDemuxer demuxer_ RTC_GUARDED_BY(&lock_); + // TODO(bugs.webrtc.org/11993): We expect construction and all methods to be + // called on the same thread/tq. Currently this is the worker thread + // (including OnRtpPacket) but a more natural fit would be the network thread. + // Using a sequence checker to ensure that usage is correct but at the same + // time not require a specific thread/tq, an instance of this class + the + // associated functionality should be easily moved from one execution context + // to another (i.e. when network packets don't hop to the worker thread inside + // of Call). + SequenceChecker demuxer_sequence_; + // At this level the demuxer is only configured to demux by SSRC, so don't + // worry about MIDs (MIDs are handled by upper layers). + RtpDemuxer demuxer_ RTC_GUARDED_BY(&demuxer_sequence_){false /*use_mid*/}; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_transport_controller_send.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_transport_controller_send.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_transport_controller_send.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_transport_controller_send.cc 2021-06-27 05:27:48.000000000 +0000 @@ -87,7 +87,7 @@ : clock_(clock), event_log_(event_log), bitrate_configurator_(bitrate_config), - process_thread_started_(false), + pacer_started_(false), process_thread_(std::move(process_thread)), use_task_queue_pacer_(IsEnabled(trials, "WebRTC-TaskQueuePacer")), process_thread_pacer_(use_task_queue_pacer_ @@ -496,9 +496,13 @@ } void RtpTransportControllerSend::EnsureStarted() { - if (!use_task_queue_pacer_ && !process_thread_started_) { - process_thread_started_ = true; - process_thread_->Start(); + if (!pacer_started_) { + pacer_started_ = true; + if (use_task_queue_pacer_) { + task_queue_pacer_->EnsureStarted(); + } else { + process_thread_->Start(); + } } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_transport_controller_send.h libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_transport_controller_send.h --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_transport_controller_send.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_transport_controller_send.h 2021-06-27 05:27:48.000000000 +0000 @@ -152,7 +152,7 @@ std::vector> video_rtp_senders_; RtpBitrateConfigurator bitrate_configurator_; std::map network_routes_; - bool process_thread_started_; + bool pacer_started_; const std::unique_ptr process_thread_; const bool use_task_queue_pacer_; std::unique_ptr process_thread_pacer_; diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender.cc 2021-06-27 05:27:48.000000000 +0000 @@ -301,6 +301,48 @@ return ext.uri == RtpExtension::kTransportSequenceNumberUri; }); } + +// Returns true when some coded video sequence can be decoded starting with +// this frame without requiring any previous frames. +// e.g. it is the same as a key frame when spatial scalability is not used. +// When spatial scalability is used, then it is true for layer frames of +// a key frame without inter-layer dependencies. +bool IsFirstFrameOfACodedVideoSequence( + const EncodedImage& encoded_image, + const CodecSpecificInfo* codec_specific_info) { + if (encoded_image._frameType != VideoFrameType::kVideoFrameKey) { + return false; + } + + if (codec_specific_info != nullptr) { + if (codec_specific_info->generic_frame_info.has_value()) { + // This function is used before + // `codec_specific_info->generic_frame_info->frame_diffs` are calculated, + // so need to use a more complicated way to check for presence of the + // dependencies. + return absl::c_none_of( + codec_specific_info->generic_frame_info->encoder_buffers, + [](const CodecBufferUsage& buffer) { return buffer.referenced; }); + } + + if (codec_specific_info->codecType == VideoCodecType::kVideoCodecVP8 || + codec_specific_info->codecType == VideoCodecType::kVideoCodecH264 || + codec_specific_info->codecType == VideoCodecType::kVideoCodecGeneric) { + // These codecs do not support intra picture dependencies, so a frame + // marked as a key frame should be a key frame. + return true; + } + } + + // Without depenedencies described in generic format do an educated guess. + // It might be wrong for VP9 with spatial layer 0 skipped or higher spatial + // layer not depending on the spatial layer 0. This corner case is unimportant + // for current usage of this helper function. + + // Use <= to accept both 0 (i.e. the first) and nullopt (i.e. the only). + return encoded_image.SpatialIndex() <= 0; +} + } // namespace RtpVideoSender::RtpVideoSender( @@ -369,18 +411,6 @@ // RTP/RTCP initialization. - // We add the highest spatial layer first to ensure it'll be prioritized - // when sending padding, with the hope that the packet rate will be smaller, - // and that it's more important to protect than the lower layers. - - // TODO(nisse): Consider moving registration with PacketRouter last, after the - // modules are fully configured. - for (const RtpStreamSender& stream : rtp_streams_) { - constexpr bool remb_candidate = true; - transport->packet_router()->AddSendRtpModule(stream.rtp_rtcp.get(), - remb_candidate); - } - for (size_t i = 0; i < rtp_config_.extensions.size(); ++i) { const std::string& extension = rtp_config_.extensions[i].uri; int id = rtp_config_.extensions[i].id; @@ -421,9 +451,8 @@ } RtpVideoSender::~RtpVideoSender() { - for (const RtpStreamSender& stream : rtp_streams_) { - transport_->packet_router()->RemoveSendRtpModule(stream.rtp_rtcp.get()); - } + SetActiveModulesLocked( + std::vector(rtp_streams_.size(), /*active=*/false)); transport_->GetStreamFeedbackProvider()->DeRegisterStreamFeedbackObserver( this); } @@ -467,10 +496,29 @@ if (active_modules[i]) { active_ = true; } + + RtpRtcpInterface& rtp_module = *rtp_streams_[i].rtp_rtcp; + const bool was_active = rtp_module.SendingMedia(); + const bool should_be_active = active_modules[i]; + // Sends a kRtcpByeCode when going from true to false. - rtp_streams_[i].rtp_rtcp->SetSendingStatus(active_modules[i]); + rtp_module.SetSendingStatus(active_modules[i]); + + if (was_active && !should_be_active) { + // Disabling media, remove from packet router map to reduce size and + // prevent any stray packets in the pacer from asynchronously arriving + // to a disabled module. + transport_->packet_router()->RemoveSendRtpModule(&rtp_module); + } + // If set to false this module won't send media. - rtp_streams_[i].rtp_rtcp->SetSendingMediaStatus(active_modules[i]); + rtp_module.SetSendingMediaStatus(active_modules[i]); + + if (!was_active && should_be_active) { + // Turning on media, register with packet router. + transport_->packet_router()->AddSendRtpModule(&rtp_module, + /*remb_candidate=*/true); + } } } @@ -526,7 +574,7 @@ rtp_streams_[stream_index].rtp_rtcp->ExpectedRetransmissionTimeMs(); } - if (encoded_image._frameType == VideoFrameType::kVideoFrameKey) { + if (IsFirstFrameOfACodedVideoSequence(encoded_image, codec_specific_info)) { // If encoder adapter produce FrameDependencyStructure, pass it so that // dependency descriptor rtp header extension can be used. // If not supported, disable using dependency descriptor by passing nullptr. diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender.h libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender.h --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender.h 2021-06-27 05:27:48.000000000 +0000 @@ -22,6 +22,7 @@ #include "api/fec_controller.h" #include "api/fec_controller_override.h" #include "api/rtc_event_log/rtc_event_log.h" +#include "api/sequence_checker.h" #include "api/transport/field_trial_based_config.h" #include "api/video_codecs/video_encoder.h" #include "call/rtp_config.h" @@ -39,7 +40,6 @@ #include "rtc_base/rate_limiter.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" -#include "rtc_base/thread_checker.h" namespace webrtc { @@ -185,7 +185,7 @@ bool active_ RTC_GUARDED_BY(mutex_); ProcessThread* module_process_thread_; - rtc::ThreadChecker module_process_thread_checker_; + SequenceChecker module_process_thread_checker_; std::map suspended_ssrcs_; const std::unique_ptr fec_controller_; diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/call/rtp_video_sender_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/rtp_video_sender_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -713,6 +713,61 @@ sent_packets.back().HasExtension()); } +TEST(RtpVideoSenderTest, SupportsDependencyDescriptorForVp9) { + RtpVideoSenderTestFixture test({kSsrc1}, {}, kPayloadType, {}); + test.router()->SetActive(true); + + RtpHeaderExtensionMap extensions; + extensions.Register( + kDependencyDescriptorExtensionId); + std::vector sent_packets; + ON_CALL(test.transport(), SendRtp) + .WillByDefault([&](const uint8_t* packet, size_t length, + const PacketOptions& options) { + sent_packets.emplace_back(&extensions); + EXPECT_TRUE(sent_packets.back().Parse(packet, length)); + return true; + }); + + const uint8_t kPayload[1] = {'a'}; + EncodedImage encoded_image; + encoded_image.SetTimestamp(1); + encoded_image.capture_time_ms_ = 2; + encoded_image._frameType = VideoFrameType::kVideoFrameKey; + encoded_image.SetEncodedData( + EncodedImageBuffer::Create(kPayload, sizeof(kPayload))); + + CodecSpecificInfo codec_specific; + codec_specific.codecType = VideoCodecType::kVideoCodecVP9; + codec_specific.template_structure.emplace(); + codec_specific.template_structure->num_decode_targets = 2; + codec_specific.template_structure->templates = { + FrameDependencyTemplate().S(0).Dtis("SS"), + FrameDependencyTemplate().S(1).Dtis("-S").FrameDiffs({1}), + }; + + // Send two tiny images, each mapping to single RTP packet. + // Send in key frame for the base spatial layer. + codec_specific.generic_frame_info = + GenericFrameInfo::Builder().S(0).Dtis("SS").Build(); + codec_specific.generic_frame_info->encoder_buffers = {{0, false, true}}; + EXPECT_EQ(test.router()->OnEncodedImage(encoded_image, &codec_specific).error, + EncodedImageCallback::Result::OK); + // Send in 2nd spatial layer. + codec_specific.template_structure = absl::nullopt; + codec_specific.generic_frame_info = + GenericFrameInfo::Builder().S(1).Dtis("-S").Build(); + codec_specific.generic_frame_info->encoder_buffers = {{0, true, false}, + {1, false, true}}; + EXPECT_EQ(test.router()->OnEncodedImage(encoded_image, &codec_specific).error, + EncodedImageCallback::Result::OK); + + test.AdvanceTime(TimeDelta::Millis(33)); + ASSERT_THAT(sent_packets, SizeIs(2)); + EXPECT_TRUE(sent_packets[0].HasExtension()); + EXPECT_TRUE(sent_packets[1].HasExtension()); +} + TEST(RtpVideoSenderTest, SupportsStoppingUsingDependencyDescriptor) { RtpVideoSenderTestFixture test({kSsrc1}, {}, kPayloadType, {}); test.router()->SetActive(true); @@ -770,6 +825,64 @@ sent_packets.back().HasExtension()); } +TEST(RtpVideoSenderTest, + SupportsStoppingUsingDependencyDescriptorForVp8Simulcast) { + RtpVideoSenderTestFixture test({kSsrc1, kSsrc2}, {}, kPayloadType, {}); + test.router()->SetActive(true); + + RtpHeaderExtensionMap extensions; + extensions.Register( + kDependencyDescriptorExtensionId); + std::vector sent_packets; + ON_CALL(test.transport(), SendRtp) + .WillByDefault([&](const uint8_t* packet, size_t length, + const PacketOptions& options) { + sent_packets.emplace_back(&extensions); + EXPECT_TRUE(sent_packets.back().Parse(packet, length)); + return true; + }); + + const uint8_t kPayload[1] = {'a'}; + EncodedImage encoded_image; + encoded_image.SetTimestamp(1); + encoded_image.capture_time_ms_ = 2; + encoded_image.SetEncodedData( + EncodedImageBuffer::Create(kPayload, sizeof(kPayload))); + // VP8 simulcast uses spatial index to communicate simulcast stream. + encoded_image.SetSpatialIndex(1); + + CodecSpecificInfo codec_specific; + codec_specific.codecType = VideoCodecType::kVideoCodecVP8; + codec_specific.template_structure.emplace(); + codec_specific.template_structure->num_decode_targets = 1; + codec_specific.template_structure->templates = { + FrameDependencyTemplate().T(0).Dtis("S")}; + + // Send two tiny images, mapping to single RTP packets. + // Send in a key frame. + encoded_image._frameType = VideoFrameType::kVideoFrameKey; + codec_specific.generic_frame_info = + GenericFrameInfo::Builder().T(0).Dtis("S").Build(); + codec_specific.generic_frame_info->encoder_buffers = {{0, false, true}}; + EXPECT_EQ(test.router()->OnEncodedImage(encoded_image, &codec_specific).error, + EncodedImageCallback::Result::OK); + test.AdvanceTime(TimeDelta::Millis(33)); + ASSERT_THAT(sent_packets, SizeIs(1)); + EXPECT_TRUE( + sent_packets.back().HasExtension()); + + // Send in a new key frame without the support for the dependency descriptor. + encoded_image._frameType = VideoFrameType::kVideoFrameKey; + codec_specific.template_structure = absl::nullopt; + codec_specific.generic_frame_info = absl::nullopt; + EXPECT_EQ(test.router()->OnEncodedImage(encoded_image, &codec_specific).error, + EncodedImageCallback::Result::OK); + test.AdvanceTime(TimeDelta::Millis(33)); + ASSERT_THAT(sent_packets, SizeIs(2)); + EXPECT_FALSE( + sent_packets.back().HasExtension()); +} + TEST(RtpVideoSenderTest, CanSetZeroBitrate) { RtpVideoSenderTestFixture test({kSsrc1}, {kRtxSsrc1}, kPayloadType, {}); test.router()->OnBitrateUpdated(CreateBitrateAllocationUpdate(0), @@ -798,7 +911,7 @@ constexpr uint32_t kTransportPacketOverheadBytes = 40; constexpr uint32_t kOverheadPerPacketBytes = kRtpHeaderSizeBytes + kTransportPacketOverheadBytes; - RtpVideoSenderTestFixture test({kSsrc1}, {kRtxSsrc1}, kPayloadType, {}); + RtpVideoSenderTestFixture test({kSsrc1}, {}, kPayloadType, {}); test.router()->OnTransportOverheadChanged(kTransportPacketOverheadBytes); test.router()->SetActive(true); diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/simulated_network.h libtgowt-0~git20210627.91d836d+dfsg/src/call/simulated_network.h --- libtgowt-0~git20210124.be23804+ds/src/call/simulated_network.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/simulated_network.h 2021-06-27 05:27:48.000000000 +0000 @@ -17,6 +17,7 @@ #include #include "absl/types/optional.h" +#include "api/sequence_checker.h" #include "api/test/simulated_network.h" #include "api/units/data_size.h" #include "api/units/timestamp.h" @@ -24,7 +25,6 @@ #include "rtc_base/random.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" -#include "rtc_base/thread_checker.h" namespace webrtc { // Implementation of the CoDel active queue management algorithm. Loosely based diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/version.cc libtgowt-0~git20210627.91d836d+dfsg/src/call/version.cc --- libtgowt-0~git20210124.be23804+ds/src/call/version.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/version.cc 2021-06-27 05:27:48.000000000 +0000 @@ -13,7 +13,7 @@ namespace webrtc { // The timestamp is always in UTC. -const char* const kSourceTimestamp = "WebRTC source stamp 2020-12-27T04:03:22"; +const char* const kSourceTimestamp = "WebRTC source stamp 2021-04-08T04:03:37"; void LoadWebRTCVersionInRegister() { // Using volatile to instruct the compiler to not optimize `p` away even diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/video_receive_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/call/video_receive_stream.h --- libtgowt-0~git20210124.be23804+ds/src/call/video_receive_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/video_receive_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -215,6 +215,10 @@ // Set if the stream is protected using FlexFEC. bool protected_by_flexfec = false; + // Optional callback sink to support additional packet handlsers such as + // FlexFec. + RtpPacketSinkInterface* packet_sink_ = nullptr; + // Map from rtx payload type -> media payload type. // For RTX to be enabled, both an SSRC and this mapping are needed. std::map rtx_associated_payload_types; @@ -277,13 +281,6 @@ // TODO(pbos): Add info on currently-received codec to Stats. virtual Stats GetStats() const = 0; - // RtpDemuxer only forwards a given RTP packet to one sink. However, some - // sinks, such as FlexFEC, might wish to be informed of all of the packets - // a given sink receives (or any set of sinks). They may do so by registering - // themselves as secondary sinks. - virtual void AddSecondarySink(RtpPacketSinkInterface* sink) = 0; - virtual void RemoveSecondarySink(const RtpPacketSinkInterface* sink) = 0; - virtual std::vector GetSources() const = 0; // Sets a base minimum for the playout delay. Base minimum delay sets lower @@ -324,6 +321,16 @@ virtual ~VideoReceiveStream() {} }; +class DEPRECATED_VideoReceiveStream : public VideoReceiveStream { + public: + // RtpDemuxer only forwards a given RTP packet to one sink. However, some + // sinks, such as FlexFEC, might wish to be informed of all of the packets + // a given sink receives (or any set of sinks). They may do so by registering + // themselves as secondary sinks. + virtual void AddSecondarySink(RtpPacketSinkInterface* sink) = 0; + virtual void RemoveSecondarySink(const RtpPacketSinkInterface* sink) = 0; +}; + } // namespace webrtc #endif // CALL_VIDEO_RECEIVE_STREAM_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/call/video_send_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/call/video_send_stream.h --- libtgowt-0~git20210124.be23804+ds/src/call/video_send_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/call/video_send_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -108,6 +108,7 @@ uint64_t total_encode_time_ms = 0; // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-totalencodedbytestarget uint64_t total_encoded_bytes_target = 0; + uint32_t frames = 0; uint32_t frames_dropped_by_capturer = 0; uint32_t frames_dropped_by_encoder_queue = 0; uint32_t frames_dropped_by_rate_limiter = 0; diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/common_audio/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -335,7 +335,7 @@ } } -if (rtc_include_tests) { +if (rtc_include_tests && !build_with_chromium) { rtc_test("common_audio_unittests") { visibility += webrtc_default_visibility testonly = true diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/include/signal_processing_library.h libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/include/signal_processing_library.h --- libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/include/signal_processing_library.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/include/signal_processing_library.h 2021-06-27 05:27:48.000000000 +0000 @@ -228,6 +228,25 @@ int32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, size_t length); #endif +// Returns both the minimum and maximum values of a 16-bit vector. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// Ouput: +// - max_val : Maximum sample value in |vector|. +// - min_val : Minimum sample value in |vector|. +void WebRtcSpl_MinMaxW16(const int16_t* vector, + size_t length, + int16_t* min_val, + int16_t* max_val); +#if defined(WEBRTC_HAS_NEON) +void WebRtcSpl_MinMaxW16Neon(const int16_t* vector, + size_t length, + int16_t* min_val, + int16_t* max_val); +#endif + // Returns the vector index to the largest absolute value of a 16-bit vector. // // Input: @@ -240,6 +259,17 @@ // -32768 presenting an int16 absolute value of 32767). size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length); +// Returns the element with the largest absolute value of a 16-bit vector. Note +// that this function can return a negative value. +// +// Input: +// - vector : 16-bit input vector. +// - length : Number of samples in vector. +// +// Return value : The element with the largest absolute value. Note that this +// may be a negative value. +int16_t WebRtcSpl_MaxAbsElementW16(const int16_t* vector, size_t length); + // Returns the vector index to the maximum sample value of a 16-bit vector. // // Input: diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/min_max_operations.c libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/min_max_operations.c --- libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/min_max_operations.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/min_max_operations.c 2021-06-27 05:27:48.000000000 +0000 @@ -155,6 +155,15 @@ return index; } +int16_t WebRtcSpl_MaxAbsElementW16(const int16_t* vector, size_t length) { + int16_t min_val, max_val; + WebRtcSpl_MinMaxW16(vector, length, &min_val, &max_val); + if (min_val == max_val || min_val < -max_val) { + return min_val; + } + return max_val; +} + // Index of maximum value in a word16 vector. size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length) { size_t i = 0, index = 0; @@ -222,3 +231,26 @@ return index; } + +// Finds both the minimum and maximum elements in an array of 16-bit integers. +void WebRtcSpl_MinMaxW16(const int16_t* vector, size_t length, + int16_t* min_val, int16_t* max_val) { +#if defined(WEBRTC_HAS_NEON) + return WebRtcSpl_MinMaxW16Neon(vector, length, min_val, max_val); +#else + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + size_t i = 0; + + RTC_DCHECK_GT(length, 0); + + for (i = 0; i < length; i++) { + if (vector[i] < minimum) + minimum = vector[i]; + if (vector[i] > maximum) + maximum = vector[i]; + } + *min_val = minimum; + *max_val = maximum; +#endif +} diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/min_max_operations_neon.c libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/min_max_operations_neon.c --- libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/min_max_operations_neon.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/min_max_operations_neon.c 2021-06-27 05:27:48.000000000 +0000 @@ -281,3 +281,53 @@ return minimum; } +// Finds both the minimum and maximum elements in an array of 16-bit integers. +void WebRtcSpl_MinMaxW16Neon(const int16_t* vector, size_t length, + int16_t* min_val, int16_t* max_val) { + int16_t minimum = WEBRTC_SPL_WORD16_MAX; + int16_t maximum = WEBRTC_SPL_WORD16_MIN; + size_t i = 0; + size_t residual = length & 0x7; + + RTC_DCHECK_GT(length, 0); + + const int16_t* p_start = vector; + int16x8_t min16x8 = vdupq_n_s16(WEBRTC_SPL_WORD16_MAX); + int16x8_t max16x8 = vdupq_n_s16(WEBRTC_SPL_WORD16_MIN); + + // First part, unroll the loop 8 times. + for (i = 0; i < length - residual; i += 8) { + int16x8_t in16x8 = vld1q_s16(p_start); + min16x8 = vminq_s16(min16x8, in16x8); + max16x8 = vmaxq_s16(max16x8, in16x8); + p_start += 8; + } + +#if defined(WEBRTC_ARCH_ARM64) + minimum = vminvq_s16(min16x8); + maximum = vmaxvq_s16(max16x8); +#else + int16x4_t min16x4 = vmin_s16(vget_low_s16(min16x8), vget_high_s16(min16x8)); + min16x4 = vpmin_s16(min16x4, min16x4); + min16x4 = vpmin_s16(min16x4, min16x4); + + minimum = vget_lane_s16(min16x4, 0); + + int16x4_t max16x4 = vmax_s16(vget_low_s16(max16x8), vget_high_s16(max16x8)); + max16x4 = vpmax_s16(max16x4, max16x4); + max16x4 = vpmax_s16(max16x4, max16x4); + + maximum = vget_lane_s16(max16x4, 0); +#endif + + // Second part, do the remaining iterations (if any). + for (i = residual; i > 0; i--) { + if (*p_start < minimum) + minimum = *p_start; + if (*p_start > maximum) + maximum = *p_start; + p_start++; + } + *min_val = minimum; + *max_val = maximum; +} diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/signal_processing_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/signal_processing_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/signal_processing_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/signal_processing_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -289,6 +289,12 @@ WebRtcSpl_MinValueW32(vector32, kVectorSize)); EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, + WebRtcSpl_MaxAbsElementW16(vector16, kVectorSize)); + int16_t min_value, max_value; + WebRtcSpl_MinMaxW16(vector16, kVectorSize, &min_value, &max_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, min_value); + EXPECT_EQ(12334, max_value); // Test the cases where maximum values have to be caught // outside of the unrolled loops in ARM-Neon. @@ -306,6 +312,11 @@ EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize)); EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize)); EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, + WebRtcSpl_MaxAbsElementW16(vector16, kVectorSize)); + WebRtcSpl_MinMaxW16(vector16, kVectorSize, &min_value, &max_value); + EXPECT_EQ(-29871, min_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, max_value); // Test the cases where multiple maximum and minimum values are present. vector16[1] = WEBRTC_SPL_WORD16_MAX; @@ -332,6 +343,43 @@ EXPECT_EQ(1u, WebRtcSpl_MaxIndexW32(vector32, kVectorSize)); EXPECT_EQ(6u, WebRtcSpl_MinIndexW16(vector16, kVectorSize)); EXPECT_EQ(6u, WebRtcSpl_MinIndexW32(vector32, kVectorSize)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, + WebRtcSpl_MaxAbsElementW16(vector16, kVectorSize)); + WebRtcSpl_MinMaxW16(vector16, kVectorSize, &min_value, &max_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, min_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, max_value); + + // Test a one-element vector. + int16_t single_element_vector = 0; + EXPECT_EQ(0, WebRtcSpl_MaxAbsValueW16(&single_element_vector, 1)); + EXPECT_EQ(0, WebRtcSpl_MaxValueW16(&single_element_vector, 1)); + EXPECT_EQ(0, WebRtcSpl_MinValueW16(&single_element_vector, 1)); + EXPECT_EQ(0u, WebRtcSpl_MaxAbsIndexW16(&single_element_vector, 1)); + EXPECT_EQ(0u, WebRtcSpl_MaxIndexW16(&single_element_vector, 1)); + EXPECT_EQ(0u, WebRtcSpl_MinIndexW16(&single_element_vector, 1)); + EXPECT_EQ(0, WebRtcSpl_MaxAbsElementW16(&single_element_vector, 1)); + WebRtcSpl_MinMaxW16(&single_element_vector, 1, &min_value, &max_value); + EXPECT_EQ(0, min_value); + EXPECT_EQ(0, max_value); + + // Test a two-element vector with the values WEBRTC_SPL_WORD16_MIN and + // WEBRTC_SPL_WORD16_MAX. + int16_t two_element_vector[2] = {WEBRTC_SPL_WORD16_MIN, + WEBRTC_SPL_WORD16_MAX}; + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, + WebRtcSpl_MaxAbsValueW16(two_element_vector, 2)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, + WebRtcSpl_MaxValueW16(two_element_vector, 2)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, + WebRtcSpl_MinValueW16(two_element_vector, 2)); + EXPECT_EQ(0u, WebRtcSpl_MaxAbsIndexW16(two_element_vector, 2)); + EXPECT_EQ(1u, WebRtcSpl_MaxIndexW16(two_element_vector, 2)); + EXPECT_EQ(0u, WebRtcSpl_MinIndexW16(two_element_vector, 2)); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, + WebRtcSpl_MaxAbsElementW16(two_element_vector, 2)); + WebRtcSpl_MinMaxW16(two_element_vector, 2, &min_value, &max_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MIN, min_value); + EXPECT_EQ(WEBRTC_SPL_WORD16_MAX, max_value); } TEST(SplTest, VectorOperationsTest) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/splitting_filter.c libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/splitting_filter.c --- libtgowt-0~git20210124.be23804+ds/src/common_audio/signal_processing/splitting_filter.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_audio/signal_processing/splitting_filter.c 2021-06-27 05:27:48.000000000 +0000 @@ -44,9 +44,11 @@ // |data_length| // -void WebRtcSpl_AllPassQMF(int32_t* in_data, size_t data_length, - int32_t* out_data, const uint16_t* filter_coefficients, - int32_t* filter_state) +static void WebRtcSpl_AllPassQMF(int32_t* in_data, + size_t data_length, + int32_t* out_data, + const uint16_t* filter_coefficients, + int32_t* filter_state) { // The procedure is to filter the input with three first order all pass filters // (cascade operations). diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/common_video/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/common_video/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -59,6 +59,7 @@ deps = [ "../api:scoped_refptr", + "../api:sequence_checker", "../api/task_queue", "../api/units:time_delta", "../api/units:timestamp", @@ -66,7 +67,6 @@ "../api/video:video_bitrate_allocation", "../api/video:video_bitrate_allocator", "../api/video:video_frame", - "../api/video:video_frame_nv12", "../api/video:video_rtp_headers", "../api/video_codecs:bitstream_parser_api", "../media:rtc_h264_profile_id", @@ -88,7 +88,7 @@ sources = [ "frame_counts.h" ] } -if (rtc_include_tests) { +if (rtc_include_tests && !build_with_chromium) { common_video_resources = [ "../resources/foreman_cif.yuv" ] if (is_ios) { @@ -121,7 +121,6 @@ "../api/units:time_delta", "../api/video:video_frame", "../api/video:video_frame_i010", - "../api/video:video_frame_nv12", "../api/video:video_rtp_headers", "../media:rtc_h264_profile_id", "../rtc_base", @@ -135,10 +134,11 @@ "../test:test_support", "../test:video_test_common", "//testing/gtest", - "//third_party/abseil-cpp/absl/types:optional", "//third_party/libyuv", ] + absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] + data = common_video_resources if (is_android) { deps += [ "//testing/android/native_test:native_test_support" ] diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser.cc 2021-06-27 05:27:48.000000000 +0000 @@ -296,35 +296,24 @@ } } -void H264BitstreamParser::ParseBitstream(const uint8_t* bitstream, - size_t length) { +void H264BitstreamParser::ParseBitstream( + rtc::ArrayView bitstream) { std::vector nalu_indices = - H264::FindNaluIndices(bitstream, length); + H264::FindNaluIndices(bitstream.data(), bitstream.size()); for (const H264::NaluIndex& index : nalu_indices) - ParseSlice(&bitstream[index.payload_start_offset], index.payload_size); + ParseSlice(bitstream.data() + index.payload_start_offset, + index.payload_size); } -bool H264BitstreamParser::GetLastSliceQp(int* qp) const { +absl::optional H264BitstreamParser::GetLastSliceQp() const { if (!last_slice_qp_delta_ || !pps_) - return false; - const int parsed_qp = 26 + pps_->pic_init_qp_minus26 + *last_slice_qp_delta_; - if (parsed_qp < kMinQpValue || parsed_qp > kMaxQpValue) { + return absl::nullopt; + const int qp = 26 + pps_->pic_init_qp_minus26 + *last_slice_qp_delta_; + if (qp < kMinQpValue || qp > kMaxQpValue) { RTC_LOG(LS_ERROR) << "Parsed invalid QP from bitstream."; - return false; + return absl::nullopt; } - *qp = parsed_qp; - return true; -} - -void H264BitstreamParser::ParseBitstream( - rtc::ArrayView bitstream) { - ParseBitstream(bitstream.data(), bitstream.size()); -} - -absl::optional H264BitstreamParser::GetLastSliceQp() const { - int qp; - bool success = GetLastSliceQp(&qp); - return success ? absl::optional(qp) : absl::nullopt; + return qp; } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser.h libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser.h --- libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser.h 2021-06-27 05:27:48.000000000 +0000 @@ -31,11 +31,6 @@ H264BitstreamParser(); ~H264BitstreamParser() override; - // These are here for backwards-compatability for the time being. - void ParseBitstream(const uint8_t* bitstream, size_t length); - bool GetLastSliceQp(int* qp) const; - - // New interface. void ParseBitstream(rtc::ArrayView bitstream) override; absl::optional GetLastSliceQp() const override; diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/h264/h264_bitstream_parser_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/h264/h264_bitstream_parser_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -46,43 +46,39 @@ TEST(H264BitstreamParserTest, ReportsNoQpWithoutParsedSlices) { H264BitstreamParser h264_parser; - int qp; - EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp)); + EXPECT_FALSE(h264_parser.GetLastSliceQp().has_value()); } TEST(H264BitstreamParserTest, ReportsNoQpWithOnlyParsedPpsAndSpsSlices) { H264BitstreamParser h264_parser; - h264_parser.ParseBitstream(kH264SpsPps, sizeof(kH264SpsPps)); - int qp; - EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp)); + h264_parser.ParseBitstream(kH264SpsPps); + EXPECT_FALSE(h264_parser.GetLastSliceQp().has_value()); } TEST(H264BitstreamParserTest, ReportsLastSliceQpForImageSlices) { H264BitstreamParser h264_parser; - h264_parser.ParseBitstream(kH264BitstreamChunk, sizeof(kH264BitstreamChunk)); - int qp; - ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp)); - EXPECT_EQ(35, qp); + h264_parser.ParseBitstream(kH264BitstreamChunk); + absl::optional qp = h264_parser.GetLastSliceQp(); + ASSERT_TRUE(qp.has_value()); + EXPECT_EQ(35, *qp); // Parse an additional image slice. - h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunk, - sizeof(kH264BitstreamNextImageSliceChunk)); - ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp)); - EXPECT_EQ(37, qp); + h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunk); + qp = h264_parser.GetLastSliceQp(); + ASSERT_TRUE(qp.has_value()); + EXPECT_EQ(37, *qp); } TEST(H264BitstreamParserTest, ReportsLastSliceQpForCABACImageSlices) { H264BitstreamParser h264_parser; - h264_parser.ParseBitstream(kH264BitstreamChunkCabac, - sizeof(kH264BitstreamChunkCabac)); - int qp; - EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp)); + h264_parser.ParseBitstream(kH264BitstreamChunkCabac); + EXPECT_FALSE(h264_parser.GetLastSliceQp().has_value()); // Parse an additional image slice. - h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunkCabac, - sizeof(kH264BitstreamNextImageSliceChunkCabac)); - ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp)); - EXPECT_EQ(24, qp); + h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunkCabac); + absl::optional qp = h264_parser.GetLastSliceQp(); + ASSERT_TRUE(qp.has_value()); + EXPECT_EQ(24, *qp); } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/include/incoming_video_stream.h libtgowt-0~git20210627.91d836d+dfsg/src/common_video/include/incoming_video_stream.h --- libtgowt-0~git20210124.be23804+ds/src/common_video/include/incoming_video_stream.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/include/incoming_video_stream.h 2021-06-27 05:27:48.000000000 +0000 @@ -13,13 +13,14 @@ #include +#include "api/sequence_checker.h" #include "api/task_queue/task_queue_factory.h" #include "api/video/video_frame.h" #include "api/video/video_sink_interface.h" #include "common_video/video_render_frames.h" #include "rtc_base/race_checker.h" #include "rtc_base/task_queue.h" -#include "rtc_base/thread_checker.h" +#include "rtc_base/thread_annotations.h" namespace webrtc { @@ -34,10 +35,10 @@ void OnFrame(const VideoFrame& video_frame) override; void Dequeue(); - rtc::ThreadChecker main_thread_checker_; + SequenceChecker main_thread_checker_; rtc::RaceChecker decoder_race_checker_; - VideoRenderFrames render_buffers_; // Only touched on the TaskQueue. + VideoRenderFrames render_buffers_ RTC_GUARDED_BY(&incoming_render_queue_); rtc::VideoSinkInterface* const callback_; rtc::TaskQueue incoming_render_queue_; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/include/video_frame_buffer.h libtgowt-0~git20210627.91d836d+dfsg/src/common_video/include/video_frame_buffer.h --- libtgowt-0~git20210124.be23804+ds/src/common_video/include/video_frame_buffer.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/include/video_frame_buffer.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,10 +12,10 @@ #define COMMON_VIDEO_INCLUDE_VIDEO_FRAME_BUFFER_H_ #include +#include #include "api/scoped_refptr.h" #include "api/video/video_frame_buffer.h" -#include "rtc_base/callback.h" #include "rtc_base/ref_counted_object.h" namespace webrtc { @@ -29,7 +29,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used); + std::function no_longer_used); rtc::scoped_refptr WrapI444Buffer( int width, @@ -40,7 +40,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used); + std::function no_longer_used); rtc::scoped_refptr WrapI420ABuffer( int width, @@ -53,7 +53,7 @@ int v_stride, const uint8_t* a_plane, int a_stride, - const rtc::Callback0& no_longer_used); + std::function no_longer_used); rtc::scoped_refptr WrapYuvBuffer( VideoFrameBuffer::Type type, @@ -65,7 +65,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used); + std::function no_longer_used); rtc::scoped_refptr WrapI010Buffer( int width, @@ -76,7 +76,7 @@ int u_stride, const uint16_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used); + std::function no_longer_used); } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/incoming_video_stream.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/incoming_video_stream.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/incoming_video_stream.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/incoming_video_stream.cc 2021-06-27 05:27:48.000000000 +0000 @@ -42,7 +42,7 @@ // into the lambda instead of copying it, but it doesn't work unless we change // OnFrame to take its frame argument by value instead of const reference. incoming_render_queue_.PostTask([this, video_frame = video_frame]() mutable { - RTC_DCHECK(incoming_render_queue_.IsCurrent()); + RTC_DCHECK_RUN_ON(&incoming_render_queue_); if (render_buffers_.AddFrame(std::move(video_frame)) == 1) Dequeue(); }); @@ -50,7 +50,7 @@ void IncomingVideoStream::Dequeue() { TRACE_EVENT0("webrtc", "IncomingVideoStream::Dequeue"); - RTC_DCHECK(incoming_render_queue_.IsCurrent()); + RTC_DCHECK_RUN_ON(&incoming_render_queue_); absl::optional frame_to_render = render_buffers_.FrameToRender(); if (frame_to_render) callback_->OnFrame(*frame_to_render); diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/libyuv/include/webrtc_libyuv.h libtgowt-0~git20210627.91d836d+dfsg/src/common_video/libyuv/include/webrtc_libyuv.h --- libtgowt-0~git20210124.be23804+ds/src/common_video/libyuv/include/webrtc_libyuv.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/libyuv/include/webrtc_libyuv.h 2021-06-27 05:27:48.000000000 +0000 @@ -32,17 +32,12 @@ kI420, kIYUV, kRGB24, - kABGR, kARGB, - kARGB4444, kRGB565, - kARGB1555, kYUY2, kYV12, kUYVY, kMJPEG, - kNV21, - kNV12, kBGRA, }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/libyuv/webrtc_libyuv.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/libyuv/webrtc_libyuv.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/libyuv/webrtc_libyuv.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/libyuv/webrtc_libyuv.cc 2021-06-27 05:27:48.000000000 +0000 @@ -14,7 +14,6 @@ #include "api/video/i420_buffer.h" #include "common_video/include/video_frame_buffer.h" -#include "rtc_base/bind.h" #include "rtc_base/checks.h" #include "third_party/libyuv/include/libyuv.h" @@ -26,8 +25,6 @@ size_t buffer_size = 0; switch (type) { case VideoType::kI420: - case VideoType::kNV12: - case VideoType::kNV21: case VideoType::kIYUV: case VideoType::kYV12: { int half_width = (width + 1) >> 1; @@ -35,9 +32,7 @@ buffer_size = width * height + half_width * half_height * 2; break; } - case VideoType::kARGB4444: case VideoType::kRGB565: - case VideoType::kARGB1555: case VideoType::kYUY2: case VideoType::kUYVY: buffer_size = width * height * 2; @@ -98,8 +93,6 @@ return libyuv::FOURCC_YV12; case VideoType::kRGB24: return libyuv::FOURCC_24BG; - case VideoType::kABGR: - return libyuv::FOURCC_ABGR; case VideoType::kRGB565: return libyuv::FOURCC_RGBP; case VideoType::kYUY2: @@ -108,18 +101,10 @@ return libyuv::FOURCC_UYVY; case VideoType::kMJPEG: return libyuv::FOURCC_MJPG; - case VideoType::kNV21: - return libyuv::FOURCC_NV21; - case VideoType::kNV12: - return libyuv::FOURCC_NV12; case VideoType::kARGB: return libyuv::FOURCC_ARGB; case VideoType::kBGRA: return libyuv::FOURCC_BGRA; - case VideoType::kARGB4444: - return libyuv::FOURCC_R444; - case VideoType::kARGB1555: - return libyuv::FOURCC_RGBO; } RTC_NOTREACHED(); return libyuv::FOURCC_ANY; @@ -138,10 +123,6 @@ ConvertVideoType(dst_video_type)); } -// Helper functions for keeping references alive. -void KeepBufferRefs(rtc::scoped_refptr, - rtc::scoped_refptr) {} - rtc::scoped_refptr ScaleI420ABuffer( const I420ABufferInterface& buffer, int target_width, @@ -160,7 +141,8 @@ yuv_buffer->StrideY(), yuv_buffer->DataU(), yuv_buffer->StrideU(), yuv_buffer->DataV(), yuv_buffer->StrideV(), axx_buffer->DataY(), axx_buffer->StrideY(), - rtc::Bind(&KeepBufferRefs, yuv_buffer, axx_buffer)); + // To keep references alive. + [yuv_buffer, axx_buffer] {}); return merged_buffer; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/video_frame_buffer.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/video_frame_buffer.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/video_frame_buffer.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/video_frame_buffer.cc 2021-06-27 05:27:48.000000000 +0000 @@ -30,7 +30,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) + std::function no_longer_used) : width_(width), height_(height), y_plane_(y_plane), @@ -70,7 +70,7 @@ const int y_stride_; const int u_stride_; const int v_stride_; - rtc::Callback0 no_longer_used_cb_; + std::function no_longer_used_cb_; }; // Template to implement a wrapped buffer for a I4??BufferInterface. @@ -87,7 +87,7 @@ int v_stride, const uint8_t* a_plane, int a_stride, - const rtc::Callback0& no_longer_used) + std::function no_longer_used) : WrappedYuvBuffer(width, height, y_plane, @@ -136,7 +136,7 @@ int u_stride, const uint16_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) + std::function no_longer_used) : width_(width), height_(height), y_plane_(y_plane), @@ -176,7 +176,7 @@ const int y_stride_; const int u_stride_; const int v_stride_; - rtc::Callback0 no_longer_used_cb_; + std::function no_longer_used_cb_; }; class I010BufferBase : public I010BufferInterface { @@ -206,7 +206,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) { + std::function no_longer_used) { return rtc::scoped_refptr( new rtc::RefCountedObject>( width, height, y_plane, y_stride, u_plane, u_stride, v_plane, @@ -224,7 +224,7 @@ int v_stride, const uint8_t* a_plane, int a_stride, - const rtc::Callback0& no_longer_used) { + std::function no_longer_used) { return rtc::scoped_refptr( new rtc::RefCountedObject>( width, height, y_plane, y_stride, u_plane, u_stride, v_plane, @@ -240,7 +240,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) { + std::function no_longer_used) { return rtc::scoped_refptr( new rtc::RefCountedObject>( width, height, y_plane, y_stride, u_plane, u_stride, v_plane, @@ -257,7 +257,7 @@ int u_stride, const uint8_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) { + std::function no_longer_used) { switch (type) { case VideoFrameBuffer::Type::kI420: return WrapI420Buffer(width, height, y_plane, y_stride, u_plane, u_stride, @@ -279,7 +279,7 @@ int u_stride, const uint16_t* v_plane, int v_stride, - const rtc::Callback0& no_longer_used) { + std::function no_longer_used) { return rtc::scoped_refptr( new rtc::RefCountedObject>( width, height, y_plane, y_stride, u_plane, u_stride, v_plane, diff -Nru libtgowt-0~git20210124.be23804+ds/src/common_video/video_frame_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/common_video/video_frame_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/common_video/video_frame_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/common_video/video_frame_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -16,7 +16,6 @@ #include "api/video/i010_buffer.h" #include "api/video/i420_buffer.h" #include "api/video/nv12_buffer.h" -#include "rtc_base/bind.h" #include "rtc_base/time_utils.h" #include "test/fake_texture_frame.h" #include "test/frame_utils.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/logging/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/logging/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -261,13 +261,13 @@ ":rtc_event_log_api", ":rtc_event_log_impl_encoder", "../api:libjingle_logging_api", + "../api:sequence_checker", "../api/rtc_event_log", "../api/task_queue", "../rtc_base:checks", "../rtc_base:rtc_base_approved", "../rtc_base:rtc_task_queue", "../rtc_base:safe_minmax", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:no_unique_address", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] @@ -284,10 +284,9 @@ ] deps = [ - ":ice_log", "../api/rtc_event_log", "../rtc_base", - "../rtc_base:checks", + "../rtc_base/synchronization:mutex", ] } @@ -317,10 +316,16 @@ deps = [ ":ice_log", + ":rtc_event_audio", ":rtc_event_bwe", + ":rtc_event_frame_events", + ":rtc_event_generic_packet_events", ":rtc_event_log2_proto", ":rtc_event_log_impl_encoder", ":rtc_event_log_proto", + ":rtc_event_pacing", + ":rtc_event_rtp_rtcp", + ":rtc_event_video", ":rtc_stream_config", "../api:function_view", "../api:network_state_predictor_api", @@ -337,11 +342,11 @@ "../modules/rtp_rtcp", "../modules/rtp_rtcp:rtp_rtcp_format", "../rtc_base:checks", - "../rtc_base:deprecation", "../rtc_base:ignore_wundef", "../rtc_base:protobuf_utils", "../rtc_base:rtc_base_approved", "../rtc_base:rtc_numerics", + "../rtc_base/system:file_wrapper", ] absl_deps = [ "//third_party/abseil-cpp/absl/memory", @@ -403,26 +408,28 @@ ] } - rtc_executable("rtc_event_log_rtp_dump") { - testonly = true - sources = [ "rtc_event_log/rtc_event_log2rtp_dump.cc" ] - deps = [ - ":rtc_event_log_parser", - "../api:array_view", - "../api:rtp_headers", - "../api/rtc_event_log", - "../modules/rtp_rtcp", - "../modules/rtp_rtcp:rtp_rtcp_format", - "../rtc_base:checks", - "../rtc_base:protobuf_utils", - "../rtc_base:rtc_base_approved", - "../test:rtp_test_utils", - "//third_party/abseil-cpp/absl/flags:flag", - "//third_party/abseil-cpp/absl/flags:parse", - "//third_party/abseil-cpp/absl/flags:usage", - "//third_party/abseil-cpp/absl/memory", - "//third_party/abseil-cpp/absl/types:optional", - ] + if (!build_with_chromium) { + rtc_executable("rtc_event_log_rtp_dump") { + testonly = true + sources = [ "rtc_event_log/rtc_event_log2rtp_dump.cc" ] + deps = [ + ":rtc_event_log_parser", + "../api:array_view", + "../api:rtp_headers", + "../api/rtc_event_log", + "../modules/rtp_rtcp", + "../modules/rtp_rtcp:rtp_rtcp_format", + "../rtc_base:checks", + "../rtc_base:protobuf_utils", + "../rtc_base:rtc_base_approved", + "../test:rtp_test_utils", + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/flags:parse", + "//third_party/abseil-cpp/absl/flags:usage", + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/types:optional", + ] + } } } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/blob_encoding.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/blob_encoding.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/blob_encoding.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/blob_encoding.cc 2021-06-27 05:27:48.000000000 +0000 @@ -58,49 +58,30 @@ return std::vector(); } - size_t read_idx = 0; - // Read the lengths of all blobs. std::vector lengths(num_of_blobs); for (size_t i = 0; i < num_of_blobs; ++i) { - if (read_idx >= encoded_blobs.length()) { - RTC_DCHECK_EQ(read_idx, encoded_blobs.length()); - RTC_LOG(LS_WARNING) << "Corrupt input; excessive number of blobs."; - return std::vector(); - } - - const size_t read_bytes = - DecodeVarInt(encoded_blobs.substr(read_idx), &lengths[i]); - if (read_bytes == 0) { + bool success = false; + std::tie(success, encoded_blobs) = DecodeVarInt(encoded_blobs, &lengths[i]); + if (!success) { RTC_LOG(LS_WARNING) << "Corrupt input; varint decoding failed."; return std::vector(); } - - read_idx += read_bytes; - - // Note: It might be that read_idx == encoded_blobs.length(), if this - // is the last iteration, and all of the blobs are the empty string. - RTC_DCHECK_LE(read_idx, encoded_blobs.length()); } // Read the blobs themselves. std::vector blobs(num_of_blobs); for (size_t i = 0; i < num_of_blobs; ++i) { - if (read_idx + lengths[i] < read_idx) { // Wrap-around detection. - RTC_LOG(LS_WARNING) << "Corrupt input; unreasonably large blob sequence."; - return std::vector(); - } - - if (read_idx + lengths[i] > encoded_blobs.length()) { + if (lengths[i] > encoded_blobs.length()) { RTC_LOG(LS_WARNING) << "Corrupt input; blob sizes exceed input size."; return std::vector(); } - blobs[i] = encoded_blobs.substr(read_idx, lengths[i]); - read_idx += lengths[i]; + blobs[i] = encoded_blobs.substr(0, lengths[i]); + encoded_blobs = encoded_blobs.substr(lengths[i]); } - if (read_idx != encoded_blobs.length()) { + if (!encoded_blobs.empty()) { RTC_LOG(LS_WARNING) << "Corrupt input; unrecognized trailer."; return std::vector(); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_new_format.cc 2021-06-27 05:27:48.000000000 +0000 @@ -289,7 +289,7 @@ // Copies all RTCP blocks except APP, SDES and unknown from |packet| to // |buffer|. |buffer| must have space for at least |packet.size()| bytes. -size_t RemoveNonWhitelistedRtcpBlocks(const rtc::Buffer& packet, +size_t RemoveNonAllowlistedRtcpBlocks(const rtc::Buffer& packet, uint8_t* buffer) { RTC_DCHECK(buffer != nullptr); rtcp::CommonHeader header; @@ -316,7 +316,7 @@ // inter-arrival jitter, third-party loss reports, payload-specific // feedback and extended reports. // TODO(terelius): As an optimization, don't copy anything if all blocks - // in the packet are whitelisted types. + // in the packet are allowlisted types. memcpy(buffer + buffer_length, block_begin, block_size); buffer_length += block_size; break; @@ -346,7 +346,7 @@ { std::vector buffer(base_event->packet().size()); size_t buffer_length = - RemoveNonWhitelistedRtcpBlocks(base_event->packet(), buffer.data()); + RemoveNonAllowlistedRtcpBlocks(base_event->packet(), buffer.data()); proto_batch->set_raw_packet(buffer.data(), buffer_length); } @@ -375,7 +375,7 @@ const EventType* event = batch[i + 1]; scrubed_packets[i].resize(event->packet().size()); static_assert(sizeof(std::string::value_type) == sizeof(uint8_t), ""); - const size_t buffer_length = RemoveNonWhitelistedRtcpBlocks( + const size_t buffer_length = RemoveNonAllowlistedRtcpBlocks( event->packet(), reinterpret_cast(&scrubed_packets[i][0])); if (buffer_length < event->packet().size()) { scrubed_packets[i].resize(buffer_length); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/rtc_event_log_encoder_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -1035,6 +1035,44 @@ } } +TEST_P(RtcEventLogEncoderTest, RtcEventRtcpBye) { + if (force_repeated_fields_) { + return; + } + + rtc::ScopedFakeClock fake_clock; + fake_clock.SetTime(Timestamp::Millis(prng_.Rand())); + + for (auto direction : {kIncomingPacket, kOutgoingPacket}) { + std::vector events(event_count_); + std::vector timestamps_us(event_count_); + for (size_t i = 0; i < event_count_; ++i) { + timestamps_us[i] = rtc::TimeMicros(); + events[i] = gen_.NewBye(); + rtc::Buffer buffer = events[i].Build(); + if (direction == kIncomingPacket) { + history_.push_back( + std::make_unique(buffer)); + } else { + history_.push_back( + std::make_unique(buffer)); + } + fake_clock.AdvanceTime(TimeDelta::Millis(prng_.Rand(0, 1000))); + } + + std::string encoded = + encoder_->EncodeBatch(history_.begin(), history_.end()); + ASSERT_TRUE(parsed_log_.ParseString(encoded).ok()); + + const auto& byes = parsed_log_.byes(direction); + ASSERT_EQ(byes.size(), event_count_); + + for (size_t i = 0; i < event_count_; ++i) { + verifier_.VerifyLoggedBye(timestamps_us[i], events[i], byes[i]); + } + } +} + TEST_P(RtcEventLogEncoderTest, RtcEventRtcpNack) { if (force_repeated_fields_) { return; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/var_int.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/var_int.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/var_int.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/var_int.cc 2021-06-27 05:27:48.000000000 +0000 @@ -39,7 +39,8 @@ // There is some code duplication between the flavors of this function. // For performance's sake, it's best to just keep it. -size_t DecodeVarInt(absl::string_view input, uint64_t* output) { +std::pair DecodeVarInt(absl::string_view input, + uint64_t* output) { RTC_DCHECK(output); uint64_t decoded = 0; @@ -48,11 +49,11 @@ << static_cast(7 * i)); if (!(input[i] & 0x80)) { *output = decoded; - return i + 1; + return {true, input.substr(i + 1)}; } } - return 0; + return {false, input}; } // There is some code duplication between the flavors of this function. diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/var_int.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/var_int.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/encoder/var_int.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/encoder/var_int.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,6 +15,7 @@ #include #include +#include #include "absl/strings/string_view.h" #include "rtc_base/bit_buffer.h" @@ -26,20 +27,23 @@ // Encode a given uint64_t as a varint. From least to most significant, // each batch of seven bits are put into the lower bits of a byte, and the last // remaining bit in that byte (the highest one) marks whether additional bytes -// follow (which happens if and only if there are other bits in |input| which +// follow (which happens if and only if there are other bits in `input` which // are non-zero). // Notes: If input == 0, one byte is used. If input is uint64_t::max, exactly // kMaxVarIntLengthBytes are used. std::string EncodeVarInt(uint64_t input); // Inverse of EncodeVarInt(). -// If decoding is successful, a non-zero number is returned, indicating the -// number of bytes read from |input|, and the decoded varint is written -// into |output|. -// If not successful, 0 is returned, and |output| is not modified. -size_t DecodeVarInt(absl::string_view input, uint64_t* output); +// Returns true and the remaining (unread) slice of the input if decoding +// succeeds. Returns false otherwise and `output` is not modified. +std::pair DecodeVarInt(absl::string_view input, + uint64_t* output); // Same as other version, but uses a rtc::BitBuffer for input. +// If decoding is successful, a non-zero number is returned, indicating the +// number of bytes read from `input`, and the decoded varint is written +// into `output`. +// If not successful, 0 is returned, and `output` is not modified. // Some bits may be consumed even if a varint fails to be read. size_t DecodeVarInt(rtc::BitBuffer* input, uint64_t* output); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_alr_state.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_alr_state.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_alr_state.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_alr_state.cc 2021-06-27 05:27:48.000000000 +0000 @@ -21,14 +21,6 @@ RtcEventAlrState::~RtcEventAlrState() = default; -RtcEvent::Type RtcEventAlrState::GetType() const { - return RtcEvent::Type::AlrStateEvent; -} - -bool RtcEventAlrState::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventAlrState::Copy() const { return absl::WrapUnique(new RtcEventAlrState(*this)); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_alr_state.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_alr_state.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_alr_state.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_alr_state.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,12 +19,13 @@ class RtcEventAlrState final : public RtcEvent { public: + static constexpr Type kType = Type::AlrStateEvent; + explicit RtcEventAlrState(bool in_alr); ~RtcEventAlrState() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -36,5 +37,17 @@ const bool in_alr_; }; +struct LoggedAlrStateEvent { + LoggedAlrStateEvent() = default; + LoggedAlrStateEvent(int64_t timestamp_us, bool in_alr) + : timestamp_us(timestamp_us), in_alr(in_alr) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + bool in_alr; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_ALR_STATE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.cc 2021-06-27 05:27:48.000000000 +0000 @@ -31,14 +31,6 @@ RtcEventAudioNetworkAdaptation::~RtcEventAudioNetworkAdaptation() = default; -RtcEvent::Type RtcEventAudioNetworkAdaptation::GetType() const { - return RtcEvent::Type::AudioNetworkAdaptation; -} - -bool RtcEventAudioNetworkAdaptation::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventAudioNetworkAdaptation::Copy() const { return absl::WrapUnique(new RtcEventAudioNetworkAdaptation(*this)); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,6 +14,7 @@ #include #include "api/rtc_event_log/rtc_event.h" +#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h" namespace webrtc { @@ -21,13 +22,14 @@ class RtcEventAudioNetworkAdaptation final : public RtcEvent { public: + static constexpr Type kType = Type::AudioNetworkAdaptation; + explicit RtcEventAudioNetworkAdaptation( std::unique_ptr config); ~RtcEventAudioNetworkAdaptation() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -39,6 +41,19 @@ const std::unique_ptr config_; }; +struct LoggedAudioNetworkAdaptationEvent { + LoggedAudioNetworkAdaptationEvent() = default; + LoggedAudioNetworkAdaptationEvent(int64_t timestamp_us, + const AudioEncoderRuntimeConfig& config) + : timestamp_us(timestamp_us), config(config) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + AudioEncoderRuntimeConfig config; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_AUDIO_NETWORK_ADAPTATION_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_playout.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_playout.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_playout.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_playout.cc 2021-06-27 05:27:48.000000000 +0000 @@ -19,14 +19,6 @@ RtcEventAudioPlayout::RtcEventAudioPlayout(const RtcEventAudioPlayout& other) : RtcEvent(other.timestamp_us_), ssrc_(other.ssrc_) {} -RtcEvent::Type RtcEventAudioPlayout::GetType() const { - return RtcEvent::Type::AudioPlayout; -} - -bool RtcEventAudioPlayout::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventAudioPlayout::Copy() const { return absl::WrapUnique( new RtcEventAudioPlayout(*this)); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_playout.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_playout.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_playout.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_playout.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,12 +21,13 @@ class RtcEventAudioPlayout final : public RtcEvent { public: + static constexpr Type kType = Type::AudioPlayout; + explicit RtcEventAudioPlayout(uint32_t ssrc); ~RtcEventAudioPlayout() override = default; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -38,6 +39,18 @@ const uint32_t ssrc_; }; +struct LoggedAudioPlayoutEvent { + LoggedAudioPlayoutEvent() = default; + LoggedAudioPlayoutEvent(int64_t timestamp_us, uint32_t ssrc) + : timestamp_us(timestamp_us), ssrc(ssrc) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + uint32_t ssrc; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_AUDIO_PLAYOUT_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -31,14 +31,6 @@ RtcEventAudioReceiveStreamConfig::~RtcEventAudioReceiveStreamConfig() = default; -RtcEvent::Type RtcEventAudioReceiveStreamConfig::GetType() const { - return RtcEvent::Type::AudioReceiveStreamConfig; -} - -bool RtcEventAudioReceiveStreamConfig::IsConfigEvent() const { - return true; -} - std::unique_ptr RtcEventAudioReceiveStreamConfig::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,22 +14,20 @@ #include #include "api/rtc_event_log/rtc_event.h" +#include "logging/rtc_event_log/rtc_stream_config.h" namespace webrtc { -namespace rtclog { -struct StreamConfig; -} // namespace rtclog - class RtcEventAudioReceiveStreamConfig final : public RtcEvent { public: + static constexpr Type kType = Type::AudioReceiveStreamConfig; + explicit RtcEventAudioReceiveStreamConfig( std::unique_ptr config); ~RtcEventAudioReceiveStreamConfig() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return true; } std::unique_ptr Copy() const; @@ -42,6 +40,18 @@ const std::unique_ptr config_; }; +struct LoggedAudioRecvConfig { + LoggedAudioRecvConfig() = default; + LoggedAudioRecvConfig(int64_t timestamp_us, const rtclog::StreamConfig config) + : timestamp_us(timestamp_us), config(config) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + rtclog::StreamConfig config; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_AUDIO_RECEIVE_STREAM_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -31,14 +31,6 @@ RtcEventAudioSendStreamConfig::~RtcEventAudioSendStreamConfig() = default; -RtcEvent::Type RtcEventAudioSendStreamConfig::GetType() const { - return RtcEvent::Type::AudioSendStreamConfig; -} - -bool RtcEventAudioSendStreamConfig::IsConfigEvent() const { - return true; -} - std::unique_ptr RtcEventAudioSendStreamConfig::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,22 +14,20 @@ #include #include "api/rtc_event_log/rtc_event.h" +#include "logging/rtc_event_log/rtc_stream_config.h" namespace webrtc { -namespace rtclog { -struct StreamConfig; -} // namespace rtclog - class RtcEventAudioSendStreamConfig final : public RtcEvent { public: + static constexpr Type kType = Type::AudioSendStreamConfig; + explicit RtcEventAudioSendStreamConfig( std::unique_ptr config); ~RtcEventAudioSendStreamConfig() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return true; } std::unique_ptr Copy() const; @@ -41,6 +39,17 @@ const std::unique_ptr config_; }; +struct LoggedAudioSendConfig { + LoggedAudioSendConfig() = default; + LoggedAudioSendConfig(int64_t timestamp_us, const rtclog::StreamConfig config) + : timestamp_us(timestamp_us), config(config) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + rtclog::StreamConfig config; +}; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_AUDIO_SEND_STREAM_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.cc 2021-06-27 05:27:48.000000000 +0000 @@ -28,14 +28,6 @@ RtcEventBweUpdateDelayBased::~RtcEventBweUpdateDelayBased() = default; -RtcEvent::Type RtcEventBweUpdateDelayBased::GetType() const { - return RtcEvent::Type::BweUpdateDelayBased; -} - -bool RtcEventBweUpdateDelayBased::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventBweUpdateDelayBased::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,21 +15,21 @@ #include +#include "api/network_state_predictor.h" #include "api/rtc_event_log/rtc_event.h" namespace webrtc { -enum class BandwidthUsage; - class RtcEventBweUpdateDelayBased final : public RtcEvent { public: + static constexpr Type kType = Type::BweUpdateDelayBased; + RtcEventBweUpdateDelayBased(int32_t bitrate_bps, BandwidthUsage detector_state); ~RtcEventBweUpdateDelayBased() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -43,6 +43,23 @@ const BandwidthUsage detector_state_; }; +struct LoggedBweDelayBasedUpdate { + LoggedBweDelayBasedUpdate() = default; + LoggedBweDelayBasedUpdate(int64_t timestamp_us, + int32_t bitrate_bps, + BandwidthUsage detector_state) + : timestamp_us(timestamp_us), + bitrate_bps(bitrate_bps), + detector_state(detector_state) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int32_t bitrate_bps; + BandwidthUsage detector_state; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_BWE_UPDATE_DELAY_BASED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.cc 2021-06-27 05:27:48.000000000 +0000 @@ -30,14 +30,6 @@ RtcEventBweUpdateLossBased::~RtcEventBweUpdateLossBased() = default; -RtcEvent::Type RtcEventBweUpdateLossBased::GetType() const { - return RtcEvent::Type::BweUpdateLossBased; -} - -bool RtcEventBweUpdateLossBased::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventBweUpdateLossBased::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,14 +21,15 @@ class RtcEventBweUpdateLossBased final : public RtcEvent { public: + static constexpr Type kType = Type::BweUpdateLossBased; + RtcEventBweUpdateLossBased(int32_t bitrate_bps_, uint8_t fraction_loss_, int32_t total_packets_); ~RtcEventBweUpdateLossBased() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -44,6 +45,26 @@ const int32_t total_packets_; }; +struct LoggedBweLossBasedUpdate { + LoggedBweLossBasedUpdate() = default; + LoggedBweLossBasedUpdate(int64_t timestamp_us, + int32_t bitrate_bps, + uint8_t fraction_lost, + int32_t expected_packets) + : timestamp_us(timestamp_us), + bitrate_bps(bitrate_bps), + fraction_lost(fraction_lost), + expected_packets(expected_packets) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int32_t bitrate_bps; + uint8_t fraction_lost; + int32_t expected_packets; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_BWE_UPDATE_LOSS_BASED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.cc 2021-06-27 05:27:48.000000000 +0000 @@ -24,14 +24,6 @@ RtcEventDtlsTransportState::~RtcEventDtlsTransportState() = default; -RtcEvent::Type RtcEventDtlsTransportState::GetType() const { - return RtcEvent::Type::DtlsTransportState; -} - -bool RtcEventDtlsTransportState::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventDtlsTransportState::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_transport_state.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,11 +20,13 @@ class RtcEventDtlsTransportState : public RtcEvent { public: + static constexpr Type kType = Type::DtlsTransportState; + explicit RtcEventDtlsTransportState(DtlsTransportState state); ~RtcEventDtlsTransportState() override; - Type GetType() const override; - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -38,6 +40,14 @@ const DtlsTransportState dtls_transport_state_; }; +struct LoggedDtlsTransportState { + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + DtlsTransportState dtls_transport_state; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_DTLS_TRANSPORT_STATE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.cc 2021-06-27 05:27:48.000000000 +0000 @@ -23,14 +23,6 @@ RtcEventDtlsWritableState::~RtcEventDtlsWritableState() = default; -RtcEvent::Type RtcEventDtlsWritableState::GetType() const { - return RtcEvent::Type::DtlsWritableState; -} - -bool RtcEventDtlsWritableState::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventDtlsWritableState::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_dtls_writable_state.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,11 +19,13 @@ class RtcEventDtlsWritableState : public RtcEvent { public: + static constexpr Type kType = Type::DtlsWritableState; + explicit RtcEventDtlsWritableState(bool writable); ~RtcEventDtlsWritableState() override; - Type GetType() const override; - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -35,6 +37,17 @@ const bool writable_; }; +struct LoggedDtlsWritableState { + LoggedDtlsWritableState() = default; + explicit LoggedDtlsWritableState(bool writable) : writable(writable) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + bool writable; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_DTLS_WRITABLE_STATE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_frame_decoded.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_frame_decoded.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_frame_decoded.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_frame_decoded.cc 2021-06-27 05:27:48.000000000 +0000 @@ -36,14 +36,6 @@ codec_(other.codec_), qp_(other.qp_) {} -RtcEvent::Type RtcEventFrameDecoded::GetType() const { - return RtcEvent::Type::FrameDecoded; -} - -bool RtcEventFrameDecoded::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventFrameDecoded::Copy() const { return absl::WrapUnique( new RtcEventFrameDecoded(*this)); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_frame_decoded.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_frame_decoded.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_frame_decoded.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_frame_decoded.h 2021-06-27 05:27:48.000000000 +0000 @@ -22,6 +22,8 @@ class RtcEventFrameDecoded final : public RtcEvent { public: + static constexpr Type kType = Type::FrameDecoded; + RtcEventFrameDecoded(int64_t render_time_ms, uint32_t ssrc, int width, @@ -30,9 +32,8 @@ uint8_t qp); ~RtcEventFrameDecoded() override = default; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -54,6 +55,19 @@ const uint8_t qp_; }; +struct LoggedFrameDecoded { + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int64_t render_time_ms; + uint32_t ssrc; + int width; + int height; + VideoCodecType codec; + uint8_t qp; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_FRAME_DECODED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.cc 2021-06-27 05:27:48.000000000 +0000 @@ -23,6 +23,7 @@ const std::vector& acked_packets) { std::vector> result; int64_t time_us = rtc::TimeMicros(); + result.reserve(acked_packets.size()); for (const AckedPacket& packet : acked_packets) { result.emplace_back(new RtcEventGenericAckReceived( time_us, packet_number, packet.packet_number, @@ -51,12 +52,4 @@ RtcEventGenericAckReceived::~RtcEventGenericAckReceived() = default; -RtcEvent::Type RtcEventGenericAckReceived::GetType() const { - return RtcEvent::Type::GenericAckReceived; -} - -bool RtcEventGenericAckReceived::IsConfigEvent() const { - return false; -} - } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_ack_received.h 2021-06-27 05:27:48.000000000 +0000 @@ -30,6 +30,8 @@ class RtcEventGenericAckReceived final : public RtcEvent { public: + static constexpr Type kType = Type::GenericAckReceived; + // For a collection of acked packets, it creates a vector of logs to log with // the same timestamp. static std::vector> CreateLogs( @@ -40,9 +42,8 @@ std::unique_ptr Copy() const; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } // An identifier of the packet which contained an ack. int64_t packet_number() const { return packet_number_; } @@ -74,6 +75,26 @@ const absl::optional receive_acked_packet_time_ms_; }; +struct LoggedGenericAckReceived { + LoggedGenericAckReceived() = default; + LoggedGenericAckReceived(int64_t timestamp_us, + int64_t packet_number, + int64_t acked_packet_number, + absl::optional receive_acked_packet_time_ms) + : timestamp_us(timestamp_us), + packet_number(packet_number), + acked_packet_number(acked_packet_number), + receive_acked_packet_time_ms(receive_acked_packet_time_ms) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int64_t packet_number; + int64_t acked_packet_number; + absl::optional receive_acked_packet_time_ms; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_GENERIC_ACK_RECEIVED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.cc 2021-06-27 05:27:48.000000000 +0000 @@ -28,12 +28,5 @@ RtcEventGenericPacketReceived::Copy() const { return absl::WrapUnique(new RtcEventGenericPacketReceived(*this)); } -RtcEvent::Type RtcEventGenericPacketReceived::GetType() const { - return RtcEvent::Type::GenericPacketReceived; -} - -bool RtcEventGenericPacketReceived::IsConfigEvent() const { - return false; -} } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_received.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,14 +19,15 @@ class RtcEventGenericPacketReceived final : public RtcEvent { public: + static constexpr Type kType = Type::GenericPacketReceived; + RtcEventGenericPacketReceived(int64_t packet_number, size_t packet_length); ~RtcEventGenericPacketReceived() override; std::unique_ptr Copy() const; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } // An identifier of the packet. int64_t packet_number() const { return packet_number_; } @@ -42,6 +43,23 @@ const size_t packet_length_; }; +struct LoggedGenericPacketReceived { + LoggedGenericPacketReceived() = default; + LoggedGenericPacketReceived(int64_t timestamp_us, + int64_t packet_number, + int packet_length) + : timestamp_us(timestamp_us), + packet_number(packet_number), + packet_length(packet_length) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int64_t packet_number; + int packet_length; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_GENERIC_PACKET_RECEIVED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.cc 2021-06-27 05:27:48.000000000 +0000 @@ -33,12 +33,4 @@ return absl::WrapUnique(new RtcEventGenericPacketSent(*this)); } -RtcEvent::Type RtcEventGenericPacketSent::GetType() const { - return RtcEvent::Type::GenericPacketSent; -} - -bool RtcEventGenericPacketSent::IsConfigEvent() const { - return false; -} - } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_generic_packet_sent.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,8 @@ class RtcEventGenericPacketSent final : public RtcEvent { public: + static constexpr Type kType = Type::GenericPacketSent; + RtcEventGenericPacketSent(int64_t packet_number, size_t overhead_length, size_t payload_length, @@ -27,9 +29,8 @@ std::unique_ptr Copy() const; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } // An identifier of the packet. int64_t packet_number() const { return packet_number_; } @@ -59,6 +60,31 @@ const size_t padding_length_; }; +struct LoggedGenericPacketSent { + LoggedGenericPacketSent() = default; + LoggedGenericPacketSent(int64_t timestamp_us, + int64_t packet_number, + size_t overhead_length, + size_t payload_length, + size_t padding_length) + : timestamp_us(timestamp_us), + packet_number(packet_number), + overhead_length(overhead_length), + payload_length(payload_length), + padding_length(padding_length) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + size_t packet_length() const { + return payload_length + padding_length + overhead_length; + } + int64_t timestamp_us; + int64_t packet_number; + size_t overhead_length; + size_t payload_length; + size_t padding_length; +}; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_GENERIC_PACKET_SENT_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.cc 2021-06-27 05:27:48.000000000 +0000 @@ -31,14 +31,6 @@ RtcEventIceCandidatePair::~RtcEventIceCandidatePair() = default; -RtcEvent::Type RtcEventIceCandidatePair::GetType() const { - return RtcEvent::Type::IceCandidatePairEvent; -} - -bool RtcEventIceCandidatePair::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventIceCandidatePair::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h 2021-06-27 05:27:48.000000000 +0000 @@ -29,15 +29,16 @@ class RtcEventIceCandidatePair final : public RtcEvent { public: + static constexpr Type kType = Type::IceCandidatePairEvent; + RtcEventIceCandidatePair(IceCandidatePairEventType type, uint32_t candidate_pair_id, uint32_t transaction_id); ~RtcEventIceCandidatePair() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -53,6 +54,26 @@ const uint32_t transaction_id_; }; +struct LoggedIceCandidatePairEvent { + LoggedIceCandidatePairEvent() = default; + LoggedIceCandidatePairEvent(int64_t timestamp_us, + IceCandidatePairEventType type, + uint32_t candidate_pair_id, + uint32_t transaction_id) + : timestamp_us(timestamp_us), + type(type), + candidate_pair_id(candidate_pair_id), + transaction_id(transaction_id) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + IceCandidatePairEventType type; + uint32_t candidate_pair_id; + uint32_t transaction_id; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_ICE_CANDIDATE_PAIR_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -54,16 +54,6 @@ RtcEventIceCandidatePairConfig::~RtcEventIceCandidatePairConfig() = default; -RtcEvent::Type RtcEventIceCandidatePairConfig::GetType() const { - return RtcEvent::Type::IceCandidatePairConfig; -} - -// The ICE candidate pair config event is not equivalent to a RtcEventLog config -// event. -bool RtcEventIceCandidatePairConfig::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventIceCandidatePairConfig::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -83,6 +83,8 @@ class RtcEventIceCandidatePairConfig final : public RtcEvent { public: + static constexpr Type kType = Type::IceCandidatePairConfig; + RtcEventIceCandidatePairConfig( IceCandidatePairConfigType type, uint32_t candidate_pair_id, @@ -90,9 +92,9 @@ ~RtcEventIceCandidatePairConfig() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + // N.B. An ICE config event is not considered an RtcEventLog config event. + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -110,6 +112,22 @@ const IceCandidatePairDescription candidate_pair_desc_; }; +struct LoggedIceCandidatePairConfig { + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + IceCandidatePairConfigType type; + uint32_t candidate_pair_id; + IceCandidateType local_candidate_type; + IceCandidatePairProtocol local_relay_protocol; + IceCandidateNetworkType local_network_type; + IceCandidatePairAddressFamily local_address_family; + IceCandidateType remote_candidate_type; + IceCandidatePairAddressFamily remote_address_family; + IceCandidatePairProtocol candidate_pair_protocol; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_ICE_CANDIDATE_PAIR_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.cc 2021-06-27 05:27:48.000000000 +0000 @@ -31,14 +31,6 @@ min_probes_(other.min_probes_), min_bytes_(other.min_bytes_) {} -RtcEvent::Type RtcEventProbeClusterCreated::GetType() const { - return RtcEvent::Type::ProbeClusterCreated; -} - -bool RtcEventProbeClusterCreated::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventProbeClusterCreated::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_cluster_created.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,15 +21,16 @@ class RtcEventProbeClusterCreated final : public RtcEvent { public: + static constexpr Type kType = Type::ProbeClusterCreated; + RtcEventProbeClusterCreated(int32_t id, int32_t bitrate_bps, uint32_t min_probes, uint32_t min_bytes); ~RtcEventProbeClusterCreated() override = default; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -47,6 +48,29 @@ const uint32_t min_bytes_; }; +struct LoggedBweProbeClusterCreatedEvent { + LoggedBweProbeClusterCreatedEvent() = default; + LoggedBweProbeClusterCreatedEvent(int64_t timestamp_us, + int32_t id, + int32_t bitrate_bps, + uint32_t min_packets, + uint32_t min_bytes) + : timestamp_us(timestamp_us), + id(id), + bitrate_bps(bitrate_bps), + min_packets(min_packets), + min_bytes(min_bytes) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int32_t id; + int32_t bitrate_bps; + uint32_t min_packets; + uint32_t min_bytes; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_PROBE_CLUSTER_CREATED_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.cc 2021-06-27 05:27:48.000000000 +0000 @@ -25,14 +25,6 @@ id_(other.id_), failure_reason_(other.failure_reason_) {} -RtcEvent::Type RtcEventProbeResultFailure::GetType() const { - return RtcEvent::Type::ProbeResultFailure; -} - -bool RtcEventProbeResultFailure::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventProbeResultFailure::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_failure.h 2021-06-27 05:27:48.000000000 +0000 @@ -28,12 +28,13 @@ class RtcEventProbeResultFailure final : public RtcEvent { public: + static constexpr Type kType = Type::ProbeResultFailure; + RtcEventProbeResultFailure(int32_t id, ProbeFailureReason failure_reason); ~RtcEventProbeResultFailure() override = default; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -47,6 +48,21 @@ const ProbeFailureReason failure_reason_; }; +struct LoggedBweProbeFailureEvent { + LoggedBweProbeFailureEvent() = default; + LoggedBweProbeFailureEvent(int64_t timestamp_us, + int32_t id, + ProbeFailureReason failure_reason) + : timestamp_us(timestamp_us), id(id), failure_reason(failure_reason) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int32_t id; + ProbeFailureReason failure_reason; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_PROBE_RESULT_FAILURE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_success.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_success.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_success.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_success.cc 2021-06-27 05:27:48.000000000 +0000 @@ -24,14 +24,6 @@ id_(other.id_), bitrate_bps_(other.bitrate_bps_) {} -RtcEvent::Type RtcEventProbeResultSuccess::GetType() const { - return RtcEvent::Type::ProbeResultSuccess; -} - -bool RtcEventProbeResultSuccess::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventProbeResultSuccess::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_success.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_success.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_probe_result_success.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_probe_result_success.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,12 +21,13 @@ class RtcEventProbeResultSuccess final : public RtcEvent { public: + static constexpr Type kType = Type::ProbeResultSuccess; + RtcEventProbeResultSuccess(int32_t id, int32_t bitrate_bps); ~RtcEventProbeResultSuccess() override = default; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -40,6 +41,21 @@ const int32_t bitrate_bps_; }; +struct LoggedBweProbeSuccessEvent { + LoggedBweProbeSuccessEvent() = default; + LoggedBweProbeSuccessEvent(int64_t timestamp_us, + int32_t id, + int32_t bitrate_bps) + : timestamp_us(timestamp_us), id(id), bitrate_bps(bitrate_bps) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + int32_t id; + int32_t bitrate_bps; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_PROBE_RESULT_SUCCESS_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_remote_estimate.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_remote_estimate.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_remote_estimate.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_remote_estimate.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,15 +20,29 @@ class RtcEventRemoteEstimate final : public RtcEvent { public: + static constexpr Type kType = Type::RemoteEstimateEvent; + RtcEventRemoteEstimate(DataRate link_capacity_lower, DataRate link_capacity_upper) : link_capacity_lower_(link_capacity_lower), link_capacity_upper_(link_capacity_upper) {} - Type GetType() const override { return RtcEvent::Type::RemoteEstimateEvent; } + + Type GetType() const override { return kType; } bool IsConfigEvent() const override { return false; } const DataRate link_capacity_lower_; const DataRate link_capacity_upper_; }; + +struct LoggedRemoteEstimateEvent { + LoggedRemoteEstimateEvent() = default; + + int64_t log_time_us() const { return timestamp_ms * 1000; } + int64_t log_time_ms() const { return timestamp_ms; } + + int64_t timestamp_ms; + absl::optional link_capacity_lower; + absl::optional link_capacity_upper; +}; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_REMOTE_ESTIMATE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_route_change.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_route_change.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_route_change.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_route_change.cc 2021-06-27 05:27:48.000000000 +0000 @@ -24,14 +24,6 @@ RtcEventRouteChange::~RtcEventRouteChange() = default; -RtcEvent::Type RtcEventRouteChange::GetType() const { - return RtcEvent::Type::RouteChangeEvent; -} - -bool RtcEventRouteChange::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventRouteChange::Copy() const { return absl::WrapUnique(new RtcEventRouteChange(*this)); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_route_change.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_route_change.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_route_change.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_route_change.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,12 +19,13 @@ class RtcEventRouteChange final : public RtcEvent { public: + static constexpr Type kType = Type::RouteChangeEvent; + RtcEventRouteChange(bool connected, uint32_t overhead); ~RtcEventRouteChange() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; @@ -38,5 +39,20 @@ const uint32_t overhead_; }; +struct LoggedRouteChangeEvent { + LoggedRouteChangeEvent() = default; + LoggedRouteChangeEvent(int64_t timestamp_ms, + bool connected, + uint32_t overhead) + : timestamp_ms(timestamp_ms), connected(connected), overhead(overhead) {} + + int64_t log_time_us() const { return timestamp_ms * 1000; } + int64_t log_time_ms() const { return timestamp_ms; } + + int64_t timestamp_ms; + bool connected; + uint32_t overhead; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_ROUTE_CHANGE_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.cc 2021-06-27 05:27:48.000000000 +0000 @@ -25,14 +25,6 @@ RtcEventRtcpPacketIncoming::~RtcEventRtcpPacketIncoming() = default; -RtcEvent::Type RtcEventRtcpPacketIncoming::GetType() const { - return RtcEvent::Type::RtcpPacketIncoming; -} - -bool RtcEventRtcpPacketIncoming::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventRtcpPacketIncoming::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_incoming.h 2021-06-27 05:27:48.000000000 +0000 @@ -23,12 +23,13 @@ class RtcEventRtcpPacketIncoming final : public RtcEvent { public: + static constexpr Type kType = Type::RtcpPacketIncoming; + explicit RtcEventRtcpPacketIncoming(rtc::ArrayView packet); ~RtcEventRtcpPacketIncoming() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.cc 2021-06-27 05:27:48.000000000 +0000 @@ -25,14 +25,6 @@ RtcEventRtcpPacketOutgoing::~RtcEventRtcpPacketOutgoing() = default; -RtcEvent::Type RtcEventRtcpPacketOutgoing::GetType() const { - return RtcEvent::Type::RtcpPacketOutgoing; -} - -bool RtcEventRtcpPacketOutgoing::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventRtcpPacketOutgoing::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtcp_packet_outgoing.h 2021-06-27 05:27:48.000000000 +0000 @@ -23,12 +23,13 @@ class RtcEventRtcpPacketOutgoing final : public RtcEvent { public: + static constexpr Type kType = Type::RtcpPacketOutgoing; + explicit RtcEventRtcpPacketOutgoing(rtc::ArrayView packet); ~RtcEventRtcpPacketOutgoing() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.cc 2021-06-27 05:27:48.000000000 +0000 @@ -37,14 +37,6 @@ RtcEventRtpPacketIncoming::~RtcEventRtpPacketIncoming() = default; -RtcEvent::Type RtcEventRtpPacketIncoming::GetType() const { - return RtcEvent::Type::RtpPacketIncoming; -} - -bool RtcEventRtpPacketIncoming::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventRtpPacketIncoming::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_incoming.h 2021-06-27 05:27:48.000000000 +0000 @@ -22,12 +22,13 @@ class RtcEventRtpPacketIncoming final : public RtcEvent { public: + static constexpr Type kType = Type::RtpPacketIncoming; + explicit RtcEventRtpPacketIncoming(const RtpPacketReceived& packet); ~RtcEventRtpPacketIncoming() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.cc 2021-06-27 05:27:48.000000000 +0000 @@ -40,14 +40,6 @@ RtcEventRtpPacketOutgoing::~RtcEventRtpPacketOutgoing() = default; -RtcEvent::Type RtcEventRtpPacketOutgoing::GetType() const { - return RtcEvent::Type::RtpPacketOutgoing; -} - -bool RtcEventRtpPacketOutgoing::IsConfigEvent() const { - return false; -} - std::unique_ptr RtcEventRtpPacketOutgoing::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_rtp_packet_outgoing.h 2021-06-27 05:27:48.000000000 +0000 @@ -22,13 +22,14 @@ class RtcEventRtpPacketOutgoing final : public RtcEvent { public: + static constexpr Type kType = Type::RtpPacketOutgoing; + RtcEventRtpPacketOutgoing(const RtpPacketToSend& packet, int probe_cluster_id); ~RtcEventRtpPacketOutgoing() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return false; } std::unique_ptr Copy() const; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -30,14 +30,6 @@ RtcEventVideoReceiveStreamConfig::~RtcEventVideoReceiveStreamConfig() = default; -RtcEvent::Type RtcEventVideoReceiveStreamConfig::GetType() const { - return Type::VideoReceiveStreamConfig; -} - -bool RtcEventVideoReceiveStreamConfig::IsConfigEvent() const { - return true; -} - std::unique_ptr RtcEventVideoReceiveStreamConfig::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,13 +20,14 @@ class RtcEventVideoReceiveStreamConfig final : public RtcEvent { public: + static constexpr Type kType = Type::VideoReceiveStreamConfig; + explicit RtcEventVideoReceiveStreamConfig( std::unique_ptr config); ~RtcEventVideoReceiveStreamConfig() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return true; } std::unique_ptr Copy() const; @@ -39,6 +40,18 @@ const std::unique_ptr config_; }; +struct LoggedVideoRecvConfig { + LoggedVideoRecvConfig() = default; + LoggedVideoRecvConfig(int64_t timestamp_us, const rtclog::StreamConfig config) + : timestamp_us(timestamp_us), config(config) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + rtclog::StreamConfig config; +}; + } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_VIDEO_RECEIVE_STREAM_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.cc 2021-06-27 05:27:48.000000000 +0000 @@ -27,14 +27,6 @@ RtcEventVideoSendStreamConfig::~RtcEventVideoSendStreamConfig() = default; -RtcEvent::Type RtcEventVideoSendStreamConfig::GetType() const { - return RtcEvent::Type::VideoSendStreamConfig; -} - -bool RtcEventVideoSendStreamConfig::IsConfigEvent() const { - return true; -} - std::unique_ptr RtcEventVideoSendStreamConfig::Copy() const { return absl::WrapUnique( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/events/rtc_event_video_send_stream_config.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,13 +20,14 @@ class RtcEventVideoSendStreamConfig final : public RtcEvent { public: + static constexpr Type kType = Type::VideoSendStreamConfig; + explicit RtcEventVideoSendStreamConfig( std::unique_ptr config); ~RtcEventVideoSendStreamConfig() override; - Type GetType() const override; - - bool IsConfigEvent() const override; + Type GetType() const override { return kType; } + bool IsConfigEvent() const override { return true; } std::unique_ptr Copy() const; @@ -38,6 +39,17 @@ const std::unique_ptr config_; }; +struct LoggedVideoSendConfig { + LoggedVideoSendConfig() = default; + LoggedVideoSendConfig(int64_t timestamp_us, const rtclog::StreamConfig config) + : timestamp_us(timestamp_us), config(config) {} + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + rtclog::StreamConfig config; +}; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_EVENTS_RTC_EVENT_VIDEO_SEND_STREAM_CONFIG_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log.cc 2021-06-27 05:27:48.000000000 +0000 @@ -10,32 +10,29 @@ #include "logging/rtc_event_log/fake_rtc_event_log.h" -#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h" -#include "rtc_base/bind.h" -#include "rtc_base/checks.h" -#include "rtc_base/logging.h" +#include +#include -namespace webrtc { +#include "api/rtc_event_log/rtc_event_log.h" +#include "rtc_base/synchronization/mutex.h" -FakeRtcEventLog::FakeRtcEventLog(rtc::Thread* thread) : thread_(thread) { - RTC_DCHECK(thread_); -} -FakeRtcEventLog::~FakeRtcEventLog() = default; +namespace webrtc { bool FakeRtcEventLog::StartLogging(std::unique_ptr output, int64_t output_period_ms) { return true; } -void FakeRtcEventLog::StopLogging() { - invoker_.Flush(thread_); -} +void FakeRtcEventLog::StopLogging() {} void FakeRtcEventLog::Log(std::unique_ptr event) { - RtcEvent::Type rtc_event_type = event->GetType(); - invoker_.AsyncInvoke( - RTC_FROM_HERE, thread_, - rtc::Bind(&FakeRtcEventLog::IncrementEventCount, this, rtc_event_type)); + MutexLock lock(&mu_); + ++count_[event->GetType()]; +} + +int FakeRtcEventLog::GetEventCount(RtcEvent::Type event_type) { + MutexLock lock(&mu_); + return count_[event_type]; } } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log.h 2021-06-27 05:27:48.000000000 +0000 @@ -16,26 +16,25 @@ #include "api/rtc_event_log/rtc_event.h" #include "api/rtc_event_log/rtc_event_log.h" -#include "rtc_base/async_invoker.h" -#include "rtc_base/thread.h" +#include "rtc_base/synchronization/mutex.h" +#include "rtc_base/thread_annotations.h" namespace webrtc { class FakeRtcEventLog : public RtcEventLog { public: - explicit FakeRtcEventLog(rtc::Thread* thread); - ~FakeRtcEventLog() override; + FakeRtcEventLog() = default; + ~FakeRtcEventLog() override = default; + bool StartLogging(std::unique_ptr output, int64_t output_period_ms) override; void StopLogging() override; void Log(std::unique_ptr event) override; - int GetEventCount(RtcEvent::Type event_type) { return count_[event_type]; } + int GetEventCount(RtcEvent::Type event_type); private: - void IncrementEventCount(RtcEvent::Type event_type) { ++count_[event_type]; } - std::map count_; - rtc::Thread* thread_; - rtc::AsyncInvoker invoker_; + Mutex mu_; + std::map count_ RTC_GUARDED_BY(mu_); }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log_factory.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log_factory.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log_factory.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log_factory.cc 2021-06-27 05:27:48.000000000 +0000 @@ -10,14 +10,16 @@ #include "logging/rtc_event_log/fake_rtc_event_log_factory.h" +#include + #include "api/rtc_event_log/rtc_event_log.h" #include "logging/rtc_event_log/fake_rtc_event_log.h" namespace webrtc { std::unique_ptr FakeRtcEventLogFactory::CreateRtcEventLog( - RtcEventLog::EncodingType encoding_type) { - std::unique_ptr fake_event_log(new FakeRtcEventLog(thread())); + RtcEventLog::EncodingType /*encoding_type*/) { + auto fake_event_log = std::make_unique(); last_log_created_ = fake_event_log.get(); return fake_event_log; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log_factory.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log_factory.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/fake_rtc_event_log_factory.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/fake_rtc_event_log_factory.h 2021-06-27 05:27:48.000000000 +0000 @@ -15,24 +15,21 @@ #include "api/rtc_event_log/rtc_event_log_factory_interface.h" #include "logging/rtc_event_log/fake_rtc_event_log.h" -#include "rtc_base/thread.h" namespace webrtc { class FakeRtcEventLogFactory : public RtcEventLogFactoryInterface { public: - explicit FakeRtcEventLogFactory(rtc::Thread* thread) : thread_(thread) {} - ~FakeRtcEventLogFactory() override {} + FakeRtcEventLogFactory() = default; + ~FakeRtcEventLogFactory() override = default; std::unique_ptr CreateRtcEventLog( RtcEventLog::EncodingType encoding_type) override; - webrtc::RtcEventLog* last_log_created() { return last_log_created_; } - rtc::Thread* thread() { return thread_; } + webrtc::FakeRtcEventLog* last_log_created() { return last_log_created_; } private: - webrtc::RtcEventLog* last_log_created_; - rtc::Thread* thread_; + webrtc::FakeRtcEventLog* last_log_created_; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/logged_events.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/logged_events.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/logged_events.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/logged_events.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,18 +14,10 @@ #include #include "absl/types/optional.h" -#include "api/network_state_predictor.h" #include "api/rtp_headers.h" -#include "api/units/data_rate.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" -#include "api/video/video_codec_type.h" -#include "logging/rtc_event_log/events/rtc_event_dtls_transport_state.h" -#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h" -#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h" -#include "logging/rtc_event_log/events/rtc_event_probe_result_failure.h" -#include "logging/rtc_event_log/rtc_stream_config.h" -#include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h" +#include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h" @@ -43,226 +35,6 @@ // possible by having a base class (containing e.g. the log time) are not // considered to outweigh the added memory and runtime overhead incurred by // adding a vptr. -struct LoggedAlrStateEvent { - LoggedAlrStateEvent() = default; - LoggedAlrStateEvent(int64_t timestamp_us, bool in_alr) - : timestamp_us(timestamp_us), in_alr(in_alr) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - bool in_alr; -}; - -struct LoggedAudioPlayoutEvent { - LoggedAudioPlayoutEvent() = default; - LoggedAudioPlayoutEvent(int64_t timestamp_us, uint32_t ssrc) - : timestamp_us(timestamp_us), ssrc(ssrc) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - uint32_t ssrc; -}; - -struct LoggedAudioNetworkAdaptationEvent { - LoggedAudioNetworkAdaptationEvent() = default; - LoggedAudioNetworkAdaptationEvent(int64_t timestamp_us, - const AudioEncoderRuntimeConfig& config) - : timestamp_us(timestamp_us), config(config) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - AudioEncoderRuntimeConfig config; -}; - -struct LoggedBweDelayBasedUpdate { - LoggedBweDelayBasedUpdate() = default; - LoggedBweDelayBasedUpdate(int64_t timestamp_us, - int32_t bitrate_bps, - BandwidthUsage detector_state) - : timestamp_us(timestamp_us), - bitrate_bps(bitrate_bps), - detector_state(detector_state) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int32_t bitrate_bps; - BandwidthUsage detector_state; -}; - -struct LoggedBweLossBasedUpdate { - LoggedBweLossBasedUpdate() = default; - LoggedBweLossBasedUpdate(int64_t timestamp_us, - int32_t bitrate_bps, - uint8_t fraction_lost, - int32_t expected_packets) - : timestamp_us(timestamp_us), - bitrate_bps(bitrate_bps), - fraction_lost(fraction_lost), - expected_packets(expected_packets) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int32_t bitrate_bps; - uint8_t fraction_lost; - int32_t expected_packets; -}; - -struct LoggedDtlsTransportState { - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - DtlsTransportState dtls_transport_state; -}; - -struct LoggedDtlsWritableState { - LoggedDtlsWritableState() = default; - explicit LoggedDtlsWritableState(bool writable) : writable(writable) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - bool writable; -}; - -struct LoggedBweProbeClusterCreatedEvent { - LoggedBweProbeClusterCreatedEvent() = default; - LoggedBweProbeClusterCreatedEvent(int64_t timestamp_us, - int32_t id, - int32_t bitrate_bps, - uint32_t min_packets, - uint32_t min_bytes) - : timestamp_us(timestamp_us), - id(id), - bitrate_bps(bitrate_bps), - min_packets(min_packets), - min_bytes(min_bytes) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int32_t id; - int32_t bitrate_bps; - uint32_t min_packets; - uint32_t min_bytes; -}; - -struct LoggedBweProbeSuccessEvent { - LoggedBweProbeSuccessEvent() = default; - LoggedBweProbeSuccessEvent(int64_t timestamp_us, - int32_t id, - int32_t bitrate_bps) - : timestamp_us(timestamp_us), id(id), bitrate_bps(bitrate_bps) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int32_t id; - int32_t bitrate_bps; -}; - -struct LoggedBweProbeFailureEvent { - LoggedBweProbeFailureEvent() = default; - LoggedBweProbeFailureEvent(int64_t timestamp_us, - int32_t id, - ProbeFailureReason failure_reason) - : timestamp_us(timestamp_us), id(id), failure_reason(failure_reason) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int32_t id; - ProbeFailureReason failure_reason; -}; - -struct LoggedFrameDecoded { - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int64_t render_time_ms; - uint32_t ssrc; - int width; - int height; - VideoCodecType codec; - uint8_t qp; -}; - -struct LoggedIceCandidatePairConfig { - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - IceCandidatePairConfigType type; - uint32_t candidate_pair_id; - IceCandidateType local_candidate_type; - IceCandidatePairProtocol local_relay_protocol; - IceCandidateNetworkType local_network_type; - IceCandidatePairAddressFamily local_address_family; - IceCandidateType remote_candidate_type; - IceCandidatePairAddressFamily remote_address_family; - IceCandidatePairProtocol candidate_pair_protocol; -}; - -struct LoggedIceCandidatePairEvent { - LoggedIceCandidatePairEvent() = default; - LoggedIceCandidatePairEvent(int64_t timestamp_us, - IceCandidatePairEventType type, - uint32_t candidate_pair_id, - uint32_t transaction_id) - : timestamp_us(timestamp_us), - type(type), - candidate_pair_id(candidate_pair_id), - transaction_id(transaction_id) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - IceCandidatePairEventType type; - uint32_t candidate_pair_id; - uint32_t transaction_id; -}; - -struct LoggedRouteChangeEvent { - LoggedRouteChangeEvent() = default; - LoggedRouteChangeEvent(int64_t timestamp_ms, - bool connected, - uint32_t overhead) - : timestamp_ms(timestamp_ms), connected(connected), overhead(overhead) {} - - int64_t log_time_us() const { return timestamp_ms * 1000; } - int64_t log_time_ms() const { return timestamp_ms; } - - int64_t timestamp_ms; - bool connected; - uint32_t overhead; -}; - -struct LoggedRemoteEstimateEvent { - LoggedRemoteEstimateEvent() = default; - - int64_t log_time_us() const { return timestamp_ms * 1000; } - int64_t log_time_ms() const { return timestamp_ms; } - - int64_t timestamp_ms; - absl::optional link_capacity_lower; - absl::optional link_capacity_upper; -}; struct LoggedRtpPacket { LoggedRtpPacket(int64_t timestamp_us, @@ -457,6 +229,16 @@ rtcp::LossNotification loss_notification; }; +struct LoggedRtcpPacketBye { + LoggedRtcpPacketBye() = default; + + int64_t log_time_us() const { return timestamp_us; } + int64_t log_time_ms() const { return timestamp_us / 1000; } + + int64_t timestamp_us; + rtcp::Bye bye; +}; + struct LoggedStartEvent { explicit LoggedStartEvent(int64_t timestamp_us) : LoggedStartEvent(timestamp_us, timestamp_us / 1000) {} @@ -480,54 +262,6 @@ int64_t timestamp_us; }; -struct LoggedAudioRecvConfig { - LoggedAudioRecvConfig() = default; - LoggedAudioRecvConfig(int64_t timestamp_us, const rtclog::StreamConfig config) - : timestamp_us(timestamp_us), config(config) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - rtclog::StreamConfig config; -}; - -struct LoggedAudioSendConfig { - LoggedAudioSendConfig() = default; - LoggedAudioSendConfig(int64_t timestamp_us, const rtclog::StreamConfig config) - : timestamp_us(timestamp_us), config(config) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - rtclog::StreamConfig config; -}; - -struct LoggedVideoRecvConfig { - LoggedVideoRecvConfig() = default; - LoggedVideoRecvConfig(int64_t timestamp_us, const rtclog::StreamConfig config) - : timestamp_us(timestamp_us), config(config) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - rtclog::StreamConfig config; -}; - -struct LoggedVideoSendConfig { - LoggedVideoSendConfig() = default; - LoggedVideoSendConfig(int64_t timestamp_us, const rtclog::StreamConfig config) - : timestamp_us(timestamp_us), config(config) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - rtclog::StreamConfig config; -}; - struct InferredRouteChangeEvent { int64_t log_time_ms() const { return log_time.ms(); } int64_t log_time_us() const { return log_time.us(); } @@ -602,68 +336,9 @@ LoggedIceEventType event_type; }; -struct LoggedGenericPacketSent { - LoggedGenericPacketSent() = default; - LoggedGenericPacketSent(int64_t timestamp_us, - int64_t packet_number, - size_t overhead_length, - size_t payload_length, - size_t padding_length) - : timestamp_us(timestamp_us), - packet_number(packet_number), - overhead_length(overhead_length), - payload_length(payload_length), - padding_length(padding_length) {} - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - size_t packet_length() const { - return payload_length + padding_length + overhead_length; - } - int64_t timestamp_us; - int64_t packet_number; - size_t overhead_length; - size_t payload_length; - size_t padding_length; -}; -struct LoggedGenericPacketReceived { - LoggedGenericPacketReceived() = default; - LoggedGenericPacketReceived(int64_t timestamp_us, - int64_t packet_number, - int packet_length) - : timestamp_us(timestamp_us), - packet_number(packet_number), - packet_length(packet_length) {} - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int64_t packet_number; - int packet_length; -}; - -struct LoggedGenericAckReceived { - LoggedGenericAckReceived() = default; - LoggedGenericAckReceived(int64_t timestamp_us, - int64_t packet_number, - int64_t acked_packet_number, - absl::optional receive_acked_packet_time_ms) - : timestamp_us(timestamp_us), - packet_number(packet_number), - acked_packet_number(acked_packet_number), - receive_acked_packet_time_ms(receive_acked_packet_time_ms) {} - - int64_t log_time_us() const { return timestamp_us; } - int64_t log_time_ms() const { return timestamp_us / 1000; } - - int64_t timestamp_us; - int64_t packet_number; - int64_t acked_packet_number; - absl::optional receive_acked_packet_time_ms; -}; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_LOGGED_EVENTS_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_impl.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_impl.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_impl.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_impl.h 2021-06-27 05:27:48.000000000 +0000 @@ -21,9 +21,9 @@ #include "api/rtc_event_log/rtc_event.h" #include "api/rtc_event_log/rtc_event_log.h" #include "api/rtc_event_log_output.h" +#include "api/sequence_checker.h" #include "api/task_queue/task_queue_factory.h" #include "logging/rtc_event_log/encoder/rtc_event_log_encoder.h" -#include "rtc_base/synchronization/sequence_checker.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/task_queue.h" #include "rtc_base/thread_annotations.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_parser.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_parser.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_parser.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_parser.cc 2021-06-27 05:27:48.000000000 +0000 @@ -14,8 +14,6 @@ #include #include -#include -#include // no-presubmit-check TODO(webrtc:8982) #include #include #include @@ -29,6 +27,7 @@ #include "logging/rtc_event_log/encoder/blob_encoding.h" #include "logging/rtc_event_log/encoder/delta_encoding.h" #include "logging/rtc_event_log/encoder/rtc_event_log_encoder_common.h" +#include "logging/rtc_event_log/encoder/var_int.h" #include "logging/rtc_event_log/rtc_event_processor.h" #include "modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h" #include "modules/include/module_common_types_public.h" @@ -42,6 +41,7 @@ #include "rtc_base/numerics/safe_conversions.h" #include "rtc_base/numerics/sequence_number_util.h" #include "rtc_base/protobuf_utils.h" +#include "rtc_base/system/file_wrapper.h" // These macros were added to convert existing code using RTC_CHECKs // to returning a Status object instead. Macros are necessary (over @@ -98,6 +98,8 @@ namespace webrtc { namespace { +constexpr int64_t kMaxLogSize = 250000000; + constexpr size_t kIpv4Overhead = 20; constexpr size_t kIpv6Overhead = 40; constexpr size_t kUdpOverhead = 8; @@ -313,33 +315,6 @@ return VideoCodecType::kVideoCodecMultiplex; } -// Reads a VarInt from |stream| and returns it. Also writes the read bytes to -// |buffer| starting |bytes_written| bytes into the buffer. |bytes_written| is -// incremented for each written byte. -ParsedRtcEventLog::ParseStatusOr ParseVarInt( - std::istream& stream, // no-presubmit-check TODO(webrtc:8982) - char* buffer, - size_t* bytes_written) { - uint64_t varint = 0; - for (size_t bytes_read = 0; bytes_read < 10; ++bytes_read) { - // The most significant bit of each byte is 0 if it is the last byte in - // the varint and 1 otherwise. Thus, we take the 7 least significant bits - // of each byte and shift them 7 bits for each byte read previously to get - // the (unsigned) integer. - int byte = stream.get(); - RTC_PARSE_CHECK_OR_RETURN(!stream.eof()); - RTC_DCHECK_GE(byte, 0); - RTC_DCHECK_LE(byte, 255); - varint |= static_cast(byte & 0x7F) << (7 * bytes_read); - buffer[*bytes_written] = byte; - *bytes_written += 1; - if ((byte & 0x80) == 0) { - return varint; - } - } - RTC_PARSE_CHECK_OR_RETURN(false); -} - ParsedRtcEventLog::ParseStatus GetHeaderExtensions( std::vector* header_extensions, const RepeatedPtrField& @@ -694,6 +669,7 @@ std::vector* nack_list, std::vector* fir_list, std::vector* pli_list, + std::vector* bye_list, std::vector* transport_feedback_list, std::vector* loss_notification_list) { rtcp::CommonHeader header; @@ -738,7 +714,13 @@ if (parsed_block.pli.Parse(header)) { pli_list->push_back(std::move(parsed_block)); } - } else if (header.type() == rtcp::Remb::kPacketType && + } else if (header.type() == rtcp::Bye::kPacketType) { + LoggedRtcpPacketBye parsed_block; + parsed_block.timestamp_us = timestamp_us; + if (parsed_block.bye.Parse(header)) { + bye_list->push_back(std::move(parsed_block)); + } + } else if (header.type() == rtcp::Psfb::kPacketType && header.fmt() == rtcp::Psfb::kAfbMessageType) { bool type_found = false; if (!type_found) { @@ -1102,27 +1084,39 @@ ParsedRtcEventLog::ParseStatus ParsedRtcEventLog::ParseFile( const std::string& filename) { - std::ifstream file( // no-presubmit-check TODO(webrtc:8982) - filename, std::ios_base::in | std::ios_base::binary); - if (!file.good() || !file.is_open()) { - RTC_LOG(LS_WARNING) << "Could not open file for reading."; - RTC_PARSE_CHECK_OR_RETURN(file.good() && file.is_open()); + FileWrapper file = FileWrapper::OpenReadOnly(filename); + if (!file.is_open()) { + RTC_LOG(LS_WARNING) << "Could not open file " << filename + << " for reading."; + RTC_PARSE_CHECK_OR_RETURN(file.is_open()); + } + + // Compute file size. + long signed_filesize = file.FileSize(); // NOLINT(runtime/int) + RTC_PARSE_CHECK_OR_RETURN_GE(signed_filesize, 0); + RTC_PARSE_CHECK_OR_RETURN_LE(signed_filesize, kMaxLogSize); + size_t filesize = rtc::checked_cast(signed_filesize); + + // Read file into memory. + std::string buffer(filesize, '\0'); + size_t bytes_read = file.Read(&buffer[0], buffer.size()); + if (bytes_read != filesize) { + RTC_LOG(LS_WARNING) << "Failed to read file " << filename; + RTC_PARSE_CHECK_OR_RETURN_EQ(bytes_read, filesize); } - return ParseStream(file); + return ParseStream(buffer); } ParsedRtcEventLog::ParseStatus ParsedRtcEventLog::ParseString( const std::string& s) { - std::istringstream stream( // no-presubmit-check TODO(webrtc:8982) - s, std::ios_base::in | std::ios_base::binary); - return ParseStream(stream); + return ParseStream(s); } ParsedRtcEventLog::ParseStatus ParsedRtcEventLog::ParseStream( - std::istream& stream) { // no-presubmit-check TODO(webrtc:8982) + const std::string& s) { Clear(); - ParseStatus status = ParseStreamInternal(stream); + ParseStatus status = ParseStreamInternal(s); // Cache the configured SSRCs. for (const auto& video_recv_config : video_recv_configs()) { @@ -1182,7 +1176,7 @@ auto status = StoreRtcpBlocks( timestamp_us, packet_begin, packet_end, &incoming_sr_, &incoming_rr_, &incoming_xr_, &incoming_remb_, &incoming_nack_, &incoming_fir_, - &incoming_pli_, &incoming_transport_feedback_, + &incoming_pli_, &incoming_bye_, &incoming_transport_feedback_, &incoming_loss_notification_); RTC_RETURN_IF_ERROR(status); } @@ -1194,7 +1188,7 @@ auto status = StoreRtcpBlocks( timestamp_us, packet_begin, packet_end, &outgoing_sr_, &outgoing_rr_, &outgoing_xr_, &outgoing_remb_, &outgoing_nack_, &outgoing_fir_, - &outgoing_pli_, &outgoing_transport_feedback_, + &outgoing_pli_, &outgoing_bye_, &outgoing_transport_feedback_, &outgoing_loss_notification_); RTC_RETURN_IF_ERROR(status); } @@ -1273,17 +1267,12 @@ } ParsedRtcEventLog::ParseStatus ParsedRtcEventLog::ParseStreamInternal( - std::istream& stream) { // no-presubmit-check TODO(webrtc:8982) + absl::string_view s) { constexpr uint64_t kMaxEventSize = 10000000; // Sanity check. - std::vector buffer(0xFFFF); - RTC_DCHECK(stream.good()); - while (1) { - // Check whether we have reached end of file. - stream.peek(); - if (stream.eof()) { - break; - } + while (!s.empty()) { + absl::string_view event_start = s; + bool success = false; // Read the next message tag. Protobuf defines the message tag as // (field_number << 3) | wire_type. In the legacy encoding, the field number @@ -1291,18 +1280,18 @@ // In the new encoding we still expect the wire type to be 2, but the field // number will be greater than 1. constexpr uint64_t kExpectedV1Tag = (1 << 3) | 2; - size_t bytes_written = 0; - ParsedRtcEventLog::ParseStatusOr tag = - ParseVarInt(stream, buffer.data(), &bytes_written); - if (!tag.ok()) { + uint64_t tag = 0; + std::tie(success, s) = DecodeVarInt(s, &tag); + if (!success) { RTC_LOG(LS_WARNING) - << "Missing field tag from beginning of protobuf event."; + << "Failed to read field tag from beginning of protobuf event."; RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, kIncompleteLogError); - return tag.status(); + return ParseStatus::Error("Failed to read field tag varint", __FILE__, + __LINE__); } constexpr uint64_t kWireTypeMask = 0x07; - const uint64_t wire_type = tag.value() & kWireTypeMask; + const uint64_t wire_type = tag & kWireTypeMask; if (wire_type != 2) { RTC_LOG(LS_WARNING) << "Expected field tag with wire type 2 (length " "delimited message). Found wire type " @@ -1313,36 +1302,32 @@ } // Read the length field. - ParsedRtcEventLog::ParseStatusOr message_length = - ParseVarInt(stream, buffer.data(), &bytes_written); - if (!message_length.ok()) { + uint64_t message_length = 0; + std::tie(success, s) = DecodeVarInt(s, &message_length); + if (!success) { RTC_LOG(LS_WARNING) << "Missing message length after protobuf field tag."; RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, kIncompleteLogError); - return message_length.status(); - } else if (message_length.value() > kMaxEventSize) { - RTC_LOG(LS_WARNING) << "Protobuf message length is too large."; - RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, - kIncompleteLogError); - RTC_PARSE_CHECK_OR_RETURN_LE(message_length.value(), kMaxEventSize); + return ParseStatus::Error("Failed to read message length varint", + __FILE__, __LINE__); } - // Read the next protobuf event to a temporary char buffer. - if (buffer.size() < bytes_written + message_length.value()) - buffer.resize(bytes_written + message_length.value()); - stream.read(buffer.data() + bytes_written, message_length.value()); - if (stream.gcount() != static_cast(message_length.value())) { - RTC_LOG(LS_WARNING) << "Failed to read protobuf message."; + if (message_length > s.size()) { + RTC_LOG(LS_WARNING) << "Protobuf message length is too large."; RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, kIncompleteLogError); - RTC_PARSE_CHECK_OR_RETURN(false); + RTC_PARSE_CHECK_OR_RETURN_LE(message_length, kMaxEventSize); } - size_t buffer_size = bytes_written + message_length.value(); - if (tag.value() == kExpectedV1Tag) { + // Skip forward to the start of the next event. + s = s.substr(message_length); + size_t total_event_size = event_start.size() - s.size(); + RTC_CHECK_LE(total_event_size, event_start.size()); + + if (tag == kExpectedV1Tag) { // Parse the protobuf event from the buffer. rtclog::EventStream event_stream; - if (!event_stream.ParseFromArray(buffer.data(), buffer_size)) { + if (!event_stream.ParseFromArray(event_start.data(), total_event_size)) { RTC_LOG(LS_WARNING) << "Failed to parse legacy-format protobuf message."; RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, @@ -1356,7 +1341,7 @@ } else { // Parse the protobuf event from the buffer. rtclog2::EventStream event_stream; - if (!event_stream.ParseFromArray(buffer.data(), buffer_size)) { + if (!event_stream.ParseFromArray(event_start.data(), total_event_size)) { RTC_LOG(LS_WARNING) << "Failed to parse new-format protobuf message."; RTC_PARSE_WARN_AND_RETURN_SUCCESS_IF(allow_incomplete_logs_, kIncompleteLogError); diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_parser.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_parser.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_parser.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_parser.h 2021-06-27 05:27:48.000000000 +0000 @@ -14,14 +14,36 @@ #include #include #include -#include // no-presubmit-check TODO(webrtc:8982) #include #include // pair #include +#include "absl/base/attributes.h" #include "api/rtc_event_log/rtc_event_log.h" #include "call/video_receive_stream.h" #include "call/video_send_stream.h" +#include "logging/rtc_event_log/events/rtc_event_alr_state.h" +#include "logging/rtc_event_log/events/rtc_event_audio_network_adaptation.h" +#include "logging/rtc_event_log/events/rtc_event_audio_playout.h" +#include "logging/rtc_event_log/events/rtc_event_audio_receive_stream_config.h" +#include "logging/rtc_event_log/events/rtc_event_audio_send_stream_config.h" +#include "logging/rtc_event_log/events/rtc_event_bwe_update_delay_based.h" +#include "logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h" +#include "logging/rtc_event_log/events/rtc_event_dtls_transport_state.h" +#include "logging/rtc_event_log/events/rtc_event_dtls_writable_state.h" +#include "logging/rtc_event_log/events/rtc_event_frame_decoded.h" +#include "logging/rtc_event_log/events/rtc_event_generic_ack_received.h" +#include "logging/rtc_event_log/events/rtc_event_generic_packet_received.h" +#include "logging/rtc_event_log/events/rtc_event_generic_packet_sent.h" +#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h" +#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h" +#include "logging/rtc_event_log/events/rtc_event_probe_cluster_created.h" +#include "logging/rtc_event_log/events/rtc_event_probe_result_failure.h" +#include "logging/rtc_event_log/events/rtc_event_probe_result_success.h" +#include "logging/rtc_event_log/events/rtc_event_remote_estimate.h" +#include "logging/rtc_event_log/events/rtc_event_route_change.h" +#include "logging/rtc_event_log/events/rtc_event_video_receive_stream_config.h" +#include "logging/rtc_event_log/events/rtc_event_video_send_stream_config.h" #include "logging/rtc_event_log/logged_events.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h" @@ -274,7 +296,7 @@ return error_ + " failed at " + file_ + " line " + std::to_string(line_); } - RTC_DEPRECATED operator bool() const { return ok(); } + ABSL_DEPRECATED("Use ok() instead") operator bool() const { return ok(); } private: ParseStatus() : error_(), file_(), line_(0) {} @@ -366,9 +388,8 @@ // Reads an RtcEventLog from a string and returns success if successful. ParseStatus ParseString(const std::string& s); - // Reads an RtcEventLog from an istream and returns success if successful. - ParseStatus ParseStream( - std::istream& stream); // no-presubmit-check TODO(webrtc:8982) + // Reads an RtcEventLog from an string and returns success if successful. + ParseStatus ParseStream(const std::string& s); MediaType GetMediaType(uint32_t ssrc, PacketDirection direction) const; @@ -581,6 +602,15 @@ } } + const std::vector& byes( + PacketDirection direction) const { + if (direction == kIncomingPacket) { + return incoming_bye_; + } else { + return outgoing_bye_; + } + } + const std::vector& transport_feedbacks( PacketDirection direction) const { if (direction == kIncomingPacket) { @@ -635,8 +665,7 @@ std::vector GetRouteChanges() const; private: - ABSL_MUST_USE_RESULT ParseStatus ParseStreamInternal( - std::istream& stream); // no-presubmit-check TODO(webrtc:8982) + ABSL_MUST_USE_RESULT ParseStatus ParseStreamInternal(absl::string_view s); ABSL_MUST_USE_RESULT ParseStatus StoreParsedLegacyEvent(const rtclog::Event& event); @@ -827,6 +856,8 @@ std::vector outgoing_fir_; std::vector incoming_pli_; std::vector outgoing_pli_; + std::vector incoming_bye_; + std::vector outgoing_bye_; std::vector incoming_transport_feedback_; std::vector outgoing_transport_feedback_; std::vector incoming_loss_notification_; diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -899,9 +899,9 @@ auto task_queue_factory = CreateDefaultTaskQueueFactory(); RtcEventLogFactory rtc_event_log_factory(task_queue_factory.get()); - // When log_dumper goes out of scope, it causes the log file to be flushed + // When `log` goes out of scope, it causes the log file to be flushed // to disk. - std::unique_ptr log_dumper = + std::unique_ptr log = rtc_event_log_factory.CreateRtcEventLog(encoding_type_); for (size_t i = 0; i < kNumEvents; i++) { @@ -911,18 +911,18 @@ // simplicity. // We base the various values on the index. We use this for some basic // consistency checks when we read back. - log_dumper->Log(std::make_unique( + log->Log(std::make_unique( i, kStartBitrate + i * 1000)); fake_clock->AdvanceTime(TimeDelta::Millis(10)); } int64_t start_time_us = rtc::TimeMicros(); int64_t utc_start_time_us = rtc::TimeUTCMicros(); - log_dumper->StartLogging( + log->StartLogging( std::make_unique(temp_filename, 10000000), RtcEventLog::kImmediateOutput); fake_clock->AdvanceTime(TimeDelta::Millis(10)); int64_t stop_time_us = rtc::TimeMicros(); - log_dumper->StopLogging(); + log->StopLogging(); // Read the generated file from disk. ParsedRtcEventLog parsed_log; @@ -960,6 +960,9 @@ RtcEventProbeResultSuccess(first_id + i, first_bitrate_bps + i * 1000), probe_success_events[i]); } + + // Clean up temporary file - can be pretty slow. + remove(temp_filename.c_str()); } INSTANTIATE_TEST_SUITE_P( diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest_helper.cc libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest_helper.cc --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest_helper.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest_helper.cc 2021-06-27 05:27:48.000000000 +0000 @@ -338,6 +338,19 @@ return pli; } +rtcp::Bye EventGenerator::NewBye() { + rtcp::Bye bye; + bye.SetSenderSsrc(prng_.Rand()); + std::vector csrcs{prng_.Rand(), prng_.Rand()}; + bye.SetCsrcs(csrcs); + if (prng_.Rand(0, 2)) { + bye.SetReason("foo"); + } else { + bye.SetReason("bar"); + } + return bye; +} + rtcp::TransportFeedback EventGenerator::NewTransportFeedback() { rtcp::TransportFeedback transport_feedback; uint16_t base_seq_no = prng_.Rand(); @@ -396,6 +409,7 @@ kPli, kNack, kRemb, + kBye, kTransportFeedback, kNumValues }; @@ -437,6 +451,11 @@ rtc::Buffer buffer = remb.Build(); return std::make_unique(buffer); } + case SupportedRtcpTypes::kBye: { + rtcp::Bye bye = NewBye(); + rtc::Buffer buffer = bye.Build(); + return std::make_unique(buffer); + } case SupportedRtcpTypes::kTransportFeedback: { rtcp::TransportFeedback transport_feedback = NewTransportFeedback(); rtc::Buffer buffer = transport_feedback.Build(); @@ -459,6 +478,7 @@ kPli, kNack, kRemb, + kBye, kTransportFeedback, kNumValues }; @@ -500,6 +520,11 @@ rtc::Buffer buffer = remb.Build(); return std::make_unique(buffer); } + case SupportedRtcpTypes::kBye: { + rtcp::Bye bye = NewBye(); + rtc::Buffer buffer = bye.Build(); + return std::make_unique(buffer); + } case SupportedRtcpTypes::kTransportFeedback: { rtcp::TransportFeedback transport_feedback = NewTransportFeedback(); rtc::Buffer buffer = transport_feedback.Build(); @@ -1133,6 +1158,7 @@ int64_t log_time_us, const rtcp::ExtendedReports& original_xr, const LoggedRtcpPacketExtendedReports& logged_xr) { + EXPECT_EQ(log_time_us, logged_xr.log_time_us()); EXPECT_EQ(original_xr.sender_ssrc(), logged_xr.xr.sender_ssrc()); EXPECT_EQ(original_xr.rrtr().has_value(), logged_xr.xr.rrtr().has_value()); @@ -1173,8 +1199,8 @@ void EventVerifier::VerifyLoggedFir(int64_t log_time_us, const rtcp::Fir& original_fir, const LoggedRtcpPacketFir& logged_fir) { + EXPECT_EQ(log_time_us, logged_fir.log_time_us()); EXPECT_EQ(original_fir.sender_ssrc(), logged_fir.fir.sender_ssrc()); - const auto& original_requests = original_fir.requests(); const auto& logged_requests = logged_fir.fir.requests(); ASSERT_EQ(original_requests.size(), logged_requests.size()); @@ -1187,10 +1213,20 @@ void EventVerifier::VerifyLoggedPli(int64_t log_time_us, const rtcp::Pli& original_pli, const LoggedRtcpPacketPli& logged_pli) { + EXPECT_EQ(log_time_us, logged_pli.log_time_us()); EXPECT_EQ(original_pli.sender_ssrc(), logged_pli.pli.sender_ssrc()); EXPECT_EQ(original_pli.media_ssrc(), logged_pli.pli.media_ssrc()); } +void EventVerifier::VerifyLoggedBye(int64_t log_time_us, + const rtcp::Bye& original_bye, + const LoggedRtcpPacketBye& logged_bye) { + EXPECT_EQ(log_time_us, logged_bye.log_time_us()); + EXPECT_EQ(original_bye.sender_ssrc(), logged_bye.bye.sender_ssrc()); + EXPECT_EQ(original_bye.csrcs(), logged_bye.bye.csrcs()); + EXPECT_EQ(original_bye.reason(), logged_bye.bye.reason()); +} + void EventVerifier::VerifyLoggedNack(int64_t log_time_us, const rtcp::Nack& original_nack, const LoggedRtcpPacketNack& logged_nack) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest_helper.h libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest_helper.h --- libtgowt-0~git20210124.be23804+ds/src/logging/rtc_event_log/rtc_event_log_unittest_helper.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/logging/rtc_event_log/rtc_event_log_unittest_helper.h 2021-06-27 05:27:48.000000000 +0000 @@ -45,6 +45,7 @@ #include "logging/rtc_event_log/rtc_event_log_parser.h" #include "logging/rtc_event_log/rtc_stream_config.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" +#include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h" @@ -93,6 +94,7 @@ rtcp::Remb NewRemb(); rtcp::Fir NewFir(); rtcp::Pli NewPli(); + rtcp::Bye NewBye(); rtcp::TransportFeedback NewTransportFeedback(); rtcp::LossNotification NewLossNotification(); @@ -275,6 +277,9 @@ void VerifyLoggedPli(int64_t log_time_us, const rtcp::Pli& original_pli, const LoggedRtcpPacketPli& logged_pli); + void VerifyLoggedBye(int64_t log_time_us, + const rtcp::Bye& original_bye, + const LoggedRtcpPacketBye& logged_bye); void VerifyLoggedNack(int64_t log_time_us, const rtcp::Nack& original_nack, const LoggedRtcpPacketNack& logged_nack); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/media/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/media/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -88,6 +88,7 @@ "../api:rtc_error", "../api:rtp_parameters", "../api:scoped_refptr", + "../api:sequence_checker", "../api/audio:audio_frame_processor", "../api/audio_codecs:audio_codecs_api", "../api/crypto:frame_decryptor_interface", @@ -113,9 +114,9 @@ "../rtc_base:rtc_base_approved", "../rtc_base:rtc_task_queue", "../rtc_base:sanitizer", + "../rtc_base:socket", "../rtc_base:stringutils", "../rtc_base/synchronization:mutex", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:file_wrapper", "../rtc_base/system:rtc_export", "../rtc_base/third_party/sigslot", @@ -160,16 +161,6 @@ ] } -rtc_library("rtc_constants") { - defines = [] - libs = [] - deps = [] - sources = [ - "engine/constants.cc", - "engine/constants.h", - ] -} - rtc_library("rtc_simulcast_encoder_adapter") { visibility = [ "*" ] defines = [] @@ -182,6 +173,7 @@ ":rtc_media_base", "../api:fec_controller_api", "../api:scoped_refptr", + "../api:sequence_checker", "../api/video:video_codec_constants", "../api/video:video_frame", "../api/video:video_rtp_headers", @@ -192,14 +184,17 @@ "../modules/video_coding:video_coding_utility", "../rtc_base:checks", "../rtc_base:rtc_base_approved", + "../rtc_base/experiments:encoder_info_settings", "../rtc_base/experiments:rate_control_settings", - "../rtc_base/synchronization:sequence_checker", "../rtc_base/system:no_unique_address", "../rtc_base/system:rtc_export", "../system_wrappers", "../system_wrappers:field_trial", ] - absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/algorithm:container", + "//third_party/abseil-cpp/absl/types:optional", + ] } rtc_library("rtc_encoder_simulcast_proxy") { @@ -227,7 +222,6 @@ defines = [] libs = [] deps = [ - ":rtc_constants", ":rtc_encoder_simulcast_proxy", ":rtc_h264_profile_id", ":rtc_media_base", @@ -248,7 +242,6 @@ "../modules/video_coding/codecs/av1:libaom_av1_decoder", "../modules/video_coding/codecs/av1:libaom_av1_encoder", "../rtc_base:checks", - "../rtc_base:deprecation", "../rtc_base:rtc_base_approved", "../rtc_base/system:rtc_export", "../test:fake_video_codecs", @@ -276,13 +269,13 @@ defines = [] libs = [] deps = [ - ":rtc_constants", ":rtc_media_base", "../api:call_api", "../api:libjingle_peerconnection_api", "../api:media_stream_interface", "../api:rtp_parameters", "../api:scoped_refptr", + "../api:sequence_checker", "../api:transport_api", "../api/audio:audio_frame_processor", "../api/audio:audio_mixer_api", @@ -320,12 +313,15 @@ "../rtc_base:ignore_wundef", "../rtc_base:rtc_task_queue", "../rtc_base:stringutils", + "../rtc_base:threading", "../rtc_base/experiments:field_trial_parser", "../rtc_base/experiments:min_video_bitrate_experiment", "../rtc_base/experiments:normalize_simulcast_size_experiment", "../rtc_base/experiments:rate_control_settings", "../rtc_base/synchronization:mutex", "../rtc_base/system:rtc_export", + "../rtc_base/task_utils:pending_task_safety_flag", + "../rtc_base/task_utils:to_queued_task", "../rtc_base/third_party/base64", "../system_wrappers", "../system_wrappers:metrics", @@ -403,10 +399,12 @@ deps = [ ":rtc_media_base", "../api:call_api", + "../api:sequence_checker", "../api:transport_api", "../p2p:rtc_p2p", "../rtc_base", "../rtc_base:rtc_base_approved", + "../rtc_base:threading", "../rtc_base/synchronization:mutex", "../rtc_base/task_utils:pending_task_safety_flag", "../rtc_base/task_utils:to_queued_task", @@ -483,6 +481,7 @@ "../rtc_base:rtc_base_approved", "../rtc_base:rtc_task_queue", "../rtc_base:stringutils", + "../rtc_base:threading", "../rtc_base/synchronization:mutex", "../rtc_base/third_party/sigslot", "../test:test_support", @@ -511,157 +510,166 @@ ] } - rtc_media_unittests_resources = [ - "../resources/media/captured-320x240-2s-48.frames", - "../resources/media/faces.1280x720_P420.yuv", - "../resources/media/faces_I400.jpg", - "../resources/media/faces_I411.jpg", - "../resources/media/faces_I420.jpg", - "../resources/media/faces_I422.jpg", - "../resources/media/faces_I444.jpg", - ] - - if (is_ios) { - bundle_data("rtc_media_unittests_bundle_data") { - testonly = true - sources = rtc_media_unittests_resources - outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] - } - } - - rtc_test("rtc_media_unittests") { - testonly = true - - defines = [] - deps = [ - ":rtc_audio_video", - ":rtc_constants", - ":rtc_data", - ":rtc_encoder_simulcast_proxy", - ":rtc_internal_video_codecs", - ":rtc_media", - ":rtc_media_base", - ":rtc_media_engine_defaults", - ":rtc_media_tests_utils", - ":rtc_sdp_fmtp_utils", - ":rtc_simulcast_encoder_adapter", - ":rtc_vp9_profile", - "../api:create_simulcast_test_fixture_api", - "../api:libjingle_peerconnection_api", - "../api:mock_video_bitrate_allocator", - "../api:mock_video_bitrate_allocator_factory", - "../api:mock_video_codec_factory", - "../api:mock_video_encoder", - "../api:rtp_parameters", - "../api:scoped_refptr", - "../api:simulcast_test_fixture_api", - "../api/audio_codecs:builtin_audio_decoder_factory", - "../api/audio_codecs:builtin_audio_encoder_factory", - "../api/rtc_event_log", - "../api/task_queue", - "../api/task_queue:default_task_queue_factory", - "../api/test/video:function_video_factory", - "../api/transport:field_trial_based_config", - "../api/units:time_delta", - "../api/video:builtin_video_bitrate_allocator_factory", - "../api/video:video_bitrate_allocation", - "../api/video:video_frame", - "../api/video:video_rtp_headers", - "../api/video_codecs:builtin_video_decoder_factory", - "../api/video_codecs:builtin_video_encoder_factory", - "../api/video_codecs:video_codecs_api", - "../audio", - "../call:call_interfaces", - "../common_video", - "../media:rtc_h264_profile_id", - "../modules/audio_device:mock_audio_device", - "../modules/audio_processing", - "../modules/audio_processing:api", - "../modules/audio_processing:mocks", - "../modules/rtp_rtcp", - "../modules/video_coding:simulcast_test_fixture_impl", - "../modules/video_coding:video_codec_interface", - "../modules/video_coding:webrtc_h264", - "../modules/video_coding:webrtc_vp8", - "../modules/video_coding/codecs/av1:libaom_av1_decoder", - "../p2p:p2p_test_utils", - "../rtc_base", - "../rtc_base:checks", - "../rtc_base:gunit_helpers", - "../rtc_base:rtc_base_approved", - "../rtc_base:rtc_base_tests_utils", - "../rtc_base:rtc_task_queue", - "../rtc_base:stringutils", - "../rtc_base/experiments:min_video_bitrate_experiment", - "../rtc_base/synchronization:mutex", - "../rtc_base/third_party/sigslot", - "../test:audio_codec_mocks", - "../test:fake_video_codecs", - "../test:field_trial", - "../test:rtp_test_utils", - "../test:test_main", - "../test:test_support", - "../test:video_test_common", - "//third_party/abseil-cpp/absl/algorithm:container", - "//third_party/abseil-cpp/absl/memory", - "//third_party/abseil-cpp/absl/strings", - "//third_party/abseil-cpp/absl/types:optional", - ] - sources = [ - "base/codec_unittest.cc", - "base/media_engine_unittest.cc", - "base/rtp_data_engine_unittest.cc", - "base/rtp_utils_unittest.cc", - "base/sdp_fmtp_utils_unittest.cc", - "base/stream_params_unittest.cc", - "base/turn_utils_unittest.cc", - "base/video_adapter_unittest.cc", - "base/video_broadcaster_unittest.cc", - "base/video_common_unittest.cc", - "engine/encoder_simulcast_proxy_unittest.cc", - "engine/internal_decoder_factory_unittest.cc", - "engine/multiplex_codec_factory_unittest.cc", - "engine/null_webrtc_video_engine_unittest.cc", - "engine/payload_type_mapper_unittest.cc", - "engine/simulcast_encoder_adapter_unittest.cc", - "engine/simulcast_unittest.cc", - "engine/unhandled_packets_buffer_unittest.cc", - "engine/webrtc_media_engine_unittest.cc", - "engine/webrtc_video_engine_unittest.cc", + if (!build_with_chromium) { + rtc_media_unittests_resources = [ + "../resources/media/captured-320x240-2s-48.frames", + "../resources/media/faces.1280x720_P420.yuv", + "../resources/media/faces_I400.jpg", + "../resources/media/faces_I411.jpg", + "../resources/media/faces_I420.jpg", + "../resources/media/faces_I422.jpg", + "../resources/media/faces_I444.jpg", ] - # TODO(kthelgason): Reenable this test on iOS. - # See bugs.webrtc.org/5569 - if (!is_ios) { - sources += [ "engine/webrtc_voice_engine_unittest.cc" ] - } - - if (rtc_enable_sctp) { - sources += [ - "sctp/sctp_transport_reliability_unittest.cc", - "sctp/sctp_transport_unittest.cc", - ] - } - - if (rtc_opus_support_120ms_ptime) { - defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ] - } else { - defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ] + if (is_ios) { + bundle_data("rtc_media_unittests_bundle_data") { + testonly = true + sources = rtc_media_unittests_resources + outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] + } } - data = rtc_media_unittests_resources - - if (is_android) { - deps += [ "//testing/android/native_test:native_test_support" ] - shard_timeout = 900 - } + rtc_test("rtc_media_unittests") { + testonly = true - if (is_ios) { - deps += [ ":rtc_media_unittests_bundle_data" ] - } + defines = [] + deps = [ + ":rtc_audio_video", + ":rtc_data", + ":rtc_encoder_simulcast_proxy", + ":rtc_internal_video_codecs", + ":rtc_media", + ":rtc_media_base", + ":rtc_media_engine_defaults", + ":rtc_media_tests_utils", + ":rtc_sdp_fmtp_utils", + ":rtc_simulcast_encoder_adapter", + ":rtc_vp9_profile", + "../api:create_simulcast_test_fixture_api", + "../api:libjingle_peerconnection_api", + "../api:mock_video_bitrate_allocator", + "../api:mock_video_bitrate_allocator_factory", + "../api:mock_video_codec_factory", + "../api:mock_video_encoder", + "../api:rtp_parameters", + "../api:scoped_refptr", + "../api:simulcast_test_fixture_api", + "../api/audio_codecs:builtin_audio_decoder_factory", + "../api/audio_codecs:builtin_audio_encoder_factory", + "../api/rtc_event_log", + "../api/task_queue", + "../api/task_queue:default_task_queue_factory", + "../api/test/video:function_video_factory", + "../api/transport:field_trial_based_config", + "../api/units:time_delta", + "../api/video:builtin_video_bitrate_allocator_factory", + "../api/video:video_bitrate_allocation", + "../api/video:video_codec_constants", + "../api/video:video_frame", + "../api/video:video_rtp_headers", + "../api/video_codecs:builtin_video_decoder_factory", + "../api/video_codecs:builtin_video_encoder_factory", + "../api/video_codecs:video_codecs_api", + "../audio", + "../call:call_interfaces", + "../common_video", + "../media:rtc_h264_profile_id", + "../modules/audio_device:mock_audio_device", + "../modules/audio_processing", + "../modules/audio_processing:api", + "../modules/audio_processing:mocks", + "../modules/rtp_rtcp", + "../modules/video_coding:simulcast_test_fixture_impl", + "../modules/video_coding:video_codec_interface", + "../modules/video_coding:webrtc_h264", + "../modules/video_coding:webrtc_vp8", + "../modules/video_coding/codecs/av1:libaom_av1_decoder", + "../p2p:p2p_test_utils", + "../rtc_base", + "../rtc_base:checks", + "../rtc_base:gunit_helpers", + "../rtc_base:rtc_base_approved", + "../rtc_base:rtc_base_tests_utils", + "../rtc_base:rtc_task_queue", + "../rtc_base:stringutils", + "../rtc_base:threading", + "../rtc_base/experiments:min_video_bitrate_experiment", + "../rtc_base/synchronization:mutex", + "../rtc_base/third_party/sigslot", + "../test:audio_codec_mocks", + "../test:fake_video_codecs", + "../test:field_trial", + "../test:rtp_test_utils", + "../test:test_main", + "../test:test_support", + "../test:video_test_common", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/algorithm:container", + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/types:optional", + ] + sources = [ + "base/codec_unittest.cc", + "base/media_engine_unittest.cc", + "base/rtp_data_engine_unittest.cc", + "base/rtp_utils_unittest.cc", + "base/sdp_fmtp_utils_unittest.cc", + "base/stream_params_unittest.cc", + "base/turn_utils_unittest.cc", + "base/video_adapter_unittest.cc", + "base/video_broadcaster_unittest.cc", + "base/video_common_unittest.cc", + "engine/encoder_simulcast_proxy_unittest.cc", + "engine/internal_decoder_factory_unittest.cc", + "engine/multiplex_codec_factory_unittest.cc", + "engine/null_webrtc_video_engine_unittest.cc", + "engine/payload_type_mapper_unittest.cc", + "engine/simulcast_encoder_adapter_unittest.cc", + "engine/simulcast_unittest.cc", + "engine/unhandled_packets_buffer_unittest.cc", + "engine/webrtc_media_engine_unittest.cc", + "engine/webrtc_video_engine_unittest.cc", + ] - if (rtc_enable_sctp && rtc_build_usrsctp) { - deps += [ "//third_party/usrsctp" ] + # TODO(kthelgason): Reenable this test on iOS. + # See bugs.webrtc.org/5569 + if (!is_ios) { + sources += [ "engine/webrtc_voice_engine_unittest.cc" ] + } + + if (rtc_enable_sctp) { + sources += [ + "sctp/sctp_transport_reliability_unittest.cc", + "sctp/sctp_transport_unittest.cc", + ] + deps += [ + "../rtc_base/task_utils:pending_task_safety_flag", + "../rtc_base/task_utils:to_queued_task", + ] + } + + if (rtc_opus_support_120ms_ptime) { + defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ] + } else { + defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ] + } + + data = rtc_media_unittests_resources + + if (is_android) { + deps += [ "//testing/android/native_test:native_test_support" ] + shard_timeout = 900 + } + + if (is_ios) { + deps += [ ":rtc_media_unittests_bundle_data" ] + } + + if (rtc_enable_sctp && rtc_build_usrsctp) { + deps += [ "//third_party/usrsctp" ] + } } } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/codec.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/base/codec.cc --- libtgowt-0~git20210124.be23804+ds/src/media/base/codec.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/codec.cc 2021-06-27 05:27:48.000000000 +0000 @@ -285,7 +285,11 @@ std::string VideoCodec::ToString() const { char buf[256]; rtc::SimpleStringBuilder sb(buf); - sb << "VideoCodec[" << id << ":" << name << "]"; + sb << "VideoCodec[" << id << ":" << name; + if (packetization.has_value()) { + sb << ":" << *packetization; + } + sb << "]"; return sb.str(); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/fake_media_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/fake_media_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/fake_media_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/fake_media_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -118,6 +118,8 @@ return RemoveStreamBySsrc(&send_streams_, ssrc); } virtual void ResetUnsignaledRecvStream() {} + virtual void OnDemuxerCriteriaUpdatePending() {} + virtual void OnDemuxerCriteriaUpdateComplete() {} virtual bool AddRecvStream(const StreamParams& sp) { if (absl::c_linear_search(receive_streams_, sp)) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/fake_network_interface.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/fake_network_interface.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/fake_network_interface.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/fake_network_interface.h 2021-06-27 05:27:48.000000000 +0000 @@ -129,7 +129,8 @@ rtp_packets_.push_back(*packet); if (conf_) { for (size_t i = 0; i < conf_sent_ssrcs_.size(); ++i) { - if (!SetRtpSsrc(packet->data(), packet->size(), conf_sent_ssrcs_[i])) { + if (!SetRtpSsrc(packet->MutableData(), packet->size(), + conf_sent_ssrcs_[i])) { return false; } PostMessage(ST_RTP, *packet); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/media_channel.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_channel.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/media_channel.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_channel.h 2021-06-27 05:27:48.000000000 +0000 @@ -43,7 +43,6 @@ #include "modules/rtp_rtcp/include/report_block_data.h" #include "rtc_base/async_packet_socket.h" #include "rtc_base/buffer.h" -#include "rtc_base/callback.h" #include "rtc_base/copy_on_write_buffer.h" #include "rtc_base/dscp.h" #include "rtc_base/logging.h" @@ -179,7 +178,7 @@ // Sets the abstract interface class for sending RTP/RTCP data. virtual void SetInterface(NetworkInterface* iface) RTC_LOCKS_EXCLUDED(network_interface_mutex_); - // Called when a RTP packet is received. + // Called on the network when an RTP packet is received. virtual void OnPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) = 0; // Called when the socket's ability to send has changed. @@ -207,6 +206,17 @@ // Resets any cached StreamParams for an unsignaled RecvStream, and removes // any existing unsignaled streams. virtual void ResetUnsignaledRecvStream() = 0; + // Informs the media channel when the transport's demuxer criteria is updated. + // * OnDemuxerCriteriaUpdatePending() happens on the same thread that the + // channel's streams are added and removed (worker thread). + // * OnDemuxerCriteriaUpdateComplete() happens on the thread where the demuxer + // lives (network thread). + // Because the demuxer is updated asynchronously, there is a window of time + // where packets are arriving to the channel for streams that have already + // been removed on the worker thread. It is important NOT to treat these as + // new unsignalled ssrcs. + virtual void OnDemuxerCriteriaUpdatePending() = 0; + virtual void OnDemuxerCriteriaUpdateComplete() = 0; // Returns the absoulte sendtime extension id value from media channel. virtual int GetRtpSendTimeExtnId() const; // Set the frame encryptor to use on all outgoing frames. This is optional. @@ -537,6 +547,13 @@ // longer than 150 ms). int32_t interruption_count = 0; int32_t total_interruption_duration_ms = 0; + // Remote outbound stats derived by the received RTCP sender reports. + // https://w3c.github.io/webrtc-stats/#remoteoutboundrtpstats-dict* + absl::optional last_sender_report_timestamp_ms; + absl::optional last_sender_report_remote_timestamp_ms; + uint32_t sender_reports_packets_sent = 0; + uint64_t sender_reports_bytes_sent = 0; + uint64_t sender_reports_reports_count = 0; }; struct VideoSenderInfo : public MediaSenderInfo { @@ -549,6 +566,7 @@ int nacks_rcvd = 0; int send_frame_width = 0; int send_frame_height = 0; + int frames = 0; int framerate_input = 0; int framerate_sent = 0; int aggregated_framerate_sent = 0; @@ -617,6 +635,7 @@ uint32_t total_pauses_duration_ms = 0; uint32_t total_frames_duration_ms = 0; double sum_squared_frame_durations = 0.0; + uint32_t jitter_ms = 0; webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/media_constants.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_constants.cc --- libtgowt-0~git20210124.be23804+ds/src/media/base/media_constants.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_constants.cc 2021-06-27 05:27:48.000000000 +0000 @@ -16,11 +16,14 @@ const int kDataCodecClockrate = 90000; const int kRtpDataMaxBandwidth = 30720; // bps +const int kVideoMtu = 1200; +const int kVideoRtpSendBufferSize = 65536; +const int kVideoRtpRecvBufferSize = 262144; + const float kHighSystemCpuThreshold = 0.85f; const float kLowSystemCpuThreshold = 0.65f; const float kProcessCpuThreshold = 0.10f; -const char kRtxCodecName[] = "rtx"; const char kRedCodecName[] = "red"; const char kUlpfecCodecName[] = "ulpfec"; const char kMultiplexCodecName[] = "multiplex"; @@ -32,7 +35,11 @@ // draft-ietf-payload-flexible-fec-scheme-02.txt const char kFlexfecFmtpRepairWindow[] = "repair-window"; +// RFC 4588 RTP Retransmission Payload Format +const char kRtxCodecName[] = "rtx"; +const char kCodecParamRtxTime[] = "rtx-time"; const char kCodecParamAssociatedPayloadType[] = "apt"; + const char kCodecParamAssociatedCodecName[] = "acn"; const char kOpusCodecName[] = "opus"; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/media_constants.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_constants.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/media_constants.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_constants.h 2021-06-27 05:27:48.000000000 +0000 @@ -23,12 +23,15 @@ extern const int kDataCodecClockrate; extern const int kRtpDataMaxBandwidth; // bps +extern const int kVideoMtu; +extern const int kVideoRtpSendBufferSize; +extern const int kVideoRtpRecvBufferSize; + // Default CPU thresholds. extern const float kHighSystemCpuThreshold; extern const float kLowSystemCpuThreshold; extern const float kProcessCpuThreshold; -extern const char kRtxCodecName[]; extern const char kRedCodecName[]; extern const char kUlpfecCodecName[]; extern const char kFlexfecCodecName[]; @@ -36,8 +39,10 @@ extern const char kFlexfecFmtpRepairWindow[]; -// Codec parameters +extern const char kRtxCodecName[]; +extern const char kCodecParamRtxTime[]; extern const char kCodecParamAssociatedPayloadType[]; + extern const char kCodecParamAssociatedCodecName[]; extern const char kOpusCodecName[]; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/media_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/media_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/media_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -121,9 +121,9 @@ public: virtual ~MediaEngineInterface() {} - // Initialization - // Starts the engine. + // Initialization. Needs to be called on the worker thread. virtual bool Init() = 0; + virtual VoiceEngineInterface& voice() = 0; virtual VideoEngineInterface& video() = 0; virtual const VoiceEngineInterface& voice() const = 0; @@ -141,6 +141,8 @@ CompositeMediaEngine(std::unique_ptr audio_engine, std::unique_ptr video_engine); ~CompositeMediaEngine() override; + + // Always succeeds. bool Init() override; VoiceEngineInterface& voice() override; @@ -150,8 +152,8 @@ private: const std::unique_ptr trials_; - std::unique_ptr voice_engine_; - std::unique_ptr video_engine_; + const std::unique_ptr voice_engine_; + const std::unique_ptr video_engine_; }; enum DataChannelType { diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/rtp_data_engine.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/base/rtp_data_engine.cc --- libtgowt-0~git20210124.be23804+ds/src/media/base/rtp_data_engine.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/rtp_data_engine.cc 2021-06-27 05:27:48.000000000 +0000 @@ -196,6 +196,8 @@ // Not implemented. void RtpDataMediaChannel::ResetUnsignaledRecvStream() {} +void RtpDataMediaChannel::OnDemuxerCriteriaUpdatePending() {} +void RtpDataMediaChannel::OnDemuxerCriteriaUpdateComplete() {} void RtpDataMediaChannel::OnPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t /* packet_time_us */) { @@ -312,7 +314,7 @@ &header.timestamp); rtc::CopyOnWriteBuffer packet(kMinRtpPacketLen, packet_len); - if (!SetRtpHeader(packet.data(), packet.size(), header)) { + if (!SetRtpHeader(packet.MutableData(), packet.size(), header)) { return false; } packet.AppendData(kReservedSpace); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/rtp_data_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/rtp_data_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/rtp_data_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/rtp_data_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -73,6 +73,8 @@ virtual bool AddRecvStream(const StreamParams& sp); virtual bool RemoveRecvStream(uint32_t ssrc); virtual void ResetUnsignaledRecvStream(); + virtual void OnDemuxerCriteriaUpdatePending(); + virtual void OnDemuxerCriteriaUpdateComplete(); virtual bool SetSend(bool send) { sending_ = send; return true; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/video_broadcaster.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_broadcaster.cc --- libtgowt-0~git20210124.be23804+ds/src/media/base/video_broadcaster.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_broadcaster.cc 2021-06-27 05:27:48.000000000 +0000 @@ -94,6 +94,7 @@ } void VideoBroadcaster::OnDiscardedFrame() { + webrtc::MutexLock lock(&sinks_and_wants_lock_); for (auto& sink_pair : sink_pairs()) { sink_pair.sink->OnDiscardedFrame(); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/video_broadcaster.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_broadcaster.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/video_broadcaster.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_broadcaster.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,12 +12,12 @@ #define MEDIA_BASE_VIDEO_BROADCASTER_H_ #include "api/scoped_refptr.h" +#include "api/sequence_checker.h" #include "api/video/video_frame_buffer.h" #include "api/video/video_source_interface.h" #include "media/base/video_source_base.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" -#include "rtc_base/thread_checker.h" namespace rtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/base/video_source_base.h libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_source_base.h --- libtgowt-0~git20210124.be23804+ds/src/media/base/video_source_base.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/base/video_source_base.h 2021-06-27 05:27:48.000000000 +0000 @@ -13,10 +13,10 @@ #include +#include "api/sequence_checker.h" #include "api/video/video_frame.h" #include "api/video/video_sink_interface.h" #include "api/video/video_source_interface.h" -#include "rtc_base/thread_checker.h" namespace rtc { diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/constants.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/constants.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/constants.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/constants.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "media/engine/constants.h" - -namespace cricket { - -const int kVideoMtu = 1200; -const int kVideoRtpSendBufferSize = 65536; -const int kVideoRtpRecvBufferSize = 262144; - -} // namespace cricket diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/constants.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/constants.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/constants.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/constants.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef MEDIA_ENGINE_CONSTANTS_H_ -#define MEDIA_ENGINE_CONSTANTS_H_ - -namespace cricket { - -extern const int kVideoMtu; -extern const int kVideoRtpSendBufferSize; -extern const int kVideoRtpRecvBufferSize; - -} // namespace cricket - -#endif // MEDIA_ENGINE_CONSTANTS_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/encoder_simulcast_proxy_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/encoder_simulcast_proxy_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/encoder_simulcast_proxy_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/encoder_simulcast_proxy_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -49,7 +49,8 @@ 2000, 1000, 1000, - 56}; + 56, + true}; codec_settings.simulcastStream[1] = {test::kTestWidth, test::kTestHeight, test::kTestFrameRate, @@ -57,7 +58,8 @@ 3000, 1000, 1000, - 56}; + 56, + true}; codec_settings.simulcastStream[2] = {test::kTestWidth, test::kTestHeight, test::kTestFrameRate, @@ -65,7 +67,8 @@ 5000, 1000, 1000, - 56}; + 56, + true}; codec_settings.numberOfSimulcastStreams = 3; auto mock_encoder = std::make_unique>(); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/fake_webrtc_call.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/fake_webrtc_call.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/fake_webrtc_call.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/fake_webrtc_call.cc 2021-06-27 05:27:48.000000000 +0000 @@ -326,10 +326,7 @@ FakeVideoReceiveStream::FakeVideoReceiveStream( webrtc::VideoReceiveStream::Config config) - : config_(std::move(config)), - receiving_(false), - num_added_secondary_sinks_(0), - num_removed_secondary_sinks_(0) {} + : config_(std::move(config)), receiving_(false) {} const webrtc::VideoReceiveStream::Config& FakeVideoReceiveStream::GetConfig() const { @@ -361,24 +358,6 @@ stats_ = stats; } -void FakeVideoReceiveStream::AddSecondarySink( - webrtc::RtpPacketSinkInterface* sink) { - ++num_added_secondary_sinks_; -} - -void FakeVideoReceiveStream::RemoveSecondarySink( - const webrtc::RtpPacketSinkInterface* sink) { - ++num_removed_secondary_sinks_; -} - -int FakeVideoReceiveStream::GetNumAddedSecondarySinks() const { - return num_added_secondary_sinks_; -} - -int FakeVideoReceiveStream::GetNumRemovedSecondarySinks() const { - return num_removed_secondary_sinks_; -} - FakeFlexfecReceiveStream::FakeFlexfecReceiveStream( const webrtc::FlexfecReceiveStream::Config& config) : config_(config) {} @@ -599,14 +578,17 @@ if (media_type == webrtc::MediaType::VIDEO) { for (auto receiver : video_receive_streams_) { - if (receiver->GetConfig().rtp.remote_ssrc == ssrc) + if (receiver->GetConfig().rtp.remote_ssrc == ssrc) { + ++delivered_packets_by_ssrc_[ssrc]; return DELIVERY_OK; + } } } if (media_type == webrtc::MediaType::AUDIO) { for (auto receiver : audio_receive_streams_) { if (receiver->GetConfig().rtp.remote_ssrc == ssrc) { receiver->DeliverRtp(packet.cdata(), packet.size(), packet_time_us); + ++delivered_packets_by_ssrc_[ssrc]; return DELIVERY_OK; } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/fake_webrtc_call.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/fake_webrtc_call.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/fake_webrtc_call.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/fake_webrtc_call.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,6 +20,7 @@ #ifndef MEDIA_ENGINE_FAKE_WEBRTC_CALL_H_ #define MEDIA_ENGINE_FAKE_WEBRTC_CALL_H_ +#include #include #include #include @@ -104,6 +105,7 @@ void Reconfigure(const webrtc::AudioReceiveStream::Config& config) override; void Start() override { started_ = true; } void Stop() override { started_ = false; } + bool IsRunning() const override { return started_; } webrtc::AudioReceiveStream::Stats GetStats( bool get_and_clear_legacy_stats) const override; @@ -218,12 +220,6 @@ void SetStats(const webrtc::VideoReceiveStream::Stats& stats); - void AddSecondarySink(webrtc::RtpPacketSinkInterface* sink) override; - void RemoveSecondarySink(const webrtc::RtpPacketSinkInterface* sink) override; - - int GetNumAddedSecondarySinks() const; - int GetNumRemovedSecondarySinks() const; - std::vector GetSources() const override { return std::vector(); } @@ -266,9 +262,6 @@ webrtc::VideoReceiveStream::Stats stats_; int base_mininum_playout_delay_ms_ = 0; - - int num_added_secondary_sinks_; - int num_removed_secondary_sinks_; }; class FakeFlexfecReceiveStream final : public webrtc::FlexfecReceiveStream { @@ -307,6 +300,10 @@ const std::vector& GetFlexfecReceiveStreams(); rtc::SentPacket last_sent_packet() const { return last_sent_packet_; } + size_t GetDeliveredPacketsForSsrc(uint32_t ssrc) const { + auto it = delivered_packets_by_ssrc_.find(ssrc); + return it != delivered_packets_by_ssrc_.end() ? it->second : 0u; + } // This is useful if we care about the last media packet (with id populated) // but not the last ICE packet (with -1 ID). @@ -387,6 +384,7 @@ std::vector video_receive_streams_; std::vector audio_receive_streams_; std::vector flexfec_receive_streams_; + std::map delivered_packets_by_ssrc_; int num_created_send_streams_; int num_created_receive_streams_; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/null_webrtc_video_engine_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/null_webrtc_video_engine_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/null_webrtc_video_engine_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/null_webrtc_video_engine_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -41,8 +41,7 @@ CompositeMediaEngine engine(std::move(audio_engine), std::make_unique()); - - EXPECT_TRUE(engine.Init()); + engine.Init(); } } // namespace cricket diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/payload_type_mapper.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/payload_type_mapper.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/payload_type_mapper.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/payload_type_mapper.cc 2021-06-27 05:27:48.000000000 +0000 @@ -32,18 +32,18 @@ max_payload_type_(127), mappings_( {// Static payload type assignments according to RFC 3551. - {{"PCMU", 8000, 1}, 0}, + {{kPcmuCodecName, 8000, 1}, 0}, {{"GSM", 8000, 1}, 3}, {{"G723", 8000, 1}, 4}, {{"DVI4", 8000, 1}, 5}, {{"DVI4", 16000, 1}, 6}, {{"LPC", 8000, 1}, 7}, - {{"PCMA", 8000, 1}, 8}, - {{"G722", 8000, 1}, 9}, - {{"L16", 44100, 2}, 10}, - {{"L16", 44100, 1}, 11}, + {{kPcmaCodecName, 8000, 1}, 8}, + {{kG722CodecName, 8000, 1}, 9}, + {{kL16CodecName, 44100, 2}, 10}, + {{kL16CodecName, 44100, 1}, 11}, {{"QCELP", 8000, 1}, 12}, - {{"CN", 8000, 1}, 13}, + {{kCnCodecName, 8000, 1}, 13}, // RFC 4566 is a bit ambiguous on the contents of the "encoding // parameters" field, which, for audio, encodes the number of // channels. It is "optional and may be omitted if the number of @@ -70,7 +70,8 @@ {{kOpusCodecName, 48000, 2, - {{"minptime", "10"}, {"useinbandfec", "1"}}}, + {{kCodecParamMinPTime, "10"}, + {kCodecParamUseInbandFec, kParamValueTrue}}}, 111}, // TODO(solenberg): Remove the hard coded 16k,32k,48k DTMF once we // assign payload types dynamically for send side as well. diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast.cc 2021-06-27 05:27:48.000000000 +0000 @@ -15,14 +15,15 @@ #include #include +#include #include "absl/strings/match.h" #include "absl/types/optional.h" #include "api/video/video_codec_constants.h" #include "media/base/media_constants.h" #include "modules/video_coding/utility/simulcast_rate_allocator.h" -#include "rtc_base/arraysize.h" #include "rtc_base/checks.h" +#include "rtc_base/experiments/field_trial_parser.h" #include "rtc_base/experiments/min_video_bitrate_experiment.h" #include "rtc_base/experiments/normalize_simulcast_size_experiment.h" #include "rtc_base/experiments/rate_control_settings.h" @@ -41,6 +42,15 @@ constexpr char kUseLegacySimulcastLayerLimitFieldTrial[] = "WebRTC-LegacySimulcastLayerLimit"; +constexpr double kDefaultMaxRoundupRate = 0.1; + +// TODO(webrtc:12415): Flip this to a kill switch when this feature launches. +bool EnableLowresBitrateInterpolation( + const webrtc::WebRtcKeyValueConfig& trials) { + return absl::StartsWith( + trials.Lookup("WebRTC-LowresSimulcastBitrateInterpolation"), "Enabled"); +} + // Limits for legacy conference screensharing mode. Currently used for the // lower of the two simulcast streams. constexpr webrtc::DataRate kScreenshareDefaultTl0Bitrate = @@ -61,7 +71,7 @@ int width; int height; // The maximum number of simulcast layers can be used for - // resolutions at |widthxheigh| for legacy applications. + // resolutions at |widthxheight| for legacy applications. size_t max_layers; // The maximum bitrate for encoding stream at |widthxheight|, when we are // not sending the next higher spatial stream. @@ -96,10 +106,29 @@ {320, 180, 1, webrtc::DataRate::KilobitsPerSec(200), webrtc::DataRate::KilobitsPerSec(150), webrtc::DataRate::KilobitsPerSec(30)}, - {0, 0, 1, webrtc::DataRate::KilobitsPerSec(200), - webrtc::DataRate::KilobitsPerSec(150), + // As the resolution goes down, interpolate the target and max bitrates down + // towards zero. The min bitrate is still limited at 30 kbps and the target + // and the max will be capped from below accordingly. + {0, 0, 1, webrtc::DataRate::KilobitsPerSec(0), + webrtc::DataRate::KilobitsPerSec(0), webrtc::DataRate::KilobitsPerSec(30)}}; +std::vector GetSimulcastFormats( + bool enable_lowres_bitrate_interpolation) { + std::vector formats; + formats.insert(formats.begin(), std::begin(kSimulcastFormats), + std::end(kSimulcastFormats)); + if (!enable_lowres_bitrate_interpolation) { + RTC_CHECK_GE(formats.size(), 2u); + SimulcastFormat& format0x0 = formats[formats.size() - 1]; + const SimulcastFormat& format_prev = formats[formats.size() - 2]; + format0x0.max_bitrate = format_prev.max_bitrate; + format0x0.target_bitrate = format_prev.target_bitrate; + format0x0.min_bitrate = format_prev.min_bitrate; + } + return formats; +} + const int kMaxScreenshareSimulcastLayers = 2; // Multiway: Number of temporal layers for each simulcast stream. @@ -135,12 +164,14 @@ return default_num_temporal_layers; } -int FindSimulcastFormatIndex(int width, int height) { +int FindSimulcastFormatIndex(int width, + int height, + bool enable_lowres_bitrate_interpolation) { RTC_DCHECK_GE(width, 0); RTC_DCHECK_GE(height, 0); - for (uint32_t i = 0; i < arraysize(kSimulcastFormats); ++i) { - if (width * height >= - kSimulcastFormats[i].width * kSimulcastFormats[i].height) { + const auto formats = GetSimulcastFormats(enable_lowres_bitrate_interpolation); + for (uint32_t i = 0; i < formats.size(); ++i) { + if (width * height >= formats[i].width * formats[i].height) { return i; } } @@ -162,42 +193,70 @@ return ((size >> base2_exponent) << base2_exponent); } -SimulcastFormat InterpolateSimulcastFormat(int width, int height) { - const int index = FindSimulcastFormatIndex(width, height); +SimulcastFormat InterpolateSimulcastFormat( + int width, + int height, + absl::optional max_roundup_rate, + bool enable_lowres_bitrate_interpolation) { + const auto formats = GetSimulcastFormats(enable_lowres_bitrate_interpolation); + const int index = FindSimulcastFormatIndex( + width, height, enable_lowres_bitrate_interpolation); if (index == 0) - return kSimulcastFormats[index]; + return formats[index]; const int total_pixels_up = - kSimulcastFormats[index - 1].width * kSimulcastFormats[index - 1].height; - const int total_pixels_down = - kSimulcastFormats[index].width * kSimulcastFormats[index].height; + formats[index - 1].width * formats[index - 1].height; + const int total_pixels_down = formats[index].width * formats[index].height; const int total_pixels = width * height; const float rate = (total_pixels_up - total_pixels) / static_cast(total_pixels_up - total_pixels_down); - size_t max_layers = kSimulcastFormats[index].max_layers; - webrtc::DataRate max_bitrate = - Interpolate(kSimulcastFormats[index - 1].max_bitrate, - kSimulcastFormats[index].max_bitrate, rate); - webrtc::DataRate target_bitrate = - Interpolate(kSimulcastFormats[index - 1].target_bitrate, - kSimulcastFormats[index].target_bitrate, rate); - webrtc::DataRate min_bitrate = - Interpolate(kSimulcastFormats[index - 1].min_bitrate, - kSimulcastFormats[index].min_bitrate, rate); + // Use upper resolution if |rate| is below the configured threshold. + size_t max_layers = (rate < max_roundup_rate.value_or(kDefaultMaxRoundupRate)) + ? formats[index - 1].max_layers + : formats[index].max_layers; + webrtc::DataRate max_bitrate = Interpolate(formats[index - 1].max_bitrate, + formats[index].max_bitrate, rate); + webrtc::DataRate target_bitrate = Interpolate( + formats[index - 1].target_bitrate, formats[index].target_bitrate, rate); + webrtc::DataRate min_bitrate = Interpolate(formats[index - 1].min_bitrate, + formats[index].min_bitrate, rate); return {width, height, max_layers, max_bitrate, target_bitrate, min_bitrate}; } -webrtc::DataRate FindSimulcastMaxBitrate(int width, int height) { - return InterpolateSimulcastFormat(width, height).max_bitrate; +SimulcastFormat InterpolateSimulcastFormat( + int width, + int height, + bool enable_lowres_bitrate_interpolation) { + return InterpolateSimulcastFormat(width, height, absl::nullopt, + enable_lowres_bitrate_interpolation); +} + +webrtc::DataRate FindSimulcastMaxBitrate( + int width, + int height, + bool enable_lowres_bitrate_interpolation) { + return InterpolateSimulcastFormat(width, height, + enable_lowres_bitrate_interpolation) + .max_bitrate; } -webrtc::DataRate FindSimulcastTargetBitrate(int width, int height) { - return InterpolateSimulcastFormat(width, height).target_bitrate; +webrtc::DataRate FindSimulcastTargetBitrate( + int width, + int height, + bool enable_lowres_bitrate_interpolation) { + return InterpolateSimulcastFormat(width, height, + enable_lowres_bitrate_interpolation) + .target_bitrate; } -webrtc::DataRate FindSimulcastMinBitrate(int width, int height) { - return InterpolateSimulcastFormat(width, height).min_bitrate; +webrtc::DataRate FindSimulcastMinBitrate( + int width, + int height, + bool enable_lowres_bitrate_interpolation) { + return InterpolateSimulcastFormat(width, height, + enable_lowres_bitrate_interpolation) + .min_bitrate; } void BoostMaxSimulcastLayer(webrtc::DataRate max_bitrate, @@ -235,9 +294,21 @@ const webrtc::WebRtcKeyValueConfig& trials) { if (!absl::StartsWith(trials.Lookup(kUseLegacySimulcastLayerLimitFieldTrial), "Disabled")) { + // Max layers from one higher resolution in kSimulcastFormats will be used + // if the ratio (pixels_up - pixels) / (pixels_up - pixels_down) is less + // than configured |max_ratio|. pixels_down is the selected index in + // kSimulcastFormats based on pixels. + webrtc::FieldTrialOptional max_ratio("max_ratio"); + webrtc::ParseFieldTrial({&max_ratio}, + trials.Lookup("WebRTC-SimulcastLayerLimitRoundUp")); + + const bool enable_lowres_bitrate_interpolation = + EnableLowresBitrateInterpolation(trials); size_t adaptive_layer_count = std::max( need_layers, - kSimulcastFormats[FindSimulcastFormatIndex(width, height)].max_layers); + InterpolateSimulcastFormat(width, height, max_ratio.GetOptional(), + enable_lowres_bitrate_interpolation) + .max_layers); if (layer_count > adaptive_layer_count) { RTC_LOG(LS_WARNING) << "Reducing simulcast layer count from " << layer_count << " to " << adaptive_layer_count; @@ -291,6 +362,9 @@ const webrtc::WebRtcKeyValueConfig& trials) { std::vector layers(layer_count); + const bool enable_lowres_bitrate_interpolation = + EnableLowresBitrateInterpolation(trials); + // Format width and height has to be divisible by |2 ^ num_simulcast_layers - // 1|. width = NormalizeSimulcastSize(width, layer_count); @@ -306,9 +380,14 @@ temporal_layers_supported ? DefaultNumberOfTemporalLayers(s, false, trials) : 1; - layers[s].max_bitrate_bps = FindSimulcastMaxBitrate(width, height).bps(); + layers[s].max_bitrate_bps = + FindSimulcastMaxBitrate(width, height, + enable_lowres_bitrate_interpolation) + .bps(); layers[s].target_bitrate_bps = - FindSimulcastTargetBitrate(width, height).bps(); + FindSimulcastTargetBitrate(width, height, + enable_lowres_bitrate_interpolation) + .bps(); int num_temporal_layers = DefaultNumberOfTemporalLayers(s, false, trials); if (s == 0) { // If alternative temporal rate allocation is selected, adjust the @@ -335,7 +414,17 @@ layers[s].target_bitrate_bps = static_cast(layers[s].target_bitrate_bps * rate_factor); } - layers[s].min_bitrate_bps = FindSimulcastMinBitrate(width, height).bps(); + layers[s].min_bitrate_bps = + FindSimulcastMinBitrate(width, height, + enable_lowres_bitrate_interpolation) + .bps(); + + // Ensure consistency. + layers[s].max_bitrate_bps = + std::max(layers[s].min_bitrate_bps, layers[s].max_bitrate_bps); + layers[s].target_bitrate_bps = + std::max(layers[s].min_bitrate_bps, layers[s].target_bitrate_bps); + layers[s].max_framerate = kDefaultVideoMaxFramerate; width /= 2; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter.cc 2021-06-27 05:27:48.000000000 +0000 @@ -18,6 +18,7 @@ #include #include +#include "absl/algorithm/container.h" #include "api/scoped_refptr.h" #include "api/video/i420_buffer.h" #include "api/video/video_codec_constants.h" @@ -61,25 +62,29 @@ return bitrate_sum; } -int NumberOfStreams(const webrtc::VideoCodec& codec) { - int streams = +int CountAllStreams(const webrtc::VideoCodec& codec) { + int total_streams_count = codec.numberOfSimulcastStreams < 1 ? 1 : codec.numberOfSimulcastStreams; - uint32_t simulcast_max_bitrate = SumStreamMaxBitrate(streams, codec); + uint32_t simulcast_max_bitrate = + SumStreamMaxBitrate(total_streams_count, codec); if (simulcast_max_bitrate == 0) { - streams = 1; + total_streams_count = 1; } - return streams; + return total_streams_count; } -int NumActiveStreams(const webrtc::VideoCodec& codec) { - int num_configured_streams = NumberOfStreams(codec); - int num_active_streams = 0; - for (int i = 0; i < num_configured_streams; ++i) { +int CountActiveStreams(const webrtc::VideoCodec& codec) { + if (codec.numberOfSimulcastStreams < 1) { + return 1; + } + int total_streams_count = CountAllStreams(codec); + int active_streams_count = 0; + for (int i = 0; i < total_streams_count; ++i) { if (codec.simulcastStream[i].active) { - ++num_active_streams; + ++active_streams_count; } } - return num_active_streams; + return active_streams_count; } int VerifyCodec(const webrtc::VideoCodec* inst) { @@ -97,42 +102,146 @@ return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; } if (inst->codecType == webrtc::kVideoCodecVP8 && - inst->VP8().automaticResizeOn && NumActiveStreams(*inst) > 1) { + inst->VP8().automaticResizeOn && CountActiveStreams(*inst) > 1) { return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; } return WEBRTC_VIDEO_CODEC_OK; } -bool StreamResolutionCompare(const webrtc::SpatialLayer& a, - const webrtc::SpatialLayer& b) { +bool StreamQualityCompare(const webrtc::SpatialLayer& a, + const webrtc::SpatialLayer& b) { return std::tie(a.height, a.width, a.maxBitrate, a.maxFramerate) < std::tie(b.height, b.width, b.maxBitrate, b.maxFramerate); } -// An EncodedImageCallback implementation that forwards on calls to a -// SimulcastEncoderAdapter, but with the stream index it's registered with as -// the first parameter to Encoded. -class AdapterEncodedImageCallback : public webrtc::EncodedImageCallback { - public: - AdapterEncodedImageCallback(webrtc::SimulcastEncoderAdapter* adapter, - size_t stream_idx) - : adapter_(adapter), stream_idx_(stream_idx) {} - - EncodedImageCallback::Result OnEncodedImage( - const webrtc::EncodedImage& encoded_image, - const webrtc::CodecSpecificInfo* codec_specific_info) override { - return adapter_->OnEncodedImage(stream_idx_, encoded_image, - codec_specific_info); - } - - private: - webrtc::SimulcastEncoderAdapter* const adapter_; - const size_t stream_idx_; -}; +void GetLowestAndHighestQualityStreamIndixes( + rtc::ArrayView streams, + int* lowest_quality_stream_idx, + int* highest_quality_stream_idx) { + const auto lowest_highest_quality_streams = + absl::c_minmax_element(streams, StreamQualityCompare); + *lowest_quality_stream_idx = + std::distance(streams.begin(), lowest_highest_quality_streams.first); + *highest_quality_stream_idx = + std::distance(streams.begin(), lowest_highest_quality_streams.second); +} + +std::vector GetStreamStartBitratesKbps( + const webrtc::VideoCodec& codec) { + std::vector start_bitrates; + std::unique_ptr rate_allocator = + std::make_unique(codec); + webrtc::VideoBitrateAllocation allocation = + rate_allocator->Allocate(webrtc::VideoBitrateAllocationParameters( + codec.startBitrate * 1000, codec.maxFramerate)); + + int total_streams_count = CountAllStreams(codec); + for (int i = 0; i < total_streams_count; ++i) { + uint32_t stream_bitrate = allocation.GetSpatialLayerSum(i) / 1000; + start_bitrates.push_back(stream_bitrate); + } + return start_bitrates; +} + } // namespace namespace webrtc { +SimulcastEncoderAdapter::EncoderContext::EncoderContext( + std::unique_ptr encoder, + bool prefer_temporal_support) + : encoder_(std::move(encoder)), + prefer_temporal_support_(prefer_temporal_support) {} + +void SimulcastEncoderAdapter::EncoderContext::Release() { + if (encoder_) { + encoder_->RegisterEncodeCompleteCallback(nullptr); + encoder_->Release(); + } +} + +SimulcastEncoderAdapter::StreamContext::StreamContext( + SimulcastEncoderAdapter* parent, + std::unique_ptr encoder_context, + std::unique_ptr framerate_controller, + int stream_idx, + uint16_t width, + uint16_t height, + bool is_paused) + : parent_(parent), + encoder_context_(std::move(encoder_context)), + framerate_controller_(std::move(framerate_controller)), + stream_idx_(stream_idx), + width_(width), + height_(height), + is_keyframe_needed_(false), + is_paused_(is_paused) { + if (parent_) { + encoder_context_->encoder().RegisterEncodeCompleteCallback(this); + } +} + +SimulcastEncoderAdapter::StreamContext::StreamContext(StreamContext&& rhs) + : parent_(rhs.parent_), + encoder_context_(std::move(rhs.encoder_context_)), + framerate_controller_(std::move(rhs.framerate_controller_)), + stream_idx_(rhs.stream_idx_), + width_(rhs.width_), + height_(rhs.height_), + is_keyframe_needed_(rhs.is_keyframe_needed_), + is_paused_(rhs.is_paused_) { + if (parent_) { + encoder_context_->encoder().RegisterEncodeCompleteCallback(this); + } +} + +SimulcastEncoderAdapter::StreamContext::~StreamContext() { + if (encoder_context_) { + encoder_context_->Release(); + } +} + +std::unique_ptr +SimulcastEncoderAdapter::StreamContext::ReleaseEncoderContext() && { + encoder_context_->Release(); + return std::move(encoder_context_); +} + +void SimulcastEncoderAdapter::StreamContext::OnKeyframe(Timestamp timestamp) { + is_keyframe_needed_ = false; + if (framerate_controller_) { + framerate_controller_->AddFrame(timestamp.ms()); + } +} + +bool SimulcastEncoderAdapter::StreamContext::ShouldDropFrame( + Timestamp timestamp) { + if (!framerate_controller_) { + return false; + } + + if (framerate_controller_->DropFrame(timestamp.ms())) { + return true; + } + framerate_controller_->AddFrame(timestamp.ms()); + return false; +} + +EncodedImageCallback::Result +SimulcastEncoderAdapter::StreamContext::OnEncodedImage( + const EncodedImage& encoded_image, + const CodecSpecificInfo* codec_specific_info) { + RTC_CHECK(parent_); // If null, this method should never be called. + return parent_->OnEncodedImage(stream_idx_, encoded_image, + codec_specific_info); +} + +void SimulcastEncoderAdapter::StreamContext::OnDroppedFrame( + DropReason /*reason*/) { + RTC_CHECK(parent_); // If null, this method should never be called. + parent_->OnDroppedFrame(stream_idx_); +} + SimulcastEncoderAdapter::SimulcastEncoderAdapter(VideoEncoderFactory* factory, const SdpVideoFormat& format) : SimulcastEncoderAdapter(factory, nullptr, format) {} @@ -145,6 +254,8 @@ primary_encoder_factory_(primary_factory), fallback_encoder_factory_(fallback_factory), video_format_(format), + total_streams_count_(0), + bypass_mode_(false), encoded_complete_callback_(nullptr), experimental_boosted_screenshare_qp_(GetScreenshareBoostedQpValue()), boost_base_layer_quality_(RateControlSettings::ParseFromFieldTrials() @@ -164,25 +275,23 @@ } void SimulcastEncoderAdapter::SetFecControllerOverride( - FecControllerOverride* fec_controller_override) { + FecControllerOverride* /*fec_controller_override*/) { // Ignored. } int SimulcastEncoderAdapter::Release() { RTC_DCHECK_RUN_ON(&encoder_queue_); - while (!streaminfos_.empty()) { - std::unique_ptr encoder = - std::move(streaminfos_.back().encoder); - // Even though it seems very unlikely, there are no guarantees that the - // encoder will not call back after being Release()'d. Therefore, we first - // disable the callbacks here. - encoder->RegisterEncodeCompleteCallback(nullptr); - encoder->Release(); - streaminfos_.pop_back(); // Deletes callback adapter. - stored_encoders_.push(std::move(encoder)); + while (!stream_contexts_.empty()) { + // Move the encoder instances and put it on the |cached_encoder_contexts_| + // where it may possibly be reused from (ordering does not matter). + cached_encoder_contexts_.push_front( + std::move(stream_contexts_.back()).ReleaseEncoderContext()); + stream_contexts_.pop_back(); } + bypass_mode_ = false; + // It's legal to move the encoder to another queue now. encoder_queue_.Detach(); @@ -191,7 +300,6 @@ return WEBRTC_VIDEO_CODEC_OK; } -// TODO(eladalon): s/inst/codec_settings/g. int SimulcastEncoderAdapter::InitEncode( const VideoCodec* inst, const VideoEncoder::Settings& settings) { @@ -206,136 +314,114 @@ return ret; } - ret = Release(); - if (ret < 0) { - return ret; - } - - int number_of_streams = NumberOfStreams(*inst); - RTC_DCHECK_LE(number_of_streams, kMaxSimulcastStreams); - bool doing_simulcast_using_adapter = (number_of_streams > 1); - int num_active_streams = NumActiveStreams(*inst); + Release(); codec_ = *inst; - SimulcastRateAllocator rate_allocator(codec_); - VideoBitrateAllocation allocation = - rate_allocator.Allocate(VideoBitrateAllocationParameters( - codec_.startBitrate * 1000, codec_.maxFramerate)); - std::vector start_bitrates; - for (int i = 0; i < kMaxSimulcastStreams; ++i) { - uint32_t stream_bitrate = allocation.GetSpatialLayerSum(i) / 1000; - start_bitrates.push_back(stream_bitrate); - } - - // Create |number_of_streams| of encoder instances and init them. - const auto minmax = std::minmax_element( - std::begin(codec_.simulcastStream), - std::begin(codec_.simulcastStream) + number_of_streams, - StreamResolutionCompare); - const auto lowest_resolution_stream_index = - std::distance(std::begin(codec_.simulcastStream), minmax.first); - const auto highest_resolution_stream_index = - std::distance(std::begin(codec_.simulcastStream), minmax.second); - - RTC_DCHECK_LT(lowest_resolution_stream_index, number_of_streams); - RTC_DCHECK_LT(highest_resolution_stream_index, number_of_streams); - - for (int i = 0; i < number_of_streams; ++i) { - // If an existing encoder instance exists, reuse it. - // TODO(brandtr): Set initial RTP state (e.g., picture_id/tl0_pic_idx) here, - // when we start storing that state outside the encoder wrappers. - std::unique_ptr encoder; - if (!stored_encoders_.empty()) { - encoder = std::move(stored_encoders_.top()); - stored_encoders_.pop(); - } else { - encoder = primary_encoder_factory_->CreateVideoEncoder(video_format_); - if (fallback_encoder_factory_ != nullptr) { - encoder = CreateVideoEncoderSoftwareFallbackWrapper( - fallback_encoder_factory_->CreateVideoEncoder(video_format_), - std::move(encoder), - i == lowest_resolution_stream_index && - prefer_temporal_support_on_base_layer_); - } - } + total_streams_count_ = CountAllStreams(*inst); - bool encoder_initialized = false; - if (doing_simulcast_using_adapter && i == 0 && - encoder->GetEncoderInfo().supports_simulcast) { - ret = encoder->InitEncode(&codec_, settings); - if (ret < 0) { - encoder->Release(); - } else { - doing_simulcast_using_adapter = false; - number_of_streams = 1; - encoder_initialized = true; - } - } + // TODO(ronghuawu): Remove once this is handled in LibvpxVp8Encoder. + if (codec_.qpMax < kDefaultMinQp) { + codec_.qpMax = kDefaultMaxQp; + } + + bool is_legacy_singlecast = codec_.numberOfSimulcastStreams == 0; + int lowest_quality_stream_idx = 0; + int highest_quality_stream_idx = 0; + if (!is_legacy_singlecast) { + GetLowestAndHighestQualityStreamIndixes( + rtc::ArrayView(codec_.simulcastStream, + total_streams_count_), + &lowest_quality_stream_idx, &highest_quality_stream_idx); + } + + std::unique_ptr encoder_context = FetchOrCreateEncoderContext( + /*is_lowest_quality_stream=*/( + is_legacy_singlecast || + codec_.simulcastStream[lowest_quality_stream_idx].active)); + if (encoder_context == nullptr) { + return WEBRTC_VIDEO_CODEC_MEMORY; + } + + // Two distinct scenarios: + // * Singlecast (total_streams_count == 1) or simulcast with simulcast-capable + // underlaying encoder implementation. SEA operates in bypass mode: original + // settings are passed to the underlaying encoder, frame encode complete + // callback is not intercepted. + // * Multi-encoder simulcast or singlecast if layers are deactivated + // (total_streams_count > 1 and active_streams_count >= 1). SEA creates + // N=active_streams_count encoders and configures each to produce a single + // stream. + + // Singlecast or simulcast with simulcast-capable underlaying encoder. + if (total_streams_count_ == 1 || + encoder_context->encoder().GetEncoderInfo().supports_simulcast) { + int ret = encoder_context->encoder().InitEncode(&codec_, settings); + if (ret >= 0) { + int active_streams_count = CountActiveStreams(*inst); + stream_contexts_.emplace_back( + /*parent=*/nullptr, std::move(encoder_context), + /*framerate_controller=*/nullptr, /*stream_idx=*/0, codec_.width, + codec_.height, /*is_paused=*/active_streams_count == 0); + bypass_mode_ = true; + + DestroyStoredEncoders(); + rtc::AtomicOps::ReleaseStore(&inited_, 1); + return WEBRTC_VIDEO_CODEC_OK; + } + + encoder_context->Release(); + if (total_streams_count_ == 1) { + // Failed to initialize singlecast encoder. + return ret; + } + } + + // Multi-encoder simulcast or singlecast (deactivated layers). + std::vector stream_start_bitrate_kbps = + GetStreamStartBitratesKbps(codec_); - VideoCodec stream_codec; - uint32_t start_bitrate_kbps = start_bitrates[i]; - const bool send_stream = doing_simulcast_using_adapter - ? start_bitrate_kbps > 0 - : num_active_streams > 0; - if (!doing_simulcast_using_adapter) { - stream_codec = codec_; - stream_codec.numberOfSimulcastStreams = - std::max(1, stream_codec.numberOfSimulcastStreams); - } else { - // Cap start bitrate to the min bitrate in order to avoid strange codec - // behavior. Since sending will be false, this should not matter. - StreamResolution stream_resolution = - i == highest_resolution_stream_index - ? StreamResolution::HIGHEST - : i == lowest_resolution_stream_index ? StreamResolution::LOWEST - : StreamResolution::OTHER; - - start_bitrate_kbps = - std::max(codec_.simulcastStream[i].minBitrate, start_bitrate_kbps); - PopulateStreamCodec(codec_, i, start_bitrate_kbps, stream_resolution, - &stream_codec); - } - - // TODO(ronghuawu): Remove once this is handled in LibvpxVp8Encoder. - if (stream_codec.qpMax < kDefaultMinQp) { - stream_codec.qpMax = kDefaultMaxQp; - } - - if (!encoder_initialized) { - ret = encoder->InitEncode(&stream_codec, settings); - if (ret < 0) { - // Explicitly destroy the current encoder; because we haven't registered - // a StreamInfo for it yet, Release won't do anything about it. - encoder.reset(); - Release(); - return ret; - } + for (int stream_idx = 0; stream_idx < total_streams_count_; ++stream_idx) { + if (!is_legacy_singlecast && !codec_.simulcastStream[stream_idx].active) { + continue; } - if (!doing_simulcast_using_adapter) { - // Without simulcast, just pass through the encoder info from the one - // active encoder. - encoder->RegisterEncodeCompleteCallback(encoded_complete_callback_); - streaminfos_.emplace_back( - std::move(encoder), nullptr, - std::make_unique(stream_codec.maxFramerate), - stream_codec.width, stream_codec.height, send_stream); - } else { - std::unique_ptr callback( - new AdapterEncodedImageCallback(this, i)); - encoder->RegisterEncodeCompleteCallback(callback.get()); - streaminfos_.emplace_back( - std::move(encoder), std::move(callback), - std::make_unique(stream_codec.maxFramerate), - stream_codec.width, stream_codec.height, send_stream); - } + if (encoder_context == nullptr) { + encoder_context = FetchOrCreateEncoderContext( + /*is_lowest_quality_stream=*/stream_idx == lowest_quality_stream_idx); + } + if (encoder_context == nullptr) { + Release(); + return WEBRTC_VIDEO_CODEC_MEMORY; + } + + VideoCodec stream_codec = MakeStreamCodec( + codec_, stream_idx, stream_start_bitrate_kbps[stream_idx], + /*is_lowest_quality_stream=*/stream_idx == lowest_quality_stream_idx, + /*is_highest_quality_stream=*/stream_idx == highest_quality_stream_idx); + + int ret = encoder_context->encoder().InitEncode(&stream_codec, settings); + if (ret < 0) { + encoder_context.reset(); + Release(); + return ret; + } + + // Intercept frame encode complete callback only for upper streams, where + // we need to set a correct stream index. Set |parent| to nullptr for the + // lowest stream to bypass the callback. + SimulcastEncoderAdapter* parent = stream_idx > 0 ? this : nullptr; + + bool is_paused = stream_start_bitrate_kbps[stream_idx] == 0; + stream_contexts_.emplace_back( + parent, std::move(encoder_context), + std::make_unique(stream_codec.maxFramerate), + stream_idx, stream_codec.width, stream_codec.height, is_paused); } // To save memory, don't store encoders that we don't use. DestroyStoredEncoders(); rtc::AtomicOps::ReleaseStore(&inited_, 1); - return WEBRTC_VIDEO_CODEC_OK; } @@ -351,22 +437,46 @@ return WEBRTC_VIDEO_CODEC_UNINITIALIZED; } + if (encoder_info_override_.requested_resolution_alignment()) { + const int alignment = + *encoder_info_override_.requested_resolution_alignment(); + if (input_image.width() % alignment != 0 || + input_image.height() % alignment != 0) { + RTC_LOG(LS_WARNING) << "Frame " << input_image.width() << "x" + << input_image.height() << " not divisible by " + << alignment; + return WEBRTC_VIDEO_CODEC_ERROR; + } + if (encoder_info_override_.apply_alignment_to_all_simulcast_layers()) { + for (const auto& layer : stream_contexts_) { + if (layer.width() % alignment != 0 || layer.height() % alignment != 0) { + RTC_LOG(LS_WARNING) + << "Codec " << layer.width() << "x" << layer.height() + << " not divisible by " << alignment; + return WEBRTC_VIDEO_CODEC_ERROR; + } + } + } + } + // All active streams should generate a key frame if // a key frame is requested by any stream. - bool send_key_frame = false; + bool is_keyframe_needed = false; if (frame_types) { - for (size_t i = 0; i < frame_types->size(); ++i) { - if (frame_types->at(i) == VideoFrameType::kVideoFrameKey) { - send_key_frame = true; + for (const auto& frame_type : *frame_types) { + if (frame_type == VideoFrameType::kVideoFrameKey) { + is_keyframe_needed = true; break; } } } - for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) { - if (streaminfos_[stream_idx].key_frame_request && - streaminfos_[stream_idx].send_stream) { - send_key_frame = true; - break; + + if (!is_keyframe_needed) { + for (const auto& layer : stream_contexts_) { + if (layer.is_keyframe_needed()) { + is_keyframe_needed = true; + break; + } } } @@ -374,36 +484,34 @@ rtc::scoped_refptr src_buffer; int src_width = input_image.width(); int src_height = input_image.height(); - for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) { + + for (auto& layer : stream_contexts_) { // Don't encode frames in resolutions that we don't intend to send. - if (!streaminfos_[stream_idx].send_stream) { + if (layer.is_paused()) { continue; } - const uint32_t frame_timestamp_ms = - 1000 * input_image.timestamp() / 90000; // kVideoPayloadTypeFrequency; + // Convert timestamp from RTP 90kHz clock. + const Timestamp frame_timestamp = + Timestamp::Micros((1000 * input_image.timestamp()) / 90); // If adapter is passed through and only one sw encoder does simulcast, // frame types for all streams should be passed to the encoder unchanged. // Otherwise a single per-encoder frame type is passed. std::vector stream_frame_types( - streaminfos_.size() == 1 ? NumberOfStreams(codec_) : 1); - if (send_key_frame) { + bypass_mode_ ? total_streams_count_ : 1); + if (is_keyframe_needed) { std::fill(stream_frame_types.begin(), stream_frame_types.end(), VideoFrameType::kVideoFrameKey); - streaminfos_[stream_idx].key_frame_request = false; + layer.OnKeyframe(frame_timestamp); } else { - if (streaminfos_[stream_idx].framerate_controller->DropFrame( - frame_timestamp_ms)) { + if (layer.ShouldDropFrame(frame_timestamp)) { continue; } std::fill(stream_frame_types.begin(), stream_frame_types.end(), VideoFrameType::kVideoFrameDelta); } - streaminfos_[stream_idx].framerate_controller->AddFrame(frame_timestamp_ms); - int dst_width = streaminfos_[stream_idx].width; - int dst_height = streaminfos_[stream_idx].height; // If scaling isn't required, because the input resolution // matches the destination or the input image is empty (e.g. // a keyframe request for encoders with internal camera @@ -414,14 +522,11 @@ // correctly sample/scale the source texture. // TODO(perkj): ensure that works going forward, and figure out how this // affects webrtc:5683. - if ((dst_width == src_width && dst_height == src_height) || + if ((layer.width() == src_width && layer.height() == src_height) || (input_image.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative && - streaminfos_[stream_idx] - .encoder->GetEncoderInfo() - .supports_native_handle)) { - int ret = streaminfos_[stream_idx].encoder->Encode(input_image, - &stream_frame_types); + layer.encoder().GetEncoderInfo().supports_native_handle)) { + int ret = layer.encoder().Encode(input_image, &stream_frame_types); if (ret != WEBRTC_VIDEO_CODEC_OK) { return ret; } @@ -430,7 +535,7 @@ src_buffer = input_image.video_frame_buffer(); } rtc::scoped_refptr dst_buffer = - src_buffer->Scale(dst_width, dst_height); + src_buffer->Scale(layer.width(), layer.height()); if (!dst_buffer) { RTC_LOG(LS_ERROR) << "Failed to scale video frame"; return WEBRTC_VIDEO_CODEC_ENCODER_FAILURE; @@ -443,8 +548,7 @@ frame.set_rotation(webrtc::kVideoRotation_0); frame.set_update_rect( VideoFrame::UpdateRect{0, 0, frame.width(), frame.height()}); - int ret = - streaminfos_[stream_idx].encoder->Encode(frame, &stream_frame_types); + int ret = layer.encoder().Encode(frame, &stream_frame_types); if (ret != WEBRTC_VIDEO_CODEC_OK) { return ret; } @@ -458,8 +562,10 @@ EncodedImageCallback* callback) { RTC_DCHECK_RUN_ON(&encoder_queue_); encoded_complete_callback_ = callback; - if (streaminfos_.size() == 1) { - streaminfos_[0].encoder->RegisterEncodeCompleteCallback(callback); + if (!stream_contexts_.empty() && stream_contexts_.front().stream_idx() == 0) { + // Bypass frame encode complete callback for the lowest layer since there is + // no need to override frame's spatial index. + stream_contexts_.front().encoder().RegisterEncodeCompleteCallback(callback); } return WEBRTC_VIDEO_CODEC_OK; } @@ -480,21 +586,21 @@ codec_.maxFramerate = static_cast(parameters.framerate_fps + 0.5); - if (streaminfos_.size() == 1) { - // Not doing simulcast. - streaminfos_[0].encoder->SetRates(parameters); + if (bypass_mode_) { + stream_contexts_.front().encoder().SetRates(parameters); return; } - for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) { + for (StreamContext& layer_context : stream_contexts_) { + int stream_idx = layer_context.stream_idx(); uint32_t stream_bitrate_kbps = parameters.bitrate.GetSpatialLayerSum(stream_idx) / 1000; // Need a key frame if we have not sent this stream before. - if (stream_bitrate_kbps > 0 && !streaminfos_[stream_idx].send_stream) { - streaminfos_[stream_idx].key_frame_request = true; + if (stream_bitrate_kbps > 0 && layer_context.is_paused()) { + layer_context.set_is_keyframe_needed(); } - streaminfos_[stream_idx].send_stream = stream_bitrate_kbps > 0; + layer_context.set_is_paused(stream_bitrate_kbps == 0); // Slice the temporal layers out of the full allocation and pass it on to // the encoder handling the current simulcast stream. @@ -524,28 +630,28 @@ stream_parameters.framerate_fps = std::min( parameters.framerate_fps, - streaminfos_[stream_idx].framerate_controller->GetTargetRate()); + layer_context.target_fps().value_or(parameters.framerate_fps)); - streaminfos_[stream_idx].encoder->SetRates(stream_parameters); + layer_context.encoder().SetRates(stream_parameters); } } void SimulcastEncoderAdapter::OnPacketLossRateUpdate(float packet_loss_rate) { - for (StreamInfo& info : streaminfos_) { - info.encoder->OnPacketLossRateUpdate(packet_loss_rate); + for (auto& c : stream_contexts_) { + c.encoder().OnPacketLossRateUpdate(packet_loss_rate); } } void SimulcastEncoderAdapter::OnRttUpdate(int64_t rtt_ms) { - for (StreamInfo& info : streaminfos_) { - info.encoder->OnRttUpdate(rtt_ms); + for (auto& c : stream_contexts_) { + c.encoder().OnRttUpdate(rtt_ms); } } void SimulcastEncoderAdapter::OnLossNotification( const LossNotification& loss_notification) { - for (StreamInfo& info : streaminfos_) { - info.encoder->OnLossNotification(loss_notification); + for (auto& c : stream_contexts_) { + c.encoder().OnLossNotification(loss_notification); } } @@ -564,75 +670,139 @@ &stream_codec_specific); } -void SimulcastEncoderAdapter::PopulateStreamCodec( - const webrtc::VideoCodec& inst, - int stream_index, +void SimulcastEncoderAdapter::OnDroppedFrame(size_t stream_idx) { + // Not yet implemented. +} + +bool SimulcastEncoderAdapter::Initialized() const { + return rtc::AtomicOps::AcquireLoad(&inited_) == 1; +} + +void SimulcastEncoderAdapter::DestroyStoredEncoders() { + while (!cached_encoder_contexts_.empty()) { + cached_encoder_contexts_.pop_back(); + } +} + +std::unique_ptr +SimulcastEncoderAdapter::FetchOrCreateEncoderContext( + bool is_lowest_quality_stream) { + bool prefer_temporal_support = fallback_encoder_factory_ != nullptr && + is_lowest_quality_stream && + prefer_temporal_support_on_base_layer_; + + // Toggling of |prefer_temporal_support| requires encoder recreation. Find + // and reuse encoder with desired |prefer_temporal_support|. Otherwise, if + // there is no such encoder in the cache, create a new instance. + auto encoder_context_iter = + std::find_if(cached_encoder_contexts_.begin(), + cached_encoder_contexts_.end(), [&](auto& encoder_context) { + return encoder_context->prefer_temporal_support() == + prefer_temporal_support; + }); + + std::unique_ptr encoder_context; + if (encoder_context_iter != cached_encoder_contexts_.end()) { + encoder_context = std::move(*encoder_context_iter); + cached_encoder_contexts_.erase(encoder_context_iter); + } else { + std::unique_ptr encoder = + primary_encoder_factory_->CreateVideoEncoder(video_format_); + if (fallback_encoder_factory_ != nullptr) { + encoder = CreateVideoEncoderSoftwareFallbackWrapper( + fallback_encoder_factory_->CreateVideoEncoder(video_format_), + std::move(encoder), prefer_temporal_support); + } + + encoder_context = std::make_unique( + std::move(encoder), prefer_temporal_support); + } + + encoder_context->encoder().RegisterEncodeCompleteCallback( + encoded_complete_callback_); + return encoder_context; +} + +webrtc::VideoCodec SimulcastEncoderAdapter::MakeStreamCodec( + const webrtc::VideoCodec& codec, + int stream_idx, uint32_t start_bitrate_kbps, - StreamResolution stream_resolution, - webrtc::VideoCodec* stream_codec) { - *stream_codec = inst; - - // Stream specific settings. - stream_codec->numberOfSimulcastStreams = 0; - stream_codec->width = inst.simulcastStream[stream_index].width; - stream_codec->height = inst.simulcastStream[stream_index].height; - stream_codec->maxBitrate = inst.simulcastStream[stream_index].maxBitrate; - stream_codec->minBitrate = inst.simulcastStream[stream_index].minBitrate; - stream_codec->maxFramerate = inst.simulcastStream[stream_index].maxFramerate; - stream_codec->qpMax = inst.simulcastStream[stream_index].qpMax; - stream_codec->active = inst.simulcastStream[stream_index].active; + bool is_lowest_quality_stream, + bool is_highest_quality_stream) { + webrtc::VideoCodec codec_params = codec; + const SpatialLayer& stream_params = codec.simulcastStream[stream_idx]; + + codec_params.numberOfSimulcastStreams = 0; + codec_params.width = stream_params.width; + codec_params.height = stream_params.height; + codec_params.maxBitrate = stream_params.maxBitrate; + codec_params.minBitrate = stream_params.minBitrate; + codec_params.maxFramerate = stream_params.maxFramerate; + codec_params.qpMax = stream_params.qpMax; + codec_params.active = stream_params.active; // Settings that are based on stream/resolution. - if (stream_resolution == StreamResolution::LOWEST) { + if (is_lowest_quality_stream) { // Settings for lowest spatial resolutions. - if (inst.mode == VideoCodecMode::kScreensharing) { + if (codec.mode == VideoCodecMode::kScreensharing) { if (experimental_boosted_screenshare_qp_) { - stream_codec->qpMax = *experimental_boosted_screenshare_qp_; + codec_params.qpMax = *experimental_boosted_screenshare_qp_; } } else if (boost_base_layer_quality_) { - stream_codec->qpMax = kLowestResMaxQp; + codec_params.qpMax = kLowestResMaxQp; } } - if (inst.codecType == webrtc::kVideoCodecVP8) { - stream_codec->VP8()->numberOfTemporalLayers = - inst.simulcastStream[stream_index].numberOfTemporalLayers; - if (stream_resolution != StreamResolution::HIGHEST) { + if (codec.codecType == webrtc::kVideoCodecVP8) { + codec_params.VP8()->numberOfTemporalLayers = + stream_params.numberOfTemporalLayers; + if (!is_highest_quality_stream) { // For resolutions below CIF, set the codec |complexity| parameter to // kComplexityHigher, which maps to cpu_used = -4. - int pixels_per_frame = stream_codec->width * stream_codec->height; + int pixels_per_frame = codec_params.width * codec_params.height; if (pixels_per_frame < 352 * 288) { - stream_codec->VP8()->complexity = + codec_params.VP8()->complexity = webrtc::VideoCodecComplexity::kComplexityHigher; } // Turn off denoising for all streams but the highest resolution. - stream_codec->VP8()->denoisingOn = false; + codec_params.VP8()->denoisingOn = false; } - } else if (inst.codecType == webrtc::kVideoCodecH264) { - stream_codec->H264()->numberOfTemporalLayers = - inst.simulcastStream[stream_index].numberOfTemporalLayers; + } else if (codec.codecType == webrtc::kVideoCodecH264) { + codec_params.H264()->numberOfTemporalLayers = + stream_params.numberOfTemporalLayers; } - // TODO(ronghuawu): what to do with targetBitrate. - stream_codec->startBitrate = start_bitrate_kbps; + // Cap start bitrate to the min bitrate in order to avoid strange codec + // behavior. + codec_params.startBitrate = + std::max(stream_params.minBitrate, start_bitrate_kbps); // Legacy screenshare mode is only enabled for the first simulcast layer - stream_codec->legacy_conference_mode = - inst.legacy_conference_mode && stream_index == 0; -} + codec_params.legacy_conference_mode = + codec.legacy_conference_mode && stream_idx == 0; -bool SimulcastEncoderAdapter::Initialized() const { - return rtc::AtomicOps::AcquireLoad(&inited_) == 1; + return codec_params; } -void SimulcastEncoderAdapter::DestroyStoredEncoders() { - while (!stored_encoders_.empty()) { - stored_encoders_.pop(); +void SimulcastEncoderAdapter::OverrideFromFieldTrial( + VideoEncoder::EncoderInfo* info) const { + if (encoder_info_override_.requested_resolution_alignment()) { + info->requested_resolution_alignment = + *encoder_info_override_.requested_resolution_alignment(); + info->apply_alignment_to_all_simulcast_layers = + encoder_info_override_.apply_alignment_to_all_simulcast_layers(); + } + if (!encoder_info_override_.resolution_bitrate_limits().empty()) { + info->resolution_bitrate_limits = + encoder_info_override_.resolution_bitrate_limits(); } } VideoEncoder::EncoderInfo SimulcastEncoderAdapter::GetEncoderInfo() const { - if (streaminfos_.size() == 1) { + if (stream_contexts_.size() == 1) { // Not using simulcast adapting functionality, just pass through. - return streaminfos_[0].encoder->GetEncoderInfo(); + VideoEncoder::EncoderInfo info = + stream_contexts_.front().encoder().GetEncoderInfo(); + OverrideFromFieldTrial(&info); + return info; } VideoEncoder::EncoderInfo encoder_info; @@ -641,16 +811,16 @@ encoder_info.apply_alignment_to_all_simulcast_layers = false; encoder_info.supports_native_handle = true; encoder_info.scaling_settings.thresholds = absl::nullopt; - if (streaminfos_.empty()) { + if (stream_contexts_.empty()) { + OverrideFromFieldTrial(&encoder_info); return encoder_info; } encoder_info.scaling_settings = VideoEncoder::ScalingSettings::kOff; - int num_active_streams = NumActiveStreams(codec_); - for (size_t i = 0; i < streaminfos_.size(); ++i) { + for (size_t i = 0; i < stream_contexts_.size(); ++i) { VideoEncoder::EncoderInfo encoder_impl_info = - streaminfos_[i].encoder->GetEncoderInfo(); + stream_contexts_[i].encoder().GetEncoderInfo(); if (i == 0) { // Encoder name indicates names of all sub-encoders. @@ -693,12 +863,11 @@ if (encoder_impl_info.apply_alignment_to_all_simulcast_layers) { encoder_info.apply_alignment_to_all_simulcast_layers = true; } - if (num_active_streams == 1 && codec_.simulcastStream[i].active) { - encoder_info.scaling_settings = encoder_impl_info.scaling_settings; - } } encoder_info.implementation_name += ")"; + OverrideFromFieldTrial(&encoder_info); + return encoder_info; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter.h 2021-06-27 05:27:48.000000000 +0000 @@ -12,6 +12,7 @@ #ifndef MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_ #define MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_ +#include #include #include #include @@ -20,20 +21,19 @@ #include "absl/types/optional.h" #include "api/fec_controller_override.h" +#include "api/sequence_checker.h" #include "api/video_codecs/sdp_video_format.h" #include "api/video_codecs/video_encoder.h" +#include "api/video_codecs/video_encoder_factory.h" #include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/utility/framerate_controller.h" #include "rtc_base/atomic_ops.h" -#include "rtc_base/synchronization/sequence_checker.h" +#include "rtc_base/experiments/encoder_info_settings.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { -class SimulcastRateAllocator; -class VideoEncoderFactory; - // SimulcastEncoderAdapter implements simulcast support by creating multiple // webrtc::VideoEncoder instances with the given VideoEncoderFactory. // The object is created and destroyed on the worker thread, but all public @@ -65,63 +65,105 @@ void OnRttUpdate(int64_t rtt_ms) override; void OnLossNotification(const LossNotification& loss_notification) override; - // Eventual handler for the contained encoders' EncodedImageCallbacks, but - // called from an internal helper that also knows the correct stream - // index. - EncodedImageCallback::Result OnEncodedImage( - size_t stream_idx, - const EncodedImage& encoded_image, - const CodecSpecificInfo* codec_specific_info); - EncoderInfo GetEncoderInfo() const override; private: - struct StreamInfo { - StreamInfo(std::unique_ptr encoder, - std::unique_ptr callback, - std::unique_ptr framerate_controller, - uint16_t width, - uint16_t height, - bool send_stream) - : encoder(std::move(encoder)), - callback(std::move(callback)), - framerate_controller(std::move(framerate_controller)), - width(width), - height(height), - key_frame_request(false), - send_stream(send_stream) {} - std::unique_ptr encoder; - std::unique_ptr callback; - std::unique_ptr framerate_controller; - uint16_t width; - uint16_t height; - bool key_frame_request; - bool send_stream; + class EncoderContext { + public: + EncoderContext(std::unique_ptr encoder, + bool prefer_temporal_support); + EncoderContext& operator=(EncoderContext&&) = delete; + + VideoEncoder& encoder() { return *encoder_; } + bool prefer_temporal_support() { return prefer_temporal_support_; } + void Release(); + + private: + std::unique_ptr encoder_; + bool prefer_temporal_support_; }; - enum class StreamResolution { - OTHER, - HIGHEST, - LOWEST, + class StreamContext : public EncodedImageCallback { + public: + StreamContext(SimulcastEncoderAdapter* parent, + std::unique_ptr encoder_context, + std::unique_ptr framerate_controller, + int stream_idx, + uint16_t width, + uint16_t height, + bool send_stream); + StreamContext(StreamContext&& rhs); + StreamContext& operator=(StreamContext&&) = delete; + ~StreamContext() override; + + Result OnEncodedImage( + const EncodedImage& encoded_image, + const CodecSpecificInfo* codec_specific_info) override; + void OnDroppedFrame(DropReason reason) override; + + VideoEncoder& encoder() { return encoder_context_->encoder(); } + const VideoEncoder& encoder() const { return encoder_context_->encoder(); } + int stream_idx() const { return stream_idx_; } + uint16_t width() const { return width_; } + uint16_t height() const { return height_; } + bool is_keyframe_needed() const { + return !is_paused_ && is_keyframe_needed_; + } + void set_is_keyframe_needed() { is_keyframe_needed_ = true; } + bool is_paused() const { return is_paused_; } + void set_is_paused(bool is_paused) { is_paused_ = is_paused; } + absl::optional target_fps() const { + return framerate_controller_ == nullptr + ? absl::nullopt + : absl::optional( + framerate_controller_->GetTargetRate()); + } + + std::unique_ptr ReleaseEncoderContext() &&; + void OnKeyframe(Timestamp timestamp); + bool ShouldDropFrame(Timestamp timestamp); + + private: + SimulcastEncoderAdapter* const parent_; + std::unique_ptr encoder_context_; + std::unique_ptr framerate_controller_; + const int stream_idx_; + const uint16_t width_; + const uint16_t height_; + bool is_keyframe_needed_; + bool is_paused_; }; - // Populate the codec settings for each simulcast stream. - void PopulateStreamCodec(const webrtc::VideoCodec& inst, - int stream_index, - uint32_t start_bitrate_kbps, - StreamResolution stream_resolution, - webrtc::VideoCodec* stream_codec); - bool Initialized() const; void DestroyStoredEncoders(); + std::unique_ptr FetchOrCreateEncoderContext( + bool is_lowest_quality_stream); + + webrtc::VideoCodec MakeStreamCodec(const webrtc::VideoCodec& codec, + int stream_idx, + uint32_t start_bitrate_kbps, + bool is_lowest_quality_stream, + bool is_highest_quality_stream); + + EncodedImageCallback::Result OnEncodedImage( + size_t stream_idx, + const EncodedImage& encoded_image, + const CodecSpecificInfo* codec_specific_info); + + void OnDroppedFrame(size_t stream_idx); + + void OverrideFromFieldTrial(VideoEncoder::EncoderInfo* info) const; + volatile int inited_; // Accessed atomically. VideoEncoderFactory* const primary_encoder_factory_; VideoEncoderFactory* const fallback_encoder_factory_; const SdpVideoFormat video_format_; VideoCodec codec_; - std::vector streaminfos_; + int total_streams_count_; + bool bypass_mode_; + std::vector stream_contexts_; EncodedImageCallback* encoded_complete_callback_; // Used for checking the single-threaded access of the encoder interface. @@ -129,11 +171,13 @@ // Store encoders in between calls to Release and InitEncode, so they don't // have to be recreated. Remaining encoders are destroyed by the destructor. - std::stack> stored_encoders_; + std::list> cached_encoder_contexts_; const absl::optional experimental_boosted_screenshare_qp_; const bool boost_base_layer_quality_; const bool prefer_temporal_support_on_base_layer_; + + const SimulcastEncoderAdapterEncoderInfoSettings encoder_info_override_; }; } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_encoder_adapter_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_encoder_adapter_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -18,6 +18,7 @@ #include "api/test/simulcast_test_fixture.h" #include "api/test/video/function_video_decoder_factory.h" #include "api/test/video/function_video_encoder_factory.h" +#include "api/video/video_codec_constants.h" #include "api/video_codecs/sdp_video_format.h" #include "api/video_codecs/video_encoder.h" #include "api/video_codecs/video_encoder_factory.h" @@ -28,6 +29,7 @@ #include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/utility/simulcast_test_fixture_impl.h" #include "rtc_base/checks.h" +#include "test/field_trial.h" #include "test/gmock.h" #include "test/gtest.h" @@ -420,14 +422,24 @@ } void SetUp() override { - helper_ = std::make_unique( - use_fallback_factory_, SdpVideoFormat("VP8", sdp_video_parameters_)); + helper_.reset(new TestSimulcastEncoderAdapterFakeHelper( + use_fallback_factory_, SdpVideoFormat("VP8", sdp_video_parameters_))); adapter_.reset(helper_->CreateMockEncoderAdapter()); last_encoded_image_width_ = -1; last_encoded_image_height_ = -1; last_encoded_image_simulcast_index_ = -1; } + void ReSetUp() { + if (adapter_) { + adapter_->Release(); + // |helper_| owns factories which |adapter_| needs to destroy encoders. + // Release |adapter_| before |helper_| (released in SetUp()). + adapter_.reset(); + } + SetUp(); + } + Result OnEncodedImage(const EncodedImage& encoded_image, const CodecSpecificInfo* codec_specific_info) override { last_encoded_image_width_ = encoded_image._encodedWidth; @@ -450,10 +462,23 @@ return true; } - void SetupCodec() { + void SetupCodec() { SetupCodec(/*active_streams=*/{true, true, true}); } + + void SetupCodec(std::vector active_streams) { SimulcastTestFixtureImpl::DefaultSettings( &codec_, static_cast(kTestTemporalLayerProfile), kVideoCodecVP8); + ASSERT_LE(active_streams.size(), codec_.numberOfSimulcastStreams); + codec_.numberOfSimulcastStreams = active_streams.size(); + for (size_t stream_idx = 0; stream_idx < kMaxSimulcastStreams; + ++stream_idx) { + if (stream_idx >= codec_.numberOfSimulcastStreams) { + // Reset parameters of unspecified stream. + codec_.simulcastStream[stream_idx] = {0}; + } else { + codec_.simulcastStream[stream_idx].active = active_streams[stream_idx]; + } + } rate_allocator_.reset(new SimulcastRateAllocator(codec_)); EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings)); adapter_->RegisterEncodeCompleteCallback(this); @@ -578,7 +603,8 @@ EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); EXPECT_EQ(1152, width); EXPECT_EQ(704, height); - EXPECT_EQ(0, simulcast_index); + // SEA doesn't intercept frame encode complete callback for the lowest stream. + EXPECT_EQ(-1, simulcast_index); encoders[1]->SendEncodedImage(300, 620); EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); @@ -794,7 +820,8 @@ int height; int simulcast_index; EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); - EXPECT_EQ(0, simulcast_index); + // SEA doesn't intercept frame encode complete callback for the lowest stream. + EXPECT_EQ(-1, simulcast_index); encoders[1]->SendEncodedImage(300, 620); EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); @@ -814,7 +841,7 @@ // Verify that the same encoder sends out frames on the same simulcast index. encoders[0]->SendEncodedImage(1152, 704); EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); - EXPECT_EQ(0, simulcast_index); + EXPECT_EQ(-1, simulcast_index); encoders[1]->SendEncodedImage(300, 620); EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index)); @@ -1291,6 +1318,53 @@ adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers); } +TEST_F(TestSimulcastEncoderAdapterFake, EncoderInfoFromFieldTrial) { + test::ScopedFieldTrials field_trials( + "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" + "requested_resolution_alignment:8," + "apply_alignment_to_all_simulcast_layers/"); + SetUp(); + SimulcastTestFixtureImpl::DefaultSettings( + &codec_, static_cast(kTestTemporalLayerProfile), + kVideoCodecVP8); + codec_.numberOfSimulcastStreams = 3; + EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings)); + ASSERT_EQ(3u, helper_->factory()->encoders().size()); + + EXPECT_EQ(8, adapter_->GetEncoderInfo().requested_resolution_alignment); + EXPECT_TRUE( + adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers); + EXPECT_TRUE(adapter_->GetEncoderInfo().resolution_bitrate_limits.empty()); +} + +TEST_F(TestSimulcastEncoderAdapterFake, + EncoderInfoFromFieldTrialForSingleStream) { + test::ScopedFieldTrials field_trials( + "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" + "requested_resolution_alignment:9," + "frame_size_pixels:123|456|789," + "min_start_bitrate_bps:11000|22000|33000," + "min_bitrate_bps:44000|55000|66000," + "max_bitrate_bps:77000|88000|99000/"); + SetUp(); + SimulcastTestFixtureImpl::DefaultSettings( + &codec_, static_cast(kTestTemporalLayerProfile), + kVideoCodecVP8); + codec_.numberOfSimulcastStreams = 1; + EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings)); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + + EXPECT_EQ(9, adapter_->GetEncoderInfo().requested_resolution_alignment); + EXPECT_FALSE( + adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers); + EXPECT_THAT( + adapter_->GetEncoderInfo().resolution_bitrate_limits, + ::testing::ElementsAre( + VideoEncoder::ResolutionBitrateLimits{123, 11000, 44000, 77000}, + VideoEncoder::ResolutionBitrateLimits{456, 22000, 55000, 88000}, + VideoEncoder::ResolutionBitrateLimits{789, 33000, 66000, 99000})); +} + TEST_F(TestSimulcastEncoderAdapterFake, ReportsInternalSource) { SimulcastTestFixtureImpl::DefaultSettings( &codec_, static_cast(kTestTemporalLayerProfile), @@ -1545,5 +1619,69 @@ EXPECT_EQ(10u, helper_->factory()->encoders()[2]->codec().maxFramerate); } +TEST_F(TestSimulcastEncoderAdapterFake, CreatesEncoderOnlyIfStreamIsActive) { + // Legacy singlecast + SetupCodec(/*active_streams=*/{}); + EXPECT_EQ(1u, helper_->factory()->encoders().size()); + + // Simulcast-capable underlaying encoder + ReSetUp(); + helper_->factory()->set_supports_simulcast(true); + SetupCodec(/*active_streams=*/{true, true}); + EXPECT_EQ(1u, helper_->factory()->encoders().size()); + + // Muti-encoder simulcast + ReSetUp(); + helper_->factory()->set_supports_simulcast(false); + SetupCodec(/*active_streams=*/{true, true}); + EXPECT_EQ(2u, helper_->factory()->encoders().size()); + + // Singlecast via layers deactivation. Lowest layer is active. + ReSetUp(); + helper_->factory()->set_supports_simulcast(false); + SetupCodec(/*active_streams=*/{true, false}); + EXPECT_EQ(1u, helper_->factory()->encoders().size()); + + // Singlecast via layers deactivation. Highest layer is active. + ReSetUp(); + helper_->factory()->set_supports_simulcast(false); + SetupCodec(/*active_streams=*/{false, true}); + EXPECT_EQ(1u, helper_->factory()->encoders().size()); +} + +TEST_F(TestSimulcastEncoderAdapterFake, + RecreateEncoderIfPreferTemporalSupportIsEnabled) { + // Normally SEA reuses encoders. But, when TL-based SW fallback is enabled, + // the encoder which served the lowest stream should be recreated before it + // can be used to process an upper layer and vice-versa. + test::ScopedFieldTrials field_trials( + "WebRTC-Video-PreferTemporalSupportOnBaseLayer/Enabled/"); + use_fallback_factory_ = true; + ReSetUp(); + + // Legacy singlecast + SetupCodec(/*active_streams=*/{}); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + + // Singlecast, the lowest stream is active. Encoder should be reused. + MockVideoEncoder* prev_encoder = helper_->factory()->encoders()[0]; + SetupCodec(/*active_streams=*/{true, false}); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + EXPECT_EQ(helper_->factory()->encoders()[0], prev_encoder); + + // Singlecast, an upper stream is active. Encoder should be recreated. + EXPECT_CALL(*prev_encoder, Release()).Times(1); + SetupCodec(/*active_streams=*/{false, true}); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + EXPECT_NE(helper_->factory()->encoders()[0], prev_encoder); + + // Singlecast, the lowest stream is active. Encoder should be recreated. + prev_encoder = helper_->factory()->encoders()[0]; + EXPECT_CALL(*prev_encoder, Release()).Times(1); + SetupCodec(/*active_streams=*/{true, false}); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + EXPECT_NE(helper_->factory()->encoders()[0], prev_encoder); +} + } // namespace test } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/simulcast_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/simulcast_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -12,7 +12,6 @@ #include "api/transport/field_trial_based_config.h" #include "media/base/media_constants.h" -#include "media/engine/constants.h" #include "test/field_trial.h" #include "test/gtest.h" @@ -378,4 +377,149 @@ } } +TEST(SimulcastTest, MaxLayersWithRoundUpDisabled) { + test::ScopedFieldTrials field_trials( + "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.0/"); + FieldTrialBasedConfig trials; + const size_t kMinLayers = 1; + const int kMaxLayers = 3; + + std::vector streams; + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 540, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(3u, streams.size()); + // <960x540: 2 layers + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 539, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 270, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + // <480x270: 1 layer + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 269, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(1u, streams.size()); +} + +TEST(SimulcastTest, MaxLayersWithDefaultRoundUpRatio) { + // Default: "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.1/" + FieldTrialBasedConfig trials; + const size_t kMinLayers = 1; + const int kMaxLayers = 3; + + std::vector streams; + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 540, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(3u, streams.size()); + // Lowest cropped height where max layers from higher resolution is used. + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 512, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(3u, streams.size()); + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 960, 508, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 270, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + // Lowest cropped height where max layers from higher resolution is used. + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 256, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 254, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(1u, streams.size()); +} + +TEST(SimulcastTest, MaxLayersWithRoundUpRatio) { + test::ScopedFieldTrials field_trials( + "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.13/"); + FieldTrialBasedConfig trials; + const size_t kMinLayers = 1; + const int kMaxLayers = 3; + + std::vector streams; + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 270, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + // Lowest cropped height where max layers from higher resolution is used. + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 252, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(2u, streams.size()); + streams = cricket::GetSimulcastConfig(kMinLayers, kMaxLayers, 480, 250, + kBitratePriority, kQpMax, !kScreenshare, + true, trials); + EXPECT_EQ(1u, streams.size()); +} + +TEST(SimulcastTest, BitratesInterpolatedForResBelow180p) { + // TODO(webrtc:12415): Remove when feature launches. + test::ScopedFieldTrials field_trials( + "WebRTC-LowresSimulcastBitrateInterpolation/Enabled/"); + + const size_t kMaxLayers = 3; + FieldTrialBasedConfig trials; + + std::vector streams = cricket::GetSimulcastConfig( + /* min_layers = */ 1, kMaxLayers, /* width = */ 960, /* height = */ 540, + kBitratePriority, kQpMax, !kScreenshare, true, trials); + + ASSERT_EQ(streams.size(), kMaxLayers); + EXPECT_EQ(240u, streams[0].width); + EXPECT_EQ(135u, streams[0].height); + EXPECT_EQ(streams[0].max_bitrate_bps, 112500); + EXPECT_EQ(streams[0].target_bitrate_bps, 84375); + EXPECT_EQ(streams[0].min_bitrate_bps, 30000); +} + +TEST(SimulcastTest, BitratesConsistentForVerySmallRes) { + // TODO(webrtc:12415): Remove when feature launches. + test::ScopedFieldTrials field_trials( + "WebRTC-LowresSimulcastBitrateInterpolation/Enabled/"); + + FieldTrialBasedConfig trials; + + std::vector streams = cricket::GetSimulcastConfig( + /* min_layers = */ 1, /* max_layers = */ 3, /* width = */ 1, + /* height = */ 1, kBitratePriority, kQpMax, !kScreenshare, true, trials); + + ASSERT_TRUE(!streams.empty()); + EXPECT_EQ(1u, streams[0].width); + EXPECT_EQ(1u, streams[0].height); + EXPECT_EQ(streams[0].max_bitrate_bps, 30000); + EXPECT_EQ(streams[0].target_bitrate_bps, 30000); + EXPECT_EQ(streams[0].min_bitrate_bps, 30000); +} + +TEST(SimulcastTest, + BitratesNotInterpolatedForResBelow180pWhenDisabledTrialSet) { + test::ScopedFieldTrials field_trials( + "WebRTC-LowresSimulcastBitrateInterpolation/Disabled/"); + + const size_t kMaxLayers = 3; + FieldTrialBasedConfig trials; + + std::vector streams = cricket::GetSimulcastConfig( + /* min_layers = */ 1, kMaxLayers, /* width = */ 960, /* height = */ 540, + kBitratePriority, kQpMax, !kScreenshare, true, trials); + + ASSERT_EQ(streams.size(), kMaxLayers); + EXPECT_EQ(240u, streams[0].width); + EXPECT_EQ(135u, streams[0].height); + EXPECT_EQ(streams[0].max_bitrate_bps, 200000); + EXPECT_EQ(streams[0].target_bitrate_bps, 150000); + EXPECT_EQ(streams[0].min_bitrate_bps, 30000); +} + } // namespace webrtc diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_media_engine.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_media_engine.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_media_engine.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_media_engine.cc 2021-06-27 05:27:48.000000000 +0000 @@ -39,8 +39,7 @@ std::move(dependencies.audio_decoder_factory), std::move(dependencies.audio_mixer), std::move(dependencies.audio_processing), - dependencies.audio_frame_processor, trials, - std::move(dependencies.onUnknownAudioSsrc)); + dependencies.audio_frame_processor, trials); #ifdef HAVE_WEBRTC_VIDEO auto video_engine = std::make_unique( std::move(dependencies.video_encoder_factory), diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_media_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_media_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_media_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_media_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -53,8 +53,6 @@ std::unique_ptr video_encoder_factory; std::unique_ptr video_decoder_factory; - std::function onUnknownAudioSsrc = nullptr; - const webrtc::WebRtcKeyValueConfig* trials = nullptr; }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine.cc 2021-06-27 05:27:48.000000000 +0000 @@ -167,7 +167,8 @@ for (const webrtc::SdpVideoFormat& format : supported_formats) { VideoCodec codec(format); bool isCodecValidForLowerRange = - absl::EqualsIgnoreCase(codec.name, kFlexfecCodecName); + absl::EqualsIgnoreCase(codec.name, kFlexfecCodecName) || + absl::EqualsIgnoreCase(codec.name, kAv1CodecName); if (!isCodecValidForLowerRange) { codec.id = payload_type_upper++; } else { @@ -625,11 +626,11 @@ : decoder_factory_(std::move(video_decoder_factory)), encoder_factory_(std::move(video_encoder_factory)), trials_(trials) { - RTC_LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; + RTC_DLOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; } WebRtcVideoEngine::~WebRtcVideoEngine() { - RTC_LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; + RTC_DLOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; } VideoMediaChannel* WebRtcVideoEngine::CreateMediaChannel( @@ -685,6 +686,12 @@ ? webrtc::RtpTransceiverDirection::kSendRecv : webrtc::RtpTransceiverDirection::kStopped); + result.emplace_back( + webrtc::RtpExtension::kVideoFrameTrackingIdUri, id++, + IsEnabled(trials_, "WebRTC-VideoFrameTrackingIdAdvertised") + ? webrtc::RtpTransceiverDirection::kSendRecv + : webrtc::RtpTransceiverDirection::kStopped); + return result; } @@ -715,7 +722,8 @@ "WebRTC-Video-BufferPacketsWithUnknownSsrc") ? new UnhandledPacketsBuffer() : nullptr) { - RTC_DCHECK(thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&thread_checker_); + network_thread_checker_.Detach(); rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; sending_ = false; @@ -815,7 +823,6 @@ // Never enable sending FlexFEC, unless we are in the experiment. if (!IsEnabled(call_->trials(), "WebRTC-FlexFEC-03")) { - RTC_LOG(LS_INFO) << "WebRTC-FlexFEC-03 field trial is not enabled."; for (VideoCodecSettings& codec : negotiated_codecs) codec.flexfec_payload_type = -1; } @@ -1031,7 +1038,7 @@ if (changed_params.send_codec || changed_params.rtcp_mode) { // Update receive feedback parameters from new codec or RTCP mode. RTC_LOG(LS_INFO) - << "SetFeedbackOptions on all the receive streams because the send " + << "SetFeedbackParameters on all the receive streams because the send " "codec or RTCP mode has changed."; for (auto& kv : receive_streams_) { RTC_DCHECK(kv.second != nullptr); @@ -1039,7 +1046,8 @@ HasLntf(send_codec_->codec), HasNack(send_codec_->codec), HasTransportCc(send_codec_->codec), send_params_.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize - : webrtc::RtcpMode::kCompound); + : webrtc::RtcpMode::kCompound, + send_codec_->rtx_time); } } return true; @@ -1167,7 +1175,8 @@ const std::vector mapped_codecs = MapCodecs(params.codecs); if (mapped_codecs.empty()) { - RTC_LOG(LS_ERROR) << "SetRecvParameters called without any video codecs."; + RTC_LOG(LS_ERROR) + << "GetChangedRecvParameters called without any video codecs."; return false; } @@ -1180,7 +1189,7 @@ for (const VideoCodecSettings& mapped_codec : mapped_codecs) { if (!FindMatchingCodec(local_supported_codecs, mapped_codec.codec)) { RTC_LOG(LS_ERROR) - << "SetRecvParameters called with unsupported video codec: " + << "GetChangedRecvParameters called with unsupported video codec: " << mapped_codec.codec.ToString(); return false; } @@ -1212,25 +1221,25 @@ bool WebRtcVideoChannel::SetRecvParameters(const VideoRecvParameters& params) { RTC_DCHECK_RUN_ON(&thread_checker_); TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetRecvParameters"); - RTC_LOG(LS_INFO) << "SetRecvParameters: " << params.ToString(); + RTC_DLOG(LS_INFO) << "SetRecvParameters: " << params.ToString(); ChangedRecvParameters changed_params; if (!GetChangedRecvParameters(params, &changed_params)) { return false; } if (changed_params.flexfec_payload_type) { - RTC_LOG(LS_INFO) << "Changing FlexFEC payload type (recv) from " - << recv_flexfec_payload_type_ << " to " - << *changed_params.flexfec_payload_type; + RTC_DLOG(LS_INFO) << "Changing FlexFEC payload type (recv) from " + << recv_flexfec_payload_type_ << " to " + << *changed_params.flexfec_payload_type; recv_flexfec_payload_type_ = *changed_params.flexfec_payload_type; } if (changed_params.rtp_header_extensions) { recv_rtp_extensions_ = *changed_params.rtp_header_extensions; } if (changed_params.codec_settings) { - RTC_LOG(LS_INFO) << "Changing recv codecs from " - << CodecSettingsVectorToString(recv_codecs_) << " to " - << CodecSettingsVectorToString( - *changed_params.codec_settings); + RTC_DLOG(LS_INFO) << "Changing recv codecs from " + << CodecSettingsVectorToString(recv_codecs_) << " to " + << CodecSettingsVectorToString( + *changed_params.codec_settings); recv_codecs_ = *changed_params.codec_settings; } @@ -1349,21 +1358,6 @@ video_config_.periodic_alr_bandwidth_probing; config.encoder_settings.experiment_cpu_load_estimator = video_config_.experiment_cpu_load_estimator; - using TargetBitrateType = - webrtc::VideoStreamEncoderSettings::BitrateAllocationCallbackType; - if (send_rtp_extensions_ && - webrtc::RtpExtension::FindHeaderExtensionByUri( - *send_rtp_extensions_, - webrtc::RtpExtension::kVideoLayersAllocationUri)) { - config.encoder_settings.allocation_cb_type = - TargetBitrateType::kVideoLayersAllocation; - } else if (IsEnabled(call_->trials(), "WebRTC-Target-Bitrate-Rtcp")) { - config.encoder_settings.allocation_cb_type = - TargetBitrateType::kVideoBitrateAllocation; - } else { - config.encoder_settings.allocation_cb_type = - TargetBitrateType::kVideoBitrateAllocationWhenScreenSharing; - } config.encoder_settings.encoder_factory = encoder_factory_; config.encoder_settings.bitrate_allocator_factory = bitrate_allocator_factory_; @@ -1530,6 +1524,12 @@ ? webrtc::RtcpMode::kReducedSize : webrtc::RtcpMode::kCompound; + // rtx-time (RFC 4588) is a declarative attribute similar to rtcp-rsize and + // determined by the sender / send codec. + if (send_codec_ && send_codec_->rtx_time != -1) { + config->rtp.nack.rtp_history_ms = send_codec_->rtx_time; + } + config->rtp.transport_cc = send_codec_ ? HasTransportCc(send_codec_->codec) : false; @@ -1587,6 +1587,19 @@ } } +void WebRtcVideoChannel::OnDemuxerCriteriaUpdatePending() { + RTC_DCHECK_RUN_ON(&thread_checker_); + ++demuxer_criteria_id_; +} + +void WebRtcVideoChannel::OnDemuxerCriteriaUpdateComplete() { + RTC_DCHECK_RUN_ON(&network_thread_checker_); + worker_thread_->PostTask(ToQueuedTask(task_safety_, [this] { + RTC_DCHECK_RUN_ON(&thread_checker_); + ++demuxer_criteria_completed_id_; + })); +} + bool WebRtcVideoChannel::SetSink( uint32_t ssrc, rtc::VideoSinkInterface* sink) { @@ -1697,67 +1710,83 @@ void WebRtcVideoChannel::OnPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) { - RTC_DCHECK_RUN_ON(&thread_checker_); - const webrtc::PacketReceiver::DeliveryStatus delivery_result = - call_->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, packet, - packet_time_us); - switch (delivery_result) { - case webrtc::PacketReceiver::DELIVERY_OK: - return; - case webrtc::PacketReceiver::DELIVERY_PACKET_ERROR: - return; - case webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC: - break; - } + RTC_DCHECK_RUN_ON(&network_thread_checker_); + // TODO(bugs.webrtc.org/11993): This code is very similar to what + // WebRtcVoiceMediaChannel::OnPacketReceived does. For maintainability and + // consistency it would be good to move the interaction with call_->Receiver() + // to a common implementation and provide a callback on the worker thread + // for the exception case (DELIVERY_UNKNOWN_SSRC) and how retry is attempted. + worker_thread_->PostTask( + ToQueuedTask(task_safety_, [this, packet, packet_time_us] { + RTC_DCHECK_RUN_ON(&thread_checker_); + const webrtc::PacketReceiver::DeliveryStatus delivery_result = + call_->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, packet, + packet_time_us); + switch (delivery_result) { + case webrtc::PacketReceiver::DELIVERY_OK: + return; + case webrtc::PacketReceiver::DELIVERY_PACKET_ERROR: + return; + case webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC: + break; + } - uint32_t ssrc = 0; - if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) { - return; - } + uint32_t ssrc = 0; + if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) { + return; + } - if (unknown_ssrc_packet_buffer_) { - unknown_ssrc_packet_buffer_->AddPacket(ssrc, packet_time_us, packet); - return; - } + if (unknown_ssrc_packet_buffer_) { + unknown_ssrc_packet_buffer_->AddPacket(ssrc, packet_time_us, packet); + return; + } - if (discard_unknown_ssrc_packets_) { - return; - } + if (discard_unknown_ssrc_packets_) { + return; + } - int payload_type = 0; - if (!GetRtpPayloadType(packet.cdata(), packet.size(), &payload_type)) { - return; - } + int payload_type = 0; + if (!GetRtpPayloadType(packet.cdata(), packet.size(), &payload_type)) { + return; + } - // See if this payload_type is registered as one that usually gets its own - // SSRC (RTX) or at least is safe to drop either way (FEC). If it is, and - // it wasn't handled above by DeliverPacket, that means we don't know what - // stream it associates with, and we shouldn't ever create an implicit channel - // for these. - for (auto& codec : recv_codecs_) { - if (payload_type == codec.rtx_payload_type || - payload_type == codec.ulpfec.red_rtx_payload_type || - payload_type == codec.ulpfec.ulpfec_payload_type) { - return; - } - } - if (payload_type == recv_flexfec_payload_type_) { - return; - } + // See if this payload_type is registered as one that usually gets its + // own SSRC (RTX) or at least is safe to drop either way (FEC). If it + // is, and it wasn't handled above by DeliverPacket, that means we don't + // know what stream it associates with, and we shouldn't ever create an + // implicit channel for these. + for (auto& codec : recv_codecs_) { + if (payload_type == codec.rtx_payload_type || + payload_type == codec.ulpfec.red_rtx_payload_type || + payload_type == codec.ulpfec.ulpfec_payload_type) { + return; + } + } + if (payload_type == recv_flexfec_payload_type_) { + return; + } - switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) { - case UnsignalledSsrcHandler::kDropPacket: - return; - case UnsignalledSsrcHandler::kDeliverPacket: - break; - } + // Ignore unknown ssrcs if there is a demuxer criteria update pending. + // During a demuxer update we may receive ssrcs that were recently + // removed or we may receve ssrcs that were recently configured for a + // different video channel. + if (demuxer_criteria_id_ != demuxer_criteria_completed_id_) { + return; + } - if (call_->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, packet, - packet_time_us) != - webrtc::PacketReceiver::DELIVERY_OK) { - RTC_LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery."; - return; - } + switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) { + case UnsignalledSsrcHandler::kDropPacket: + return; + case UnsignalledSsrcHandler::kDeliverPacket: + break; + } + + if (call_->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, packet, + packet_time_us) != + webrtc::PacketReceiver::DELIVERY_OK) { + RTC_LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery."; + } + })); } void WebRtcVideoChannel::BackfillBufferedPackets( @@ -1807,7 +1836,7 @@ } void WebRtcVideoChannel::OnReadyToSend(bool ready) { - RTC_DCHECK_RUN_ON(&thread_checker_); + RTC_DCHECK_RUN_ON(&network_thread_checker_); RTC_LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); call_->SignalChannelNetworkState( webrtc::MediaType::VIDEO, @@ -1817,11 +1846,15 @@ void WebRtcVideoChannel::OnNetworkRouteChanged( const std::string& transport_name, const rtc::NetworkRoute& network_route) { - RTC_DCHECK_RUN_ON(&thread_checker_); - call_->GetTransportControllerSend()->OnNetworkRouteChanged(transport_name, - network_route); - call_->GetTransportControllerSend()->OnTransportOverheadChanged( - network_route.packet_overhead); + RTC_DCHECK_RUN_ON(&network_thread_checker_); + worker_thread_->PostTask(ToQueuedTask( + task_safety_, [this, name = transport_name, route = network_route] { + RTC_DCHECK_RUN_ON(&thread_checker_); + webrtc::RtpTransportControllerSendInterface* transport = + call_->GetTransportControllerSend(); + transport->OnNetworkRouteChanged(name, route); + transport->OnTransportOverheadChanged(route.packet_overhead); + })); } void WebRtcVideoChannel::SetInterface(NetworkInterface* iface) { @@ -2310,6 +2343,9 @@ // TODO(bugs.webrtc.org/8807): The active field as well should not require // a full encoder reconfiguration, but it needs to update both the bitrate // allocator and the video bitrate allocator. + // + // Note that the simulcast encoder adapter relies on the fact that layers + // de/activation triggers encoder reinitialization. bool new_send_state = false; for (size_t i = 0; i < rtp_parameters_.encodings.size(); ++i) { bool new_active = IsLayerActive(new_parameters.encodings[i]); @@ -2490,11 +2526,17 @@ encoder_config.legacy_conference_mode = parameters_.conference_mode; + encoder_config.is_quality_scaling_allowed = + !disable_automatic_resize_ && !is_screencast && + (parameters_.config.rtp.ssrcs.size() == 1 || + NumActiveStreams(rtp_parameters_) == 1); + int max_qp = kDefaultQpMax; codec.GetParam(kCodecParamMaxQuantization, &max_qp); encoder_config.video_stream_factory = new rtc::RefCountedObject( codec.name, max_qp, is_screencast, parameters_.conference_mode); + return encoder_config; } @@ -2572,6 +2614,7 @@ stats.quality_limitation_resolution_changes; common_info.encoder_implementation_name = stats.encoder_implementation_name; common_info.ssrc_groups = ssrc_groups_; + common_info.frames = stats.frames; common_info.framerate_input = stats.input_frame_rate; common_info.avg_encode_ms = stats.avg_encode_time_ms; common_info.encode_usage_percent = stats.encode_usage_percent; @@ -2780,17 +2823,14 @@ estimated_remote_start_ntp_time_ms_(0) { config_.renderer = this; ConfigureCodecs(recv_codecs); - ConfigureFlexfecCodec(flexfec_config.payload_type); - MaybeRecreateWebRtcFlexfecStream(); + flexfec_config_.payload_type = flexfec_config.payload_type; RecreateWebRtcVideoStream(); } WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() { - if (flexfec_stream_) { - MaybeDissociateFlexfecFromVideo(); - call_->DestroyFlexfecReceiveStream(flexfec_stream_); - } call_->DestroyVideoReceiveStream(stream_); + if (flexfec_stream_) + call_->DestroyFlexfecReceiveStream(flexfec_stream_); } const std::vector& @@ -2852,6 +2892,11 @@ config_.rtp.lntf.enabled = HasLntf(codec.codec); config_.rtp.nack.rtp_history_ms = HasNack(codec.codec) ? kNackHistoryMs : 0; + // The rtx-time parameter can be used to override the hardcoded default for + // the NACK buffer length. + if (codec.rtx_time != -1 && config_.rtp.nack.rtp_history_ms != 0) { + config_.rtp.nack.rtp_history_ms = codec.rtx_time; + } config_.rtp.rtcp_xr.receiver_reference_time_report = HasRrtr(codec.codec); if (codec.ulpfec.red_rtx_payload_type != -1) { config_.rtp @@ -2860,11 +2905,6 @@ } } -void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureFlexfecCodec( - int flexfec_payload_type) { - flexfec_config_.payload_type = flexfec_payload_type; -} - void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetLocalSsrc( uint32_t local_ssrc) { // TODO(pbos): Consider turning this sanity check into a RTC_DCHECK. You @@ -2881,9 +2921,8 @@ config_.rtp.local_ssrc = local_ssrc; flexfec_config_.local_ssrc = local_ssrc; RTC_LOG(LS_INFO) - << "RecreateWebRtcStream (recv) because of SetLocalSsrc; local_ssrc=" + << "RecreateWebRtcVideoStream (recv) because of SetLocalSsrc; local_ssrc=" << local_ssrc; - MaybeRecreateWebRtcFlexfecStream(); RecreateWebRtcVideoStream(); } @@ -2891,8 +2930,10 @@ bool lntf_enabled, bool nack_enabled, bool transport_cc_enabled, - webrtc::RtcpMode rtcp_mode) { - int nack_history_ms = nack_enabled ? kNackHistoryMs : 0; + webrtc::RtcpMode rtcp_mode, + int rtx_time) { + int nack_history_ms = + nack_enabled ? rtx_time != -1 ? rtx_time : kNackHistoryMs : 0; if (config_.rtp.lntf.enabled == lntf_enabled && config_.rtp.nack.rtp_history_ms == nack_history_ms && config_.rtp.transport_cc == transport_cc_enabled && @@ -2901,7 +2942,8 @@ << "Ignoring call to SetFeedbackParameters because parameters are " "unchanged; lntf=" << lntf_enabled << ", nack=" << nack_enabled - << ", transport_cc=" << transport_cc_enabled; + << ", transport_cc=" << transport_cc_enabled + << ", rtx_time=" << rtx_time; return; } config_.rtp.lntf.enabled = lntf_enabled; @@ -2912,17 +2954,15 @@ // based on the rtcp-fb for the FlexFEC codec, not the media codec. flexfec_config_.transport_cc = config_.rtp.transport_cc; flexfec_config_.rtcp_mode = config_.rtp.rtcp_mode; - RTC_LOG(LS_INFO) - << "RecreateWebRtcStream (recv) because of SetFeedbackParameters; nack=" - << nack_enabled << ", transport_cc=" << transport_cc_enabled; - MaybeRecreateWebRtcFlexfecStream(); + RTC_LOG(LS_INFO) << "RecreateWebRtcVideoStream (recv) because of " + "SetFeedbackParameters; nack=" + << nack_enabled << ", transport_cc=" << transport_cc_enabled; RecreateWebRtcVideoStream(); } void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters( const ChangedRecvParameters& params) { bool video_needs_recreation = false; - bool flexfec_needs_recreation = false; if (params.codec_settings) { ConfigureCodecs(*params.codec_settings); video_needs_recreation = true; @@ -2931,20 +2971,16 @@ config_.rtp.extensions = *params.rtp_header_extensions; flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions; video_needs_recreation = true; - flexfec_needs_recreation = true; } if (params.flexfec_payload_type) { - ConfigureFlexfecCodec(*params.flexfec_payload_type); - flexfec_needs_recreation = true; - } - if (flexfec_needs_recreation) { - RTC_LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of " - "SetRecvParameters"; - MaybeRecreateWebRtcFlexfecStream(); + flexfec_config_.payload_type = *params.flexfec_payload_type; + // TODO(tommi): See if it is better to always have a flexfec stream object + // configured and instead of recreating the video stream, reconfigure the + // flexfec object from within the rtp callback (soon to be on the network + // thread). + video_needs_recreation = true; } if (video_needs_recreation) { - RTC_LOG(LS_INFO) - << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters"; RecreateWebRtcVideoStream(); } } @@ -2957,12 +2993,22 @@ recording_state = stream_->SetAndGetRecordingState( webrtc::VideoReceiveStream::RecordingState(), /*generate_key_frame=*/false); - MaybeDissociateFlexfecFromVideo(); call_->DestroyVideoReceiveStream(stream_); stream_ = nullptr; } + + if (flexfec_stream_) { + call_->DestroyFlexfecReceiveStream(flexfec_stream_); + flexfec_stream_ = nullptr; + } + + if (flexfec_config_.IsCompleteAndEnabled()) { + flexfec_stream_ = call_->CreateFlexfecReceiveStream(flexfec_config_); + } + webrtc::VideoReceiveStream::Config config = config_.Copy(); config.rtp.protected_by_flexfec = (flexfec_stream_ != nullptr); + config.rtp.packet_sink_ = flexfec_stream_; config.stream_id = stream_params_.id; stream_ = call_->CreateVideoReceiveStream(std::move(config)); if (base_minimum_playout_delay_ms) { @@ -2973,7 +3019,7 @@ stream_->SetAndGetRecordingState(std::move(*recording_state), /*generate_key_frame=*/false); } - MaybeAssociateFlexfecWithVideo(); + stream_->Start(); if (IsEnabled(call_->trials(), "WebRTC-Video-BufferPacketsWithUnknownSsrc")) { @@ -2981,33 +3027,6 @@ } } -void WebRtcVideoChannel::WebRtcVideoReceiveStream:: - MaybeRecreateWebRtcFlexfecStream() { - if (flexfec_stream_) { - MaybeDissociateFlexfecFromVideo(); - call_->DestroyFlexfecReceiveStream(flexfec_stream_); - flexfec_stream_ = nullptr; - } - if (flexfec_config_.IsCompleteAndEnabled()) { - flexfec_stream_ = call_->CreateFlexfecReceiveStream(flexfec_config_); - MaybeAssociateFlexfecWithVideo(); - } -} - -void WebRtcVideoChannel::WebRtcVideoReceiveStream:: - MaybeAssociateFlexfecWithVideo() { - if (stream_ && flexfec_stream_) { - stream_->AddSecondarySink(flexfec_stream_); - } -} - -void WebRtcVideoChannel::WebRtcVideoReceiveStream:: - MaybeDissociateFlexfecFromVideo() { - if (stream_ && flexfec_stream_) { - stream_->RemoveSecondarySink(flexfec_stream_); - } -} - void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame( const webrtc::VideoFrame& frame) { webrtc::MutexLock lock(&sink_lock_); @@ -3087,6 +3106,7 @@ stats.rtp_stats.packet_counter.padding_bytes; info.packets_rcvd = stats.rtp_stats.packet_counter.packets; info.packets_lost = stats.rtp_stats.packets_lost; + info.jitter_ms = stats.rtp_stats.jitter; info.framerate_rcvd = stats.network_frame_rate; info.framerate_decoded = stats.decode_frame_rate; @@ -3193,20 +3213,21 @@ } WebRtcVideoChannel::VideoCodecSettings::VideoCodecSettings() - : flexfec_payload_type(-1), rtx_payload_type(-1) {} + : flexfec_payload_type(-1), rtx_payload_type(-1), rtx_time(-1) {} bool WebRtcVideoChannel::VideoCodecSettings::operator==( const WebRtcVideoChannel::VideoCodecSettings& other) const { return codec == other.codec && ulpfec == other.ulpfec && flexfec_payload_type == other.flexfec_payload_type && - rtx_payload_type == other.rtx_payload_type; + rtx_payload_type == other.rtx_payload_type && + rtx_time == other.rtx_time; } bool WebRtcVideoChannel::VideoCodecSettings::EqualsDisregardingFlexfec( const WebRtcVideoChannel::VideoCodecSettings& a, const WebRtcVideoChannel::VideoCodecSettings& b) { return a.codec == b.codec && a.ulpfec == b.ulpfec && - a.rtx_payload_type == b.rtx_payload_type; + a.rtx_payload_type == b.rtx_payload_type && a.rtx_time == b.rtx_time; } bool WebRtcVideoChannel::VideoCodecSettings::operator!=( @@ -3224,6 +3245,7 @@ std::map payload_codec_type; // |rtx_mapping| maps video payload type to rtx payload type. std::map rtx_mapping; + std::map rtx_time_mapping; webrtc::UlpfecConfig ulpfec_config; absl::optional flexfec_payload_type; @@ -3285,6 +3307,10 @@ << in_codec.ToString(); return {}; } + int rtx_time; + if (in_codec.GetParam(kCodecParamRtxTime, &rtx_time) && rtx_time > 0) { + rtx_time_mapping[associated_payload_type] = rtx_time; + } rtx_mapping[associated_payload_type] = payload_type; break; } @@ -3334,6 +3360,16 @@ if (it != rtx_mapping.end()) { const int rtx_payload_type = it->second; codec_settings.rtx_payload_type = rtx_payload_type; + + auto rtx_time_it = rtx_time_mapping.find(payload_type); + if (rtx_time_it != rtx_time_mapping.end()) { + const int rtx_time = rtx_time_it->second; + if (rtx_time < kNackHistoryMs) { + codec_settings.rtx_time = rtx_time; + } else { + codec_settings.rtx_time = kNackHistoryMs; + } + } } } @@ -3538,7 +3574,7 @@ *encoder_config.simulcast_layers[0].num_temporal_layers; } } - + layer.scalability_mode = encoder_config.simulcast_layers[0].scalability_mode; layers.push_back(layer); return layers; } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,7 @@ #include "absl/types/optional.h" #include "api/call/transport.h" +#include "api/sequence_checker.h" #include "api/transport/field_trial_based_config.h" #include "api/video/video_bitrate_allocator_factory.h" #include "api/video/video_frame.h" @@ -30,12 +31,11 @@ #include "call/video_receive_stream.h" #include "call/video_send_stream.h" #include "media/base/media_engine.h" -#include "media/engine/constants.h" #include "media/engine/unhandled_packets_buffer.h" #include "rtc_base/network_route.h" #include "rtc_base/synchronization/mutex.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" #include "rtc_base/thread_annotations.h" -#include "rtc_base/thread_checker.h" namespace webrtc { class VideoDecoderFactory; @@ -159,6 +159,8 @@ bool AddRecvStream(const StreamParams& sp, bool default_stream); bool RemoveRecvStream(uint32_t ssrc) override; void ResetUnsignaledRecvStream() override; + void OnDemuxerCriteriaUpdatePending() override; + void OnDemuxerCriteriaUpdateComplete() override; bool SetSink(uint32_t ssrc, rtc::VideoSinkInterface* sink) override; void SetDefaultSink( @@ -273,6 +275,7 @@ webrtc::UlpfecConfig ulpfec; int flexfec_payload_type; // -1 if absent. int rtx_payload_type; // -1 if absent. + int rtx_time; // -1 if absent. }; struct ChangedSendParameters { @@ -397,7 +400,7 @@ webrtc::DegradationPreference GetDegradationPreference() const RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_); - rtc::ThreadChecker thread_checker_; + webrtc::SequenceChecker thread_checker_; rtc::Thread* worker_thread_; const std::vector ssrcs_ RTC_GUARDED_BY(&thread_checker_); const std::vector ssrc_groups_ RTC_GUARDED_BY(&thread_checker_); @@ -455,7 +458,8 @@ void SetFeedbackParameters(bool lntf_enabled, bool nack_enabled, bool transport_cc_enabled, - webrtc::RtcpMode rtcp_mode); + webrtc::RtcpMode rtcp_mode, + int rtx_time); void SetRecvParameters(const ChangedRecvParameters& recv_params); void OnFrame(const webrtc::VideoFrame& frame) override; @@ -483,13 +487,8 @@ private: void RecreateWebRtcVideoStream(); - void MaybeRecreateWebRtcFlexfecStream(); - - void MaybeAssociateFlexfecWithVideo(); - void MaybeDissociateFlexfecFromVideo(); void ConfigureCodecs(const std::vector& recv_codecs); - void ConfigureFlexfecCodec(int flexfec_payload_type); std::string GetCodecNameFromPayloadType(int payload_type); @@ -554,11 +553,13 @@ RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_); rtc::Thread* const worker_thread_; - rtc::ThreadChecker thread_checker_; + webrtc::ScopedTaskSafety task_safety_; + webrtc::SequenceChecker network_thread_checker_; + webrtc::SequenceChecker thread_checker_; uint32_t rtcp_receiver_report_ssrc_ RTC_GUARDED_BY(thread_checker_); bool sending_ RTC_GUARDED_BY(thread_checker_); - webrtc::Call* const call_ RTC_GUARDED_BY(thread_checker_); + webrtc::Call* const call_; DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_ RTC_GUARDED_BY(thread_checker_); @@ -575,6 +576,22 @@ RTC_GUARDED_BY(thread_checker_); std::map receive_streams_ RTC_GUARDED_BY(thread_checker_); + // When the channel and demuxer get reconfigured, there is a window of time + // where we have to be prepared for packets arriving based on the old demuxer + // criteria because the streams live on the worker thread and the demuxer + // lives on the network thread. Because packets are posted from the network + // thread to the worker thread, they can still be in-flight when streams are + // reconfgured. This can happen when |demuxer_criteria_id_| and + // |demuxer_criteria_completed_id_| don't match. During this time, we do not + // want to create unsignalled receive streams and should instead drop the + // packets. E.g: + // * If RemoveRecvStream(old_ssrc) was recently called, there may be packets + // in-flight for that ssrc. This happens when a receiver becomes inactive. + // * If we go from one to many m= sections, the demuxer may change from + // forwarding all packets to only forwarding the configured ssrcs, so there + // is a risk of receiving ssrcs for other, recently added m= sections. + uint32_t demuxer_criteria_id_ RTC_GUARDED_BY(thread_checker_) = 0; + uint32_t demuxer_criteria_completed_id_ RTC_GUARDED_BY(thread_checker_) = 0; std::set send_ssrcs_ RTC_GUARDED_BY(thread_checker_); std::set receive_ssrcs_ RTC_GUARDED_BY(thread_checker_); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_video_engine_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_video_engine_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -47,7 +47,6 @@ #include "media/base/media_constants.h" #include "media/base/rtp_utils.h" #include "media/base/test_utils.h" -#include "media/engine/constants.h" #include "media/engine/fake_webrtc_call.h" #include "media/engine/fake_webrtc_video_engine.h" #include "media/engine/simulcast.h" @@ -398,6 +397,17 @@ ExpectRtpCapabilitySupport(RtpExtension::kVideoLayersAllocationUri, true); } +class WebRtcVideoFrameTrackingId : public WebRtcVideoEngineTest { + public: + WebRtcVideoFrameTrackingId() + : WebRtcVideoEngineTest( + "WebRTC-VideoFrameTrackingIdAdvertised/Enabled/") {} +}; + +TEST_F(WebRtcVideoFrameTrackingId, AdvertiseVideoFrameTrackingId) { + ExpectRtpCapabilitySupport(RtpExtension::kVideoFrameTrackingIdUri, true); +} + TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) { // Allocate the source first to prevent early destruction before channel's // dtor is called. @@ -2050,7 +2060,7 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; rtc::CopyOnWriteBuffer packet1(data1, sizeof(data1)); - rtc::SetBE32(packet1.data() + 8, kSsrc); + rtc::SetBE32(packet1.MutableData() + 8, kSsrc); channel_->SetDefaultSink(NULL); EXPECT_TRUE(SetDefaultCodec()); EXPECT_TRUE(SetSend(true)); @@ -4082,8 +4092,10 @@ fake_call_->GetVideoReceiveStreams(); ASSERT_EQ(1U, video_streams.size()); const FakeVideoReceiveStream& video_stream = *video_streams.front(); - EXPECT_EQ(0, video_stream.GetNumAddedSecondarySinks()); - EXPECT_EQ(0, video_stream.GetNumRemovedSecondarySinks()); + const webrtc::VideoReceiveStream::Config& video_config = + video_stream.GetConfig(); + EXPECT_FALSE(video_config.rtp.protected_by_flexfec); + EXPECT_EQ(video_config.rtp.packet_sink_, nullptr); } TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetDefaultRecvCodecsWithSsrc) { @@ -4104,14 +4116,17 @@ fake_call_->GetVideoReceiveStreams(); ASSERT_EQ(1U, video_streams.size()); const FakeVideoReceiveStream& video_stream = *video_streams.front(); - EXPECT_EQ(1, video_stream.GetNumAddedSecondarySinks()); const webrtc::VideoReceiveStream::Config& video_config = video_stream.GetConfig(); EXPECT_TRUE(video_config.rtp.protected_by_flexfec); + EXPECT_NE(video_config.rtp.packet_sink_, nullptr); } +// Test changing the configuration after a video stream has been created and +// turn on flexfec. This will result in the video stream being recreated because +// the flexfec stream pointer is injected to the video stream at construction. TEST_F(WebRtcVideoChannelFlexfecRecvTest, - EnablingFlexfecDoesNotRecreateVideoReceiveStream) { + EnablingFlexfecRecreatesVideoReceiveStream) { cricket::VideoRecvParameters recv_parameters; recv_parameters.codecs.push_back(GetEngineCodec("VP8")); ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters)); @@ -4122,25 +4137,37 @@ const std::vector& video_streams = fake_call_->GetVideoReceiveStreams(); ASSERT_EQ(1U, video_streams.size()); - const FakeVideoReceiveStream& video_stream = *video_streams.front(); - EXPECT_EQ(0, video_stream.GetNumAddedSecondarySinks()); - EXPECT_EQ(0, video_stream.GetNumRemovedSecondarySinks()); + const FakeVideoReceiveStream* video_stream = video_streams.front(); + const webrtc::VideoReceiveStream::Config* video_config = + &video_stream->GetConfig(); + EXPECT_FALSE(video_config->rtp.protected_by_flexfec); + EXPECT_EQ(video_config->rtp.packet_sink_, nullptr); // Enable FlexFEC. recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters)); - EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams()) + + // Now the count of created streams will be 3 since the video stream was + // recreated and a flexfec stream was created. + EXPECT_EQ(3, fake_call_->GetNumCreatedReceiveStreams()) << "Enabling FlexFEC should create FlexfecReceiveStream."; + EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()) << "Enabling FlexFEC should not create VideoReceiveStream."; EXPECT_EQ(1U, fake_call_->GetFlexfecReceiveStreams().size()) << "Enabling FlexFEC should create a single FlexfecReceiveStream."; - EXPECT_EQ(1, video_stream.GetNumAddedSecondarySinks()); - EXPECT_EQ(0, video_stream.GetNumRemovedSecondarySinks()); + video_stream = video_streams.front(); + video_config = &video_stream->GetConfig(); + EXPECT_TRUE(video_config->rtp.protected_by_flexfec); + EXPECT_NE(video_config->rtp.packet_sink_, nullptr); } +// Test changing the configuration after a video stream has been created with +// flexfec enabled and then turn off flexfec. This will result in the video +// stream being recreated because the flexfec stream pointer is injected to the +// video stream at construction and that config needs to be torn down. TEST_F(WebRtcVideoChannelFlexfecRecvTest, - DisablingFlexfecDoesNotRecreateVideoReceiveStream) { + DisablingFlexfecRecreatesVideoReceiveStream) { cricket::VideoRecvParameters recv_parameters; recv_parameters.codecs.push_back(GetEngineCodec("VP8")); recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03")); @@ -4153,22 +4180,28 @@ const std::vector& video_streams = fake_call_->GetVideoReceiveStreams(); ASSERT_EQ(1U, video_streams.size()); - const FakeVideoReceiveStream& video_stream = *video_streams.front(); - EXPECT_EQ(1, video_stream.GetNumAddedSecondarySinks()); - EXPECT_EQ(0, video_stream.GetNumRemovedSecondarySinks()); + const FakeVideoReceiveStream* video_stream = video_streams.front(); + const webrtc::VideoReceiveStream::Config* video_config = + &video_stream->GetConfig(); + EXPECT_TRUE(video_config->rtp.protected_by_flexfec); + EXPECT_NE(video_config->rtp.packet_sink_, nullptr); // Disable FlexFEC. recv_parameters.codecs.clear(); recv_parameters.codecs.push_back(GetEngineCodec("VP8")); ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters)); - EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams()) + // Now the count of created streams will be 3 since the video stream had to + // be recreated on account of the flexfec stream being deleted. + EXPECT_EQ(3, fake_call_->GetNumCreatedReceiveStreams()) << "Disabling FlexFEC should not recreate VideoReceiveStream."; EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()) << "Disabling FlexFEC should not destroy VideoReceiveStream."; EXPECT_TRUE(fake_call_->GetFlexfecReceiveStreams().empty()) << "Disabling FlexFEC should destroy FlexfecReceiveStream."; - EXPECT_EQ(1, video_stream.GetNumAddedSecondarySinks()); - EXPECT_EQ(1, video_stream.GetNumRemovedSecondarySinks()); + video_stream = video_streams.front(); + video_config = &video_stream->GetConfig(); + EXPECT_FALSE(video_config->rtp.protected_by_flexfec); + EXPECT_EQ(video_config->rtp.packet_sink_, nullptr); } TEST_F(WebRtcVideoChannelFlexfecRecvTest, DuplicateFlexfecCodecIsDropped) { @@ -4901,6 +4934,76 @@ EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx_ssrc); } +TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRtxWithRtxTime) { + const int kUnusedPayloadType1 = 126; + const int kUnusedPayloadType2 = 127; + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType1)); + EXPECT_FALSE(FindCodecById(engine_.recv_codecs(), kUnusedPayloadType2)); + + // SSRCs for RTX. + cricket::StreamParams params = + cricket::StreamParams::CreateLegacy(kSsrcs1[0]); + params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]); + AddRecvStream(params); + + // Payload type for RTX. + cricket::VideoRecvParameters parameters; + parameters.codecs.push_back(GetEngineCodec("VP8")); + cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx"); + rtx_codec.SetParam("apt", GetEngineCodec("VP8").id); + parameters.codecs.push_back(rtx_codec); + EXPECT_TRUE(channel_->SetRecvParameters(parameters)); + ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size()); + const webrtc::VideoReceiveStream::Config& config = + fake_call_->GetVideoReceiveStreams()[0]->GetConfig(); + + const int kRtxTime = 343; + // Assert that the default value is different from the ones we test + // and store the default value. + EXPECT_NE(config.rtp.nack.rtp_history_ms, kRtxTime); + int default_history_ms = config.rtp.nack.rtp_history_ms; + + // Set rtx-time. + parameters.codecs[1].SetParam(kCodecParamRtxTime, kRtxTime); + EXPECT_TRUE(channel_->SetRecvParameters(parameters)); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + kRtxTime); + + // Negative values are ignored so the default value applies. + parameters.codecs[1].SetParam(kCodecParamRtxTime, -1); + EXPECT_TRUE(channel_->SetRecvParameters(parameters)); + EXPECT_NE(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + -1); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + default_history_ms); + + // 0 is ignored so the default applies. + parameters.codecs[1].SetParam(kCodecParamRtxTime, 0); + EXPECT_TRUE(channel_->SetRecvParameters(parameters)); + EXPECT_NE(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + 0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + default_history_ms); + + // Values larger than the default are clamped to the default. + parameters.codecs[1].SetParam(kCodecParamRtxTime, default_history_ms + 100); + EXPECT_TRUE(channel_->SetRecvParameters(parameters)); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams()[0] + ->GetConfig() + .rtp.nack.rtp_history_ms, + default_history_ms); +} + TEST_F(WebRtcVideoChannelTest, SetRecvCodecsDifferentPayloadType) { cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); @@ -6134,6 +6237,7 @@ rtc::SetBE32(&data[8], ssrcs[0]); rtc::CopyOnWriteBuffer packet(data, kDataLength); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) << "No default receive stream created."; @@ -6281,6 +6385,9 @@ cricket::StreamParams unsignaled_stream; unsignaled_stream.set_stream_ids({kSyncLabel}); ASSERT_TRUE(channel_->AddRecvStream(unsignaled_stream)); + channel_->OnDemuxerCriteriaUpdatePending(); + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); // The stream shouldn't have been created at this point because it doesn't // have any SSRCs. EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); @@ -6292,18 +6399,31 @@ rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc); rtc::CopyOnWriteBuffer packet(data, kDataLength); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // The stream should now be created with the appropriate sync label. EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); EXPECT_EQ(kSyncLabel, fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group); - // Reset the unsignaled stream to clear the cache. This time when - // a default video receive stream is created it won't have a sync_group. + // Reset the unsignaled stream to clear the cache. This deletes the receive + // stream. channel_->ResetUnsignaledRecvStream(); + channel_->OnDemuxerCriteriaUpdatePending(); EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); + // Until the demuxer criteria has been updated, we ignore in-flight ssrcs of + // the recently removed unsignaled receive stream. channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size()); + + // After the demuxer criteria has been updated, we should proceed to create + // unsignalled receive streams. This time when a default video receive stream + // is created it won't have a sync_group. + channel_->OnDemuxerCriteriaUpdateComplete(); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); EXPECT_TRUE( fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group.empty()); @@ -6321,6 +6441,7 @@ rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc); rtc::CopyOnWriteBuffer packet(data, kDataLength); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // Default receive stream created. const auto& receivers1 = fake_call_->GetVideoReceiveStreams(); @@ -6340,6 +6461,279 @@ EXPECT_EQ(receivers2[0]->GetConfig().rtp.remote_ssrc, kIncomingSignalledSsrc); } +TEST_F(WebRtcVideoChannelTest, + RecentlyAddedSsrcsDoNotCreateUnsignalledRecvStreams) { + const uint32_t kSsrc1 = 1; + const uint32_t kSsrc2 = 2; + + // Starting point: receiving kSsrc1. + EXPECT_TRUE(channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1))); + channel_->OnDemuxerCriteriaUpdatePending(); + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + + // If this is the only m= section the demuxer might be configure to forward + // all packets, regardless of ssrc, to this channel. When we go to multiple m= + // sections, there can thus be a window of time where packets that should + // never have belonged to this channel arrive anyway. + + // Emulate a second m= section being created by updating the demuxer criteria + // without adding any streams. + channel_->OnDemuxerCriteriaUpdatePending(); + + // Emulate there being in-flight packets for kSsrc1 and kSsrc2 arriving before + // the demuxer is updated. + { + // Receive a packet for kSsrc1. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc1); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + { + // Receive a packet for kSsrc2. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc2); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + + // No unsignaled ssrc for kSsrc2 should have been created, but kSsrc1 should + // arrive since it already has a stream. + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); + + // Signal that the demuxer update is complete. Because there are no more + // pending demuxer updates, receiving unknown ssrcs (kSsrc2) should again + // result in unsignalled receive streams being created. + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + + // Receive packets for kSsrc1 and kSsrc2 again. + { + // Receive a packet for kSsrc1. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc1); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + { + // Receive a packet for kSsrc2. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc2); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + + // An unsignalled ssrc for kSsrc2 should be created and the packet counter + // should increase for both ssrcs. + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 2u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 1u); +} + +TEST_F(WebRtcVideoChannelTest, + RecentlyRemovedSsrcsDoNotCreateUnsignalledRecvStreams) { + const uint32_t kSsrc1 = 1; + const uint32_t kSsrc2 = 2; + + // Starting point: receiving kSsrc1 and kSsrc2. + EXPECT_TRUE(channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc1))); + EXPECT_TRUE(channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc2))); + channel_->OnDemuxerCriteriaUpdatePending(); + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 0u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 0u); + + // Remove kSsrc1, signal that a demuxer criteria update is pending, but not + // completed yet. + EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc1)); + channel_->OnDemuxerCriteriaUpdatePending(); + + // We only have a receiver for kSsrc2 now. + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + + // Emulate there being in-flight packets for kSsrc1 and kSsrc2 arriving before + // the demuxer is updated. + { + // Receive a packet for kSsrc1. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc1); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + { + // Receive a packet for kSsrc2. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc2); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + + // No unsignaled ssrc for kSsrc1 should have been created, but the packet + // count for kSsrc2 should increase. + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 0u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 1u); + + // Signal that the demuxer update is complete. This means we should stop + // ignorning kSsrc1. + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + + // Receive packets for kSsrc1 and kSsrc2 again. + { + // Receive a packet for kSsrc1. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc1); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + { + // Receive a packet for kSsrc2. + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc2); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + + // An unsignalled ssrc for kSsrc1 should be created and the packet counter + // should increase for both ssrcs. + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 2u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc1), 1u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc2), 2u); +} + +TEST_F(WebRtcVideoChannelTest, MultiplePendingDemuxerCriteriaUpdates) { + const uint32_t kSsrc = 1; + + // Starting point: receiving kSsrc. + EXPECT_TRUE(channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); + channel_->OnDemuxerCriteriaUpdatePending(); + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + ASSERT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + + // Remove kSsrc... + EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc)); + channel_->OnDemuxerCriteriaUpdatePending(); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); + // And then add it back again, before the demuxer knows about the new + // criteria! + EXPECT_TRUE(channel_->AddRecvStream(StreamParams::CreateLegacy(kSsrc))); + channel_->OnDemuxerCriteriaUpdatePending(); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + + // In-flight packets should arrive because the stream was recreated, even + // though demuxer criteria updates are pending... + { + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 1u); + + // Signal that the demuxer knows about the first update: the removal. + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + + // This still should not prevent in-flight packets from arriving because we + // have a receive stream for it. + { + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); + + // Remove the kSsrc again while previous demuxer updates are still pending. + EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc)); + channel_->OnDemuxerCriteriaUpdatePending(); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); + + // Now the packet should be dropped and not create an unsignalled receive + // stream. + { + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); + + // Signal that the demuxer knows about the second update: adding it back. + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + + // The packets should continue to be dropped because removal happened after + // the most recently completed demuxer update. + { + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u); + + // Signal that the demuxer knows about the last update: the second removal. + channel_->OnDemuxerCriteriaUpdateComplete(); + rtc::Thread::Current()->ProcessMessages(0); + + // If packets still arrive after the demuxer knows about the latest removal we + // should finally create an unsignalled receive stream. + { + const size_t kDataLength = 12; + uint8_t data[kDataLength]; + memset(data, 0, sizeof(data)); + rtc::SetBE32(&data[8], kSsrc); + rtc::CopyOnWriteBuffer packet(data, kDataLength); + channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + } + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u); + EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 3u); +} + // Test BaseMinimumPlayoutDelayMs on receive streams. TEST_F(WebRtcVideoChannelTest, BaseMinimumPlayoutDelayMs) { // Test that set won't work for non-existing receive streams. @@ -6374,6 +6768,7 @@ rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc); rtc::CopyOnWriteBuffer packet(data, kDataLength); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc); EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200); @@ -6411,6 +6806,7 @@ rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc); rtc::CopyOnWriteBuffer packet(data, kDataLength); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); if (expect_created_receive_stream) { EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()) @@ -6498,6 +6894,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtpHeader); rtc::CopyOnWriteBuffer packet(data, sizeof(data)); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // VP8 packet should create default receive stream. ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0]; @@ -6519,6 +6916,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtpHeader); rtc::CopyOnWriteBuffer packet2(data, sizeof(data)); channel_->OnPacketReceived(packet2, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // VP9 packet should replace the default receive SSRC. ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); recv_stream = fake_call_->GetVideoReceiveStreams()[0]; @@ -6541,6 +6939,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtpHeader); rtc::CopyOnWriteBuffer packet3(data, sizeof(data)); channel_->OnPacketReceived(packet3, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // H264 packet should replace the default receive SSRC. ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); recv_stream = fake_call_->GetVideoReceiveStreams()[0]; @@ -6580,6 +6979,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtp_header); rtc::CopyOnWriteBuffer packet(data, sizeof(data)); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // Default receive stream should be created. ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size()); FakeVideoReceiveStream* recv_stream0 = @@ -6598,6 +6998,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtp_header); packet.SetData(data, sizeof(data)); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // New default receive stream should be created, but old stream should remain. ASSERT_EQ(2u, fake_call_->GetVideoReceiveStreams().size()); EXPECT_EQ(recv_stream0, fake_call_->GetVideoReceiveStreams()[0]); @@ -8211,6 +8612,7 @@ cricket::SetRtpHeader(data, sizeof(data), rtpHeader); rtc::CopyOnWriteBuffer packet(data, sizeof(data)); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); // The |ssrc| member should still be unset. rtp_parameters = channel_->GetDefaultRtpReceiveParameters(); @@ -8268,6 +8670,48 @@ TestReceiverLocalSsrcConfiguration(true); } +TEST_F(WebRtcVideoChannelTest, Simulcast_QualityScalingNotAllowed) { + FakeVideoSendStream* stream = SetUpSimulcast(true, true); + EXPECT_FALSE(stream->GetEncoderConfig().is_quality_scaling_allowed); +} + +TEST_F(WebRtcVideoChannelTest, Singlecast_QualityScalingAllowed) { + FakeVideoSendStream* stream = SetUpSimulcast(false, true); + EXPECT_TRUE(stream->GetEncoderConfig().is_quality_scaling_allowed); +} + +TEST_F(WebRtcVideoChannelTest, + SinglecastScreenSharing_QualityScalingNotAllowed) { + SetUpSimulcast(false, true); + + webrtc::test::FrameForwarder frame_forwarder; + VideoOptions options; + options.is_screencast = true; + EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder)); + // Fetch the latest stream since SetVideoSend() may recreate it if the + // screen content setting is changed. + FakeVideoSendStream* stream = fake_call_->GetVideoSendStreams().front(); + + EXPECT_FALSE(stream->GetEncoderConfig().is_quality_scaling_allowed); + EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, nullptr)); +} + +TEST_F(WebRtcVideoChannelTest, + SimulcastSingleActiveStream_QualityScalingAllowed) { + FakeVideoSendStream* stream = SetUpSimulcast(true, false); + + webrtc::RtpParameters rtp_parameters = + channel_->GetRtpSendParameters(last_ssrc_); + ASSERT_EQ(3u, rtp_parameters.encodings.size()); + ASSERT_TRUE(rtp_parameters.encodings[0].active); + ASSERT_TRUE(rtp_parameters.encodings[1].active); + ASSERT_TRUE(rtp_parameters.encodings[2].active); + rtp_parameters.encodings[0].active = false; + rtp_parameters.encodings[1].active = false; + EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, rtp_parameters).ok()); + EXPECT_TRUE(stream->GetEncoderConfig().is_quality_scaling_allowed); +} + class WebRtcVideoChannelSimulcastTest : public ::testing::Test { public: WebRtcVideoChannelSimulcastTest() diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine.cc 2021-06-27 05:27:48.000000000 +0000 @@ -11,6 +11,7 @@ #include "media/engine/webrtc_voice_engine.h" #include +#include #include #include #include @@ -46,7 +47,10 @@ #include "rtc_base/strings/audio_format_to_string.h" #include "rtc_base/strings/string_builder.h" #include "rtc_base/strings/string_format.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" +#include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/third_party/base64/base64.h" +#include "rtc_base/thread.h" #include "rtc_base/trace_event.h" #include "system_wrappers/include/metrics.h" @@ -207,7 +211,9 @@ struct AdaptivePtimeConfig { bool enabled = false; webrtc::DataRate min_payload_bitrate = webrtc::DataRate::KilobitsPerSec(16); - webrtc::DataRate min_encoder_bitrate = webrtc::DataRate::KilobitsPerSec(12); + // Value is chosen to ensure FEC can be encoded, see LBRR_WB_MIN_RATE_BPS in + // libopus. + webrtc::DataRate min_encoder_bitrate = webrtc::DataRate::KilobitsPerSec(16); bool use_slow_adaptation = true; absl::optional audio_network_adaptor_config; @@ -245,8 +251,7 @@ rtc::scoped_refptr audio_mixer, rtc::scoped_refptr audio_processing, webrtc::AudioFrameProcessor* audio_frame_processor, - const webrtc::WebRtcKeyValueConfig& trials, - std::function onUnknownAudioSsrc) + const webrtc::WebRtcKeyValueConfig& trials) : task_queue_factory_(task_queue_factory), adm_(adm), encoder_factory_(encoder_factory), @@ -257,8 +262,7 @@ audio_red_for_opus_trial_enabled_( IsEnabled(trials, "WebRTC-Audio-Red-For-Opus")), minimized_remsampling_on_mobile_trial_enabled_( - IsEnabled(trials, "WebRTC-Audio-MinimizeResamplingOnMobile")), - onUnknownAudioSsrc_(onUnknownAudioSsrc) { + IsEnabled(trials, "WebRTC-Audio-MinimizeResamplingOnMobile")) { // This may be called from any thread, so detach thread checkers. worker_thread_checker_.Detach(); signal_thread_checker_.Detach(); @@ -269,7 +273,7 @@ } WebRtcVoiceEngine::~WebRtcVoiceEngine() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine"; if (initialized_) { StopAecDump(); @@ -283,7 +287,7 @@ } void WebRtcVoiceEngine::Init() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_LOG(LS_INFO) << "WebRtcVoiceEngine::Init"; // TaskQueue expects to be created/destroyed on the same thread. @@ -364,7 +368,7 @@ rtc::scoped_refptr WebRtcVoiceEngine::GetAudioState() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return audio_state_; } @@ -373,13 +377,13 @@ const MediaConfig& config, const AudioOptions& options, const webrtc::CryptoOptions& crypto_options) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return new WebRtcVoiceMediaChannel(this, config, options, crypto_options, call); } bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_LOG(LS_INFO) << "WebRtcVoiceEngine::ApplyOptions: " << options_in.ToString(); AudioOptions options = options_in; // The options are modified below. @@ -623,13 +627,13 @@ } void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(channel); channels_.push_back(channel); } void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); auto it = absl::c_find(channels_, channel); RTC_DCHECK(it != channels_.end()); channels_.erase(it); @@ -637,7 +641,7 @@ bool WebRtcVoiceEngine::StartAecDump(webrtc::FileWrapper file, int64_t max_size_bytes) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); webrtc::AudioProcessing* ap = apm(); if (!ap) { @@ -652,7 +656,7 @@ } void WebRtcVoiceEngine::StopAecDump() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); webrtc::AudioProcessing* ap = apm(); if (ap) { ap->DetachAecDump(); @@ -663,18 +667,18 @@ } webrtc::AudioDeviceModule* WebRtcVoiceEngine::adm() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(adm_); return adm_.get(); } webrtc::AudioProcessing* WebRtcVoiceEngine::apm() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return apm_.get(); } webrtc::AudioState* WebRtcVoiceEngine::audio_state() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(audio_state_); return audio_state_.get(); } @@ -816,7 +820,7 @@ WebRtcAudioSendStream& operator=(const WebRtcAudioSendStream&) = delete; ~WebRtcAudioSendStream() override { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); ClearSource(); call_->DestroyAudioSendStream(stream_); } @@ -828,7 +832,7 @@ } void SetRtpExtensions(const std::vector& extensions) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.rtp.extensions = extensions; rtp_parameters_.header_extensions = extensions; ReconfigureAudioSendStream(); @@ -840,7 +844,7 @@ } void SetMid(const std::string& mid) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (config_.rtp.mid == mid) { return; } @@ -850,14 +854,14 @@ void SetFrameEncryptor( rtc::scoped_refptr frame_encryptor) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.frame_encryptor = frame_encryptor; ReconfigureAudioSendStream(); } void SetAudioNetworkAdaptorConfig( const absl::optional& audio_network_adaptor_config) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (audio_network_adaptor_config_from_options_ == audio_network_adaptor_config) { return; @@ -869,7 +873,7 @@ } bool SetMaxSendBitrate(int bps) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(config_.send_codec_spec); RTC_DCHECK(audio_codec_spec_); auto send_rate = ComputeSendBitrate( @@ -892,32 +896,32 @@ int payload_freq, int event, int duration_ms) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); return stream_->SendTelephoneEvent(payload_type, payload_freq, event, duration_ms); } void SetSend(bool send) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); send_ = send; UpdateSendState(); } void SetMuted(bool muted) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); stream_->SetMuted(muted); muted_ = muted; } bool muted() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); return muted_; } webrtc::AudioSendStream::Stats GetStats(bool has_remote_tracks) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); return stream_->GetStats(has_remote_tracks); } @@ -927,7 +931,7 @@ // This method is called on the libjingle worker thread. // TODO(xians): Make sure Start() is called only once. void SetSource(AudioSource* source) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(source); if (source_) { RTC_DCHECK(source_ == source); @@ -942,7 +946,7 @@ // callback will be received after this method. // This method is called on the libjingle worker thread. void ClearSource() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (source_) { source_->SetSink(nullptr); source_ = nullptr; @@ -978,7 +982,7 @@ // Callback from the |source_| when it is going away. In case Start() has // never been called, this callback won't be triggered. void OnClose() override { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Set |source_| to nullptr to make sure no more callback will get into // the source. source_ = nullptr; @@ -1045,14 +1049,14 @@ void SetEncoderToPacketizerFrameTransformer( rtc::scoped_refptr frame_transformer) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.frame_transformer = std::move(frame_transformer); ReconfigureAudioSendStream(); } private: void UpdateSendState() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); RTC_DCHECK_EQ(1UL, rtp_parameters_.encodings.size()); if (send_ && source_ != nullptr && rtp_parameters_.encodings[0].active) { @@ -1063,7 +1067,7 @@ } void UpdateAllowedBitrateRange() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // The order of precedence, from lowest to highest is: // - a reasonable default of 32kbps min/max // - fixed target bitrate from codec spec @@ -1095,7 +1099,7 @@ void UpdateSendCodecSpec( const webrtc::AudioSendStream::Config::SendCodecSpec& send_codec_spec) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.send_codec_spec = send_codec_spec; auto info = config_.encoder_factory->QueryAudioEncoder(send_codec_spec.format); @@ -1138,7 +1142,7 @@ } void ReconfigureAudioSendStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); stream_->Reconfigure(config_); } @@ -1146,7 +1150,7 @@ int NumPreferredChannels() const override { return num_encoded_channels_; } const AdaptivePtimeConfig adaptive_ptime_config_; - rtc::ThreadChecker worker_thread_checker_; + webrtc::SequenceChecker worker_thread_checker_; rtc::RaceChecker audio_capture_race_checker_; webrtc::Call* call_ = nullptr; webrtc::AudioSendStream::Config config_; @@ -1166,7 +1170,7 @@ // TODO(webrtc:11717): Remove this once audio_network_adaptor in AudioOptions // has been removed. absl::optional audio_network_adaptor_config_from_options_; - int num_encoded_channels_ = -1; + std::atomic num_encoded_channels_{-1}; }; class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream { @@ -1220,19 +1224,19 @@ WebRtcAudioReceiveStream& operator=(const WebRtcAudioReceiveStream&) = delete; ~WebRtcAudioReceiveStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); call_->DestroyAudioReceiveStream(stream_); } void SetFrameDecryptor( rtc::scoped_refptr frame_decryptor) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.frame_decryptor = frame_decryptor; RecreateAudioReceiveStream(); } void SetLocalSsrc(uint32_t local_ssrc) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); if (local_ssrc != config_.rtp.local_ssrc) { config_.rtp.local_ssrc = local_ssrc; RecreateAudioReceiveStream(); @@ -1241,7 +1245,7 @@ void SetUseTransportCcAndRecreateStream(bool use_transport_cc, bool use_nack) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.rtp.transport_cc = use_transport_cc; config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0; ReconfigureAudioReceiveStream(); @@ -1249,21 +1253,21 @@ void SetRtpExtensionsAndRecreateStream( const std::vector& extensions) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.rtp.extensions = extensions; RecreateAudioReceiveStream(); } // Set a new payload type -> decoder map. void SetDecoderMap(const std::map& decoder_map) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.decoder_map = decoder_map; ReconfigureAudioReceiveStream(); } void MaybeRecreateAudioReceiveStream( const std::vector& stream_ids) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); std::string sync_group; if (!stream_ids.empty()) { sync_group = stream_ids[0]; @@ -1279,13 +1283,13 @@ webrtc::AudioReceiveStream::Stats GetStats( bool get_and_clear_legacy_stats) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); return stream_->GetStats(get_and_clear_legacy_stats); } void SetRawAudioSink(std::unique_ptr sink) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Need to update the stream's sink first; once raw_audio_sink_ is // reassigned, whatever was in there before is destroyed. stream_->SetSink(sink.get()); @@ -1293,24 +1297,23 @@ } void SetOutputVolume(double volume) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); output_volume_ = volume; stream_->SetGain(volume); } void SetPlayout(bool playout) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); if (playout) { stream_->Start(); } else { stream_->Stop(); } - playout_ = playout; } bool SetBaseMinimumPlayoutDelayMs(int delay_ms) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); if (stream_->SetBaseMinimumPlayoutDelayMs(delay_ms)) { // Memorize only valid delay because during stream recreation it will be @@ -1327,13 +1330,13 @@ } int GetBaseMinimumPlayoutDelayMs() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); return stream_->GetBaseMinimumPlayoutDelayMs(); } std::vector GetSources() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); return stream_->GetSources(); } @@ -1349,37 +1352,39 @@ void SetDepacketizerToDecoderFrameTransformer( rtc::scoped_refptr frame_transformer) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); config_.frame_transformer = std::move(frame_transformer); ReconfigureAudioReceiveStream(); } private: void RecreateAudioReceiveStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); + bool was_running = false; if (stream_) { + was_running = stream_->IsRunning(); call_->DestroyAudioReceiveStream(stream_); } stream_ = call_->CreateAudioReceiveStream(config_); RTC_CHECK(stream_); stream_->SetGain(output_volume_); - SetPlayout(playout_); + if (was_running) + SetPlayout(was_running); stream_->SetSink(raw_audio_sink_.get()); } void ReconfigureAudioReceiveStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK(stream_); stream_->Reconfigure(config_); } - rtc::ThreadChecker worker_thread_checker_; + webrtc::SequenceChecker worker_thread_checker_; webrtc::Call* call_ = nullptr; webrtc::AudioReceiveStream::Config config_; // The stream is owned by WebRtcAudioReceiveStream and may be reallocated if // configuration changes. webrtc::AudioReceiveStream* stream_ = nullptr; - bool playout_ = false; float output_volume_ = 1.0; std::unique_ptr raw_audio_sink_; }; @@ -1391,12 +1396,15 @@ const webrtc::CryptoOptions& crypto_options, webrtc::Call* call) : VoiceMediaChannel(config), + worker_thread_(rtc::Thread::Current()), engine_(engine), call_(call), audio_config_(config.audio), crypto_options_(crypto_options), audio_red_for_opus_trial_enabled_( IsEnabled(call->trials(), "WebRTC-Audio-Red-For-Opus")) { + RTC_DCHECK_RUN_ON(worker_thread_); + network_thread_checker_.Detach(); RTC_LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel"; RTC_DCHECK(call); engine->RegisterChannel(this); @@ -1404,7 +1412,7 @@ } WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel"; // TODO(solenberg): Should be able to delete the streams directly, without // going through RemoveNnStream(), once stream objects handle @@ -1421,7 +1429,7 @@ bool WebRtcVoiceMediaChannel::SetSendParameters( const AudioSendParameters& params) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetSendParameters"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetSendParameters: " << params.ToString(); // TODO(pthatcher): Refactor this to be more clean now that we have @@ -1467,7 +1475,7 @@ bool WebRtcVoiceMediaChannel::SetRecvParameters( const AudioRecvParameters& params) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetRecvParameters"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetRecvParameters: " << params.ToString(); // TODO(pthatcher): Refactor this to be more clean now that we have @@ -1494,7 +1502,7 @@ webrtc::RtpParameters WebRtcVoiceMediaChannel::GetRtpSendParameters( uint32_t ssrc) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto it = send_streams_.find(ssrc); if (it == send_streams_.end()) { RTC_LOG(LS_WARNING) << "Attempting to get RTP send parameters for stream " @@ -1515,7 +1523,7 @@ webrtc::RTCError WebRtcVoiceMediaChannel::SetRtpSendParameters( uint32_t ssrc, const webrtc::RtpParameters& parameters) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto it = send_streams_.find(ssrc); if (it == send_streams_.end()) { RTC_LOG(LS_WARNING) << "Attempting to set RTP send parameters for stream " @@ -1570,7 +1578,7 @@ webrtc::RtpParameters WebRtcVoiceMediaChannel::GetRtpReceiveParameters( uint32_t ssrc) const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); webrtc::RtpParameters rtp_params; auto it = recv_streams_.find(ssrc); if (it == recv_streams_.end()) { @@ -1590,7 +1598,7 @@ webrtc::RtpParameters WebRtcVoiceMediaChannel::GetDefaultRtpReceiveParameters() const { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); webrtc::RtpParameters rtp_params; if (!default_sink_) { RTC_LOG(LS_WARNING) << "Attempting to get RTP parameters for the default, " @@ -1607,7 +1615,7 @@ } bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "Setting voice channel options: " << options.ToString(); // We retain all of the existing options, and apply the given ones @@ -1633,7 +1641,7 @@ bool WebRtcVoiceMediaChannel::SetRecvCodecs( const std::vector& codecs) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); // Set the payload types to be used for incoming media. RTC_LOG(LS_INFO) << "Setting receive voice codecs."; @@ -1691,21 +1699,22 @@ return true; } - if (playout_) { - // Receive codecs can not be changed while playing. So we temporarily - // pause playout. - ChangePlayout(false); - } + bool playout_enabled = playout_; + // Receive codecs can not be changed while playing. So we temporarily + // pause playout. + SetPlayout(false); + RTC_DCHECK(!playout_); decoder_map_ = std::move(decoder_map); for (auto& kv : recv_streams_) { kv.second->SetDecoderMap(decoder_map_); } + recv_codecs_ = codecs; - if (desired_playout_ && !playout_) { - ChangePlayout(desired_playout_); - } + SetPlayout(playout_enabled); + RTC_DCHECK_EQ(playout_, playout_enabled); + return true; } @@ -1714,7 +1723,7 @@ // and receive streams may be reconfigured based on the new settings. bool WebRtcVoiceMediaChannel::SetSendCodecs( const std::vector& codecs) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); dtmf_payload_type_ = absl::nullopt; dtmf_payload_freq_ = -1; @@ -1860,13 +1869,8 @@ } void WebRtcVoiceMediaChannel::SetPlayout(bool playout) { - desired_playout_ = playout; - return ChangePlayout(desired_playout_); -} - -void WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { - TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::ChangePlayout"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetPlayout"); + RTC_DCHECK_RUN_ON(worker_thread_); if (playout_ == playout) { return; } @@ -1909,7 +1913,7 @@ bool enable, const AudioOptions* options, AudioSource* source) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); // TODO(solenberg): The state change should be fully rolled back if any one of // these calls fail. if (!SetLocalSource(ssrc, source)) { @@ -1926,7 +1930,7 @@ bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::AddSendStream"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "AddSendStream: " << sp.ToString(); uint32_t ssrc = sp.first_ssrc(); @@ -1965,7 +1969,7 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::RemoveSendStream"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "RemoveSendStream: " << ssrc; auto it = send_streams_.find(ssrc); @@ -1991,7 +1995,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::AddRecvStream"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "AddRecvStream: " << sp.ToString(); if (!sp.has_ssrcs()) { @@ -2037,7 +2041,7 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::RemoveRecvStream"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; const auto it = recv_streams_.find(ssrc); @@ -2056,7 +2060,7 @@ } void WebRtcVoiceMediaChannel::ResetUnsignaledRecvStream() { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "ResetUnsignaledRecvStream."; unsignaled_stream_params_ = StreamParams(); // Create a copy since RemoveRecvStream will modify |unsignaled_recv_ssrcs_|. @@ -2066,6 +2070,13 @@ } } +// Not implemented. +// TODO(https://crbug.com/webrtc/12676): Implement a fix for the unsignalled +// SSRC race that can happen when an m= section goes from receiving to not +// receiving. +void WebRtcVoiceMediaChannel::OnDemuxerCriteriaUpdatePending() {} +void WebRtcVoiceMediaChannel::OnDemuxerCriteriaUpdateComplete() {} + bool WebRtcVoiceMediaChannel::SetLocalSource(uint32_t ssrc, AudioSource* source) { auto it = send_streams_.find(ssrc); @@ -2090,7 +2101,7 @@ } bool WebRtcVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << rtc::StringFormat("WRVMC::%s({ssrc=%u}, {volume=%.2f})", __func__, ssrc, volume); const auto it = recv_streams_.find(ssrc); @@ -2108,7 +2119,7 @@ } bool WebRtcVoiceMediaChannel::SetDefaultOutputVolume(double volume) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); default_recv_volume_ = volume; for (uint32_t ssrc : unsignaled_recv_ssrcs_) { const auto it = recv_streams_.find(ssrc); @@ -2125,7 +2136,7 @@ bool WebRtcVoiceMediaChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); std::vector ssrcs(1, ssrc); // SSRC of 0 represents the default receive stream. if (ssrc == 0) { @@ -2168,7 +2179,7 @@ void WebRtcVoiceMediaChannel::SetFrameDecryptor( uint32_t ssrc, rtc::scoped_refptr frame_decryptor) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto matching_stream = recv_streams_.find(ssrc); if (matching_stream != recv_streams_.end()) { matching_stream->second->SetFrameDecryptor(frame_decryptor); @@ -2182,7 +2193,7 @@ void WebRtcVoiceMediaChannel::SetFrameEncryptor( uint32_t ssrc, rtc::scoped_refptr frame_encryptor) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto matching_stream = send_streams_.find(ssrc); if (matching_stream != send_streams_.end()) { matching_stream->second->SetFrameEncryptor(frame_encryptor); @@ -2192,7 +2203,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, int event, int duration) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_INFO) << "WebRtcVoiceMediaChannel::InsertDtmf"; if (!CanInsertDtmf()) { return false; @@ -2215,85 +2226,93 @@ void WebRtcVoiceMediaChannel::OnPacketReceived(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); - - webrtc::PacketReceiver::DeliveryStatus delivery_result = - call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, packet, - packet_time_us); - - if (delivery_result != webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC) { - return; - } - - // Create an unsignaled receive stream for this previously not received ssrc. - // If there already is N unsignaled receive streams, delete the oldest. - // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5208 - uint32_t ssrc = 0; - if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) { - return; - } - RTC_DCHECK(!absl::c_linear_search(unsignaled_recv_ssrcs_, ssrc)); + RTC_DCHECK_RUN_ON(&network_thread_checker_); + // TODO(bugs.webrtc.org/11993): This code is very similar to what + // WebRtcVideoChannel::OnPacketReceived does. For maintainability and + // consistency it would be good to move the interaction with call_->Receiver() + // to a common implementation and provide a callback on the worker thread + // for the exception case (DELIVERY_UNKNOWN_SSRC) and how retry is attempted. + worker_thread_->PostTask(ToQueuedTask(task_safety_, [this, packet, + packet_time_us] { + RTC_DCHECK_RUN_ON(worker_thread_); + + webrtc::PacketReceiver::DeliveryStatus delivery_result = + call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, packet, + packet_time_us); - if (engine()->onUnknownAudioSsrc_) { - engine()->onUnknownAudioSsrc_(ssrc); - } + if (delivery_result != webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC) { + return; + } - // We don't want to process unsignalled streams - return; + // Create an unsignaled receive stream for this previously not received + // ssrc. If there already is N unsignaled receive streams, delete the + // oldest. See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5208 + uint32_t ssrc = 0; + if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) { + return; + } + RTC_DCHECK(!absl::c_linear_search(unsignaled_recv_ssrcs_, ssrc)); - // Add new stream. - StreamParams sp = unsignaled_stream_params_; - sp.ssrcs.push_back(ssrc); - RTC_LOG(LS_INFO) << "Creating unsignaled receive stream for SSRC=" << ssrc; - if (!AddRecvStream(sp)) { - RTC_LOG(LS_WARNING) << "Could not create unsignaled receive stream."; - return; - } - unsignaled_recv_ssrcs_.push_back(ssrc); - RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.NumOfUnsignaledStreams", - unsignaled_recv_ssrcs_.size(), 1, 100, 101); - - // Remove oldest unsignaled stream, if we have too many. - if (unsignaled_recv_ssrcs_.size() > kMaxUnsignaledRecvStreams) { - uint32_t remove_ssrc = unsignaled_recv_ssrcs_.front(); - RTC_DLOG(LS_INFO) << "Removing unsignaled receive stream with SSRC=" - << remove_ssrc; - RemoveRecvStream(remove_ssrc); - } - RTC_DCHECK_GE(kMaxUnsignaledRecvStreams, unsignaled_recv_ssrcs_.size()); - - SetOutputVolume(ssrc, default_recv_volume_); - SetBaseMinimumPlayoutDelayMs(ssrc, default_recv_base_minimum_delay_ms_); - - // The default sink can only be attached to one stream at a time, so we hook - // it up to the *latest* unsignaled stream we've seen, in order to support the - // case where the SSRC of one unsignaled stream changes. - if (default_sink_) { - for (uint32_t drop_ssrc : unsignaled_recv_ssrcs_) { - auto it = recv_streams_.find(drop_ssrc); - it->second->SetRawAudioSink(nullptr); + // Add new stream. + StreamParams sp = unsignaled_stream_params_; + sp.ssrcs.push_back(ssrc); + RTC_LOG(LS_INFO) << "Creating unsignaled receive stream for SSRC=" << ssrc; + if (!AddRecvStream(sp)) { + RTC_LOG(LS_WARNING) << "Could not create unsignaled receive stream."; + return; + } + unsignaled_recv_ssrcs_.push_back(ssrc); + RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.NumOfUnsignaledStreams", + unsignaled_recv_ssrcs_.size(), 1, 100, 101); + + // Remove oldest unsignaled stream, if we have too many. + if (unsignaled_recv_ssrcs_.size() > kMaxUnsignaledRecvStreams) { + uint32_t remove_ssrc = unsignaled_recv_ssrcs_.front(); + RTC_DLOG(LS_INFO) << "Removing unsignaled receive stream with SSRC=" + << remove_ssrc; + RemoveRecvStream(remove_ssrc); + } + RTC_DCHECK_GE(kMaxUnsignaledRecvStreams, unsignaled_recv_ssrcs_.size()); + + SetOutputVolume(ssrc, default_recv_volume_); + SetBaseMinimumPlayoutDelayMs(ssrc, default_recv_base_minimum_delay_ms_); + + // The default sink can only be attached to one stream at a time, so we hook + // it up to the *latest* unsignaled stream we've seen, in order to support + // the case where the SSRC of one unsignaled stream changes. + if (default_sink_) { + for (uint32_t drop_ssrc : unsignaled_recv_ssrcs_) { + auto it = recv_streams_.find(drop_ssrc); + it->second->SetRawAudioSink(nullptr); + } + std::unique_ptr proxy_sink( + new ProxySink(default_sink_.get())); + SetRawAudioSink(ssrc, std::move(proxy_sink)); } - std::unique_ptr proxy_sink( - new ProxySink(default_sink_.get())); - SetRawAudioSink(ssrc, std::move(proxy_sink)); - } - delivery_result = call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, - packet, packet_time_us); - RTC_DCHECK_NE(webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC, delivery_result); + delivery_result = call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, + packet, packet_time_us); + RTC_DCHECK_NE(webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC, + delivery_result); + })); } void WebRtcVoiceMediaChannel::OnNetworkRouteChanged( const std::string& transport_name, const rtc::NetworkRoute& network_route) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); - call_->GetTransportControllerSend()->OnNetworkRouteChanged(transport_name, - network_route); + RTC_DCHECK_RUN_ON(&network_thread_checker_); + call_->OnAudioTransportOverheadChanged(network_route.packet_overhead); + + worker_thread_->PostTask(ToQueuedTask( + task_safety_, [this, name = transport_name, route = network_route] { + RTC_DCHECK_RUN_ON(worker_thread_); + call_->GetTransportControllerSend()->OnNetworkRouteChanged(name, route); + })); } bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); const auto it = send_streams_.find(ssrc); if (it == send_streams_.end()) { RTC_LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; @@ -2331,7 +2350,7 @@ } void WebRtcVoiceMediaChannel::OnReadyToSend(bool ready) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(&network_thread_checker_); RTC_LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); call_->SignalChannelNetworkState( webrtc::MediaType::AUDIO, @@ -2341,7 +2360,7 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info, bool get_and_clear_legacy_stats) { TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::GetStats"); - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_DCHECK(info); // Get SSRC and stats for each sender. @@ -2449,6 +2468,13 @@ stats.relative_packet_arrival_delay_seconds; rinfo.interruption_count = stats.interruption_count; rinfo.total_interruption_duration_ms = stats.total_interruption_duration_ms; + rinfo.last_sender_report_timestamp_ms = + stats.last_sender_report_timestamp_ms; + rinfo.last_sender_report_remote_timestamp_ms = + stats.last_sender_report_remote_timestamp_ms; + rinfo.sender_reports_packets_sent = stats.sender_reports_packets_sent; + rinfo.sender_reports_bytes_sent = stats.sender_reports_bytes_sent; + rinfo.sender_reports_reports_count = stats.sender_reports_reports_count; info->receivers.push_back(rinfo); } @@ -2472,7 +2498,7 @@ void WebRtcVoiceMediaChannel::SetRawAudioSink( uint32_t ssrc, std::unique_ptr sink) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::SetRawAudioSink: ssrc:" << ssrc << " " << (sink ? "(ptr)" : "NULL"); const auto it = recv_streams_.find(ssrc); @@ -2485,7 +2511,7 @@ void WebRtcVoiceMediaChannel::SetDefaultRawAudioSink( std::unique_ptr sink) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); RTC_LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::SetDefaultRawAudioSink:"; if (!unsignaled_recv_ssrcs_.empty()) { std::unique_ptr proxy_sink( @@ -2509,7 +2535,7 @@ void WebRtcVoiceMediaChannel::SetEncoderToPacketizerFrameTransformer( uint32_t ssrc, rtc::scoped_refptr frame_transformer) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto matching_stream = send_streams_.find(ssrc); if (matching_stream == send_streams_.end()) { RTC_LOG(LS_INFO) << "Attempting to set frame transformer for SSRC:" << ssrc @@ -2523,7 +2549,7 @@ void WebRtcVoiceMediaChannel::SetDepacketizerToDecoderFrameTransformer( uint32_t ssrc, rtc::scoped_refptr frame_transformer) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto matching_stream = recv_streams_.find(ssrc); if (matching_stream == recv_streams_.end()) { RTC_LOG(LS_INFO) << "Attempting to set frame transformer for SSRC:" << ssrc @@ -2536,7 +2562,7 @@ bool WebRtcVoiceMediaChannel::MaybeDeregisterUnsignaledRecvStream( uint32_t ssrc) { - RTC_DCHECK(worker_thread_checker_.IsCurrent()); + RTC_DCHECK_RUN_ON(worker_thread_); auto it = absl::c_find(unsignaled_recv_ssrcs_, ssrc); if (it != unsignaled_recv_ssrcs_.end()) { unsignaled_recv_ssrcs_.erase(it); diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine.h libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine.h --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine.h 2021-06-27 05:27:48.000000000 +0000 @@ -18,6 +18,7 @@ #include "api/audio_codecs/audio_encoder_factory.h" #include "api/scoped_refptr.h" +#include "api/sequence_checker.h" #include "api/task_queue/task_queue_factory.h" #include "api/transport/rtp/rtp_source.h" #include "api/transport/webrtc_key_value_config.h" @@ -29,7 +30,7 @@ #include "rtc_base/buffer.h" #include "rtc_base/network_route.h" #include "rtc_base/task_queue.h" -#include "rtc_base/thread_checker.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" namespace webrtc { class AudioFrameProcessor; @@ -56,8 +57,7 @@ rtc::scoped_refptr audio_mixer, rtc::scoped_refptr audio_processing, webrtc::AudioFrameProcessor* audio_frame_processor, - const webrtc::WebRtcKeyValueConfig& trials, - std::function onUnknownAudioSsrc); + const webrtc::WebRtcKeyValueConfig& trials); WebRtcVoiceEngine() = delete; WebRtcVoiceEngine(const WebRtcVoiceEngine&) = delete; @@ -113,8 +113,8 @@ std::vector CollectCodecs( const std::vector& specs) const; - rtc::ThreadChecker signal_thread_checker_; - rtc::ThreadChecker worker_thread_checker_; + webrtc::SequenceChecker signal_thread_checker_; + webrtc::SequenceChecker worker_thread_checker_; // The audio device module. rtc::scoped_refptr adm_; @@ -146,8 +146,6 @@ // redundancy for opus audio. const bool audio_red_for_opus_trial_enabled_; const bool minimized_remsampling_on_mobile_trial_enabled_; - - std::function onUnknownAudioSsrc_ = nullptr; }; // WebRtcVoiceMediaChannel is an implementation of VoiceMediaChannel that uses @@ -189,6 +187,8 @@ bool AddRecvStream(const StreamParams& sp) override; bool RemoveRecvStream(uint32_t ssrc) override; void ResetUnsignaledRecvStream() override; + void OnDemuxerCriteriaUpdatePending() override; + void OnDemuxerCriteriaUpdateComplete() override; // E2EE Frame API // Set a frame decryptor to a particular ssrc that will intercept all @@ -279,7 +279,6 @@ bool MuteStream(uint32_t ssrc, bool mute); WebRtcVoiceEngine* engine() { return engine_; } - void ChangePlayout(bool playout); int CreateVoEChannel(); bool DeleteVoEChannel(int channel); bool SetMaxSendBitrate(int bps); @@ -288,7 +287,9 @@ // unsignaled anymore (i.e. it is now removed, or signaled), and return true. bool MaybeDeregisterUnsignaledRecvStream(uint32_t ssrc); - rtc::ThreadChecker worker_thread_checker_; + webrtc::TaskQueueBase* const worker_thread_; + webrtc::ScopedTaskSafety task_safety_; + webrtc::SequenceChecker network_thread_checker_; WebRtcVoiceEngine* const engine_ = nullptr; std::vector send_codecs_; @@ -304,7 +305,6 @@ int dtmf_payload_freq_ = -1; bool recv_transport_cc_enabled_ = false; bool recv_nack_enabled_ = false; - bool desired_playout_ = false; bool playout_ = false; bool send_ = false; webrtc::Call* const call_ = nullptr; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/engine/webrtc_voice_engine_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/engine/webrtc_voice_engine_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -277,6 +277,7 @@ void DeliverPacket(const void* data, int len) { rtc::CopyOnWriteBuffer packet(reinterpret_cast(data), len); channel_->OnPacketReceived(packet, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); } void TearDown() override { delete channel_; } @@ -1217,7 +1218,7 @@ parameters.encodings[0].adaptive_ptime = true; EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok()); EXPECT_TRUE(GetAudioNetworkAdaptorConfig(kSsrcX)); - EXPECT_EQ(12000, GetSendStreamConfig(kSsrcX).min_bitrate_bps); + EXPECT_EQ(16000, GetSendStreamConfig(kSsrcX).min_bitrate_bps); parameters.encodings[0].adaptive_ptime = false; EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters).ok()); @@ -3443,6 +3444,8 @@ call_.GetAudioReceiveStream(kAudioSsrc); EXPECT_EQ(0, s->received_packets()); channel_->OnPacketReceived(kPcmuPacket, /* packet_time_us */ -1); + rtc::Thread::Current()->ProcessMessages(0); + EXPECT_EQ(1, s->received_packets()); } diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport.cc --- libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport.cc 2021-06-27 05:27:48.000000000 +0000 @@ -20,6 +20,7 @@ // Successful return value from usrsctp callbacks. Is not actually used by // usrsctp, but all example programs for usrsctp use 1 as their return value. constexpr int kSctpSuccessReturn = 1; +constexpr int kSctpErrorReturn = 0; } // namespace @@ -33,6 +34,7 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" #include "absl/types/optional.h" +#include "api/sequence_checker.h" #include "media/base/codec.h" #include "media/base/media_channel.h" #include "media/base/media_constants.h" @@ -48,14 +50,24 @@ #include "rtc_base/synchronization/mutex.h" #include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/thread_annotations.h" -#include "rtc_base/thread_checker.h" #include "rtc_base/trace_event.h" namespace { // The biggest SCTP packet. Starting from a 'safe' wire MTU value of 1280, -// take off 80 bytes for DTLS/TURN/TCP/IP overhead. -static constexpr size_t kSctpMtu = 1200; +// take off 85 bytes for DTLS/TURN/TCP/IP and ciphertext overhead. +// +// Additionally, it's possible that TURN adds an additional 4 bytes of overhead +// after a channel has been established, so we subtract an additional 4 bytes. +// +// 1280 IPV6 MTU +// -40 IPV6 header +// -8 UDP +// -24 GCM Cipher +// -13 DTLS record header +// -4 TURN ChannelData +// = 1191 bytes. +static constexpr size_t kSctpMtu = 1191; // Set the initial value of the static SCTP Data Engines reference count. ABSL_CONST_INIT int g_usrsctp_usage_count = 0; @@ -81,59 +93,24 @@ PPID_TEXT_LAST = 51 }; -// Maps SCTP transport ID to SctpTransport object, necessary in send threshold -// callback and outgoing packet callback. -// TODO(crbug.com/1076703): Remove once the underlying problem is fixed or -// workaround is provided in usrsctp. -class SctpTransportMap { - public: - SctpTransportMap() = default; - - // Assigns a new unused ID to the following transport. - uintptr_t Register(cricket::SctpTransport* transport) { - webrtc::MutexLock lock(&lock_); - // usrsctp_connect fails with a value of 0... - if (next_id_ == 0) { - ++next_id_; - } - // In case we've wrapped around and need to find an empty spot from a - // removed transport. Assumes we'll never be full. - while (map_.find(next_id_) != map_.end()) { - ++next_id_; - if (next_id_ == 0) { - ++next_id_; - } - }; - map_[next_id_] = transport; - return next_id_++; - } +// Should only be modified by UsrSctpWrapper. +ABSL_CONST_INIT cricket::SctpTransportMap* g_transport_map_ = nullptr; - // Returns true if found. - bool Deregister(uintptr_t id) { - webrtc::MutexLock lock(&lock_); - return map_.erase(id) > 0; - } +// Helper that will call C's free automatically. +// TODO(b/181900299): Figure out why unique_ptr with a custom deleter is causing +// issues in a certain build environment. +class AutoFreedPointer { + public: + explicit AutoFreedPointer(void* ptr) : ptr_(ptr) {} + AutoFreedPointer(AutoFreedPointer&& o) : ptr_(o.ptr_) { o.ptr_ = nullptr; } + ~AutoFreedPointer() { free(ptr_); } - cricket::SctpTransport* Retrieve(uintptr_t id) const { - webrtc::MutexLock lock(&lock_); - auto it = map_.find(id); - if (it == map_.end()) { - return nullptr; - } - return it->second; - } + void* get() const { return ptr_; } private: - mutable webrtc::Mutex lock_; - - uintptr_t next_id_ RTC_GUARDED_BY(lock_) = 0; - std::unordered_map map_ - RTC_GUARDED_BY(lock_); + void* ptr_; }; -// Should only be modified by UsrSctpWrapper. -ABSL_CONST_INIT SctpTransportMap* g_transport_map_ = nullptr; - // Helper for logging SCTP messages. #if defined(__GNUC__) __attribute__((__format__(__printf__, 1, 2))) @@ -258,6 +235,71 @@ namespace cricket { +// Maps SCTP transport ID to SctpTransport object, necessary in send threshold +// callback and outgoing packet callback. It also provides a facility to +// safely post a task to an SctpTransport's network thread from another thread. +class SctpTransportMap { + public: + SctpTransportMap() = default; + + // Assigns a new unused ID to the following transport. + uintptr_t Register(cricket::SctpTransport* transport) { + webrtc::MutexLock lock(&lock_); + // usrsctp_connect fails with a value of 0... + if (next_id_ == 0) { + ++next_id_; + } + // In case we've wrapped around and need to find an empty spot from a + // removed transport. Assumes we'll never be full. + while (map_.find(next_id_) != map_.end()) { + ++next_id_; + if (next_id_ == 0) { + ++next_id_; + } + }; + map_[next_id_] = transport; + return next_id_++; + } + + // Returns true if found. + bool Deregister(uintptr_t id) { + webrtc::MutexLock lock(&lock_); + return map_.erase(id) > 0; + } + + // Posts |action| to the network thread of the transport identified by |id| + // and returns true if found, all while holding a lock to protect against the + // transport being simultaneously deleted/deregistered, or returns false if + // not found. + template + bool PostToTransportThread(uintptr_t id, F action) const { + webrtc::MutexLock lock(&lock_); + SctpTransport* transport = RetrieveWhileHoldingLock(id); + if (!transport) { + return false; + } + transport->network_thread_->PostTask(ToQueuedTask( + transport->task_safety_, + [transport, action{std::move(action)}]() { action(transport); })); + return true; + } + + private: + SctpTransport* RetrieveWhileHoldingLock(uintptr_t id) const + RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_) { + auto it = map_.find(id); + if (it == map_.end()) { + return nullptr; + } + return it->second; + } + + mutable webrtc::Mutex lock_; + + uintptr_t next_id_ RTC_GUARDED_BY(lock_) = 0; + std::unordered_map map_ RTC_GUARDED_BY(lock_); +}; + // Handles global init/deinit, and mapping from usrsctp callbacks to // SctpTransport calls. class SctpTransport::UsrSctpWrapper { @@ -370,14 +412,6 @@ << "OnSctpOutboundPacket called after usrsctp uninitialized?"; return EINVAL; } - SctpTransport* transport = - g_transport_map_->Retrieve(reinterpret_cast(addr)); - if (!transport) { - RTC_LOG(LS_ERROR) - << "OnSctpOutboundPacket: Failed to get transport for socket ID " - << addr; - return EINVAL; - } RTC_LOG(LS_VERBOSE) << "global OnSctpOutboundPacket():" "addr: " << addr << "; length: " << length @@ -385,13 +419,23 @@ << "; set_df: " << rtc::ToHex(set_df); VerboseLogPacket(data, length, SCTP_DUMP_OUTBOUND); + // Note: We have to copy the data; the caller will delete it. rtc::CopyOnWriteBuffer buf(reinterpret_cast(data), length); - transport->network_thread_->PostTask(ToQueuedTask( - transport->task_safety_, [transport, buf = std::move(buf)]() { + // PostsToTransportThread protects against the transport being + // simultaneously deregistered/deleted, since this callback may come from + // the SCTP timer thread and thus race with the network thread. + bool found = g_transport_map_->PostToTransportThread( + reinterpret_cast(addr), [buf](SctpTransport* transport) { transport->OnPacketFromSctpToNetwork(buf); - })); + }); + if (!found) { + RTC_LOG(LS_ERROR) + << "OnSctpOutboundPacket: Failed to get transport for socket ID " + << addr << "; possibly was already destroyed."; + return EINVAL; + } return 0; } @@ -407,28 +451,46 @@ struct sctp_rcvinfo rcv, int flags, void* ulp_info) { - SctpTransport* transport = GetTransportFromSocket(sock); - if (!transport) { + AutoFreedPointer owned_data(data); + + absl::optional id = GetTransportIdFromSocket(sock); + if (!id) { RTC_LOG(LS_ERROR) - << "OnSctpInboundPacket: Failed to get transport for socket " << sock - << "; possibly was already destroyed."; - free(data); - return 0; + << "OnSctpInboundPacket: Failed to get transport ID from socket " + << sock; + return kSctpErrorReturn; } - // Sanity check that both methods of getting the SctpTransport pointer - // yield the same result. - RTC_CHECK_EQ(transport, static_cast(ulp_info)); - int result = - transport->OnDataOrNotificationFromSctp(data, length, rcv, flags); - free(data); - return result; + + if (!g_transport_map_) { + RTC_LOG(LS_ERROR) + << "OnSctpInboundPacket called after usrsctp uninitialized?"; + return kSctpErrorReturn; + } + // PostsToTransportThread protects against the transport being + // simultaneously deregistered/deleted, since this callback may come from + // the SCTP timer thread and thus race with the network thread. + bool found = g_transport_map_->PostToTransportThread( + *id, [owned_data{std::move(owned_data)}, length, rcv, + flags](SctpTransport* transport) { + transport->OnDataOrNotificationFromSctp(owned_data.get(), length, rcv, + flags); + }); + if (!found) { + RTC_LOG(LS_ERROR) + << "OnSctpInboundPacket: Failed to get transport for socket ID " + << *id << "; possibly was already destroyed."; + return kSctpErrorReturn; + } + return kSctpSuccessReturn; } - static SctpTransport* GetTransportFromSocket(struct socket* sock) { + static absl::optional GetTransportIdFromSocket( + struct socket* sock) { + absl::optional ret; struct sockaddr* addrs = nullptr; int naddrs = usrsctp_getladdrs(sock, 0, &addrs); if (naddrs <= 0 || addrs[0].sa_family != AF_CONN) { - return nullptr; + return ret; } // usrsctp_getladdrs() returns the addresses bound to this socket, which // contains the SctpTransport id as sconn_addr. Read the id, @@ -437,17 +499,10 @@ // id of the transport that created them, so [0] is as good as any other. struct sockaddr_conn* sconn = reinterpret_cast(&addrs[0]); - if (!g_transport_map_) { - RTC_LOG(LS_ERROR) - << "GetTransportFromSocket called after usrsctp uninitialized?"; - usrsctp_freeladdrs(addrs); - return nullptr; - } - SctpTransport* transport = g_transport_map_->Retrieve( - reinterpret_cast(sconn->sconn_addr)); + ret = reinterpret_cast(sconn->sconn_addr); usrsctp_freeladdrs(addrs); - return transport; + return ret; } // TODO(crbug.com/webrtc/11899): This is a legacy callback signature, remove @@ -456,14 +511,26 @@ // Fired on our I/O thread. SctpTransport::OnPacketReceived() gets // a packet containing acknowledgments, which goes into usrsctp_conninput, // and then back here. - SctpTransport* transport = GetTransportFromSocket(sock); - if (!transport) { + absl::optional id = GetTransportIdFromSocket(sock); + if (!id) { + RTC_LOG(LS_ERROR) + << "SendThresholdCallback: Failed to get transport ID from socket " + << sock; + return 0; + } + if (!g_transport_map_) { RTC_LOG(LS_ERROR) - << "SendThresholdCallback: Failed to get transport for socket " - << sock << "; possibly was already destroyed."; + << "SendThresholdCallback called after usrsctp uninitialized?"; return 0; } - transport->OnSendThresholdCallback(); + bool found = g_transport_map_->PostToTransportThread( + *id, + [](SctpTransport* transport) { transport->OnSendThresholdCallback(); }); + if (!found) { + RTC_LOG(LS_ERROR) + << "SendThresholdCallback: Failed to get transport for socket ID " + << *id << "; possibly was already destroyed."; + } return 0; } @@ -473,17 +540,26 @@ // Fired on our I/O thread. SctpTransport::OnPacketReceived() gets // a packet containing acknowledgments, which goes into usrsctp_conninput, // and then back here. - SctpTransport* transport = GetTransportFromSocket(sock); - if (!transport) { + absl::optional id = GetTransportIdFromSocket(sock); + if (!id) { + RTC_LOG(LS_ERROR) + << "SendThresholdCallback: Failed to get transport ID from socket " + << sock; + return 0; + } + if (!g_transport_map_) { RTC_LOG(LS_ERROR) - << "SendThresholdCallback: Failed to get transport for socket " - << sock << "; possibly was already destroyed."; + << "SendThresholdCallback called after usrsctp uninitialized?"; return 0; } - // Sanity check that both methods of getting the SctpTransport pointer - // yield the same result. - RTC_CHECK_EQ(transport, static_cast(ulp_info)); - transport->OnSendThresholdCallback(); + bool found = g_transport_map_->PostToTransportThread( + *id, + [](SctpTransport* transport) { transport->OnSendThresholdCallback(); }); + if (!found) { + RTC_LOG(LS_ERROR) + << "SendThresholdCallback: Failed to get transport for socket ID " + << *id << "; possibly was already destroyed."; + } return 0; } }; @@ -644,6 +720,21 @@ ready_to_send_data_ = false; return false; } + + // Do not queue data to send on a closing stream. + auto it = stream_status_by_sid_.find(params.sid); + if (it == stream_status_by_sid_.end() || !it->second.is_open()) { + RTC_LOG(LS_WARNING) + << debug_name_ + << "->SendData(...): " + "Not sending data because sid is unknown or closing: " + << params.sid; + if (result) { + *result = SDR_ERROR; + } + return false; + } + size_t payload_size = payload.size(); OutgoingMessage message(payload, params); SendDataResult send_message_result = SendMessageInternal(&message); @@ -680,12 +771,11 @@ } if (message->send_params().type != DMT_CONTROL) { auto it = stream_status_by_sid_.find(message->send_params().sid); - if (it == stream_status_by_sid_.end() || !it->second.is_open()) { - RTC_LOG(LS_WARNING) - << debug_name_ - << "->SendMessageInternal(...): " - "Not sending data because sid is unknown or closing: " - << message->send_params().sid; + if (it == stream_status_by_sid_.end()) { + RTC_LOG(LS_WARNING) << debug_name_ + << "->SendMessageInternal(...): " + "Not sending data because sid is unknown: " + << message->send_params().sid; return SDR_ERROR; } } @@ -956,13 +1046,19 @@ bool SctpTransport::SendQueuedStreamResets() { RTC_DCHECK_RUN_ON(network_thread_); + auto needs_reset = + [this](const std::map::value_type& stream) { + // Ignore streams with partial outgoing messages as they are required to + // be fully sent by the WebRTC spec + // https://w3c.github.io/webrtc-pc/#closing-procedure + return stream.second.need_outgoing_reset() && + (!partial_outgoing_message_.has_value() || + partial_outgoing_message_.value().send_params().sid != + static_cast(stream.first)); + }; // Figure out how many streams need to be reset. We need to do this so we can // allocate the right amount of memory for the sctp_reset_streams structure. - size_t num_streams = absl::c_count_if( - stream_status_by_sid_, - [](const std::map::value_type& stream) { - return stream.second.need_outgoing_reset(); - }); + size_t num_streams = absl::c_count_if(stream_status_by_sid_, needs_reset); if (num_streams == 0) { // Nothing to reset. return true; @@ -981,12 +1077,10 @@ resetp->srs_number_streams = rtc::checked_cast(num_streams); int result_idx = 0; - for (const std::map::value_type& stream : - stream_status_by_sid_) { - if (!stream.second.need_outgoing_reset()) { - continue; + for (const auto& stream : stream_status_by_sid_) { + if (needs_reset(stream)) { + resetp->srs_stream_list[result_idx++] = stream.first; } - resetp->srs_stream_list[result_idx++] = stream.first; } int ret = @@ -1035,7 +1129,16 @@ return false; } RTC_DCHECK_EQ(0u, partial_outgoing_message_->size()); + + int sid = partial_outgoing_message_->send_params().sid; partial_outgoing_message_.reset(); + + // Send the queued stream reset if it was pending for this stream. + auto it = stream_status_by_sid_.find(sid); + if (it->second.need_outgoing_reset()) { + SendQueuedStreamResets(); + } + return true; } @@ -1135,24 +1238,25 @@ rtc::PacketOptions(), PF_NORMAL); } -int SctpTransport::InjectDataOrNotificationFromSctpForTesting( - void* data, +void SctpTransport::InjectDataOrNotificationFromSctpForTesting( + const void* data, size_t length, struct sctp_rcvinfo rcv, int flags) { - return OnDataOrNotificationFromSctp(data, length, rcv, flags); + OnDataOrNotificationFromSctp(data, length, rcv, flags); } -int SctpTransport::OnDataOrNotificationFromSctp(void* data, - size_t length, - struct sctp_rcvinfo rcv, - int flags) { +void SctpTransport::OnDataOrNotificationFromSctp(const void* data, + size_t length, + struct sctp_rcvinfo rcv, + int flags) { + RTC_DCHECK_RUN_ON(network_thread_); // If data is NULL, the SCTP association has been closed. if (!data) { RTC_LOG(LS_INFO) << debug_name_ << "->OnDataOrNotificationFromSctp(...): " "No data; association closed."; - return kSctpSuccessReturn; + return; } // Handle notifications early. @@ -1165,14 +1269,10 @@ << "->OnDataOrNotificationFromSctp(...): SCTP notification" << " length=" << length; - // Copy and dispatch asynchronously - rtc::CopyOnWriteBuffer notification(reinterpret_cast(data), + rtc::CopyOnWriteBuffer notification(reinterpret_cast(data), length); - network_thread_->PostTask(ToQueuedTask( - task_safety_, [this, notification = std::move(notification)]() { - OnNotificationFromSctp(notification); - })); - return kSctpSuccessReturn; + OnNotificationFromSctp(notification); + return; } // Log data chunk @@ -1190,7 +1290,7 @@ // Unexpected PPID, dropping RTC_LOG(LS_ERROR) << "Received an unknown PPID " << ppid << " on an SCTP packet. Dropping."; - return kSctpSuccessReturn; + return; } // Expect only continuation messages belonging to the same SID. The SCTP @@ -1216,7 +1316,7 @@ params.timestamp = 0; // Append the chunk's data to the message buffer - partial_incoming_message_.AppendData(reinterpret_cast(data), + partial_incoming_message_.AppendData(reinterpret_cast(data), length); partial_params_ = params; partial_flags_ = flags; @@ -1226,7 +1326,7 @@ if (partial_incoming_message_.size() < kSctpSendBufferSize) { // We still have space in the buffer. Continue buffering chunks until // the message is complete before handing it out. - return kSctpSuccessReturn; + return; } else { // The sender is exceeding the maximum message size that we announced. // Spit out a warning but still hand out the partial message. Note that @@ -1240,18 +1340,9 @@ } } - // Dispatch the complete message. - // The ownership of the packet transfers to |invoker_|. Using - // CopyOnWriteBuffer is the most convenient way to do this. - network_thread_->PostTask(webrtc::ToQueuedTask( - task_safety_, [this, params = std::move(params), - message = partial_incoming_message_]() { - OnDataFromSctpToTransport(params, message); - })); - - // Reset the message buffer + // Dispatch the complete message and reset the message buffer. + OnDataFromSctpToTransport(params, partial_incoming_message_); partial_incoming_message_.Clear(); - return kSctpSuccessReturn; } void SctpTransport::OnDataFromSctpToTransport( diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport.h libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport.h --- libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport.h 2021-06-27 05:27:48.000000000 +0000 @@ -96,10 +96,10 @@ void set_debug_name_for_testing(const char* debug_name) override { debug_name_ = debug_name; } - int InjectDataOrNotificationFromSctpForTesting(void* data, - size_t length, - struct sctp_rcvinfo rcv, - int flags); + void InjectDataOrNotificationFromSctpForTesting(const void* data, + size_t length, + struct sctp_rcvinfo rcv, + int flags); // Exposed to allow Post call from c-callbacks. // TODO(deadbeef): Remove this or at least make it return a const pointer. @@ -180,12 +180,12 @@ // Called using |invoker_| to send packet on the network. void OnPacketFromSctpToNetwork(const rtc::CopyOnWriteBuffer& buffer); - // Called on the SCTP thread. + // Called on the network thread. // Flags are standard socket API flags (RFC 6458). - int OnDataOrNotificationFromSctp(void* data, - size_t length, - struct sctp_rcvinfo rcv, - int flags); + void OnDataOrNotificationFromSctp(const void* data, + size_t length, + struct sctp_rcvinfo rcv, + int flags); // Called using |invoker_| to decide what to do with the data. void OnDataFromSctpToTransport(const ReceiveDataParams& params, const rtc::CopyOnWriteBuffer& buffer); @@ -281,6 +281,8 @@ // various callbacks. uintptr_t id_ = 0; + friend class SctpTransportMap; + RTC_DISALLOW_COPY_AND_ASSIGN(SctpTransport); }; @@ -299,6 +301,8 @@ rtc::Thread* network_thread_; }; +class SctpTransportMap; + } // namespace cricket #endif // MEDIA_SCTP_SCTP_TRANSPORT_H_ diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport_reliability_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport_reliability_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport_reliability_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport_reliability_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -7,12 +7,11 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ -#include "media/sctp/sctp_transport.h" - #include #include #include +#include "media/sctp/sctp_transport.h" #include "media/sctp/sctp_transport_internal.h" #include "rtc_base/async_invoker.h" #include "rtc_base/copy_on_write_buffer.h" @@ -20,6 +19,8 @@ #include "rtc_base/logging.h" #include "rtc_base/random.h" #include "rtc_base/synchronization/mutex.h" +#include "rtc_base/task_utils/pending_task_safety_flag.h" +#include "rtc_base/task_utils/to_queued_task.h" #include "rtc_base/thread.h" #include "test/gtest.h" @@ -169,14 +170,14 @@ } void Start() { - invoker_.AsyncInvoke(RTC_FROM_HERE, thread_, [this] { + thread_->PostTask(ToQueuedTask(task_safety_.flag(), [this] { if (started_) { RTC_LOG(LS_INFO) << sender_id_ << " sender is already started"; return; } started_ = true; SendNextMessage(); - }); + })); } uint64_t BytesSentCount() const { return num_bytes_sent_; } @@ -219,17 +220,16 @@ switch (result) { case cricket::SDR_BLOCK: // retry after timeout - invoker_.AsyncInvokeDelayed( - RTC_FROM_HERE, thread_, - rtc::Bind(&SctpDataSender::SendNextMessage, this), 500); + thread_->PostDelayedTask( + ToQueuedTask(task_safety_.flag(), [this] { SendNextMessage(); }), + 500); break; case cricket::SDR_SUCCESS: // send next num_bytes_sent_ += payload_.size(); ++num_messages_sent_; - invoker_.AsyncInvoke( - RTC_FROM_HERE, thread_, - rtc::Bind(&SctpDataSender::SendNextMessage, this)); + thread_->PostTask( + ToQueuedTask(task_safety_.flag(), [this] { SendNextMessage(); })); break; case cricket::SDR_ERROR: // give up @@ -246,11 +246,11 @@ const uint32_t sender_id_; rtc::CopyOnWriteBuffer payload_{std::string(1400, '.').c_str(), 1400}; std::atomic started_ ATOMIC_VAR_INIT(false); - rtc::AsyncInvoker invoker_; std::atomic num_messages_sent_ ATOMIC_VAR_INIT(0); rtc::Event sent_target_messages_count_{true, false}; std::atomic num_bytes_sent_ ATOMIC_VAR_INIT(0); absl::optional last_error_; + webrtc::ScopedTaskSafety task_safety_; RTC_DISALLOW_COPY_AND_ASSIGN(SctpDataSender); }; diff -Nru libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/media/sctp/sctp_transport_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/media/sctp/sctp_transport_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -282,8 +282,8 @@ meta.rcv_tsn = 42; meta.rcv_cumtsn = 42; chunk.SetData("meow?", 5); - EXPECT_EQ(1, transport1->InjectDataOrNotificationFromSctpForTesting( - chunk.data(), chunk.size(), meta, 0)); + transport1->InjectDataOrNotificationFromSctpForTesting(chunk.data(), + chunk.size(), meta, 0); // Inject a notification in between chunks. union sctp_notification notification; @@ -292,15 +292,15 @@ notification.sn_header.sn_type = SCTP_PEER_ADDR_CHANGE; notification.sn_header.sn_flags = 0; notification.sn_header.sn_length = sizeof(notification); - EXPECT_EQ(1, transport1->InjectDataOrNotificationFromSctpForTesting( - ¬ification, sizeof(notification), {0}, MSG_NOTIFICATION)); + transport1->InjectDataOrNotificationFromSctpForTesting( + ¬ification, sizeof(notification), {0}, MSG_NOTIFICATION); // Inject chunk 2/2 meta.rcv_tsn = 42; meta.rcv_cumtsn = 43; chunk.SetData(" rawr!", 6); - EXPECT_EQ(1, transport1->InjectDataOrNotificationFromSctpForTesting( - chunk.data(), chunk.size(), meta, MSG_EOR)); + transport1->InjectDataOrNotificationFromSctpForTesting( + chunk.data(), chunk.size(), meta, MSG_EOR); // Expect the message to contain both chunks. EXPECT_TRUE_WAIT(ReceivedData(&recv1, 1, "meow? rawr!"), kDefaultTimeout); @@ -518,6 +518,47 @@ EXPECT_EQ(2u, receiver2()->num_messages_received()); } +// Tests that a large message gets buffered and later sent by the SctpTransport +// when the sctp library only accepts the message partially during a stream +// reset. +TEST_P(SctpTransportTestWithOrdered, + SendLargeBufferedOutgoingMessageDuringReset) { + bool ordered = GetParam(); + SetupConnectedTransportsWithTwoStreams(); + SctpTransportObserver transport2_observer(transport2()); + + // Wait for initial SCTP association to be formed. + EXPECT_EQ_WAIT(1, transport1_ready_to_send_count(), kDefaultTimeout); + // Make the fake transport unwritable so that messages pile up for the SCTP + // socket. + fake_dtls1()->SetWritable(false); + SendDataResult result; + + // Fill almost all of sctp library's send buffer. + ASSERT_TRUE(SendData(transport1(), /*sid=*/1, + std::string(kSctpSendBufferSize / 2, 'a'), &result, + ordered)); + + std::string buffered_message(kSctpSendBufferSize, 'b'); + // SctpTransport accepts this message by buffering the second half. + ASSERT_TRUE( + SendData(transport1(), /*sid=*/1, buffered_message, &result, ordered)); + // Queue a stream reset + transport1()->ResetStream(/*sid=*/1); + + // Make the transport writable again and expect a "SignalReadyToSendData" at + // some point after sending the buffered message. + fake_dtls1()->SetWritable(true); + EXPECT_EQ_WAIT(2, transport1_ready_to_send_count(), kDefaultTimeout); + + // Queued message should be received by the receiver before receiving the + // reset + EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, buffered_message), + kDefaultTimeout); + EXPECT_EQ(2u, receiver2()->num_messages_received()); + EXPECT_TRUE_WAIT(transport2_observer.WasStreamClosed(1), kDefaultTimeout); +} + TEST_P(SctpTransportTestWithOrdered, SendData) { bool ordered = GetParam(); SetupConnectedTransportsWithTwoStreams(); @@ -589,7 +630,7 @@ params.sid = 1; params.ordered = GetParam(); rtc::CopyOnWriteBuffer buf(1024); - memset(buf.data(), 0, 1024); + memset(buf.MutableData(), 0, 1024); SendDataResult result; size_t message_count = 0; for (; message_count < kMaxMessages; ++message_count) { diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/modules/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/modules/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -47,7 +47,7 @@ sources = [ "include/module_fec_types.h" ] } -if (rtc_include_tests) { +if (rtc_include_tests && !build_with_chromium) { modules_tests_resources = [ "../resources/audio_coding/testfile16kHz.pcm", "../resources/audio_coding/testfile32kHz.pcm", diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/async_audio_processing/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/modules/async_audio_processing/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/modules/async_audio_processing/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/async_audio_processing/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -18,13 +18,13 @@ deps = [ "../../api:scoped_refptr", + "../../api:sequence_checker", "../../api/audio:audio_frame_api", "../../api/audio:audio_frame_processor", "../../api/task_queue:task_queue", "../../rtc_base:checks", "../../rtc_base:rtc_base_approved", "../../rtc_base:rtc_task_queue", - "../../rtc_base/synchronization:sequence_checker", ] } diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/BUILD.gn libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/BUILD.gn --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/BUILD.gn 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/BUILD.gn 2021-06-27 05:27:48.000000000 +0000 @@ -17,7 +17,6 @@ rtc_source_set("audio_coding_module_typedefs") { visibility += [ "*" ] sources = [ "include/audio_coding_module_typedefs.h" ] - deps = [ "../../rtc_base:deprecation" ] } rtc_library("audio_coding") { @@ -52,7 +51,6 @@ "../../common_audio:common_audio_c", "../../rtc_base:audio_format_to_string", "../../rtc_base:checks", - "../../rtc_base:deprecation", "../../rtc_base:rtc_base_approved", "../../rtc_base/synchronization:mutex", "../../system_wrappers", @@ -368,8 +366,8 @@ "../../rtc_base:rtc_base_approved", "../../rtc_base:sanitizer", "../../rtc_base/system:arch", - "../../rtc_base/system:unused", ] + absl_deps = [ "//third_party/abseil-cpp/absl/base:core_headers" ] } rtc_source_set("isac_common") { @@ -831,6 +829,7 @@ } deps = [ + "../../api:array_view", "../../rtc_base:checks", "../../rtc_base:ignore_wundef", "../../rtc_base:rtc_base_approved", @@ -1301,36 +1300,39 @@ ] } - group("audio_coding_tests") { - visibility += webrtc_default_visibility - testonly = true - public_deps = [ - ":acm_receive_test", - ":acm_send_test", - ":audio_codec_speed_tests", - ":audio_decoder_unittests", - ":audio_decoder_unittests", - ":g711_test", - ":g722_test", - ":ilbc_test", - ":isac_api_test", - ":isac_fix_test", - ":isac_switch_samprate_test", - ":isac_test", - ":neteq_ilbc_quality_test", - ":neteq_isac_quality_test", - ":neteq_opus_quality_test", - ":neteq_pcm16b_quality_test", - ":neteq_pcmu_quality_test", - ":neteq_speed_test", - ":rtp_analyze", - ":rtp_encode", - ":rtp_jitter", - ":rtpcat", - ":webrtc_opus_fec_test", - ] - if (rtc_enable_protobuf) { - public_deps += [ ":neteq_rtpplay" ] + if (!build_with_chromium) { + group("audio_coding_tests") { + visibility += webrtc_default_visibility + testonly = true + public_deps = [ # no-presubmit-check TODO(webrtc:8603) + ":acm_receive_test", + ":acm_send_test", + ":audio_codec_speed_tests", + ":audio_decoder_unittests", + ":audio_decoder_unittests", + ":g711_test", + ":g722_test", + ":ilbc_test", + ":isac_api_test", + ":isac_fix_test", + ":isac_switch_samprate_test", + ":isac_test", + ":neteq_ilbc_quality_test", + ":neteq_isac_quality_test", + ":neteq_opus_quality_test", + ":neteq_pcm16b_quality_test", + ":neteq_pcmu_quality_test", + ":neteq_speed_test", + ":rtp_analyze", + ":rtp_encode", + ":rtp_jitter", + ":rtpcat", + ":webrtc_opus_fec_test", + ] + if (rtc_enable_protobuf) { + public_deps += # no-presubmit-check TODO(webrtc:8603) + [ ":neteq_rtpplay" ] + } } } @@ -1454,7 +1456,6 @@ defines = audio_coding_defines deps = audio_coding_deps + [ - "//third_party/abseil-cpp/absl/strings", "../../api/audio:audio_frame_api", "../../rtc_base:checks", ":audio_coding", @@ -1466,49 +1467,53 @@ "../../test:test_support", "//testing/gtest", ] - } - - audio_decoder_unittests_resources = - [ "../../resources/audio_coding/testfile32kHz.pcm" ] - if (is_ios) { - bundle_data("audio_decoder_unittests_bundle_data") { - testonly = true - sources = audio_decoder_unittests_resources - outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] - } + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } - rtc_test("audio_decoder_unittests") { - testonly = true - sources = [ "neteq/audio_decoder_unittest.cc" ] + if (!build_with_chromium) { + audio_decoder_unittests_resources = + [ "../../resources/audio_coding/testfile32kHz.pcm" ] - defines = neteq_defines + if (is_ios) { + bundle_data("audio_decoder_unittests_bundle_data") { + testonly = true + sources = audio_decoder_unittests_resources + outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] + } + } - deps = [ - ":ilbc", - ":isac", - ":isac_fix", - ":neteq", - ":neteq_tools", - "../../test:fileutils", - "../../api/audio_codecs:audio_codecs_api", - "../../api/audio_codecs/opus:audio_encoder_opus", - "../../common_audio", - "../../rtc_base/system:arch", - "../../test:test_main", - "//testing/gtest", - "../../test:test_support", - ] + audio_coding_deps + rtc_test("audio_decoder_unittests") { + testonly = true + sources = [ "neteq/audio_decoder_unittest.cc" ] - data = audio_decoder_unittests_resources + defines = neteq_defines - if (is_android) { - deps += [ "//testing/android/native_test:native_test_native_code" ] - shard_timeout = 900 - } - if (is_ios) { - deps += [ ":audio_decoder_unittests_bundle_data" ] + deps = [ + ":ilbc", + ":isac", + ":isac_fix", + ":neteq", + ":neteq_tools", + "../../test:fileutils", + "../../api/audio_codecs:audio_codecs_api", + "../../api/audio_codecs/opus:audio_encoder_opus", + "../../common_audio", + "../../rtc_base/system:arch", + "../../test:test_main", + "//testing/gtest", + "../../test:test_support", + ] + audio_coding_deps + + data = audio_decoder_unittests_resources + + if (is_android) { + deps += [ "//testing/android/native_test:native_test_native_code" ] + shard_timeout = 900 + } + if (is_ios) { + deps += [ ":audio_decoder_unittests_bundle_data" ] + } } } @@ -1538,7 +1543,9 @@ "../../test:test_support", ] } + } + if (rtc_enable_protobuf && !build_with_chromium) { rtc_executable("neteq_rtpplay") { testonly = true visibility += [ "*" ] @@ -1559,51 +1566,53 @@ } } - audio_codec_speed_tests_resources = [ - "//resources/audio_coding/music_stereo_48kHz.pcm", - "//resources/audio_coding/speech_mono_16kHz.pcm", - "//resources/audio_coding/speech_mono_32_48kHz.pcm", - ] + if (!build_with_chromium) { + audio_codec_speed_tests_resources = [ + "//resources/audio_coding/music_stereo_48kHz.pcm", + "//resources/audio_coding/speech_mono_16kHz.pcm", + "//resources/audio_coding/speech_mono_32_48kHz.pcm", + ] - if (is_ios) { - bundle_data("audio_codec_speed_tests_data") { - testonly = true - sources = audio_codec_speed_tests_resources - outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] + if (is_ios) { + bundle_data("audio_codec_speed_tests_data") { + testonly = true + sources = audio_codec_speed_tests_resources + outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] + } } - } - rtc_test("audio_codec_speed_tests") { - testonly = true - defines = [] - deps = [ "../../test:fileutils" ] - sources = [ - "codecs/isac/fix/test/isac_speed_test.cc", - "codecs/opus/opus_speed_test.cc", - "codecs/tools/audio_codec_speed_test.cc", - "codecs/tools/audio_codec_speed_test.h", - ] + rtc_test("audio_codec_speed_tests") { + testonly = true + defines = [] + deps = [ "../../test:fileutils" ] + sources = [ + "codecs/isac/fix/test/isac_speed_test.cc", + "codecs/opus/opus_speed_test.cc", + "codecs/tools/audio_codec_speed_test.cc", + "codecs/tools/audio_codec_speed_test.h", + ] - data = audio_codec_speed_tests_resources + data = audio_codec_speed_tests_resources - if (is_android) { - deps += [ "//testing/android/native_test:native_test_native_code" ] - shard_timeout = 900 - } + if (is_android) { + deps += [ "//testing/android/native_test:native_test_native_code" ] + shard_timeout = 900 + } + + if (is_ios) { + deps += [ ":audio_codec_speed_tests_data" ] + } - if (is_ios) { - deps += [ ":audio_codec_speed_tests_data" ] + deps += [ + ":isac_fix", + ":webrtc_opus", + "../../rtc_base:rtc_base_approved", + "../../test:test_main", + "../../test:test_support", + "../audio_processing", + "//testing/gtest", + ] } - - deps += [ - ":isac_fix", - ":webrtc_opus", - "../../rtc_base:rtc_base_approved", - "../../test:test_main", - "../../test:test_support", - "../audio_processing", - "//testing/gtest", - ] } rtc_library("neteq_test_support") { @@ -1631,210 +1640,212 @@ ] } - rtc_library("neteq_quality_test_support") { - testonly = true - sources = [ - "neteq/tools/neteq_quality_test.cc", - "neteq/tools/neteq_quality_test.h", - ] + if (!build_with_chromium) { + rtc_library("neteq_quality_test_support") { + testonly = true + sources = [ + "neteq/tools/neteq_quality_test.cc", + "neteq/tools/neteq_quality_test.h", + ] - deps = [ - ":default_neteq_factory", - ":neteq", - ":neteq_test_tools", - "../../api/audio_codecs:builtin_audio_decoder_factory", - "../../api/neteq:neteq_api", - "../../rtc_base:checks", - "../../system_wrappers", - "../../test:fileutils", - "../../test:test_support", - "//testing/gtest", - ] - absl_deps = [ "//third_party/abseil-cpp/absl/flags:flag" ] - } + deps = [ + ":default_neteq_factory", + ":neteq", + ":neteq_test_tools", + "../../api/audio_codecs:builtin_audio_decoder_factory", + "../../api/neteq:neteq_api", + "../../rtc_base:checks", + "../../system_wrappers", + "../../test:fileutils", + "../../test:test_support", + "//testing/gtest", + ] + absl_deps = [ "//third_party/abseil-cpp/absl/flags:flag" ] + } - rtc_executable("rtp_encode") { - testonly = true + rtc_executable("rtp_encode") { + testonly = true - deps = audio_coding_deps + [ - "//third_party/abseil-cpp/absl/flags:flag", - "//third_party/abseil-cpp/absl/flags:parse", - ":audio_coding", - ":audio_encoder_cng", - ":neteq_input_audio_tools", - "../../api/audio:audio_frame_api", - "../../api/audio_codecs/g711:audio_encoder_g711", - "../../api/audio_codecs/L16:audio_encoder_L16", - "../../api/audio_codecs/g722:audio_encoder_g722", - "../../api/audio_codecs/ilbc:audio_encoder_ilbc", - "../../api/audio_codecs/isac:audio_encoder_isac", - "../../api/audio_codecs/opus:audio_encoder_opus", - "../../rtc_base:safe_conversions", - "//third_party/abseil-cpp/absl/memory", - ] + deps = audio_coding_deps + [ + ":audio_coding", + ":audio_encoder_cng", + ":neteq_input_audio_tools", + "../../api/audio:audio_frame_api", + "../../api/audio_codecs/g711:audio_encoder_g711", + "../../api/audio_codecs/L16:audio_encoder_L16", + "../../api/audio_codecs/g722:audio_encoder_g722", + "../../api/audio_codecs/ilbc:audio_encoder_ilbc", + "../../api/audio_codecs/isac:audio_encoder_isac", + "../../api/audio_codecs/opus:audio_encoder_opus", + "../../rtc_base:safe_conversions", + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/flags:parse", + "//third_party/abseil-cpp/absl/memory", + ] - sources = [ "neteq/tools/rtp_encode.cc" ] + sources = [ "neteq/tools/rtp_encode.cc" ] - defines = audio_coding_defines - } + defines = audio_coding_defines + } - rtc_executable("rtp_jitter") { - testonly = true + rtc_executable("rtp_jitter") { + testonly = true - deps = audio_coding_deps + [ - "../rtp_rtcp:rtp_rtcp_format", - "../../api:array_view", - "../../rtc_base:rtc_base_approved", - ] + deps = audio_coding_deps + [ + "../rtp_rtcp:rtp_rtcp_format", + "../../api:array_view", + "../../rtc_base:rtc_base_approved", + ] - sources = [ "neteq/tools/rtp_jitter.cc" ] + sources = [ "neteq/tools/rtp_jitter.cc" ] - defines = audio_coding_defines - } + defines = audio_coding_defines + } - rtc_executable("rtpcat") { - testonly = true + rtc_executable("rtpcat") { + testonly = true - sources = [ "neteq/tools/rtpcat.cc" ] + sources = [ "neteq/tools/rtpcat.cc" ] - deps = [ - "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", - "../../test:rtp_test_utils", - "//testing/gtest", - ] - } + deps = [ + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + "../../test:rtp_test_utils", + "//testing/gtest", + ] + } - rtc_executable("rtp_analyze") { - testonly = true + rtc_executable("rtp_analyze") { + testonly = true - sources = [ "neteq/tools/rtp_analyze.cc" ] + sources = [ "neteq/tools/rtp_analyze.cc" ] - deps = [ - ":neteq", - ":neteq_test_tools", - ":pcm16b", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - "//third_party/abseil-cpp/absl/flags:parse", - ] - } + deps = [ + ":neteq", + ":neteq_test_tools", + ":pcm16b", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/flags:parse", + ] + } - rtc_executable("neteq_opus_quality_test") { - testonly = true + rtc_executable("neteq_opus_quality_test") { + testonly = true - sources = [ "neteq/test/neteq_opus_quality_test.cc" ] + sources = [ "neteq/test/neteq_opus_quality_test.cc" ] - deps = [ - ":neteq", - ":neteq_quality_test_support", - ":neteq_tools", - ":webrtc_opus", - "../../rtc_base:rtc_base_approved", - "../../test:test_main", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - ] - } + deps = [ + ":neteq", + ":neteq_quality_test_support", + ":neteq_tools", + ":webrtc_opus", + "../../rtc_base:rtc_base_approved", + "../../test:test_main", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + ] + } - rtc_executable("neteq_speed_test") { - testonly = true + rtc_executable("neteq_speed_test") { + testonly = true - sources = [ "neteq/test/neteq_speed_test.cc" ] + sources = [ "neteq/test/neteq_speed_test.cc" ] - deps = [ - ":neteq", - ":neteq_test_support", - "../../rtc_base:checks", - "../../test:test_support", - "//third_party/abseil-cpp/absl/flags:flag", - "//third_party/abseil-cpp/absl/flags:parse", - ] - } + deps = [ + ":neteq", + ":neteq_test_support", + "../../rtc_base:checks", + "../../test:test_support", + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/flags:parse", + ] + } - rtc_executable("neteq_ilbc_quality_test") { - testonly = true + rtc_executable("neteq_ilbc_quality_test") { + testonly = true - sources = [ "neteq/test/neteq_ilbc_quality_test.cc" ] + sources = [ "neteq/test/neteq_ilbc_quality_test.cc" ] - deps = [ - ":ilbc", - ":neteq", - ":neteq_quality_test_support", - ":neteq_tools", - "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", - "../../test:fileutils", - "../../test:test_main", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - ] - } + deps = [ + ":ilbc", + ":neteq", + ":neteq_quality_test_support", + ":neteq_tools", + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + "../../test:fileutils", + "../../test:test_main", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + ] + } - rtc_executable("neteq_isac_quality_test") { - testonly = true + rtc_executable("neteq_isac_quality_test") { + testonly = true - sources = [ "neteq/test/neteq_isac_quality_test.cc" ] + sources = [ "neteq/test/neteq_isac_quality_test.cc" ] - deps = [ - ":isac_fix", - ":neteq", - ":neteq_quality_test_support", - "../../rtc_base:rtc_base_approved", - "../../test:test_main", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - ] - } + deps = [ + ":isac_fix", + ":neteq", + ":neteq_quality_test_support", + "../../rtc_base:rtc_base_approved", + "../../test:test_main", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + ] + } - rtc_executable("neteq_pcmu_quality_test") { - testonly = true + rtc_executable("neteq_pcmu_quality_test") { + testonly = true - sources = [ "neteq/test/neteq_pcmu_quality_test.cc" ] + sources = [ "neteq/test/neteq_pcmu_quality_test.cc" ] - deps = [ - ":g711", - ":neteq", - ":neteq_quality_test_support", - "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", - "../../test:fileutils", - "../../test:test_main", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - ] - } + deps = [ + ":g711", + ":neteq", + ":neteq_quality_test_support", + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + "../../test:fileutils", + "../../test:test_main", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + ] + } - rtc_executable("neteq_pcm16b_quality_test") { - testonly = true + rtc_executable("neteq_pcm16b_quality_test") { + testonly = true - sources = [ "neteq/test/neteq_pcm16b_quality_test.cc" ] + sources = [ "neteq/test/neteq_pcm16b_quality_test.cc" ] - deps = [ - ":neteq", - ":neteq_quality_test_support", - ":pcm16b", - "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", - "../../test:fileutils", - "../../test:test_main", - "//testing/gtest", - "//third_party/abseil-cpp/absl/flags:flag", - ] - } + deps = [ + ":neteq", + ":neteq_quality_test_support", + ":pcm16b", + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + "../../test:fileutils", + "../../test:test_main", + "//testing/gtest", + "//third_party/abseil-cpp/absl/flags:flag", + ] + } - rtc_executable("isac_fix_test") { - testonly = true + rtc_executable("isac_fix_test") { + testonly = true - sources = [ "codecs/isac/fix/test/kenny.cc" ] + sources = [ "codecs/isac/fix/test/kenny.cc" ] - deps = [ - ":isac_fix", - "../../test:perf_test", - "../../test:test_support", - ] + deps = [ + ":isac_fix", + "../../test:perf_test", + "../../test:test_support", + ] - data = [ "../../resources/speech_and_misc_wb.pcm" ] + data = [ "../../resources/speech_and_misc_wb.pcm" ] + } } rtc_library("isac_test_util") { @@ -1845,16 +1856,18 @@ ] } - rtc_executable("isac_test") { - testonly = true + if (!build_with_chromium) { + rtc_executable("isac_test") { + testonly = true - sources = [ "codecs/isac/main/test/simpleKenny.c" ] + sources = [ "codecs/isac/main/test/simpleKenny.c" ] - deps = [ - ":isac", - ":isac_test_util", - "../../rtc_base:rtc_base_approved", - ] + deps = [ + ":isac", + ":isac_test_util", + "../../rtc_base:rtc_base_approved", + ] + } } rtc_executable("g711_test") { @@ -1873,225 +1886,228 @@ deps = [ ":g722" ] } - rtc_executable("isac_api_test") { - testonly = true + if (!build_with_chromium) { + rtc_executable("isac_api_test") { + testonly = true - sources = [ "codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc" ] + sources = [ "codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc" ] - deps = [ - ":isac", - ":isac_test_util", - "../../rtc_base:rtc_base_approved", - ] - } + deps = [ + ":isac", + ":isac_test_util", + "../../rtc_base:rtc_base_approved", + ] + } - rtc_executable("isac_switch_samprate_test") { - testonly = true + rtc_executable("isac_switch_samprate_test") { + testonly = true - sources = [ "codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc" ] + sources = + [ "codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc" ] - deps = [ - ":isac", - ":isac_test_util", - "../../common_audio", - "../../common_audio:common_audio_c", - ] - } + deps = [ + ":isac", + ":isac_test_util", + "../../common_audio", + "../../common_audio:common_audio_c", + ] + } - rtc_executable("ilbc_test") { - testonly = true + rtc_executable("ilbc_test") { + testonly = true - sources = [ "codecs/ilbc/test/iLBC_test.c" ] + sources = [ "codecs/ilbc/test/iLBC_test.c" ] - deps = [ ":ilbc" ] - } + deps = [ ":ilbc" ] + } - rtc_executable("webrtc_opus_fec_test") { - testonly = true + rtc_executable("webrtc_opus_fec_test") { + testonly = true - sources = [ "codecs/opus/opus_fec_test.cc" ] + sources = [ "codecs/opus/opus_fec_test.cc" ] - deps = [ - ":webrtc_opus", - "../../common_audio", - "../../rtc_base:rtc_base_approved", - "../../test:fileutils", - "../../test:test_main", - "../../test:test_support", - "//testing/gtest", - ] - } + deps = [ + ":webrtc_opus", + "../../common_audio", + "../../rtc_base:rtc_base_approved", + "../../test:fileutils", + "../../test:test_main", + "../../test:test_support", + "//testing/gtest", + ] + } - rtc_library("audio_coding_unittests") { - testonly = true - visibility += webrtc_default_visibility + rtc_library("audio_coding_unittests") { + testonly = true + visibility += webrtc_default_visibility - sources = [ - "acm2/acm_receiver_unittest.cc", - "acm2/acm_remixing_unittest.cc", - "acm2/audio_coding_module_unittest.cc", - "acm2/call_statistics_unittest.cc", - "audio_network_adaptor/audio_network_adaptor_impl_unittest.cc", - "audio_network_adaptor/bitrate_controller_unittest.cc", - "audio_network_adaptor/channel_controller_unittest.cc", - "audio_network_adaptor/controller_manager_unittest.cc", - "audio_network_adaptor/dtx_controller_unittest.cc", - "audio_network_adaptor/event_log_writer_unittest.cc", - "audio_network_adaptor/fec_controller_plr_based_unittest.cc", - "audio_network_adaptor/frame_length_controller_unittest.cc", - "audio_network_adaptor/frame_length_controller_v2_unittest.cc", - "audio_network_adaptor/util/threshold_curve_unittest.cc", - "codecs/builtin_audio_decoder_factory_unittest.cc", - "codecs/builtin_audio_encoder_factory_unittest.cc", - "codecs/cng/audio_encoder_cng_unittest.cc", - "codecs/cng/cng_unittest.cc", - "codecs/ilbc/ilbc_unittest.cc", - "codecs/isac/fix/source/filterbanks_unittest.cc", - "codecs/isac/fix/source/filters_unittest.cc", - "codecs/isac/fix/source/lpc_masking_model_unittest.cc", - "codecs/isac/fix/source/transform_unittest.cc", - "codecs/isac/isac_webrtc_api_test.cc", - "codecs/isac/main/source/audio_encoder_isac_unittest.cc", - "codecs/isac/main/source/isac_unittest.cc", - "codecs/legacy_encoded_audio_frame_unittest.cc", - "codecs/opus/audio_decoder_multi_channel_opus_unittest.cc", - "codecs/opus/audio_encoder_multi_channel_opus_unittest.cc", - "codecs/opus/audio_encoder_opus_unittest.cc", - "codecs/opus/opus_bandwidth_unittest.cc", - "codecs/opus/opus_unittest.cc", - "codecs/red/audio_encoder_copy_red_unittest.cc", - "neteq/audio_multi_vector_unittest.cc", - "neteq/audio_vector_unittest.cc", - "neteq/background_noise_unittest.cc", - "neteq/buffer_level_filter_unittest.cc", - "neteq/comfort_noise_unittest.cc", - "neteq/decision_logic_unittest.cc", - "neteq/decoder_database_unittest.cc", - "neteq/delay_manager_unittest.cc", - "neteq/dsp_helper_unittest.cc", - "neteq/dtmf_buffer_unittest.cc", - "neteq/dtmf_tone_generator_unittest.cc", - "neteq/expand_unittest.cc", - "neteq/histogram_unittest.cc", - "neteq/merge_unittest.cc", - "neteq/mock/mock_buffer_level_filter.h", - "neteq/mock/mock_decoder_database.h", - "neteq/mock/mock_delay_manager.h", - "neteq/mock/mock_dtmf_buffer.h", - "neteq/mock/mock_dtmf_tone_generator.h", - "neteq/mock/mock_expand.h", - "neteq/mock/mock_histogram.h", - "neteq/mock/mock_neteq_controller.h", - "neteq/mock/mock_packet_buffer.h", - "neteq/mock/mock_red_payload_splitter.h", - "neteq/mock/mock_statistics_calculator.h", - "neteq/nack_tracker_unittest.cc", - "neteq/neteq_decoder_plc_unittest.cc", - "neteq/neteq_impl_unittest.cc", - "neteq/neteq_network_stats_unittest.cc", - "neteq/neteq_stereo_unittest.cc", - "neteq/neteq_unittest.cc", - "neteq/normal_unittest.cc", - "neteq/packet_buffer_unittest.cc", - "neteq/post_decode_vad_unittest.cc", - "neteq/random_vector_unittest.cc", - "neteq/red_payload_splitter_unittest.cc", - "neteq/statistics_calculator_unittest.cc", - "neteq/sync_buffer_unittest.cc", - "neteq/time_stretch_unittest.cc", - "neteq/timestamp_scaler_unittest.cc", - "neteq/tools/input_audio_file_unittest.cc", - "neteq/tools/packet_unittest.cc", - ] + sources = [ + "acm2/acm_receiver_unittest.cc", + "acm2/acm_remixing_unittest.cc", + "acm2/audio_coding_module_unittest.cc", + "acm2/call_statistics_unittest.cc", + "audio_network_adaptor/audio_network_adaptor_impl_unittest.cc", + "audio_network_adaptor/bitrate_controller_unittest.cc", + "audio_network_adaptor/channel_controller_unittest.cc", + "audio_network_adaptor/controller_manager_unittest.cc", + "audio_network_adaptor/dtx_controller_unittest.cc", + "audio_network_adaptor/event_log_writer_unittest.cc", + "audio_network_adaptor/fec_controller_plr_based_unittest.cc", + "audio_network_adaptor/frame_length_controller_unittest.cc", + "audio_network_adaptor/frame_length_controller_v2_unittest.cc", + "audio_network_adaptor/util/threshold_curve_unittest.cc", + "codecs/builtin_audio_decoder_factory_unittest.cc", + "codecs/builtin_audio_encoder_factory_unittest.cc", + "codecs/cng/audio_encoder_cng_unittest.cc", + "codecs/cng/cng_unittest.cc", + "codecs/ilbc/ilbc_unittest.cc", + "codecs/isac/fix/source/filterbanks_unittest.cc", + "codecs/isac/fix/source/filters_unittest.cc", + "codecs/isac/fix/source/lpc_masking_model_unittest.cc", + "codecs/isac/fix/source/transform_unittest.cc", + "codecs/isac/isac_webrtc_api_test.cc", + "codecs/isac/main/source/audio_encoder_isac_unittest.cc", + "codecs/isac/main/source/isac_unittest.cc", + "codecs/legacy_encoded_audio_frame_unittest.cc", + "codecs/opus/audio_decoder_multi_channel_opus_unittest.cc", + "codecs/opus/audio_encoder_multi_channel_opus_unittest.cc", + "codecs/opus/audio_encoder_opus_unittest.cc", + "codecs/opus/opus_bandwidth_unittest.cc", + "codecs/opus/opus_unittest.cc", + "codecs/red/audio_encoder_copy_red_unittest.cc", + "neteq/audio_multi_vector_unittest.cc", + "neteq/audio_vector_unittest.cc", + "neteq/background_noise_unittest.cc", + "neteq/buffer_level_filter_unittest.cc", + "neteq/comfort_noise_unittest.cc", + "neteq/decision_logic_unittest.cc", + "neteq/decoder_database_unittest.cc", + "neteq/delay_manager_unittest.cc", + "neteq/dsp_helper_unittest.cc", + "neteq/dtmf_buffer_unittest.cc", + "neteq/dtmf_tone_generator_unittest.cc", + "neteq/expand_unittest.cc", + "neteq/histogram_unittest.cc", + "neteq/merge_unittest.cc", + "neteq/mock/mock_buffer_level_filter.h", + "neteq/mock/mock_decoder_database.h", + "neteq/mock/mock_delay_manager.h", + "neteq/mock/mock_dtmf_buffer.h", + "neteq/mock/mock_dtmf_tone_generator.h", + "neteq/mock/mock_expand.h", + "neteq/mock/mock_histogram.h", + "neteq/mock/mock_neteq_controller.h", + "neteq/mock/mock_packet_buffer.h", + "neteq/mock/mock_red_payload_splitter.h", + "neteq/mock/mock_statistics_calculator.h", + "neteq/nack_tracker_unittest.cc", + "neteq/neteq_decoder_plc_unittest.cc", + "neteq/neteq_impl_unittest.cc", + "neteq/neteq_network_stats_unittest.cc", + "neteq/neteq_stereo_unittest.cc", + "neteq/neteq_unittest.cc", + "neteq/normal_unittest.cc", + "neteq/packet_buffer_unittest.cc", + "neteq/post_decode_vad_unittest.cc", + "neteq/random_vector_unittest.cc", + "neteq/red_payload_splitter_unittest.cc", + "neteq/statistics_calculator_unittest.cc", + "neteq/sync_buffer_unittest.cc", + "neteq/time_stretch_unittest.cc", + "neteq/timestamp_scaler_unittest.cc", + "neteq/tools/input_audio_file_unittest.cc", + "neteq/tools/packet_unittest.cc", + ] - deps = [ - ":acm_receive_test", - ":acm_send_test", - ":audio_coding", - ":audio_coding_module_typedefs", - ":audio_coding_modules_tests_shared", - ":audio_coding_opus_common", - ":audio_encoder_cng", - ":audio_network_adaptor", - ":default_neteq_factory", - ":g711", - ":ilbc", - ":isac", - ":isac_c", - ":isac_common", - ":isac_fix", - ":legacy_encoded_audio_frame", - ":mocks", - ":neteq", - ":neteq_test_support", - ":neteq_test_tools", - ":pcm16b", - ":red", - ":webrtc_cng", - ":webrtc_opus", - "..:module_api", - "..:module_api_public", - "../../api:array_view", - "../../api/audio:audio_frame_api", - "../../api/audio_codecs:audio_codecs_api", - "../../api/audio_codecs:builtin_audio_decoder_factory", - "../../api/audio_codecs:builtin_audio_encoder_factory", - "../../api/audio_codecs/isac:audio_decoder_isac_fix", - "../../api/audio_codecs/isac:audio_decoder_isac_float", - "../../api/audio_codecs/isac:audio_encoder_isac_fix", - "../../api/audio_codecs/isac:audio_encoder_isac_float", - "../../api/audio_codecs/opus:audio_decoder_multiopus", - "../../api/audio_codecs/opus:audio_decoder_opus", - "../../api/audio_codecs/opus:audio_encoder_multiopus", - "../../api/audio_codecs/opus:audio_encoder_opus", - "../../api/neteq:default_neteq_controller_factory", - "../../api/neteq:neteq_api", - "../../api/neteq:neteq_controller_api", - "../../api/neteq:tick_timer", - "../../api/neteq:tick_timer_unittest", - "../../api/rtc_event_log", - "../../common_audio", - "../../common_audio:common_audio_c", - "../../common_audio:mock_common_audio", - "../../logging:mocks", - "../../logging:rtc_event_audio", - "../../modules/rtp_rtcp:rtp_rtcp_format", - "../../rtc_base", - "../../rtc_base:checks", - "../../rtc_base:ignore_wundef", - "../../rtc_base:rtc_base_approved", - "../../rtc_base:rtc_base_tests_utils", - "../../rtc_base:sanitizer", - "../../rtc_base:timeutils", - "../../rtc_base/synchronization:mutex", - "../../rtc_base/system:arch", - "../../system_wrappers", - "../../test:audio_codec_mocks", - "../../test:field_trial", - "../../test:fileutils", - "../../test:rtc_expect_death", - "../../test:rtp_test_utils", - "../../test:test_common", - "../../test:test_support", - "codecs/opus/test", - "codecs/opus/test:test_unittest", - "//testing/gtest", - ] - absl_deps = [ - "//third_party/abseil-cpp/absl/flags:flag", - "//third_party/abseil-cpp/absl/memory", - "//third_party/abseil-cpp/absl/strings", - "//third_party/abseil-cpp/absl/types:optional", - ] + deps = [ + ":acm_receive_test", + ":acm_send_test", + ":audio_coding", + ":audio_coding_module_typedefs", + ":audio_coding_modules_tests_shared", + ":audio_coding_opus_common", + ":audio_encoder_cng", + ":audio_network_adaptor", + ":default_neteq_factory", + ":g711", + ":ilbc", + ":isac", + ":isac_c", + ":isac_common", + ":isac_fix", + ":legacy_encoded_audio_frame", + ":mocks", + ":neteq", + ":neteq_test_support", + ":neteq_test_tools", + ":pcm16b", + ":red", + ":webrtc_cng", + ":webrtc_opus", + "..:module_api", + "..:module_api_public", + "../../api:array_view", + "../../api/audio:audio_frame_api", + "../../api/audio_codecs:audio_codecs_api", + "../../api/audio_codecs:builtin_audio_decoder_factory", + "../../api/audio_codecs:builtin_audio_encoder_factory", + "../../api/audio_codecs/isac:audio_decoder_isac_fix", + "../../api/audio_codecs/isac:audio_decoder_isac_float", + "../../api/audio_codecs/isac:audio_encoder_isac_fix", + "../../api/audio_codecs/isac:audio_encoder_isac_float", + "../../api/audio_codecs/opus:audio_decoder_multiopus", + "../../api/audio_codecs/opus:audio_decoder_opus", + "../../api/audio_codecs/opus:audio_encoder_multiopus", + "../../api/audio_codecs/opus:audio_encoder_opus", + "../../api/neteq:default_neteq_controller_factory", + "../../api/neteq:neteq_api", + "../../api/neteq:neteq_controller_api", + "../../api/neteq:tick_timer", + "../../api/neteq:tick_timer_unittest", + "../../api/rtc_event_log", + "../../common_audio", + "../../common_audio:common_audio_c", + "../../common_audio:mock_common_audio", + "../../logging:mocks", + "../../logging:rtc_event_audio", + "../../modules/rtp_rtcp:rtp_rtcp_format", + "../../rtc_base", + "../../rtc_base:checks", + "../../rtc_base:ignore_wundef", + "../../rtc_base:rtc_base_approved", + "../../rtc_base:rtc_base_tests_utils", + "../../rtc_base:sanitizer", + "../../rtc_base:timeutils", + "../../rtc_base/synchronization:mutex", + "../../rtc_base/system:arch", + "../../system_wrappers", + "../../test:audio_codec_mocks", + "../../test:field_trial", + "../../test:fileutils", + "../../test:rtc_expect_death", + "../../test:rtp_test_utils", + "../../test:test_common", + "../../test:test_support", + "codecs/opus/test", + "codecs/opus/test:test_unittest", + "//testing/gtest", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/types:optional", + ] - defines = audio_coding_defines + defines = audio_coding_defines - if (rtc_enable_protobuf) { - defines += [ "WEBRTC_NETEQ_UNITTEST_BITEXACT" ] - deps += [ - ":ana_config_proto", - ":neteq_unittest_proto", - ] + if (rtc_enable_protobuf) { + defines += [ "WEBRTC_NETEQ_UNITTEST_BITEXACT" ] + deps += [ + ":ana_config_proto", + ":neteq_unittest_proto", + ] + } } } } diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/acm2/audio_coding_module_unittest.cc libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/acm2/audio_coding_module_unittest.cc --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/acm2/audio_coding_module_unittest.cc 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/acm2/audio_coding_module_unittest.cc 2021-06-27 05:27:48.000000000 +0000 @@ -939,58 +939,58 @@ defined(WEBRTC_CODEC_ILBC) TEST_F(AcmReceiverBitExactnessOldApi, 8kHzOutput) { std::string others_checksum_reference = - GetCPUInfo(kAVX2) != 0 ? "1d7b784031599e2c01a3f575f8439f2f" - : "c119fda4ea2c119ff2a720fd0c289071"; + GetCPUInfo(kAVX2) != 0 ? "e0c966d7b8c36ff60167988fa35d33e0" + : "7d8f6b84abd1e57ec010a53bc2130652"; std::string win64_checksum_reference = GetCPUInfo(kAVX2) != 0 ? "405a50f0bcb8827e20aa944299fc59f6" - : "38e70d4e186f8e1a56b929fafcb7c379"; + : "0ed5830930f5527a01bbec0ba11f8541"; Run(8000, PlatformChecksum(others_checksum_reference, win64_checksum_reference, - "3b03e41731e1cef5ae2b9f9618660b42", + "b892ed69c38b21b16c132ec2ce03aa7b", "4598140b5e4f7ee66c5adad609e65a3e", - "da7e76687c8c0a9509cd1d57ee1aba3b")); + "5fec8d770778ef7969ec98c56d9eb10f")); } TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) { std::string others_checksum_reference = - GetCPUInfo(kAVX2) != 0 ? "8884d910e443c244d8593c2e3cef5e63" - : "36dc8c0532ba0efa099e2b6a689cde40"; + GetCPUInfo(kAVX2) != 0 ? "a63c578e1195c8420f453962c6d8519c" + : "6bac83762c1306b932cd25a560155681"; std::string win64_checksum_reference = GetCPUInfo(kAVX2) != 0 ? "58fd62a5c49ee513f9fa6fe7dbf62c97" - : "07e4b388168e273fa19da0a167aff782"; + : "0509cf0672f543efb4b050e8cffefb1d"; Run(16000, PlatformChecksum(others_checksum_reference, win64_checksum_reference, - "06b08d14a72f6e7c72840b1cc9ad204d", + "3cea9abbeabbdea9a79719941b241af5", "f2aad418af974a3b1694d5ae5cc2c3c7", - "1d5f9a93f3975e7e491373b81eb5fd14")); + "9d4b92c31c00e321a4cff29ad002d6a2")); } TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) { std::string others_checksum_reference = - GetCPUInfo(kAVX2) != 0 ? "73f4fe21996c0af495e2c47e3708e519" - : "c848ce9002d3825056a1eac2a067c0d3"; + GetCPUInfo(kAVX2) != 0 ? "8775ce387f44dc5ff4a26da295d5ee7c" + : "e319222ca47733709f90fdf33c8574db"; std::string win64_checksum_reference = GetCPUInfo(kAVX2) != 0 ? "04ce6a1dac5ffdd8438d804623d0132f" - : "0e705f6844c75fd57a84734f7c30af87"; + : "39a4a7a1c455b35baeffb9fd193d7858"; Run(32000, PlatformChecksum(others_checksum_reference, win64_checksum_reference, - "c18e98e5701ec91bba5c026b720d1790", + "4df55b3b62bcbf4328786d474ae87f61", "100869c8dcde51346c2073e52a272d98", - "e35df943bfa3ca32e86b26bf1e37ed8f")); + "ff58d3153d2780a3df6bc2068844cb2d")); } TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) { std::string others_checksum_reference = - GetCPUInfo(kAVX2) != 0 ? "884243f7e1476931e93eda5de88d1326" - : "ba0f66d538487bba377e721cfac62d1e"; + GetCPUInfo(kAVX2) != 0 ? "7a55700b7ca9aa60237db58b33e55606" + : "57d1d316c88279f4f3da3511665069a9"; std::string win64_checksum_reference = GetCPUInfo(kAVX2) != 0 ? "f59833d9b0924f4b0704707dd3589f80" - : "6a480541fb86faa95c7563b9de08104d"; + : "74cbe7345e2b6b45c1e455a5d1e921ca"; Run(48000, PlatformChecksum(others_checksum_reference, win64_checksum_reference, - "30e617e4b3c9ba1979d1b2e8eba3519b", + "f52bc7bf0f499c9da25932fdf176c4ec", "bd44bf97e7899186532f91235cef444d", - "90158462a1853b1de50873eebd68dba7")); + "364d403dae55d73cd69e6dbd6b723a4d")); } TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) { @@ -1069,16 +1069,16 @@ rtc::scoped_refptr> factory( new rtc::RefCountedObject); std::string others_checksum_reference = - GetCPUInfo(kAVX2) != 0 ? "884243f7e1476931e93eda5de88d1326" - : "ba0f66d538487bba377e721cfac62d1e"; + GetCPUInfo(kAVX2) != 0 ? "7a55700b7ca9aa60237db58b33e55606" + : "57d1d316c88279f4f3da3511665069a9"; std::string win64_checksum_reference = GetCPUInfo(kAVX2) != 0 ? "f59833d9b0924f4b0704707dd3589f80" - : "6a480541fb86faa95c7563b9de08104d"; + : "74cbe7345e2b6b45c1e455a5d1e921ca"; Run(48000, PlatformChecksum(others_checksum_reference, win64_checksum_reference, - "30e617e4b3c9ba1979d1b2e8eba3519b", + "f52bc7bf0f499c9da25932fdf176c4ec", "bd44bf97e7899186532f91235cef444d", - "90158462a1853b1de50873eebd68dba7"), + "364d403dae55d73cd69e6dbd6b723a4d"), factory, [](AudioCodingModule* acm) { acm->SetReceiveCodecs({{0, {"MockPCMu", 8000, 1}}, {103, {"ISAC", 16000, 1}}, @@ -1488,13 +1488,17 @@ "7efbfc9f8e3b4b2933ae2d01ab919028"); } // namespace -TEST_F(AcmSenderBitExactnessOldApi, Opus_stereo_20ms) { +// TODO(http://bugs.webrtc.org/12518): Enable the test after Opus has been +// updated. +TEST_F(AcmSenderBitExactnessOldApi, DISABLED_Opus_stereo_20ms) { ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 2, 120, 960, 960)); Run(audio_checksum, payload_checksum, 50, test::AcmReceiveTestOldApi::kStereoOutput); } -TEST_F(AcmSenderBitExactnessNewApi, MAYBE_OpusFromFormat_stereo_20ms) { +// TODO(http://bugs.webrtc.org/12518): Enable the test after Opus has been +// updated. +TEST_F(AcmSenderBitExactnessNewApi, DISABLED_OpusFromFormat_stereo_20ms) { const auto config = AudioEncoderOpus::SdpToConfig( SdpAudioFormat("opus", 48000, 2, {{"stereo", "1"}})); ASSERT_TRUE(SetUpSender(kTestFileFakeStereo32kHz, 32000)); @@ -1551,7 +1555,9 @@ 50, test::AcmReceiveTestOldApi::kQuadOutput, decoder_factory); } -TEST_F(AcmSenderBitExactnessNewApi, OpusFromFormat_stereo_20ms_voip) { +// TODO(http://bugs.webrtc.org/12518): Enable the test after Opus has been +// updated. +TEST_F(AcmSenderBitExactnessNewApi, DISABLED_OpusFromFormat_stereo_20ms_voip) { auto config = AudioEncoderOpus::SdpToConfig( SdpAudioFormat("opus", 48000, 2, {{"stereo", "1"}})); // If not set, default will be kAudio in case of stereo. diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,9 +16,11 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" -#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/abs_quant.h" + #include "modules/audio_coding/codecs/ilbc/abs_quant_loop.h" +#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" /*----------------------------------------------------------------* diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_H_ +#include +#include + #include "modules/audio_coding/codecs/ilbc/defines.h" /*----------------------------------------------------------------* diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,8 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/abs_quant_loop.h" + #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" #include "modules/audio_coding/codecs/ilbc/sort_sq.h" void WebRtcIlbcfix_AbsQuantLoop(int16_t *syntOutIN, int16_t *in_weightedIN, diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/abs_quant_loop.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_LOOP_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_LOOP_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*----------------------------------------------------------------* * predictive noise shaping encoding of scaled start state diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h 2021-06-27 05:27:48.000000000 +0000 @@ -13,6 +13,7 @@ #include #include + #include #include "api/audio_codecs/audio_decoder.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h 2021-06-27 05:27:48.000000000 +0000 @@ -11,6 +11,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_ +#include +#include + #include #include "absl/types/optional.h" diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,10 +16,11 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" -#include "modules/audio_coding/codecs/ilbc/constants.h" #include "modules/audio_coding/codecs/ilbc/augmented_cb_corr.h" +#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" + void WebRtcIlbcfix_AugmentedCbCorr( int16_t *target, /* (i) Target vector */ int16_t *buffer, /* (i) Memory buffer */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_AUGMENTED_CB_CORR_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_AUGMENTED_CB_CORR_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*----------------------------------------------------------------* * Calculate correlation between target and Augmented codebooks diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/bw_expand.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/bw_expand.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/bw_expand.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/bw_expand.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,6 +16,8 @@ ******************************************************************/ +#include "modules/audio_coding/codecs/ilbc/bw_expand.h" + #include "modules/audio_coding/codecs/ilbc/defines.h" /*----------------------------------------------------------------* diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/bw_expand.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/bw_expand.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/bw_expand.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/bw_expand.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_BW_EXPAND_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_BW_EXPAND_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*----------------------------------------------------------------* * lpc bandwidth expansion diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_construct.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_construct.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_construct.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_construct.h 2021-06-27 05:27:48.000000000 +0000 @@ -20,16 +20,18 @@ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_CONSTRUCT_H_ #include +#include #include +#include "absl/base/attributes.h" #include "modules/audio_coding/codecs/ilbc/defines.h" -#include "rtc_base/system/unused.h" /*----------------------------------------------------------------* * Construct decoded vector from codebook and gains. *---------------------------------------------------------------*/ // Returns true on success, false on failure. +ABSL_MUST_USE_RESULT bool WebRtcIlbcfix_CbConstruct( int16_t* decvector, /* (o) Decoded vector */ const int16_t* index, /* (i) Codebook indices */ @@ -37,6 +39,6 @@ int16_t* mem, /* (i) Buffer for codevector construction */ size_t lMem, /* (i) Length of buffer */ size_t veclen /* (i) Length of vector */ - ) RTC_WARN_UNUSED_RESULT; +); #endif diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,9 +16,11 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" -#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/cb_mem_energy.h" + #include "modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h" +#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" /*----------------------------------------------------------------* * Function WebRtcIlbcfix_CbMemEnergy computes the energy of all diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_H_ +#include +#include + void WebRtcIlbcfix_CbMemEnergy( size_t range, int16_t* CB, /* (i) The CB memory (1:st section) */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,8 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h" + #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" void WebRtcIlbcfix_CbMemEnergyAugmentation( int16_t *interpSamples, /* (i) The interpolated samples */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_AUGMENTATION_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_AUGMENTATION_H_ +#include +#include + void WebRtcIlbcfix_CbMemEnergyAugmentation( int16_t* interpSamples, /* (i) The interpolated samples */ int16_t* CBmem, /* (i) The CB memory */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,6 +16,8 @@ ******************************************************************/ +#include "modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h" + #include "modules/audio_coding/codecs/ilbc/defines.h" /* Compute the energy of the rest of the cb memory diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_CALC_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_CALC_H_ +#include +#include + void WebRtcIlbcfix_CbMemEnergyCalc( int32_t energy, /* (i) input start energy */ size_t range, /* (i) number of iterations */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,18 +16,20 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" -#include "modules/audio_coding/codecs/ilbc/gain_quant.h" -#include "modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h" -#include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/cb_search.h" + +#include "modules/audio_coding/codecs/ilbc/augmented_cb_corr.h" #include "modules/audio_coding/codecs/ilbc/cb_mem_energy.h" -#include "modules/audio_coding/codecs/ilbc/interpolate_samples.h" #include "modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h" #include "modules/audio_coding/codecs/ilbc/cb_search_core.h" -#include "modules/audio_coding/codecs/ilbc/energy_inverse.h" -#include "modules/audio_coding/codecs/ilbc/augmented_cb_corr.h" #include "modules/audio_coding/codecs/ilbc/cb_update_best_index.h" +#include "modules/audio_coding/codecs/ilbc/constants.h" #include "modules/audio_coding/codecs/ilbc/create_augmented_vec.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/energy_inverse.h" +#include "modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h" +#include "modules/audio_coding/codecs/ilbc/gain_quant.h" +#include "modules/audio_coding/codecs/ilbc/interpolate_samples.h" /*----------------------------------------------------------------* * Search routine for codebook encoding and gain quantization. diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,11 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_H_ +#include +#include + +#include "modules/audio_coding/codecs/ilbc/defines.h" + void WebRtcIlbcfix_CbSearch( IlbcEncoder* iLBCenc_inst, /* (i) the encoder state structure */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search_core.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search_core.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search_core.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search_core.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,8 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/cb_search_core.h" + #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" void WebRtcIlbcfix_CbSearchCore( int32_t *cDot, /* (i) Cross Correlation */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search_core.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search_core.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_search_core.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_search_core.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_CORE_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_CORE_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include void WebRtcIlbcfix_CbSearchCore( int32_t* cDot, /* (i) Cross Correlation */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,9 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" #include "modules/audio_coding/codecs/ilbc/cb_update_best_index.h" + #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" void WebRtcIlbcfix_CbUpdateBestIndex( int32_t CritNew, /* (i) New Potentially best Criteria */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/cb_update_best_index.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_UPDATE_BEST_INDEX_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_UPDATE_BEST_INDEX_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include void WebRtcIlbcfix_CbUpdateBestIndex( int32_t CritNew, /* (i) New Potentially best Criteria */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/chebyshev.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/chebyshev.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/chebyshev.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/chebyshev.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,8 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/chebyshev.h" + #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" /*------------------------------------------------------------------* * Calculate the Chevyshev polynomial series diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/chebyshev.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/chebyshev.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/chebyshev.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/chebyshev.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CHEBYSHEV_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CHEBYSHEV_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*------------------------------------------------------------------* * Calculate the Chevyshev polynomial series diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/comp_corr.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/comp_corr.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/comp_corr.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/comp_corr.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,6 +16,8 @@ ******************************************************************/ +#include "modules/audio_coding/codecs/ilbc/comp_corr.h" + #include "modules/audio_coding/codecs/ilbc/defines.h" /*----------------------------------------------------------------* diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/comp_corr.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/comp_corr.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/comp_corr.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/comp_corr.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_COMP_CORR_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_COMP_CORR_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*----------------------------------------------------------------* * Compute cross correlation and pitch gain for pitch prediction diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/constants.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/constants.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/constants.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/constants.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,9 +16,10 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" + /* HP Filters {b[0] b[1] b[2] -a[1] -a[2]} */ const int16_t WebRtcIlbcfix_kHpInCoefs[5] = {3798, -7596, 3798, 7807, -3733}; diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/constants.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/constants.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/constants.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/constants.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,6 +19,9 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CONSTANTS_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CONSTANTS_H_ +#include +#include + #include "modules/audio_coding/codecs/ilbc/defines.h" /* high pass filters */ diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,10 +16,12 @@ ******************************************************************/ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include "modules/audio_coding/codecs/ilbc/create_augmented_vec.h" + +#include "common_audio/signal_processing/include/signal_processing_library.h" #include "modules/audio_coding/codecs/ilbc/constants.h" +#include "modules/audio_coding/codecs/ilbc/defines.h" #include "rtc_base/sanitizer.h" -#include "common_audio/signal_processing/include/signal_processing_library.h" /*----------------------------------------------------------------* * Recreate a specific codebook vector from the augmented part. diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.h libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.h --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.h 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/create_augmented_vec.h 2021-06-27 05:27:48.000000000 +0000 @@ -19,7 +19,8 @@ #ifndef MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CREATE_AUGMENTED_VEC_H_ #define MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CREATE_AUGMENTED_VEC_H_ -#include "modules/audio_coding/codecs/ilbc/defines.h" +#include +#include /*----------------------------------------------------------------* * Recreate a specific codebook vector from the augmented part. diff -Nru libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/decode.c libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/decode.c --- libtgowt-0~git20210124.be23804+ds/src/modules/audio_coding/codecs/ilbc/decode.c 2021-01-24 06:31:14.000000000 +0000 +++ libtgowt-0~git20210627.91d836d+dfsg/src/modules/audio_coding/codecs/ilbc/decode.c 2021-06-27 05:27:48.000000000 +0000 @@ -16,22 +16,23 @@ ******************************************************************/ -// Defines WEBRTC_ARCH_BIG_ENDIAN, used below. -#include "rtc_base/system/arch.h" +#include "modules/audio_coding/codecs/ilbc/decode.h" -#include "modules/audio_coding/codecs/ilbc/defines.h" -#include "modules/audi