diff options
author | Ben Murdoch <benm@google.com> | 2014-07-20 18:25:52 -0700 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2014-07-20 18:25:52 -0700 |
commit | 116680a4aac90f2aa7413d9095a592090648e557 (patch) | |
tree | f7c6fed0e63d6a2804243d4a31a752dca39fb076 /media/cast | |
parent | 1f14a4515e04c9ffc9bac4dd1e2f68611626b800 (diff) | |
download | chromium_org-116680a4aac90f2aa7413d9095a592090648e557.tar.gz |
Merge from Chromium at DEPS revision 284076
This commit was generated by merge_to_master.py.
Change-Id: I9a279485b02fe7ceddcd32d992a714ff132e99ae
Diffstat (limited to 'media/cast')
-rw-r--r-- | media/cast/DEPS | 1 | ||||
-rw-r--r-- | media/cast/README | 61 | ||||
-rw-r--r-- | media/cast/cast.gyp | 161 | ||||
-rw-r--r-- | media/cast/cast_config.cc | 24 | ||||
-rw-r--r-- | media/cast/cast_config.h | 73 | ||||
-rw-r--r-- | media/cast/cast_defines.h | 10 | ||||
-rw-r--r-- | media/cast/cast_receiver.h | 8 | ||||
-rw-r--r-- | media/cast/cast_sender.h | 6 | ||||
-rw-r--r-- | media/cast/cast_sender_impl.cc | 7 | ||||
-rw-r--r-- | media/cast/cast_sender_impl.h | 10 | ||||
-rw-r--r-- | media/cast/cast_testing.gypi | 130 | ||||
-rw-r--r-- | media/cast/common/clock_drift_smoother.cc (renamed from media/cast/base/clock_drift_smoother.cc) | 2 | ||||
-rw-r--r-- | media/cast/common/clock_drift_smoother.h (renamed from media/cast/base/clock_drift_smoother.h) | 6 | ||||
-rw-r--r-- | media/cast/common/transport_encryption_handler.cc (renamed from media/cast/transport/utility/transport_encryption_handler.cc) | 42 | ||||
-rw-r--r-- | media/cast/common/transport_encryption_handler.h (renamed from media/cast/transport/utility/transport_encryption_handler.h) | 15 | ||||
-rw-r--r-- | media/cast/logging/proto/BUILD.gn | 22 | ||||
-rw-r--r-- | media/cast/net/DEPS | 16 | ||||
-rw-r--r-- | media/cast/net/cast_transport_config.cc (renamed from media/cast/transport/cast_transport_config.cc) | 26 | ||||
-rw-r--r-- | media/cast/net/cast_transport_config.h (renamed from media/cast/transport/cast_transport_config.h) | 70 | ||||
-rw-r--r-- | media/cast/net/cast_transport_defines.h (renamed from media/cast/transport/cast_transport_defines.h) | 30 | ||||
-rw-r--r-- | media/cast/net/cast_transport_sender.h (renamed from media/cast/transport/cast_transport_sender.h) | 20 | ||||
-rw-r--r-- | media/cast/net/cast_transport_sender_impl.cc (renamed from media/cast/transport/cast_transport_sender_impl.cc) | 37 | ||||
-rw-r--r-- | media/cast/net/cast_transport_sender_impl.h (renamed from media/cast/transport/cast_transport_sender_impl.h) | 27 | ||||
-rw-r--r-- | media/cast/net/cast_transport_sender_impl_unittest.cc (renamed from media/cast/transport/cast_transport_sender_impl_unittest.cc) | 12 | ||||
-rw-r--r-- | media/cast/net/frame_id_wrap_helper_test.cc (renamed from media/cast/transport/frame_id_wrap_helper_test.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/pacing/mock_paced_packet_sender.cc (renamed from media/cast/transport/pacing/mock_paced_packet_sender.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/pacing/mock_paced_packet_sender.h (renamed from media/cast/transport/pacing/mock_paced_packet_sender.h) | 12 | ||||
-rw-r--r-- | media/cast/net/pacing/paced_sender.cc (renamed from media/cast/transport/pacing/paced_sender.cc) | 60 | ||||
-rw-r--r-- | media/cast/net/pacing/paced_sender.h (renamed from media/cast/transport/pacing/paced_sender.h) | 36 | ||||
-rw-r--r-- | media/cast/net/pacing/paced_sender_unittest.cc (renamed from media/cast/transport/pacing/paced_sender_unittest.cc) | 77 | ||||
-rw-r--r-- | media/cast/net/rtcp/mock_rtcp_receiver_feedback.cc (renamed from media/cast/rtcp/mock_rtcp_receiver_feedback.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtcp/mock_rtcp_receiver_feedback.h (renamed from media/cast/rtcp/mock_rtcp_receiver_feedback.h) | 10 | ||||
-rw-r--r-- | media/cast/net/rtcp/mock_rtcp_sender_feedback.cc (renamed from media/cast/rtcp/mock_rtcp_sender_feedback.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtcp/mock_rtcp_sender_feedback.h (renamed from media/cast/rtcp/mock_rtcp_sender_feedback.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc (renamed from media/cast/rtcp/receiver_rtcp_event_subscriber.cc) | 2 | ||||
-rw-r--r-- | media/cast/net/rtcp/receiver_rtcp_event_subscriber.h (renamed from media/cast/rtcp/receiver_rtcp_event_subscriber.h) | 2 | ||||
-rw-r--r-- | media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc (renamed from media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc) | 2 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp.cc (renamed from media/cast/rtcp/rtcp.cc) | 74 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp.h (renamed from media/cast/rtcp/rtcp.h) | 24 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder.cc (renamed from media/cast/transport/rtcp/rtcp_builder.cc) | 10 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder.h (renamed from media/cast/transport/rtcp/rtcp_builder.h) | 14 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_builder_unittest.cc (renamed from media/cast/transport/rtcp/rtcp_builder_unittest.cc) | 10 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_defines.cc (renamed from media/cast/rtcp/rtcp_defines.cc) | 2 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_defines.h (renamed from media/cast/rtcp/rtcp_defines.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_receiver.cc (renamed from media/cast/rtcp/rtcp_receiver.cc) | 12 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_receiver.h (renamed from media/cast/rtcp/rtcp_receiver.h) | 14 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_receiver_unittest.cc (renamed from media/cast/rtcp/rtcp_receiver_unittest.cc) | 29 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_sender.cc (renamed from media/cast/rtcp/rtcp_sender.cc) | 76 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_sender.h (renamed from media/cast/rtcp/rtcp_sender.h) | 26 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_sender_unittest.cc (renamed from media/cast/rtcp/rtcp_sender_unittest.cc) | 75 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_unittest.cc (renamed from media/cast/rtcp/rtcp_unittest.cc) | 53 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_utility.cc (renamed from media/cast/rtcp/rtcp_utility.cc) | 30 | ||||
-rw-r--r-- | media/cast/net/rtcp/rtcp_utility.h (renamed from media/cast/rtcp/rtcp_utility.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtcp/test_rtcp_packet_builder.cc (renamed from media/cast/rtcp/test_rtcp_packet_builder.cc) | 26 | ||||
-rw-r--r-- | media/cast/net/rtcp/test_rtcp_packet_builder.h (renamed from media/cast/rtcp/test_rtcp_packet_builder.h) | 9 | ||||
-rw-r--r-- | media/cast/net/rtp/cast_message_builder.cc (renamed from media/cast/framer/cast_message_builder.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/cast_message_builder.h (renamed from media/cast/framer/cast_message_builder.h) | 8 | ||||
-rw-r--r-- | media/cast/net/rtp/cast_message_builder_unittest.cc (renamed from media/cast/framer/cast_message_builder_unittest.cc) | 8 | ||||
-rw-r--r-- | media/cast/net/rtp/frame_buffer.cc (renamed from media/cast/framer/frame_buffer.cc) | 12 | ||||
-rw-r--r-- | media/cast/net/rtp/frame_buffer.h (renamed from media/cast/framer/frame_buffer.h) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/frame_buffer_unittest.cc (renamed from media/cast/framer/frame_buffer_unittest.cc) | 15 | ||||
-rw-r--r-- | media/cast/net/rtp/frame_id_map.cc (renamed from media/cast/framer/frame_id_map.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/frame_id_map.h (renamed from media/cast/framer/frame_id_map.h) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/framer.cc (renamed from media/cast/framer/framer.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/framer.h (renamed from media/cast/framer/framer.h) | 14 | ||||
-rw-r--r-- | media/cast/net/rtp/framer_unittest.cc (renamed from media/cast/framer/framer_unittest.cc) | 69 | ||||
-rw-r--r-- | media/cast/net/rtp/mock_rtp_feedback.h (renamed from media/cast/rtp_receiver/rtp_parser/include/mock/mock_rtp_feedback.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/mock_rtp_payload_feedback.cc (renamed from media/cast/rtp_receiver/mock_rtp_payload_feedback.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/mock_rtp_payload_feedback.h (renamed from media/cast/rtp_receiver/mock_rtp_payload_feedback.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/packet_storage.cc (renamed from media/cast/transport/rtp_sender/packet_storage/packet_storage.cc) | 7 | ||||
-rw-r--r-- | media/cast/net/rtp/packet_storage.h (renamed from media/cast/transport/rtp_sender/packet_storage/packet_storage.h) | 16 | ||||
-rw-r--r-- | media/cast/net/rtp/packet_storage_unittest.cc (renamed from media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/receiver_stats.cc (renamed from media/cast/rtp_receiver/receiver_stats.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/receiver_stats.h (renamed from media/cast/rtp_receiver/receiver_stats.h) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/receiver_stats_unittest.cc (renamed from media/cast/rtp_receiver/receiver_stats_unittest.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_header_parser.cc (renamed from media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.cc) | 6 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_header_parser.h (renamed from media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h) | 16 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_packet_builder.cc (renamed from media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_packet_builder.h (renamed from media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_packetizer.cc (renamed from media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.cc) | 15 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_packetizer.h (renamed from media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h) | 22 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_packetizer_unittest.cc (renamed from media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer_unittest.cc) | 14 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_parser.cc (renamed from media/cast/rtp_receiver/rtp_parser/rtp_parser.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_parser.h (renamed from media/cast/rtp_receiver/rtp_parser/rtp_parser.h) | 14 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_parser_unittest.cc (renamed from media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc) | 12 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_receiver_defines.cc (renamed from media/cast/rtp_receiver/rtp_receiver_defines.cc) | 2 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_receiver_defines.h (renamed from media/cast/rtp_receiver/rtp_receiver_defines.h) | 4 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_sender.cc (renamed from media/cast/transport/rtp_sender/rtp_sender.cc) | 35 | ||||
-rw-r--r-- | media/cast/net/rtp/rtp_sender.h (renamed from media/cast/transport/rtp_sender/rtp_sender.h) | 33 | ||||
-rw-r--r-- | media/cast/net/udp_transport.cc (renamed from media/cast/transport/transport/udp_transport.cc) | 4 | ||||
-rw-r--r-- | media/cast/net/udp_transport.h (renamed from media/cast/transport/transport/udp_transport.h) | 12 | ||||
-rw-r--r-- | media/cast/net/udp_transport_unittest.cc (renamed from media/cast/transport/transport/udp_transport_unittest.cc) | 10 | ||||
-rw-r--r-- | media/cast/receiver/audio_decoder.cc | 18 | ||||
-rw-r--r-- | media/cast/receiver/audio_decoder.h | 6 | ||||
-rw-r--r-- | media/cast/receiver/audio_decoder_unittest.cc | 33 | ||||
-rw-r--r-- | media/cast/receiver/cast_receiver_impl.cc | 14 | ||||
-rw-r--r-- | media/cast/receiver/cast_receiver_impl.h | 16 | ||||
-rw-r--r-- | media/cast/receiver/frame_receiver.cc | 8 | ||||
-rw-r--r-- | media/cast/receiver/frame_receiver.h | 20 | ||||
-rw-r--r-- | media/cast/receiver/frame_receiver_unittest.cc | 8 | ||||
-rw-r--r-- | media/cast/receiver/video_decoder.cc | 27 | ||||
-rw-r--r-- | media/cast/receiver/video_decoder.h | 6 | ||||
-rw-r--r-- | media/cast/receiver/video_decoder_unittest.cc | 14 | ||||
-rw-r--r-- | media/cast/sender/audio_encoder.cc (renamed from media/cast/audio_sender/audio_encoder.cc) | 39 | ||||
-rw-r--r-- | media/cast/sender/audio_encoder.h (renamed from media/cast/audio_sender/audio_encoder.h) | 16 | ||||
-rw-r--r-- | media/cast/sender/audio_encoder_unittest.cc (renamed from media/cast/audio_sender/audio_encoder_unittest.cc) | 47 | ||||
-rw-r--r-- | media/cast/sender/audio_sender.cc (renamed from media/cast/audio_sender/audio_sender.cc) | 59 | ||||
-rw-r--r-- | media/cast/sender/audio_sender.h (renamed from media/cast/audio_sender/audio_sender.h) | 18 | ||||
-rw-r--r-- | media/cast/sender/audio_sender_unittest.cc (renamed from media/cast/audio_sender/audio_sender_unittest.cc) | 28 | ||||
-rw-r--r-- | media/cast/sender/congestion_control.cc (renamed from media/cast/congestion_control/congestion_control.cc) | 7 | ||||
-rw-r--r-- | media/cast/sender/congestion_control.h (renamed from media/cast/congestion_control/congestion_control.h) | 6 | ||||
-rw-r--r-- | media/cast/sender/congestion_control_unittest.cc (renamed from media/cast/congestion_control/congestion_control_unittest.cc) | 5 | ||||
-rw-r--r-- | media/cast/sender/external_video_encoder.cc (renamed from media/cast/video_sender/external_video_encoder.cc) | 24 | ||||
-rw-r--r-- | media/cast/sender/external_video_encoder.h (renamed from media/cast/video_sender/external_video_encoder.h) | 8 | ||||
-rw-r--r-- | media/cast/sender/external_video_encoder_unittest.cc (renamed from media/cast/video_sender/external_video_encoder_unittest.cc) | 14 | ||||
-rw-r--r-- | media/cast/sender/fake_software_video_encoder.cc (renamed from media/cast/video_sender/fake_software_video_encoder.cc) | 14 | ||||
-rw-r--r-- | media/cast/sender/fake_software_video_encoder.h (renamed from media/cast/video_sender/fake_software_video_encoder.h) | 10 | ||||
-rw-r--r-- | media/cast/sender/rtp_timestamp_helper.cc (renamed from media/cast/rtp_timestamp_helper.cc) | 2 | ||||
-rw-r--r-- | media/cast/sender/rtp_timestamp_helper.h (renamed from media/cast/rtp_timestamp_helper.h) | 6 | ||||
-rw-r--r-- | media/cast/sender/software_video_encoder.h (renamed from media/cast/video_sender/software_video_encoder.h) | 10 | ||||
-rw-r--r-- | media/cast/sender/video_encoder.h (renamed from media/cast/video_sender/video_encoder.h) | 10 | ||||
-rw-r--r-- | media/cast/sender/video_encoder_impl.cc (renamed from media/cast/video_sender/video_encoder_impl.cc) | 19 | ||||
-rw-r--r-- | media/cast/sender/video_encoder_impl.h (renamed from media/cast/video_sender/video_encoder_impl.h) | 13 | ||||
-rw-r--r-- | media/cast/sender/video_encoder_impl_unittest.cc (renamed from media/cast/video_sender/video_encoder_impl_unittest.cc) | 14 | ||||
-rw-r--r-- | media/cast/sender/video_sender.cc (renamed from media/cast/video_sender/video_sender.cc) | 35 | ||||
-rw-r--r-- | media/cast/sender/video_sender.h (renamed from media/cast/video_sender/video_sender.h) | 25 | ||||
-rw-r--r-- | media/cast/sender/video_sender_unittest.cc (renamed from media/cast/video_sender/video_sender_unittest.cc) | 34 | ||||
-rw-r--r-- | media/cast/sender/vp8_encoder.cc (renamed from media/cast/video_sender/codecs/vp8/vp8_encoder.cc) | 16 | ||||
-rw-r--r-- | media/cast/sender/vp8_encoder.h (renamed from media/cast/video_sender/codecs/vp8/vp8_encoder.h) | 12 | ||||
-rw-r--r-- | media/cast/test/cast_benchmarks.cc | 147 | ||||
-rw-r--r-- | media/cast/test/end2end_unittest.cc | 123 | ||||
-rw-r--r-- | media/cast/test/fake_media_source.cc | 594 | ||||
-rw-r--r-- | media/cast/test/fake_media_source.h | 152 | ||||
-rw-r--r-- | media/cast/test/loopback_transport.cc | 68 | ||||
-rw-r--r-- | media/cast/test/loopback_transport.h | 55 | ||||
-rw-r--r-- | media/cast/test/proto/BUILD.gn | 14 | ||||
-rw-r--r-- | media/cast/test/proto/network_simulation_model.proto | 27 | ||||
-rw-r--r-- | media/cast/test/receiver.cc | 2 | ||||
-rw-r--r-- | media/cast/test/sender.cc | 708 | ||||
-rw-r--r-- | media/cast/test/simulator.cc | 445 | ||||
-rw-r--r-- | media/cast/test/utility/default_config.cc | 43 | ||||
-rw-r--r-- | media/cast/test/utility/default_config.h | 9 | ||||
-rw-r--r-- | media/cast/test/utility/in_process_receiver.cc | 10 | ||||
-rw-r--r-- | media/cast/test/utility/in_process_receiver.h | 10 | ||||
-rw-r--r-- | media/cast/test/utility/udp_proxy.cc | 238 | ||||
-rw-r--r-- | media/cast/test/utility/udp_proxy.h | 64 | ||||
-rw-r--r-- | media/cast/test/utility/udp_proxy_main.cc | 2 |
147 files changed, 3167 insertions, 2162 deletions
diff --git a/media/cast/DEPS b/media/cast/DEPS index abee2864b3..e44afe05ab 100644 --- a/media/cast/DEPS +++ b/media/cast/DEPS @@ -3,6 +3,7 @@ include_rules = [ "+media", "+net", "+third_party/libyuv", + "+third_party/mt19937ar", "+third_party/zlib", "+ui/gfx", ] diff --git a/media/cast/README b/media/cast/README deleted file mode 100644 index 0930c1e012..0000000000 --- a/media/cast/README +++ /dev/null @@ -1,61 +0,0 @@ -This directory contains a RTP/RTCP library used for the Cast mirroring -protocol. This library is specifically built for low latency purposes and -enables Chrome to send real-time video and audio streams. - -CONTENTS - -cast/ - Build rules and top level source files and headers. - -cast/audio_receiver/ - Module for receiving and decodes audio RTP stream. - -cast/audio_sender/ - Module for encoding and sending audio RTP stream. - -cast/congestion_control/ - Bandwidth estimation and network congestion handling. - -cast/transport/pacing/ - Module for rate limiting data outflow. - -cast/rtcp/ - Module for handling RTCP messages. - -cast/rtp_common/ - Module for common code used for RTP messages. - -cast/rtp_receiver/ - Module for reciving RTP messages. - -cast/transport/rtp_sender/ - Module for sending RTP messages. - -cast/test/ - Module for test applications. - -cast/video_receiver/ - Module for receiving and decodes video RTP stream. - -cast/video_sender/ - Module for encoding and sending video RTP stream. - -DEPENDENCIES - -Content of this directory should only depend on: - -base/ - Provides base libraries and platform independent layer. - -net/ - Provides network capabilities. - -third_party/libvpx - Provides video encoder. - -third_party/opus - Provides audio encoder. - -OWNERS - -See OWNERS for ownership. diff --git a/media/cast/cast.gyp b/media/cast/cast.gyp index 5de8796079..fb1ee64e6c 100644 --- a/media/cast/cast.gyp +++ b/media/cast/cast.gyp @@ -22,6 +22,7 @@ 'dependencies': [ 'cast_logging_proto', '<(DEPTH)/base/base.gyp:base', + '<(DEPTH)/crypto/crypto.gyp:crypto', '<(DEPTH)/net/net.gyp:net', ], 'export_dependent_settings': [ @@ -33,8 +34,10 @@ 'cast_defines.h', 'cast_environment.cc', 'cast_environment.h', - 'base/clock_drift_smoother.cc', - 'base/clock_drift_smoother.h', + 'common/clock_drift_smoother.cc', + 'common/clock_drift_smoother.h', + 'common/transport_encryption_handler.cc', + 'common/transport_encryption_handler.h', 'logging/encoding_event_subscriber.cc', 'logging/encoding_event_subscriber.h', 'logging/log_deserializer.cc', @@ -57,15 +60,10 @@ 'logging/simple_event_subscriber.h', 'logging/stats_event_subscriber.cc', 'logging/stats_event_subscriber.h', - 'rtp_timestamp_helper.cc', - 'rtp_timestamp_helper.h', - 'transport/cast_transport_config.cc', - 'transport/cast_transport_config.h', - 'transport/cast_transport_defines.h', - 'transport/cast_transport_sender.h', ], # source }, { + # GN version: //media/cast/logging/proto 'target_name': 'cast_logging_proto', 'type': 'static_library', 'include_dirs': [ @@ -89,8 +87,7 @@ ], 'dependencies': [ 'cast_base', - 'cast_rtcp', - 'cast_transport', + 'cast_net', '<(DEPTH)/base/base.gyp:base', '<(DEPTH)/media/media.gyp:media', '<(DEPTH)/media/media.gyp:shared_memory_support', @@ -100,14 +97,6 @@ ], 'sources': [ 'cast_receiver.h', - 'framer/cast_message_builder.cc', - 'framer/cast_message_builder.h', - 'framer/frame_buffer.cc', - 'framer/frame_buffer.h', - 'framer/frame_id_map.cc', - 'framer/frame_id_map.h', - 'framer/framer.cc', - 'framer/framer.h', 'receiver/audio_decoder.cc', 'receiver/audio_decoder.h', 'receiver/cast_receiver_impl.cc', @@ -116,39 +105,20 @@ 'receiver/frame_receiver.h', 'receiver/video_decoder.cc', 'receiver/video_decoder.h', - 'rtp_receiver/receiver_stats.cc', - 'rtp_receiver/receiver_stats.h', - 'rtp_receiver/rtp_receiver_defines.cc', - 'rtp_receiver/rtp_receiver_defines.h', - 'rtp_receiver/rtp_parser/rtp_parser.cc', - 'rtp_receiver/rtp_parser/rtp_parser.h', - ], # source - }, - { - 'target_name': 'cast_rtcp', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)/', - ], - 'dependencies': [ - 'cast_base', - 'cast_transport', - '<(DEPTH)/base/base.gyp:base', - '<(DEPTH)/net/net.gyp:net', - ], - 'sources': [ - 'rtcp/rtcp_defines.cc', - 'rtcp/rtcp_defines.h', - 'rtcp/rtcp.h', - 'rtcp/rtcp.cc', - 'rtcp/rtcp_receiver.cc', - 'rtcp/rtcp_receiver.h', - 'rtcp/rtcp_sender.cc', - 'rtcp/rtcp_sender.h', - 'rtcp/rtcp_utility.cc', - 'rtcp/rtcp_utility.h', - 'rtcp/receiver_rtcp_event_subscriber.cc', - 'rtcp/receiver_rtcp_event_subscriber.cc', + 'net/rtp/cast_message_builder.cc', + 'net/rtp/cast_message_builder.h', + 'net/rtp/frame_buffer.cc', + 'net/rtp/frame_buffer.h', + 'net/rtp/frame_id_map.cc', + 'net/rtp/frame_id_map.h', + 'net/rtp/framer.cc', + 'net/rtp/framer.h', + 'net/rtp/receiver_stats.cc', + 'net/rtp/receiver_stats.h', + 'net/rtp/rtp_parser.cc', + 'net/rtp/rtp_parser.h', + 'net/rtp/rtp_receiver_defines.cc', + 'net/rtp/rtp_receiver_defines.h', ], # source }, { @@ -159,39 +129,40 @@ ], 'dependencies': [ 'cast_base', - 'cast_rtcp', - 'cast_transport', + 'cast_net', '<(DEPTH)/media/media.gyp:media', '<(DEPTH)/media/media.gyp:shared_memory_support', '<(DEPTH)/third_party/opus/opus.gyp:opus', '<(DEPTH)/third_party/libvpx/libvpx.gyp:libvpx', ], # dependencies 'sources': [ - 'audio_sender/audio_encoder.h', - 'audio_sender/audio_encoder.cc', - 'audio_sender/audio_sender.h', - 'audio_sender/audio_sender.cc', 'cast_sender.h', 'cast_sender_impl.cc', 'cast_sender_impl.h', - 'congestion_control/congestion_control.h', - 'congestion_control/congestion_control.cc', - 'video_sender/codecs/vp8/vp8_encoder.cc', - 'video_sender/codecs/vp8/vp8_encoder.h', - 'video_sender/external_video_encoder.h', - 'video_sender/external_video_encoder.cc', - 'video_sender/fake_software_video_encoder.h', - 'video_sender/fake_software_video_encoder.cc', - 'video_sender/software_video_encoder.h', - 'video_sender/video_encoder.h', - 'video_sender/video_encoder_impl.h', - 'video_sender/video_encoder_impl.cc', - 'video_sender/video_sender.h', - 'video_sender/video_sender.cc', + 'sender/audio_encoder.h', + 'sender/audio_encoder.cc', + 'sender/audio_sender.h', + 'sender/audio_sender.cc', + 'sender/congestion_control.h', + 'sender/congestion_control.cc', + 'sender/external_video_encoder.h', + 'sender/external_video_encoder.cc', + 'sender/fake_software_video_encoder.h', + 'sender/fake_software_video_encoder.cc', + 'sender/rtp_timestamp_helper.cc', + 'sender/rtp_timestamp_helper.h', + 'sender/software_video_encoder.h', + 'sender/video_encoder.h', + 'sender/video_encoder_impl.h', + 'sender/video_encoder_impl.cc', + 'sender/video_sender.h', + 'sender/video_sender.cc', + 'sender/vp8_encoder.cc', + 'sender/vp8_encoder.h', ], # source }, { - 'target_name': 'cast_transport', + 'target_name': 'cast_net', 'type': 'static_library', 'include_dirs': [ '<(DEPTH)/', @@ -199,26 +170,38 @@ 'dependencies': [ 'cast_base', '<(DEPTH)/base/base.gyp:base', - '<(DEPTH)/crypto/crypto.gyp:crypto', '<(DEPTH)/net/net.gyp:net', ], 'sources': [ - 'transport/cast_transport_sender_impl.cc', - 'transport/cast_transport_sender_impl.h', - 'transport/pacing/paced_sender.cc', - 'transport/pacing/paced_sender.h', - 'transport/rtcp/rtcp_builder.cc', - 'transport/rtcp/rtcp_builder.h', - 'transport/rtp_sender/packet_storage/packet_storage.cc', - 'transport/rtp_sender/packet_storage/packet_storage.h', - 'transport/rtp_sender/rtp_packetizer/rtp_packetizer.cc', - 'transport/rtp_sender/rtp_packetizer/rtp_packetizer.h', - 'transport/rtp_sender/rtp_sender.cc', - 'transport/rtp_sender/rtp_sender.h', - 'transport/transport/udp_transport.cc', - 'transport/transport/udp_transport.h', - 'transport/utility/transport_encryption_handler.cc', - 'transport/utility/transport_encryption_handler.h', + 'net/cast_transport_config.cc', + 'net/cast_transport_config.h', + 'net/cast_transport_defines.h', + 'net/cast_transport_sender.h', + 'net/cast_transport_sender_impl.cc', + 'net/cast_transport_sender_impl.h', + 'net/pacing/paced_sender.cc', + 'net/pacing/paced_sender.h', + 'net/rtcp/receiver_rtcp_event_subscriber.cc', + 'net/rtcp/rtcp_builder.cc', + 'net/rtcp/rtcp_builder.h', + 'net/rtcp/rtcp_defines.cc', + 'net/rtcp/rtcp_defines.h', + 'net/rtcp/rtcp.h', + 'net/rtcp/rtcp.cc', + 'net/rtcp/rtcp_receiver.cc', + 'net/rtcp/rtcp_receiver.h', + 'net/rtcp/rtcp_sender.cc', + 'net/rtcp/rtcp_sender.h', + 'net/rtcp/rtcp_utility.cc', + 'net/rtcp/rtcp_utility.h', + 'net/rtp/packet_storage.cc', + 'net/rtp/packet_storage.h', + 'net/rtp/rtp_packetizer.cc', + 'net/rtp/rtp_packetizer.h', + 'net/rtp/rtp_sender.cc', + 'net/rtp/rtp_sender.h', + 'net/udp_transport.cc', + 'net/udp_transport.h', ], # source }, ], diff --git a/media/cast/cast_config.cc b/media/cast/cast_config.cc index 0e7953af01..f74121632c 100644 --- a/media/cast/cast_config.cc +++ b/media/cast/cast_config.cc @@ -22,9 +22,13 @@ namespace cast { // these classes to centralize the logic? VideoSenderConfig::VideoSenderConfig() - : incoming_feedback_ssrc(0), + : ssrc(0), + incoming_feedback_ssrc(0), rtcp_interval(kDefaultRtcpIntervalMs), rtcp_mode(kRtcpReducedSize), + target_playout_delay( + base::TimeDelta::FromMilliseconds(kDefaultRtpMaxDelayMs)), + rtp_payload_type(0), use_external_encoder(false), width(0), height(0), @@ -36,17 +40,26 @@ VideoSenderConfig::VideoSenderConfig() min_qp(kDefaultMinQp), max_frame_rate(kDefaultMaxFrameRate), max_number_of_video_buffers_used(kDefaultNumberOfVideoBuffers), - codec(transport::kVp8), + codec(CODEC_VIDEO_VP8), number_of_encode_threads(1) {} +VideoSenderConfig::~VideoSenderConfig() {} + AudioSenderConfig::AudioSenderConfig() - : incoming_feedback_ssrc(0), + : ssrc(0), + incoming_feedback_ssrc(0), rtcp_interval(kDefaultRtcpIntervalMs), rtcp_mode(kRtcpReducedSize), + target_playout_delay( + base::TimeDelta::FromMilliseconds(kDefaultRtpMaxDelayMs)), + rtp_payload_type(0), use_external_encoder(false), frequency(0), channels(0), - bitrate(0) {} + bitrate(0), + codec(CODEC_AUDIO_OPUS) {} + +AudioSenderConfig::~AudioSenderConfig() {} FrameReceiverConfig::FrameReceiverConfig() : feedback_ssrc(0), @@ -57,7 +70,8 @@ FrameReceiverConfig::FrameReceiverConfig() rtp_payload_type(0), frequency(0), channels(0), - max_frame_rate(0) {} + max_frame_rate(0), + codec(CODEC_UNKNOWN) {} FrameReceiverConfig::~FrameReceiverConfig() {} diff --git a/media/cast/cast_config.h b/media/cast/cast_config.h index ea25d6b6cf..c2e797b63a 100644 --- a/media/cast/cast_config.h +++ b/media/cast/cast_config.h @@ -14,51 +14,79 @@ #include "base/memory/ref_counted.h" #include "base/memory/shared_memory.h" #include "base/single_thread_task_runner.h" +#include "base/time/time.h" #include "media/cast/cast_defines.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace media { class VideoEncodeAccelerator; namespace cast { -enum RtcpMode { - kRtcpCompound, // Compound RTCP mode is described by RFC 4585. - kRtcpReducedSize, // Reduced-size RTCP mode is described by RFC 5506. -}; - // TODO(miu): Merge AudioSenderConfig and VideoSenderConfig and make their // naming/documentation consistent with FrameReceiverConfig. struct AudioSenderConfig { AudioSenderConfig(); + ~AudioSenderConfig(); + + // Identifier referring to the sender, used by the receiver. + uint32 ssrc; - // The sender ssrc is in rtp_config.ssrc. + // The receiver's SSRC identifier. uint32 incoming_feedback_ssrc; int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; - transport::RtpConfig rtp_config; + // The total amount of time between a frame's capture/recording on the sender + // and its playback on the receiver (i.e., shown to a user). This is fixed as + // a value large enough to give the system sufficient time to encode, + // transmit/retransmit, receive, decode, and render; given its run-time + // environment (sender/receiver hardware performance, network conditions, + // etc.). + base::TimeDelta target_playout_delay; + + // RTP payload type enum: Specifies the type/encoding of frame data. + int rtp_payload_type; bool use_external_encoder; int frequency; int channels; int bitrate; // Set to <= 0 for "auto variable bitrate" (libopus knows best). - transport::AudioCodec codec; + Codec codec; + + // The AES crypto key and initialization vector. Each of these strings + // contains the data in binary form, of size kAesKeySize. If they are empty + // strings, crypto is not being used. + std::string aes_key; + std::string aes_iv_mask; }; struct VideoSenderConfig { VideoSenderConfig(); + ~VideoSenderConfig(); - // The sender ssrc is in rtp_config.ssrc. - uint32 incoming_feedback_ssrc; + // Identifier referring to the sender, used by the receiver. + uint32 ssrc; + + // The receiver's SSRC identifier. + uint32 incoming_feedback_ssrc; // TODO(miu): Rename to receiver_ssrc. int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; - transport::RtpConfig rtp_config; + // The total amount of time between a frame's capture/recording on the sender + // and its playback on the receiver (i.e., shown to a user). This is fixed as + // a value large enough to give the system sufficient time to encode, + // transmit/retransmit, receive, decode, and render; given its run-time + // environment (sender/receiver hardware performance, network conditions, + // etc.). + base::TimeDelta target_playout_delay; + + // RTP payload type enum: Specifies the type/encoding of frame data. + int rtp_payload_type; bool use_external_encoder; int width; // Incoming frames will be scaled to this size. @@ -72,8 +100,14 @@ struct VideoSenderConfig { int min_qp; int max_frame_rate; int max_number_of_video_buffers_used; // Max value depend on codec. - transport::VideoCodec codec; + Codec codec; int number_of_encode_threads; + + // The AES crypto key and initialization vector. Each of these strings + // contains the data in binary form, of size kAesKeySize. If they are empty + // strings, crypto is not being used. + std::string aes_key; + std::string aes_iv_mask; }; // TODO(miu): Naming and minor type changes are badly needed in a later CL. @@ -127,11 +161,7 @@ struct FrameReceiverConfig { // Codec used for the compression of signal data. // TODO(miu): Merge the AudioCodec and VideoCodec enums into one so this union // is not necessary. - union MergedCodecPlaceholder { - transport::AudioCodec audio; - transport::VideoCodec video; - MergedCodecPlaceholder() : audio(transport::kUnknownAudioCodec) {} - } codec; + Codec codec; // The AES crypto key and initialization vector. Each of these strings // contains the data in binary form, of size kAesKeySize. If they are empty @@ -140,9 +170,10 @@ struct FrameReceiverConfig { std::string aes_iv_mask; }; -// import from media::cast::transport -typedef transport::Packet Packet; -typedef transport::PacketList PacketList; +// Import from media::cast. + +typedef Packet Packet; +typedef PacketList PacketList; typedef base::Callback<void(CastInitializationStatus)> CastInitializationCallback; diff --git a/media/cast/cast_defines.h b/media/cast/cast_defines.h index 64b20c96da..07be3b3f9e 100644 --- a/media/cast/cast_defines.h +++ b/media/cast/cast_defines.h @@ -14,7 +14,7 @@ #include "base/compiler_specific.h" #include "base/logging.h" #include "base/time/time.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace media { namespace cast { @@ -29,7 +29,6 @@ const uint32 kStartFrameId = UINT32_C(0xffffffff); // frames. const int kMaxUnackedFrames = 255; -const size_t kMaxIpPacketSize = 1500; const int kStartRttMs = 20; const int64 kCastMessageUpdateIntervalMs = 33; const int64 kNackRepeatIntervalMs = 30; @@ -193,13 +192,6 @@ inline base::TimeDelta RtpDeltaToTimeDelta(int64 rtp_delta, int rtp_timebase) { return rtp_delta * base::TimeDelta::FromSeconds(1) / rtp_timebase; } -inline uint32 GetVideoRtpTimestamp(const base::TimeTicks& time_ticks) { - base::TimeTicks zero_time; - base::TimeDelta recorded_delta = time_ticks - zero_time; - // Timestamp is in 90 KHz for video. - return static_cast<uint32>(recorded_delta.InMilliseconds() * 90); -} - } // namespace cast } // namespace media diff --git a/media/cast/cast_receiver.h b/media/cast/cast_receiver.h index a9d3edeb78..f57942231d 100644 --- a/media/cast/cast_receiver.h +++ b/media/cast/cast_receiver.h @@ -22,9 +22,7 @@ class VideoFrame; namespace cast { -namespace transport { class PacketSender; -} // The following callbacks are used to deliver decoded audio/video frame data, // the frame's corresponding play-out time, and a continuity flag. @@ -44,7 +42,7 @@ typedef base::Callback<void(const scoped_refptr<media::VideoFrame>& video_frame, // should examine the |frame_id| field to determine whether any frames have been // dropped (i.e., frame_id should be incrementing by one each time). Note: A // NULL pointer can be returned on error. -typedef base::Callback<void(scoped_ptr<transport::EncodedFrame>)> +typedef base::Callback<void(scoped_ptr<EncodedFrame>)> ReceiveEncodedFrameCallback; class CastReceiver { @@ -53,13 +51,13 @@ class CastReceiver { scoped_refptr<CastEnvironment> cast_environment, const FrameReceiverConfig& audio_config, const FrameReceiverConfig& video_config, - transport::PacketSender* const packet_sender); + PacketSender* const packet_sender); // All received RTP and RTCP packets for the call should be sent to this // PacketReceiver. Can be called from any thread. // TODO(hubbe): Replace with: // virtual void ReceivePacket(scoped_ptr<Packet> packet) = 0; - virtual transport::PacketReceiverCallback packet_receiver() = 0; + virtual PacketReceiverCallback packet_receiver() = 0; // Polling interface to get audio and video frames from the CastReceiver. The // the RequestDecodedXXXXXFrame() methods utilize internal software-based diff --git a/media/cast/cast_sender.h b/media/cast/cast_sender.h index eb3327ff3d..abe0a01713 100644 --- a/media/cast/cast_sender.h +++ b/media/cast/cast_sender.h @@ -19,7 +19,7 @@ #include "media/base/audio_bus.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/transport/cast_transport_sender.h" +#include "media/cast/net/cast_transport_sender.h" namespace media { class VideoFrame; @@ -63,7 +63,7 @@ class CastSender { public: static scoped_ptr<CastSender> Create( scoped_refptr<CastEnvironment> cast_environment, - transport::CastTransportSender* const transport_sender); + CastTransportSender* const transport_sender); virtual ~CastSender() {} @@ -75,7 +75,7 @@ class CastSender { // All RTCP packets for the session should be inserted to this object. // This function and the callback must be called on the main thread. - virtual transport::PacketReceiverCallback packet_receiver() = 0; + virtual PacketReceiverCallback packet_receiver() = 0; // Initialize the audio stack. Must be called in order to send audio frames. // Status of the initialization will be returned on cast_initialization_cb. diff --git a/media/cast/cast_sender_impl.cc b/media/cast/cast_sender_impl.cc index 361e4d8dc1..a120d3a930 100644 --- a/media/cast/cast_sender_impl.cc +++ b/media/cast/cast_sender_impl.cc @@ -1,6 +1,7 @@ // Copyright 2013 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. + #include "media/cast/cast_sender_impl.h" #include "base/bind.h" @@ -75,7 +76,7 @@ class LocalAudioFrameInput : public AudioFrameInput { scoped_ptr<CastSender> CastSender::Create( scoped_refptr<CastEnvironment> cast_environment, - transport::CastTransportSender* const transport_sender) { + CastTransportSender* const transport_sender) { CHECK(cast_environment); return scoped_ptr<CastSender>( new CastSenderImpl(cast_environment, transport_sender)); @@ -83,7 +84,7 @@ scoped_ptr<CastSender> CastSender::Create( CastSenderImpl::CastSenderImpl( scoped_refptr<CastEnvironment> cast_environment, - transport::CastTransportSender* const transport_sender) + CastTransportSender* const transport_sender) : cast_environment_(cast_environment), transport_sender_(transport_sender), weak_factory_(this) { @@ -211,7 +212,7 @@ scoped_refptr<VideoFrameInput> CastSenderImpl::video_frame_input() { return video_frame_input_; } -transport::PacketReceiverCallback CastSenderImpl::packet_receiver() { +PacketReceiverCallback CastSenderImpl::packet_receiver() { return base::Bind(&CastSenderImpl::ReceivedPacket, weak_factory_.GetWeakPtr()); } diff --git a/media/cast/cast_sender_impl.h b/media/cast/cast_sender_impl.h index d09a869712..bc320f7b54 100644 --- a/media/cast/cast_sender_impl.h +++ b/media/cast/cast_sender_impl.h @@ -6,12 +6,12 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include "media/cast/audio_sender/audio_sender.h" #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" #include "media/cast/cast_sender.h" -#include "media/cast/video_sender/video_sender.h" +#include "media/cast/sender/audio_sender.h" +#include "media/cast/sender/video_sender.h" namespace media { class VideoFrame; @@ -25,7 +25,7 @@ class VideoSender; class CastSenderImpl : public CastSender { public: CastSenderImpl(scoped_refptr<CastEnvironment> cast_environment, - transport::CastTransportSender* const transport_sender); + CastTransportSender* const transport_sender); virtual void InitializeAudio( const AudioSenderConfig& audio_config, @@ -42,7 +42,7 @@ class CastSenderImpl : public CastSender { virtual scoped_refptr<AudioFrameInput> audio_frame_input() OVERRIDE; virtual scoped_refptr<VideoFrameInput> video_frame_input() OVERRIDE; - virtual transport::PacketReceiverCallback packet_receiver() OVERRIDE; + virtual PacketReceiverCallback packet_receiver() OVERRIDE; private: void ReceivedPacket(scoped_ptr<Packet> packet); @@ -55,7 +55,7 @@ class CastSenderImpl : public CastSender { scoped_refptr<CastEnvironment> cast_environment_; // The transport sender is owned by the owner of the CastSender, and should be // valid throughout the lifetime of the CastSender. - transport::CastTransportSender* const transport_sender_; + CastTransportSender* const transport_sender_; uint32 ssrc_of_audio_sender_; uint32 ssrc_of_video_sender_; diff --git a/media/cast/cast_testing.gypi b/media/cast/cast_testing.gypi index aef0fbd8c3..97e831e42b 100644 --- a/media/cast/cast_testing.gypi +++ b/media/cast/cast_testing.gypi @@ -11,19 +11,25 @@ '<(DEPTH)/', ], 'dependencies': [ + 'cast_net', 'cast_receiver', - 'cast_transport', '<(DEPTH)/testing/gtest.gyp:gtest', + '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg', '<(DEPTH)/third_party/libyuv/libyuv.gyp:libyuv', + '<(DEPTH)/third_party/mt19937ar/mt19937ar.gyp:mt19937ar', '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry', ], 'sources': [ + 'test/fake_media_source.cc', + 'test/fake_media_source.h', 'test/fake_single_thread_task_runner.cc', 'test/fake_single_thread_task_runner.h', 'test/skewed_single_thread_task_runner.cc', 'test/skewed_single_thread_task_runner.h', 'test/skewed_tick_clock.cc', 'test/skewed_tick_clock.h', + 'test/loopback_transport.cc', + 'test/loopback_transport.h', 'test/utility/audio_utility.cc', 'test/utility/audio_utility.h', 'test/utility/barcode.cc', @@ -52,14 +58,13 @@ ], 'dependencies': [ 'cast_base', + 'cast_net', 'cast_receiver', - 'cast_rtcp', 'cast_sender', 'cast_test_utility', # Not a true dependency. This is here to make sure the CQ can verify # the tools compile correctly. 'cast_tools', - 'cast_transport', '<(DEPTH)/base/base.gyp:test_support_base', '<(DEPTH)/net/net.gyp:net', '<(DEPTH)/testing/gmock.gyp:gmock', @@ -67,12 +72,6 @@ ], 'sources': [ '<(DEPTH)/media/base/run_all_unittests.cc', - 'audio_sender/audio_encoder_unittest.cc', - 'audio_sender/audio_sender_unittest.cc', - 'congestion_control/congestion_control_unittest.cc', - 'framer/cast_message_builder_unittest.cc', - 'framer/frame_buffer_unittest.cc', - 'framer/framer_unittest.cc', 'logging/encoding_event_subscriber_unittest.cc', 'logging/serialize_deserialize_test.cc', 'logging/logging_impl_unittest.cc', @@ -80,26 +79,44 @@ 'logging/receiver_time_offset_estimator_impl_unittest.cc', 'logging/simple_event_subscriber_unittest.cc', 'logging/stats_event_subscriber_unittest.cc', + 'net/cast_transport_sender_impl_unittest.cc', + 'net/pacing/mock_paced_packet_sender.cc', + 'net/pacing/mock_paced_packet_sender.h', + 'net/pacing/paced_sender_unittest.cc', + 'net/rtcp/mock_rtcp_receiver_feedback.cc', + 'net/rtcp/mock_rtcp_receiver_feedback.h', + 'net/rtcp/mock_rtcp_sender_feedback.cc', + 'net/rtcp/mock_rtcp_sender_feedback.h', + 'net/rtcp/rtcp_receiver_unittest.cc', + 'net/rtcp/rtcp_sender_unittest.cc', + 'net/rtcp/rtcp_unittest.cc', + 'net/rtcp/receiver_rtcp_event_subscriber_unittest.cc', +# TODO(miu): The following two are test utility modules. Rename/move the files. + 'net/rtcp/test_rtcp_packet_builder.cc', + 'net/rtcp/test_rtcp_packet_builder.h', + 'net/rtp/cast_message_builder_unittest.cc', + 'net/rtp/frame_buffer_unittest.cc', + 'net/rtp/framer_unittest.cc', + 'net/rtp/mock_rtp_payload_feedback.cc', + 'net/rtp/mock_rtp_payload_feedback.h', + 'net/rtp/packet_storage_unittest.cc', + 'net/rtp/receiver_stats_unittest.cc', + 'net/rtp/rtp_header_parser.cc', + 'net/rtp/rtp_header_parser.h', + 'net/rtp/rtp_packet_builder.cc', + 'net/rtp/rtp_parser_unittest.cc', + 'net/rtp/rtp_packetizer_unittest.cc', + 'net/rtp/rtp_receiver_defines.h', + 'net/udp_transport_unittest.cc', 'receiver/audio_decoder_unittest.cc', 'receiver/frame_receiver_unittest.cc', 'receiver/video_decoder_unittest.cc', - 'rtcp/mock_rtcp_receiver_feedback.cc', - 'rtcp/mock_rtcp_receiver_feedback.h', - 'rtcp/mock_rtcp_sender_feedback.cc', - 'rtcp/mock_rtcp_sender_feedback.h', - 'rtcp/rtcp_receiver_unittest.cc', - 'rtcp/rtcp_sender_unittest.cc', - 'rtcp/rtcp_unittest.cc', - 'rtcp/receiver_rtcp_event_subscriber_unittest.cc', -# TODO(miu): The following two are test utility modules. Rename/move the files. - 'rtcp/test_rtcp_packet_builder.cc', - 'rtcp/test_rtcp_packet_builder.h', - 'rtp_receiver/rtp_receiver_defines.h', - 'rtp_receiver/mock_rtp_payload_feedback.cc', - 'rtp_receiver/mock_rtp_payload_feedback.h', - 'rtp_receiver/receiver_stats_unittest.cc', - 'rtp_receiver/rtp_parser/test/rtp_packet_builder.cc', - 'rtp_receiver/rtp_parser/rtp_parser_unittest.cc', + 'sender/audio_encoder_unittest.cc', + 'sender/audio_sender_unittest.cc', + 'sender/congestion_control_unittest.cc', + 'sender/external_video_encoder_unittest.cc', + 'sender/video_encoder_impl_unittest.cc', + 'sender/video_sender_unittest.cc', 'test/end2end_unittest.cc', 'test/fake_receiver_time_offset_estimator.cc', 'test/fake_receiver_time_offset_estimator.h', @@ -109,18 +126,6 @@ 'test/fake_video_encode_accelerator.h', 'test/utility/audio_utility_unittest.cc', 'test/utility/barcode_unittest.cc', - 'transport/cast_transport_sender_impl_unittest.cc', - 'transport/pacing/mock_paced_packet_sender.cc', - 'transport/pacing/mock_paced_packet_sender.h', - 'transport/pacing/paced_sender_unittest.cc', - 'transport/rtp_sender/packet_storage/packet_storage_unittest.cc', - 'transport/rtp_sender/rtp_packetizer/rtp_packetizer_unittest.cc', - 'transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.cc', - 'transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h', - 'transport/transport/udp_transport_unittest.cc', - 'video_sender/external_video_encoder_unittest.cc', - 'video_sender/video_encoder_impl_unittest.cc', - 'video_sender/video_sender_unittest.cc', ], # source }, { @@ -131,11 +136,10 @@ ], 'dependencies': [ 'cast_base', + 'cast_net', 'cast_receiver', - 'cast_rtcp', 'cast_sender', 'cast_test_utility', - 'cast_transport', '<(DEPTH)/base/base.gyp:test_support_base', '<(DEPTH)/net/net.gyp:net', '<(DEPTH)/testing/gtest.gyp:gtest', @@ -167,6 +171,7 @@ 'dependencies': [ 'cast_receiver_app', 'cast_sender_app', + 'cast_simulator', 'udp_proxy', ], }, @@ -178,9 +183,9 @@ ], 'dependencies': [ 'cast_base', + 'cast_net', 'cast_receiver', 'cast_test_utility', - 'cast_transport', '<(DEPTH)/net/net.gyp:net_test_support', '<(DEPTH)/media/media.gyp:media', '<(DEPTH)/testing/gtest.gyp:gtest', @@ -211,9 +216,9 @@ ], 'dependencies': [ 'cast_base', + 'cast_net', 'cast_sender', 'cast_test_utility', - 'cast_transport', '<(DEPTH)/net/net.gyp:net_test_support', '<(DEPTH)/media/media.gyp:media', '<(DEPTH)/testing/gtest.gyp:gtest', @@ -226,6 +231,45 @@ ], }, { + 'target_name': 'cast_simulator', + 'type': 'executable', + 'include_dirs': [ + '<(DEPTH)/', + ], + 'dependencies': [ + 'cast_base', + 'cast_net', + 'cast_network_model_proto', + 'cast_sender', + 'cast_test_utility', + '<(DEPTH)/net/net.gyp:net_test_support', + '<(DEPTH)/media/media.gyp:media', + '<(DEPTH)/testing/gtest.gyp:gtest', + '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg', + '<(DEPTH)/third_party/opus/opus.gyp:opus', + '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry', + ], + 'sources': [ + '<(DEPTH)/media/cast/test/simulator.cc', + ], + }, + { + # GN version: //media/cast/test/proto + 'target_name': 'cast_network_model_proto', + 'type': 'static_library', + 'include_dirs': [ + '<(DEPTH)/', + ], + 'sources': [ + 'test/proto/network_simulation_model.proto', + ], + 'variables': { + 'proto_in_dir': 'test/proto', + 'proto_out_dir': 'media/cast/test/proto', + }, + 'includes': ['../../build/protoc.gypi'], + }, + { 'target_name': 'generate_barcode_video', 'type': 'executable', 'include_dirs': [ @@ -248,8 +292,8 @@ ], 'dependencies': [ 'cast_base', + 'cast_net', 'cast_test_utility', - 'cast_transport', '<(DEPTH)/base/base.gyp:base', '<(DEPTH)/media/media.gyp:media', ], diff --git a/media/cast/base/clock_drift_smoother.cc b/media/cast/common/clock_drift_smoother.cc index ca0380533e..aff9a396de 100644 --- a/media/cast/base/clock_drift_smoother.cc +++ b/media/cast/common/clock_drift_smoother.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/base/clock_drift_smoother.h" +#include "media/cast/common/clock_drift_smoother.h" #include "base/logging.h" diff --git a/media/cast/base/clock_drift_smoother.h b/media/cast/common/clock_drift_smoother.h index 67de4cb51a..0511da9f3d 100644 --- a/media/cast/base/clock_drift_smoother.h +++ b/media/cast/common/clock_drift_smoother.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_BASE_CLOCK_DRIFT_SMOOTHER_H_ -#define MEDIA_CAST_BASE_CLOCK_DRIFT_SMOOTHER_H_ +#ifndef MEDIA_CAST_COMMON_CLOCK_DRIFT_SMOOTHER_H_ +#define MEDIA_CAST_COMMON_CLOCK_DRIFT_SMOOTHER_H_ #include "base/time/time.h" @@ -49,4 +49,4 @@ class ClockDriftSmoother { } // namespace cast } // namespace media -#endif // MEDIA_CAST_BASE_CLOCK_DRIFT_SMOOTHER_H_ +#endif // MEDIA_CAST_COMMON_CLOCK_DRIFT_SMOOTHER_H_ diff --git a/media/cast/transport/utility/transport_encryption_handler.cc b/media/cast/common/transport_encryption_handler.cc index 89db2cf95b..54a43e8b52 100644 --- a/media/cast/transport/utility/transport_encryption_handler.cc +++ b/media/cast/common/transport_encryption_handler.cc @@ -2,32 +2,55 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/transport/utility/transport_encryption_handler.h" +#include "media/cast/common/transport_encryption_handler.h" #include "base/logging.h" #include "crypto/encryptor.h" #include "crypto/symmetric_key.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" + +namespace { + +// Crypto. +const size_t kAesBlockSize = 16; +const size_t kAesKeySize = 16; + +std::string GetAesNonce(uint32 frame_id, const std::string& iv_mask) { + std::string aes_nonce(kAesBlockSize, 0); + + // Serializing frame_id in big-endian order (aes_nonce[8] is the most + // significant byte of frame_id). + aes_nonce[11] = frame_id & 0xff; + aes_nonce[10] = (frame_id >> 8) & 0xff; + aes_nonce[9] = (frame_id >> 16) & 0xff; + aes_nonce[8] = (frame_id >> 24) & 0xff; + + for (size_t i = 0; i < kAesBlockSize; ++i) { + aes_nonce[i] ^= iv_mask[i]; + } + return aes_nonce; +} + +} // namespace namespace media { namespace cast { -namespace transport { TransportEncryptionHandler::TransportEncryptionHandler() - : key_(), encryptor_(), iv_mask_(), initialized_(false) {} + : key_(), encryptor_(), iv_mask_(), is_activated_(false) {} TransportEncryptionHandler::~TransportEncryptionHandler() {} bool TransportEncryptionHandler::Initialize(std::string aes_key, std::string aes_iv_mask) { - initialized_ = false; + is_activated_ = false; if (aes_iv_mask.size() == kAesKeySize && aes_key.size() == kAesKeySize) { iv_mask_ = aes_iv_mask; key_.reset( crypto::SymmetricKey::Import(crypto::SymmetricKey::AES, aes_key)); encryptor_.reset(new crypto::Encryptor()); encryptor_->Init(key_.get(), crypto::Encryptor::CTR, std::string()); - initialized_ = true; + is_activated_ = true; } else if (aes_iv_mask.size() != 0 || aes_key.size() != 0) { DCHECK_EQ(aes_iv_mask.size(), 0u) << "Invalid Crypto configuration: aes_iv_mask.size"; @@ -41,7 +64,7 @@ bool TransportEncryptionHandler::Initialize(std::string aes_key, bool TransportEncryptionHandler::Encrypt(uint32 frame_id, const base::StringPiece& data, std::string* encrypted_data) { - if (!initialized_) + if (!is_activated_) return false; if (!encryptor_->SetCounter(GetAesNonce(frame_id, iv_mask_))) { NOTREACHED() << "Failed to set counter"; @@ -57,10 +80,10 @@ bool TransportEncryptionHandler::Encrypt(uint32 frame_id, bool TransportEncryptionHandler::Decrypt(uint32 frame_id, const base::StringPiece& ciphertext, std::string* plaintext) { - if (!initialized_) { + if (!is_activated_) { return false; } - if (!encryptor_->SetCounter(transport::GetAesNonce(frame_id, iv_mask_))) { + if (!encryptor_->SetCounter(GetAesNonce(frame_id, iv_mask_))) { NOTREACHED() << "Failed to set counter"; return false; } @@ -71,6 +94,5 @@ bool TransportEncryptionHandler::Decrypt(uint32 frame_id, return true; } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/utility/transport_encryption_handler.h b/media/cast/common/transport_encryption_handler.h index 06d0e3f34d..d4798dc78b 100644 --- a/media/cast/transport/utility/transport_encryption_handler.h +++ b/media/cast/common/transport_encryption_handler.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_TRANSPORT_TRANSPORT_UTILITY_ENCRYPTION_HANDLER_H_ -#define MEDIA_CAST_TRANSPORT_TRANSPORT_UTILITY_ENCRYPTION_HANDLER_H_ +#ifndef MEDIA_CAST_COMMON_TRANSPORT_ENCRYPTION_HANDLER_H_ +#define MEDIA_CAST_COMMON_TRANSPORT_ENCRYPTION_HANDLER_H_ // Helper class to handle encryption for the Cast Transport library. #include <string> @@ -20,7 +20,6 @@ class SymmetricKey; namespace media { namespace cast { -namespace transport { class TransportEncryptionHandler : public base::NonThreadSafe { public: @@ -37,22 +36,18 @@ class TransportEncryptionHandler : public base::NonThreadSafe { const base::StringPiece& ciphertext, std::string* plaintext); - // TODO(miu): This naming is very misleading. It should be called - // is_activated() since Initialize() without keys (i.e., cypto is disabled) - // may have succeeded. - bool initialized() const { return initialized_; } + bool is_activated() const { return is_activated_; } private: scoped_ptr<crypto::SymmetricKey> key_; scoped_ptr<crypto::Encryptor> encryptor_; std::string iv_mask_; - bool initialized_; + bool is_activated_; DISALLOW_COPY_AND_ASSIGN(TransportEncryptionHandler); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_TRANSPORT_UTILITY_ENCRYPTION_HANDLER_H_ +#endif // MEDIA_CAST_COMMON_TRANSPORT_ENCRYPTION_HANDLER_H_ diff --git a/media/cast/logging/proto/BUILD.gn b/media/cast/logging/proto/BUILD.gn new file mode 100644 index 0000000000..c9fb89bbae --- /dev/null +++ b/media/cast/logging/proto/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright 2014 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. + +import("//third_party/protobuf/proto_library.gni") + +# GYP version: media/cast/cast.gyp:cast_logging_proto +source_set("proto") { + sources = [ + "proto_utils.cc", + ] + deps = [ + ":cast_logging_proto", + ] +} + +proto_library("cast_logging_proto") { + visibility = ":proto" + sources = [ + "raw_events.proto", + ] +} diff --git a/media/cast/net/DEPS b/media/cast/net/DEPS new file mode 100644 index 0000000000..3fa74fa027 --- /dev/null +++ b/media/cast/net/DEPS @@ -0,0 +1,16 @@ +include_rules = [ + "-media/cast", + "+media/cast/cast_config.h", + "+media/cast/cast_defines.h", + "+media/cast/cast_environment.h", + "+media/cast/common", + "+media/cast/logging", + "+media/cast/net", + "+net", +] + +specific_include_rules = { + ".*unittest.cc": [ + "+media/cast/test", + ], +} diff --git a/media/cast/transport/cast_transport_config.cc b/media/cast/net/cast_transport_config.cc index 16e9034713..ae8ec60551 100644 --- a/media/cast/transport/cast_transport_config.cc +++ b/media/cast/net/cast_transport_config.cc @@ -2,37 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace media { namespace cast { -namespace transport { - -namespace { -const int kDefaultRtpMaxDelayMs = 100; -} // namespace - -RtpConfig::RtpConfig() - : ssrc(0), - max_delay_ms(kDefaultRtpMaxDelayMs), - payload_type(0) {} - -RtpConfig::~RtpConfig() {} CastTransportRtpConfig::CastTransportRtpConfig() - : max_outstanding_frames(-1) {} + : ssrc(0), rtp_payload_type(0), stored_frames(0) {} CastTransportRtpConfig::~CastTransportRtpConfig() {} -CastTransportAudioConfig::CastTransportAudioConfig() - : codec(kOpus), frequency(0), channels(0) {} - -CastTransportAudioConfig::~CastTransportAudioConfig() {} - -CastTransportVideoConfig::CastTransportVideoConfig() : codec(kVp8) {} - -CastTransportVideoConfig::~CastTransportVideoConfig() {} - EncodedFrame::EncodedFrame() : dependency(UNKNOWN_DEPENDENCY), frame_id(0), @@ -77,6 +56,5 @@ SendRtcpFromRtpSenderData::SendRtcpFromRtpSenderData() : packet_type_flags(0), sending_ssrc(0) {} SendRtcpFromRtpSenderData::~SendRtcpFromRtpSenderData() {} -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/cast_transport_config.h b/media/cast/net/cast_transport_config.h index 96b771acb9..db87b8c9fc 100644 --- a/media/cast/transport/cast_transport_config.h +++ b/media/cast/net/cast_transport_config.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_ -#define MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_ +#ifndef MEDIA_CAST_NET_CAST_TRANSPORT_CONFIG_H_ +#define MEDIA_CAST_NET_CAST_TRANSPORT_CONFIG_H_ #include <string> #include <vector> @@ -13,66 +13,45 @@ #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "base/stl_util.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "net/base/ip_endpoint.h" +#include "media/cast/net/cast_transport_defines.h" namespace media { namespace cast { -namespace transport { enum RtcpMode { kRtcpCompound, // Compound RTCP mode is described by RFC 4585. kRtcpReducedSize, // Reduced-size RTCP mode is described by RFC 5506. }; -enum VideoCodec { - kUnknownVideoCodec, - kFakeSoftwareVideo, - kVp8, - kH264, - kVideoCodecLast = kH264 -}; - -enum AudioCodec { - kUnknownAudioCodec, - kOpus, - kPcm16, - kAudioCodecLast = kPcm16 -}; - -struct RtpConfig { - RtpConfig(); - ~RtpConfig(); - uint32 ssrc; - int max_delay_ms; - int payload_type; - std::string aes_key; // Binary string of size kAesKeySize. - std::string aes_iv_mask; // Binary string of size kAesBlockSize. +enum Codec { + CODEC_UNKNOWN, + CODEC_AUDIO_OPUS, + CODEC_AUDIO_PCM16, + CODEC_VIDEO_FAKE, + CODEC_VIDEO_VP8, + CODEC_VIDEO_H264, + CODEC_LAST = CODEC_VIDEO_H264 }; struct CastTransportRtpConfig { CastTransportRtpConfig(); ~CastTransportRtpConfig(); - RtpConfig config; - int max_outstanding_frames; -}; -struct CastTransportAudioConfig { - CastTransportAudioConfig(); - ~CastTransportAudioConfig(); + // Identifier refering to this sender. + uint32 ssrc; - CastTransportRtpConfig rtp; - AudioCodec codec; - int frequency; - int channels; -}; + // RTP payload type enum: Specifies the type/encoding of frame data. + int rtp_payload_type; -struct CastTransportVideoConfig { - CastTransportVideoConfig(); - ~CastTransportVideoConfig(); + // The number of most-recent frames that must be stored in the transport + // layer, to facilitate re-transmissions. + int stored_frames; - CastTransportRtpConfig rtp; - VideoCodec codec; + // The AES crypto key and initialization vector. Each of these strings + // contains the data in binary form, of size kAesKeySize. If they are empty + // strings, crypto is not being used. + std::string aes_key; + std::string aes_iv_mask; }; // A combination of metadata and data for one encoded frame. This can contain @@ -214,8 +193,7 @@ inline bool operator==(RtcpSenderInfo lhs, RtcpSenderInfo rhs) { lhs.send_octet_count == rhs.send_octet_count; } -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_CONFIG_H_ +#endif // MEDIA_CAST_NET_CAST_TRANSPORT_CONFIG_H_ diff --git a/media/cast/transport/cast_transport_defines.h b/media/cast/net/cast_transport_defines.h index a34f7c539a..b2020f33af 100644 --- a/media/cast/transport/cast_transport_defines.h +++ b/media/cast/net/cast_transport_defines.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_DEFINES_H_ -#define MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_DEFINES_H_ +#ifndef MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ +#define MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ #include <stdint.h> @@ -16,7 +16,6 @@ namespace media { namespace cast { -namespace transport { // TODO(mikhal): Implement and add more types. enum CastTransportStatus { @@ -35,26 +34,6 @@ typedef std::set<uint16> PacketIdSet; // Each uint8 represents one cast frame. typedef std::map<uint8, PacketIdSet> MissingFramesAndPacketsMap; -// Crypto. -const size_t kAesBlockSize = 16; -const size_t kAesKeySize = 16; - -inline std::string GetAesNonce(uint32 frame_id, const std::string& iv_mask) { - std::string aes_nonce(kAesBlockSize, 0); - - // Serializing frame_id in big-endian order (aes_nonce[8] is the most - // significant byte of frame_id). - aes_nonce[11] = frame_id & 0xff; - aes_nonce[10] = (frame_id >> 8) & 0xff; - aes_nonce[9] = (frame_id >> 16) & 0xff; - aes_nonce[8] = (frame_id >> 24) & 0xff; - - for (size_t i = 0; i < kAesBlockSize; ++i) { - aes_nonce[i] ^= iv_mask[i]; - } - return aes_nonce; -} - // Rtcp defines. enum RtcpPacketFields { @@ -162,8 +141,7 @@ inline uint32 GetVideoRtpTimestamp(const base::TimeTicks& time_ticks) { return static_cast<uint32>(recorded_delta.InMilliseconds() * 90); } -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_DEFINES_H_ +#endif // MEDIA_CAST_NET_CAST_TRANSPORT_DEFINES_H_ diff --git a/media/cast/transport/cast_transport_sender.h b/media/cast/net/cast_transport_sender.h index e88f2f4f09..3f8a119655 100644 --- a/media/cast/transport/cast_transport_sender.h +++ b/media/cast/net/cast_transport_sender.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -20,8 +20,8 @@ // This also works when the CastSender acts as a receiver for the RTCP packets // due to the weak pointers in the ReceivedPacket method in cast_sender_impl.cc. -#ifndef MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_SENDER_H_ -#define MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_SENDER_H_ +#ifndef MEDIA_CAST_NET_CAST_TRANSPORT_SENDER_H_ +#define MEDIA_CAST_NET_CAST_TRANSPORT_SENDER_H_ #include "base/basictypes.h" #include "base/callback.h" @@ -29,8 +29,9 @@ #include "base/threading/non_thread_safe.h" #include "base/time/tick_clock.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "net/base/ip_endpoint.h" namespace net { class NetLog; @@ -38,7 +39,6 @@ class NetLog; namespace media { namespace cast { -namespace transport { // Following the initialization of either audio or video an initialization // status will be sent via this callback. @@ -65,9 +65,8 @@ class CastTransportSender : public base::NonThreadSafe { // Audio/Video initialization. // Encoded frames cannot be transmitted until the relevant initialize method // is called. Usually called by CastSender. - virtual void InitializeAudio(const CastTransportAudioConfig& config) = 0; - - virtual void InitializeVideo(const CastTransportVideoConfig& config) = 0; + virtual void InitializeAudio(const CastTransportRtpConfig& config) = 0; + virtual void InitializeVideo(const CastTransportRtpConfig& config) = 0; // Sets the Cast packet receiver. Should be called after creation on the // Cast sender. Packets won't be received until this function is called. @@ -106,8 +105,7 @@ class CastTransportSender : public base::NonThreadSafe { base::TimeDelta dedupe_window) = 0; }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_SENDER_H_ +#endif // MEDIA_CAST_NET_CAST_TRANSPORT_SENDER_H_ diff --git a/media/cast/transport/cast_transport_sender_impl.cc b/media/cast/net/cast_transport_sender_impl.cc index 6fd848f27b..973f34155f 100644 --- a/media/cast/transport/cast_transport_sender_impl.cc +++ b/media/cast/net/cast_transport_sender_impl.cc @@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/transport/cast_transport_sender_impl.h" +#include "media/cast/net/cast_transport_sender_impl.h" #include "base/single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/udp_transport.h" #include "net/base/net_util.h" namespace media { namespace cast { -namespace transport { scoped_ptr<CastTransportSender> CastTransportSender::Create( net::NetLog* net_log, @@ -80,18 +80,18 @@ CastTransportSenderImpl::~CastTransportSenderImpl() { } void CastTransportSenderImpl::InitializeAudio( - const CastTransportAudioConfig& config) { - LOG_IF(WARNING, config.rtp.config.aes_key.empty() || - config.rtp.config.aes_iv_mask.empty()) + const CastTransportRtpConfig& config) { + LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) << "Unsafe to send audio with encryption DISABLED."; - if (!audio_encryptor_.Initialize(config.rtp.config.aes_key, - config.rtp.config.aes_iv_mask)) { + if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); return; } audio_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_)); - if (audio_sender_->InitializeAudio(config)) { - pacer_.RegisterAudioSsrc(config.rtp.config.ssrc); + if (audio_sender_->Initialize(config)) { + // Audio packets have a higher priority. + pacer_.RegisterAudioSsrc(config.ssrc); + pacer_.RegisterPrioritySsrc(config.ssrc); status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); } else { audio_sender_.reset(); @@ -100,18 +100,16 @@ void CastTransportSenderImpl::InitializeAudio( } void CastTransportSenderImpl::InitializeVideo( - const CastTransportVideoConfig& config) { - LOG_IF(WARNING, config.rtp.config.aes_key.empty() || - config.rtp.config.aes_iv_mask.empty()) + const CastTransportRtpConfig& config) { + LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) << "Unsafe to send video with encryption DISABLED."; - if (!video_encryptor_.Initialize(config.rtp.config.aes_key, - config.rtp.config.aes_iv_mask)) { + if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); return; } video_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_)); - if (video_sender_->InitializeVideo(config)) { - pacer_.RegisterVideoSsrc(config.rtp.config.ssrc); + if (video_sender_->Initialize(config)) { + pacer_.RegisterVideoSsrc(config.ssrc); status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); } else { video_sender_.reset(); @@ -128,7 +126,7 @@ namespace { void EncryptAndSendFrame(const EncodedFrame& frame, TransportEncryptionHandler* encryptor, RtpSender* sender) { - if (encryptor->initialized()) { + if (encryptor->is_activated()) { EncodedFrame encrypted_frame; frame.CopyMetadataTo(&encrypted_frame); if (encryptor->Encrypt(frame.frame_id, frame.data, &encrypted_frame.data)) { @@ -207,6 +205,5 @@ void CastTransportSenderImpl::SendRawEvents() { raw_events_callback_.Run(packet_events); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/cast_transport_sender_impl.h b/media/cast/net/cast_transport_sender_impl.h index 035ef844b6..5d34fdeb01 100644 --- a/media/cast/transport/cast_transport_sender_impl.h +++ b/media/cast/net/cast_transport_sender_impl.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_IMPL_H_ -#define MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_IMPL_H_ +#ifndef MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_ +#define MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_ #include "base/callback.h" #include "base/memory/ref_counted.h" @@ -11,18 +11,19 @@ #include "base/time/tick_clock.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "media/cast/common/transport_encryption_handler.h" #include "media/cast/logging/logging_defines.h" #include "media/cast/logging/simple_event_subscriber.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/pacing/paced_sender.h" -#include "media/cast/transport/rtcp/rtcp_builder.h" -#include "media/cast/transport/rtp_sender/rtp_sender.h" -#include "media/cast/transport/utility/transport_encryption_handler.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/rtcp_builder.h" +#include "media/cast/net/rtp/rtp_sender.h" namespace media { namespace cast { -namespace transport { + +class UdpTransport; class CastTransportSenderImpl : public CastTransportSender { public: @@ -46,9 +47,8 @@ class CastTransportSenderImpl : public CastTransportSender { virtual ~CastTransportSenderImpl(); - virtual void InitializeAudio(const CastTransportAudioConfig& config) OVERRIDE; - - virtual void InitializeVideo(const CastTransportVideoConfig& config) OVERRIDE; + virtual void InitializeAudio(const CastTransportRtpConfig& config) OVERRIDE; + virtual void InitializeVideo(const CastTransportRtpConfig& config) OVERRIDE; // CastTransportSender implementation. virtual void SetPacketReceiver(const PacketReceiverCallback& packet_receiver) @@ -103,8 +103,7 @@ class CastTransportSenderImpl : public CastTransportSender { DISALLOW_COPY_AND_ASSIGN(CastTransportSenderImpl); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_CAST_TRANSPORT_IMPL_H_ +#endif // MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_ diff --git a/media/cast/transport/cast_transport_sender_impl_unittest.cc b/media/cast/net/cast_transport_sender_impl_unittest.cc index 67eb39a47a..b1d29b9ef9 100644 --- a/media/cast/transport/cast_transport_sender_impl_unittest.cc +++ b/media/cast/net/cast_transport_sender_impl_unittest.cc @@ -12,19 +12,18 @@ #include "base/run_loop.h" #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_config.h" -#include "media/cast/rtcp/rtcp.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender_impl.h" +#include "media/cast/net/rtcp/rtcp.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender_impl.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { namespace cast { -namespace transport { static const int64 kStartMillisecond = INT64_C(12345678900000); -class FakePacketSender : public transport::PacketSender { +class FakePacketSender : public PacketSender { public: FakePacketSender() {} @@ -78,7 +77,7 @@ class CastTransportSenderImplTest : public ::testing::Test { } } - static void UpdateCastTransportStatus(transport::CastTransportStatus status) { + static void UpdateCastTransportStatus(CastTransportStatus status) { } base::SimpleTestTickClock testing_clock_; @@ -108,6 +107,5 @@ TEST_F(CastTransportSenderImplTest, InitWithLogging) { EXPECT_GT(num_times_callback_called_, 1); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/frame_id_wrap_helper_test.cc b/media/cast/net/frame_id_wrap_helper_test.cc index 3a2060d3aa..92a8443533 100644 --- a/media/cast/transport/frame_id_wrap_helper_test.cc +++ b/media/cast/net/frame_id_wrap_helper_test.cc @@ -1,13 +1,12 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. #include <gtest/gtest.h> -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" namespace media { namespace cast { -namespace transport { class FrameIdWrapHelperTest : public ::testing::Test { protected: @@ -47,6 +46,5 @@ TEST_F(FrameIdWrapHelperTest, OutOfOrder) { EXPECT_EQ(257u, new_frame_id); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/pacing/mock_paced_packet_sender.cc b/media/cast/net/pacing/mock_paced_packet_sender.cc index 5e325f0233..3219ba2ba4 100644 --- a/media/cast/transport/pacing/mock_paced_packet_sender.cc +++ b/media/cast/net/pacing/mock_paced_packet_sender.cc @@ -1,17 +1,15 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/pacing/mock_paced_packet_sender.h" +#include "media/cast/net/pacing/mock_paced_packet_sender.h" namespace media { namespace cast { -namespace transport { MockPacedPacketSender::MockPacedPacketSender() {} MockPacedPacketSender::~MockPacedPacketSender() {} -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/pacing/mock_paced_packet_sender.h b/media/cast/net/pacing/mock_paced_packet_sender.h index 20b7647035..2f7f1b2650 100644 --- a/media/cast/transport/pacing/mock_paced_packet_sender.h +++ b/media/cast/net/pacing/mock_paced_packet_sender.h @@ -1,16 +1,15 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_PACING_MOCK_PACED_PACKET_SENDER_H_ -#define MEDIA_CAST_TRANSPORT_PACING_MOCK_PACED_PACKET_SENDER_H_ +#ifndef MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ +#define MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/pacing/paced_sender.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { namespace cast { -namespace transport { class MockPacedPacketSender : public PacedPacketSender { public: @@ -24,8 +23,7 @@ class MockPacedPacketSender : public PacedPacketSender { MOCK_METHOD1(CancelSendingPacket, void(const PacketKey& packet_key)); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_PACING_MOCK_PACED_PACKET_SENDER_H_ +#endif // MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ diff --git a/media/cast/transport/pacing/paced_sender.cc b/media/cast/net/pacing/paced_sender.cc index 20cbde85be..89a69272dc 100644 --- a/media/cast/transport/pacing/paced_sender.cc +++ b/media/cast/net/pacing/paced_sender.cc @@ -1,16 +1,16 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/pacing/paced_sender.h" #include "base/big_endian.h" #include "base/bind.h" #include "base/message_loop/message_loop.h" +#include "media/cast/logging/logging_impl.h" namespace media { namespace cast { -namespace transport { namespace { @@ -60,13 +60,24 @@ void PacedSender::RegisterVideoSsrc(uint32 video_ssrc) { video_ssrc_ = video_ssrc; } +void PacedSender::RegisterPrioritySsrc(uint32 ssrc) { + priority_ssrcs_.push_back(ssrc); +} + bool PacedSender::SendPackets(const SendPacketVector& packets) { if (packets.empty()) { return true; } + const bool high_priority = IsHighPriority(packets.begin()->first); for (size_t i = 0; i < packets.size(); i++) { - packet_list_[packets[i].first] = - make_pair(PacketType_Normal, packets[i].second); + DCHECK(IsHighPriority(packets[i].first) == high_priority); + if (high_priority) { + priority_packet_list_[packets[i].first] = + make_pair(PacketType_Normal, packets[i].second); + } else { + packet_list_[packets[i].first] = + make_pair(PacketType_Normal, packets[i].second); + } } if (state_ == State_Unblocked) { SendStoredPackets(); @@ -79,6 +90,7 @@ bool PacedSender::ResendPackets(const SendPacketVector& packets, if (packets.empty()) { return true; } + const bool high_priority = IsHighPriority(packets.begin()->first); base::TimeTicks now = clock_->NowTicks(); for (size_t i = 0; i < packets.size(); i++) { std::map<PacketKey, base::TimeTicks>::const_iterator j = @@ -89,8 +101,14 @@ bool PacedSender::ResendPackets(const SendPacketVector& packets, continue; } - packet_list_[packets[i].first] = - make_pair(PacketType_Resend, packets[i].second); + DCHECK(IsHighPriority(packets[i].first) == high_priority); + if (high_priority) { + priority_packet_list_[packets[i].first] = + make_pair(PacketType_Resend, packets[i].second); + } else { + packet_list_[packets[i].first] = + make_pair(PacketType_Resend, packets[i].second); + } } if (state_ == State_Unblocked) { SendStoredPackets(); @@ -100,7 +118,8 @@ bool PacedSender::ResendPackets(const SendPacketVector& packets, bool PacedSender::SendRtcpPacket(uint32 ssrc, PacketRef packet) { if (state_ == State_TransportBlocked) { - packet_list_[PacedPacketSender::MakePacketKey(base::TimeTicks(), ssrc, 0)] = + priority_packet_list_[ + PacedPacketSender::MakePacketKey(base::TimeTicks(), ssrc, 0)] = make_pair(PacketType_RTCP, packet); } else { // We pass the RTCP packets straight through. @@ -110,33 +129,39 @@ bool PacedSender::SendRtcpPacket(uint32 ssrc, PacketRef packet) { weak_factory_.GetWeakPtr()))) { state_ = State_TransportBlocked; } - } return true; } void PacedSender::CancelSendingPacket(const PacketKey& packet_key) { packet_list_.erase(packet_key); + priority_packet_list_.erase(packet_key); } -PacketRef PacedSender::GetNextPacket(PacketType* packet_type, +PacketRef PacedSender::PopNextPacket(PacketType* packet_type, PacketKey* packet_key) { - std::map<PacketKey, std::pair<PacketType, PacketRef> >::iterator i; - i = packet_list_.begin(); - DCHECK(i != packet_list_.end()); + PacketList* list = !priority_packet_list_.empty() ? + &priority_packet_list_ : &packet_list_; + DCHECK(!list->empty()); + PacketList::iterator i = list->begin(); *packet_type = i->second.first; *packet_key = i->first; PacketRef ret = i->second.second; - packet_list_.erase(i); + list->erase(i); return ret; } +bool PacedSender::IsHighPriority(const PacketKey& packet_key) const { + return std::find(priority_ssrcs_.begin(), priority_ssrcs_.end(), + packet_key.second.first) != priority_ssrcs_.end(); +} + bool PacedSender::empty() const { - return packet_list_.empty(); + return packet_list_.empty() && priority_packet_list_.empty(); } size_t PacedSender::size() const { - return packet_list_.size(); + return packet_list_.size() + priority_packet_list_.size(); } // This function can be called from three places: @@ -199,7 +224,7 @@ void PacedSender::SendStoredPackets() { } PacketType packet_type; PacketKey packet_key; - PacketRef packet = GetNextPacket(&packet_type, &packet_key); + PacketRef packet = PopNextPacket(&packet_type, &packet_key); sent_time_[packet_key] = now; sent_time_buffer_[packet_key] = now; @@ -255,6 +280,5 @@ void PacedSender::LogPacketEvent(const Packet& packet, CastLoggingEvent event) { packet); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/pacing/paced_sender.h b/media/cast/net/pacing/paced_sender.h index 9fc0c8b8b8..094e5299e1 100644 --- a/media/cast/transport/pacing/paced_sender.h +++ b/media/cast/net/pacing/paced_sender.h @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ -#define MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ +#ifndef MEDIA_CAST_NET_PACING_PACED_SENDER_H_ +#define MEDIA_CAST_NET_PACING_PACED_SENDER_H_ -#include <list> +#include <map> #include <vector> #include "base/basictypes.h" @@ -16,16 +16,14 @@ #include "base/time/default_tick_clock.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/transport/udp_transport.h" +#include "media/cast/logging/logging_defines.h" +#include "media/cast/net/cast_transport_config.h" namespace media { namespace cast { class LoggingImpl; -namespace transport { - // Use std::pair for free comparison operators. // { capture_time, ssrc, packet_id } // The PacketKey is designed to meet two criteria: @@ -71,6 +69,12 @@ class PacedSender : public PacedPacketSender, void RegisterAudioSsrc(uint32 audio_ssrc); void RegisterVideoSsrc(uint32 video_ssrc); + // Register SSRC that has a higher priority for sending. Multiple SSRCs can + // be registered. + // Note that it is not expected to register many SSRCs with this method. + // Because IsHigherPriority() is determined in linear time. + void RegisterPrioritySsrc(uint32 ssrc); + // PacedPacketSender implementation. virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE; virtual bool ResendPackets(const SendPacketVector& packets, @@ -110,16 +114,25 @@ class PacedSender : public PacedPacketSender, // Returns the next packet to send. RTCP packets have highest priority, // resend packets have second highest priority and then comes everything // else. - PacketRef GetNextPacket(PacketType* packet_type, + PacketRef PopNextPacket(PacketType* packet_type, PacketKey* packet_key); + // Returns true if the packet should have a higher priority. + bool IsHighPriority(const PacketKey& packet_key) const; + base::TickClock* const clock_; // Not owned by this class. LoggingImpl* const logging_; // Not owned by this class. PacketSender* transport_; // Not owned by this class. scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_; uint32 audio_ssrc_; uint32 video_ssrc_; - std::map<PacketKey, std::pair<PacketType, PacketRef> > packet_list_; + + // Set of SSRCs that have higher priority. This is a vector instead of a + // set because there's only very few in it (most likely 1). + std::vector<uint32> priority_ssrcs_; + typedef std::map<PacketKey, std::pair<PacketType, PacketRef> > PacketList; + PacketList packet_list_; + PacketList priority_packet_list_; std::map<PacketKey, base::TimeTicks> sent_time_; std::map<PacketKey, base::TimeTicks> sent_time_buffer_; @@ -140,8 +153,7 @@ class PacedSender : public PacedPacketSender, DISALLOW_COPY_AND_ASSIGN(PacedSender); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ +#endif // MEDIA_CAST_NET_PACING_PACED_SENDER_H_ diff --git a/media/cast/transport/pacing/paced_sender_unittest.cc b/media/cast/net/pacing/paced_sender_unittest.cc index 5e24fca4b5..43e7603385 100644 --- a/media/cast/transport/pacing/paced_sender_unittest.cc +++ b/media/cast/net/pacing/paced_sender_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -6,23 +6,24 @@ #include "base/big_endian.h" #include "base/test/simple_test_tick_clock.h" +#include "media/cast/logging/logging_impl.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/pacing/paced_sender.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/pacing/paced_sender.h" #include "testing/gmock/include/gmock/gmock.h" +using testing::_; + namespace media { namespace cast { -namespace transport { - -using testing::_; +namespace { static const uint8 kValue = 123; -static const size_t kSize1 = 100; -static const size_t kSize2 = 101; -static const size_t kSize3 = 102; -static const size_t kSize4 = 103; -static const size_t kNackSize = 104; +static const size_t kSize1 = 101; +static const size_t kSize2 = 102; +static const size_t kSize3 = 103; +static const size_t kSize4 = 104; +static const size_t kNackSize = 105; static const int64 kStartMillisecond = INT64_C(12345678900000); static const uint32 kVideoSsrc = 0x1234; static const uint32 kAudioSsrc = 0x5678; @@ -68,7 +69,7 @@ class PacedSenderTest : public ::testing::Test { logging_.RemoveRawEventSubscriber(&subscriber_); } - static void UpdateCastTransportStatus(transport::CastTransportStatus status) { + static void UpdateCastTransportStatus(CastTransportStatus status) { NOTREACHED(); } @@ -124,6 +125,8 @@ class PacedSenderTest : public ::testing::Test { DISALLOW_COPY_AND_ASSIGN(PacedSenderTest); }; +} // namespace + TEST_F(PacedSenderTest, PassThroughRtcp) { mock_transport_.AddExpectedSize(kSize1, 2); SendPacketVector packets = CreateSendPacketVector(kSize1, 1, true); @@ -346,6 +349,56 @@ TEST_F(PacedSenderTest, PaceWith60fps) { EXPECT_TRUE(RunUntilEmpty(5)); } -} // namespace transport +TEST_F(PacedSenderTest, SendPriority) { + // Actual order to the network is: + // 1. Video packets x 10. + // 2. RTCP packet x 1. + // 3. Audio packet x 1. + // 4. Video retransmission packet x 10. + // 5. Video packet x 10. + mock_transport_.AddExpectedSize(kSize2, 10); // Normal video packets. + mock_transport_.AddExpectedSize(kSize3, 1); // RTCP packet. + mock_transport_.AddExpectedSize(kSize1, 1); // Audio packet. + mock_transport_.AddExpectedSize(kSize4, 10); // Resend video packets. + mock_transport_.AddExpectedSize(kSize2, 10); // Normal video packets. + + paced_sender_->RegisterPrioritySsrc(kAudioSsrc); + + // Retransmission packets with the earlier timestamp. + SendPacketVector resend_packets = + CreateSendPacketVector(kSize4, 10, false); + testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); + + // Send 20 normal video packets. Only 10 will be sent in this + // call, the rest will be sitting in the queue waiting for pacing. + EXPECT_TRUE(paced_sender_->SendPackets( + CreateSendPacketVector(kSize2, 20, false))); + + testing_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); + + // Send normal audio packet. This is queued and will be sent + // earlier than video packets. + EXPECT_TRUE(paced_sender_->SendPackets( + CreateSendPacketVector(kSize1, 1, true))); + + // Send RTCP packet. This is queued and will be sent first. + EXPECT_TRUE(paced_sender_->SendRtcpPacket( + kVideoSsrc, + new base::RefCountedData<Packet>(Packet(kSize3, kValue)))); + + // Resend video packets. This is queued and will be sent + // earlier than normal video packets. + EXPECT_TRUE(paced_sender_->ResendPackets( + resend_packets, base::TimeDelta())); + + // Roll the clock. Queued packets will be sent in this order: + // 1. RTCP packet x 1. + // 2. Audio packet x 1. + // 3. Video retransmission packet x 10. + // 4. Video packet x 10. + task_runner_->RunTasks(); + EXPECT_TRUE(RunUntilEmpty(4)); +} + } // namespace cast } // namespace media diff --git a/media/cast/rtcp/mock_rtcp_receiver_feedback.cc b/media/cast/net/rtcp/mock_rtcp_receiver_feedback.cc index 9ff2d48f03..0ea6606f82 100644 --- a/media/cast/rtcp/mock_rtcp_receiver_feedback.cc +++ b/media/cast/net/rtcp/mock_rtcp_receiver_feedback.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" +#include "media/cast/net/rtcp/mock_rtcp_receiver_feedback.h" namespace media { namespace cast { diff --git a/media/cast/rtcp/mock_rtcp_receiver_feedback.h b/media/cast/net/rtcp/mock_rtcp_receiver_feedback.h index 56fe1ca699..38bf0eec28 100644 --- a/media/cast/rtcp/mock_rtcp_receiver_feedback.h +++ b/media/cast/net/rtcp/mock_rtcp_receiver_feedback.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,9 +7,9 @@ #include <vector> -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/rtcp/rtcp_receiver.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_receiver.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -21,7 +21,7 @@ class MockRtcpReceiverFeedback : public RtcpReceiverFeedback { virtual ~MockRtcpReceiverFeedback(); MOCK_METHOD1(OnReceivedSenderReport, - void(const transport::RtcpSenderInfo& remote_sender_info)); + void(const RtcpSenderInfo& remote_sender_info)); MOCK_METHOD1(OnReceiverReferenceTimeReport, void(const RtcpReceiverReferenceTimeReport& remote_time_report)); diff --git a/media/cast/rtcp/mock_rtcp_sender_feedback.cc b/media/cast/net/rtcp/mock_rtcp_sender_feedback.cc index e44e0bfdef..2c51c7448d 100644 --- a/media/cast/rtcp/mock_rtcp_sender_feedback.cc +++ b/media/cast/net/rtcp/mock_rtcp_sender_feedback.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/mock_rtcp_sender_feedback.h" +#include "media/cast/net/rtcp/mock_rtcp_sender_feedback.h" namespace media { namespace cast { diff --git a/media/cast/rtcp/mock_rtcp_sender_feedback.h b/media/cast/net/rtcp/mock_rtcp_sender_feedback.h index 40547e6283..a6af0aaa3e 100644 --- a/media/cast/rtcp/mock_rtcp_sender_feedback.h +++ b/media/cast/net/rtcp/mock_rtcp_sender_feedback.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,7 +7,7 @@ #include <vector> -#include "media/cast/rtcp/rtcp_receiver.h" +#include "media/cast/net/rtcp/rtcp_receiver.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber.cc b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc index 9a9c0aeeb7..a751ff94d3 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber.cc +++ b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" #include <utility> diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber.h b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h index 84af7cbaf3..7e80ffebc6 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber.h +++ b/media/cast/net/rtcp/receiver_rtcp_event_subscriber.h @@ -10,7 +10,7 @@ #include "base/threading/thread_checker.h" #include "media/cast/logging/logging_defines.h" #include "media/cast/logging/raw_event_subscriber.h" -#include "media/cast/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc b/media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc index e0d0f17216..8d975592f2 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc +++ b/media/cast/net/rtcp/receiver_rtcp_event_subscriber_unittest.cc @@ -8,7 +8,7 @@ #include "base/time/tick_clock.h" #include "media/cast/cast_environment.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/media/cast/rtcp/rtcp.cc b/media/cast/net/rtcp/rtcp.cc index 480b2ac399..c0e6c19387 100644 --- a/media/cast/rtcp/rtcp.cc +++ b/media/cast/net/rtcp/rtcp.cc @@ -1,25 +1,26 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/rtcp.h" +#include "media/cast/net/rtcp/rtcp.h" #include "base/big_endian.h" -#include "base/rand_util.h" #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/rtcp/rtcp_receiver.h" -#include "media/cast/rtcp/rtcp_sender.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_receiver.h" +#include "media/cast/net/rtcp/rtcp_sender.h" +#include "media/cast/net/rtcp/rtcp_utility.h" + +using base::TimeDelta; namespace media { namespace cast { -static const int kMaxRttMs = 10000; // 10 seconds. -static const int kMaxDelay = 2000; +static const int32 kMaxRttMs = 10000; // 10 seconds. +static const int32 kMaxDelayMs = 2000; // 2 seconds. class LocalRtcpRttFeedback : public RtcpRttFeedback { public: @@ -43,7 +44,7 @@ class LocalRtcpReceiverFeedback : public RtcpReceiverFeedback { : rtcp_(rtcp), cast_environment_(cast_environment) {} virtual void OnReceivedSenderReport( - const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE { + const RtcpSenderInfo& remote_sender_info) OVERRIDE { rtcp_->OnReceivedNtp(remote_sender_info.ntp_seconds, remote_sender_info.ntp_fraction); if (remote_sender_info.send_packet_count != 0) { @@ -75,8 +76,8 @@ class LocalRtcpReceiverFeedback : public RtcpReceiverFeedback { Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, RtcpSenderFeedback* sender_feedback, - transport::CastTransportSender* const transport_sender, - transport::PacedPacketSender* paced_packet_sender, + CastTransportSender* const transport_sender, + PacedPacketSender* paced_packet_sender, RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, const base::TimeDelta& rtcp_interval, uint32 local_ssrc, uint32 remote_ssrc, const std::string& c_name, @@ -98,7 +99,7 @@ Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, local_clock_ahead_by_(ClockDriftSmoother::GetDefaultTimeConstant()), lip_sync_rtp_timestamp_(0), lip_sync_ntp_timestamp_(0), - min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), + min_rtt_(TimeDelta::FromMilliseconds(kMaxRttMs)), number_of_rtt_in_avg_(0) { rtcp_receiver_.reset(new RtcpReceiver(cast_environment, sender_feedback, receiver_feedback_.get(), @@ -114,8 +115,8 @@ bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { if (length < kMinLengthOfRtcp) return false; uint8 packet_type = packet[1]; - if (packet_type >= transport::kPacketTypeLow && - packet_type <= transport::kPacketTypeHigh) { + if (packet_type >= kPacketTypeLow && + packet_type <= kPacketTypeHigh) { return true; } return false; @@ -156,23 +157,23 @@ void Rtcp::SendRtcpFromRtpReceiver( uint32 packet_type_flags = 0; base::TimeTicks now = cast_environment_->Clock()->NowTicks(); - transport::RtcpReportBlock report_block; + RtcpReportBlock report_block; RtcpReceiverReferenceTimeReport rrtr; // Attach our NTP to all RTCP packets; with this information a "smart" sender // can make decisions based on how old the RTCP message is. - packet_type_flags |= transport::kRtcpRrtr; + packet_type_flags |= kRtcpRrtr; ConvertTimeTicksToNtp(now, &rrtr.ntp_seconds, &rrtr.ntp_fraction); SaveLastSentNtpTime(now, rrtr.ntp_seconds, rrtr.ntp_fraction); if (cast_message) { - packet_type_flags |= transport::kRtcpCast; + packet_type_flags |= kRtcpCast; } if (rtcp_events) { - packet_type_flags |= transport::kRtcpReceiverLog; + packet_type_flags |= kRtcpReceiverLog; } if (rtcp_mode_ == kRtcpCompound || now >= next_time_to_send_rtcp_) { - packet_type_flags |= transport::kRtcpRr; + packet_type_flags |= kRtcpRr; report_block.remote_ssrc = 0; // Not needed to set send side. report_block.media_ssrc = remote_ssrc_; // SSRC of the RTP packet sender. @@ -201,13 +202,13 @@ void Rtcp::SendRtcpFromRtpReceiver( &rrtr, cast_message, rtcp_events, - target_delay_ms_); + target_delay_); } void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, uint32 current_time_as_rtp_timestamp) { DCHECK(transport_sender_); - uint32 packet_type_flags = transport::kRtcpSr; + uint32 packet_type_flags = kRtcpSr; uint32 current_ntp_seconds = 0; uint32 current_ntp_fractions = 0; ConvertTimeTicksToNtp(current_time, ¤t_ntp_seconds, @@ -215,9 +216,9 @@ void Rtcp::SendRtcpFromRtpSender(base::TimeTicks current_time, SaveLastSentNtpTime(current_time, current_ntp_seconds, current_ntp_fractions); - transport::RtcpDlrrReportBlock dlrr; + RtcpDlrrReportBlock dlrr; if (!time_last_report_received_.is_null()) { - packet_type_flags |= transport::kRtcpDlrr; + packet_type_flags |= kRtcpDlrr; dlrr.last_rr = last_report_truncated_ntp_; uint32 delay_seconds = 0; uint32 delay_fraction = 0; @@ -302,8 +303,8 @@ void Rtcp::SetCastReceiverEventHistorySize(size_t size) { } void Rtcp::SetTargetDelay(base::TimeDelta target_delay) { - DCHECK(target_delay.InMilliseconds() < kMaxDelay); - target_delay_ms_ = static_cast<uint16>(target_delay.InMilliseconds()); + DCHECK(target_delay < TimeDelta::FromMilliseconds(kMaxDelayMs)); + target_delay_ = target_delay; } void Rtcp::OnReceivedDelaySinceLastReport(uint32 receivers_ssrc, @@ -331,7 +332,7 @@ void Rtcp::SaveLastSentNtpTime(const base::TimeTicks& now, last_reports_sent_map_[last_report] = now; last_reports_sent_queue_.push(std::make_pair(last_report, now)); - base::TimeTicks timeout = now - base::TimeDelta::FromMilliseconds(kMaxRttMs); + base::TimeTicks timeout = now - TimeDelta::FromMilliseconds(kMaxRttMs); // Cleanup old statistics older than |timeout|. while (!last_reports_sent_queue_.empty()) { @@ -358,11 +359,12 @@ void Rtcp::UpdateRtt(const base::TimeDelta& sender_delay, // TODO(miu): Replace "average for all time" with an EWMA, or suitable // "average over recent past" mechanism. if (number_of_rtt_in_avg_ != 0) { - const double ac = static_cast<double>(number_of_rtt_in_avg_); - avg_rtt_ms_ = ((ac / (ac + 1.0)) * avg_rtt_ms_) + - ((1.0 / (ac + 1.0)) * rtt.InMillisecondsF()); + // Integer math equivalent of (ac/(ac+1.0))*avg_rtt_ + (1.0/(ac+1.0))*rtt). + // (TimeDelta only supports math with other TimeDeltas and int64s.) + avg_rtt_ = (avg_rtt_ * number_of_rtt_in_avg_ + rtt) / + (number_of_rtt_in_avg_ + 1); } else { - avg_rtt_ms_ = rtt.InMillisecondsF(); + avg_rtt_ = rtt; } number_of_rtt_in_avg_++; } @@ -377,19 +379,15 @@ bool Rtcp::Rtt(base::TimeDelta* rtt, base::TimeDelta* avg_rtt, if (number_of_rtt_in_avg_ == 0) return false; *rtt = rtt_; - *avg_rtt = base::TimeDelta::FromMillisecondsD(avg_rtt_ms_); + *avg_rtt = avg_rtt_; *min_rtt = min_rtt_; *max_rtt = max_rtt_; return true; } void Rtcp::UpdateNextTimeToSendRtcp() { - int random = base::RandInt(0, 999); - base::TimeDelta time_to_next = - (rtcp_interval_ / 2) + (rtcp_interval_ * random / 1000); - base::TimeTicks now = cast_environment_->Clock()->NowTicks(); - next_time_to_send_rtcp_ = now + time_to_next; + next_time_to_send_rtcp_ = now + rtcp_interval_; } void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { diff --git a/media/cast/rtcp/rtcp.h b/media/cast/net/rtcp/rtcp.h index 9d0184f903..2bf0367185 100644 --- a/media/cast/rtcp/rtcp.h +++ b/media/cast/net/rtcp/rtcp.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -13,15 +13,15 @@ #include "base/memory/scoped_ptr.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "media/cast/base/clock_drift_smoother.h" #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/common/clock_drift_smoother.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { @@ -60,8 +60,8 @@ class Rtcp { // be used by the Cast receivers and test applications. Rtcp(scoped_refptr<CastEnvironment> cast_environment, RtcpSenderFeedback* sender_feedback, - transport::CastTransportSender* const transport_sender, // Send-side. - transport::PacedPacketSender* paced_packet_sender, // Receive side. + CastTransportSender* const transport_sender, // Send-side. + PacedPacketSender* paced_packet_sender, // Receive side. RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, const base::TimeDelta& rtcp_interval, @@ -150,7 +150,7 @@ class Rtcp { uint32 last_ntp_fraction); scoped_refptr<CastEnvironment> cast_environment_; - transport::CastTransportSender* const transport_sender_; + CastTransportSender* const transport_sender_; const base::TimeDelta rtcp_interval_; const RtcpMode rtcp_mode_; const uint32 local_ssrc_; @@ -194,8 +194,8 @@ class Rtcp { base::TimeDelta min_rtt_; base::TimeDelta max_rtt_; int number_of_rtt_in_avg_; - double avg_rtt_ms_; - uint16 target_delay_ms_; + base::TimeDelta avg_rtt_; + base::TimeDelta target_delay_; DISALLOW_COPY_AND_ASSIGN(Rtcp); }; diff --git a/media/cast/transport/rtcp/rtcp_builder.cc b/media/cast/net/rtcp/rtcp_builder.cc index b8875fc96b..a5673a33f2 100644 --- a/media/cast/transport/rtcp/rtcp_builder.cc +++ b/media/cast/net/rtcp/rtcp_builder.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtcp/rtcp_builder.h" +#include "media/cast/net/rtcp/rtcp_builder.h" #include <algorithm> #include <string> @@ -10,12 +10,11 @@ #include "base/big_endian.h" #include "base/logging.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" namespace media { namespace cast { -namespace transport { RtcpBuilder::RtcpBuilder(PacedSender* const outgoing_transport) : transport_(outgoing_transport), @@ -192,6 +191,5 @@ bool RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, return true; } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/rtcp/rtcp_builder.h b/media/cast/net/rtcp/rtcp_builder.h index f095ae9ee5..1a9b169be1 100644 --- a/media/cast/transport/rtcp/rtcp_builder.h +++ b/media/cast/net/rtcp/rtcp_builder.h @@ -1,20 +1,19 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_RTCP_RTCP_BUILDER_H_ -#define MEDIA_CAST_TRANSPORT_RTCP_RTCP_BUILDER_H_ +#ifndef MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ +#define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ #include <list> #include <string> #include <vector> -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" namespace media { namespace cast { -namespace transport { class RtcpBuilder { public: @@ -42,8 +41,7 @@ class RtcpBuilder { DISALLOW_COPY_AND_ASSIGN(RtcpBuilder); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_RTCP_RTCP_BUILDER_H_ +#endif // MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_ diff --git a/media/cast/transport/rtcp/rtcp_builder_unittest.cc b/media/cast/net/rtcp/rtcp_builder_unittest.cc index 0322612f27..1c471f5176 100644 --- a/media/cast/transport/rtcp/rtcp_builder_unittest.cc +++ b/media/cast/net/rtcp/rtcp_builder_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -6,11 +6,11 @@ #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/rtcp_builder.h" +#include "media/cast/net/rtcp/rtcp_utility.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/pacing/paced_sender.h" -#include "media/cast/transport/rtcp/rtcp_builder.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { diff --git a/media/cast/rtcp/rtcp_defines.cc b/media/cast/net/rtcp/rtcp_defines.cc index 214100d4d9..63799a92df 100644 --- a/media/cast/rtcp/rtcp_defines.cc +++ b/media/cast/net/rtcp/rtcp_defines.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" #include "media/cast/logging/logging_defines.h" diff --git a/media/cast/rtcp/rtcp_defines.h b/media/cast/net/rtcp/rtcp_defines.h index 31795648c6..28f69e1835 100644 --- a/media/cast/rtcp/rtcp_defines.h +++ b/media/cast/net/rtcp/rtcp_defines.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -11,7 +11,7 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtcp/rtcp_receiver.cc b/media/cast/net/rtcp/rtcp_receiver.cc index 3be8e921c4..99fd9178ae 100644 --- a/media/cast/rtcp/rtcp_receiver.cc +++ b/media/cast/net/rtcp/rtcp_receiver.cc @@ -1,12 +1,12 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/rtcp_receiver.h" +#include "media/cast/net/rtcp/rtcp_receiver.h" #include "base/logging.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/rtcp_utility.h" namespace { @@ -135,7 +135,7 @@ void RtcpReceiver::HandleSenderReport(RtcpParser* rtcp_parser) { VLOG(2) << "Cast RTCP received SR from SSRC " << remote_ssrc; if (remote_ssrc_ == remote_ssrc) { - transport::RtcpSenderInfo remote_sender_info; + RtcpSenderInfo remote_sender_info; remote_sender_info.ntp_seconds = rtcp_field.sender_report.ntp_most_significant; remote_sender_info.ntp_fraction = @@ -193,7 +193,7 @@ void RtcpReceiver::HandleReportBlock(const RtcpField* rtcp_field, } VLOG(2) << "Cast RTCP received RB from SSRC " << remote_ssrc; - transport::RtcpReportBlock report_block; + RtcpReportBlock report_block; report_block.remote_ssrc = remote_ssrc; report_block.media_ssrc = rb.ssrc; report_block.fraction_lost = rb.fraction_lost; diff --git a/media/cast/rtcp/rtcp_receiver.h b/media/cast/net/rtcp/rtcp_receiver.h index d3cef9e57b..aea45846a2 100644 --- a/media/cast/rtcp/rtcp_receiver.h +++ b/media/cast/net/rtcp/rtcp_receiver.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -8,10 +8,10 @@ #include <queue> #include "base/containers/hash_tables.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_utility.h" namespace media { namespace cast { @@ -19,7 +19,7 @@ namespace cast { class RtcpReceiverFeedback { public: virtual void OnReceivedSenderReport( - const transport::RtcpSenderInfo& remote_sender_info) = 0; + const RtcpSenderInfo& remote_sender_info) = 0; virtual void OnReceiverReferenceTimeReport( const RtcpReceiverReferenceTimeReport& remote_time_report) = 0; @@ -116,7 +116,7 @@ class RtcpReceiver { RtcpRttFeedback* const rtt_feedback_; scoped_refptr<CastEnvironment> cast_environment_; - transport::FrameIdWrapHelper ack_frame_id_wrap_helper_; + FrameIdWrapHelper ack_frame_id_wrap_helper_; // Maintains a history of receiver events. size_t receiver_event_history_size_; diff --git a/media/cast/rtcp/rtcp_receiver_unittest.cc b/media/cast/net/rtcp/rtcp_receiver_unittest.cc index 51026d1554..f4010cb36b 100644 --- a/media/cast/rtcp/rtcp_receiver_unittest.cc +++ b/media/cast/net/rtcp/rtcp_receiver_unittest.cc @@ -1,17 +1,17 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. #include "base/memory/scoped_ptr.h" #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" -#include "media/cast/rtcp/mock_rtcp_sender_feedback.h" -#include "media/cast/rtcp/rtcp_receiver.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/mock_rtcp_receiver_feedback.h" +#include "media/cast/net/rtcp/mock_rtcp_sender_feedback.h" +#include "media/cast/net/rtcp/rtcp_receiver.h" +#include "media/cast/net/rtcp/rtcp_utility.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_defines.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -22,7 +22,8 @@ using testing::_; static const uint32 kSenderSsrc = 0x10203; static const uint32 kSourceSsrc = 0x40506; static const uint32 kUnknownSsrc = 0xDEAD; -static const uint16 kTargetDelayMs = 100; +static const base::TimeDelta kTargetDelay = + base::TimeDelta::FromMilliseconds(100); static const std::string kCName("test@10.1.1.1"); namespace { @@ -72,7 +73,7 @@ class RtcpReceiverCastLogVerification : public RtcpReceiverFeedback { called_on_received_receiver_log_(false) {} virtual void OnReceivedSenderReport( - const transport::RtcpSenderInfo& remote_sender_info) OVERRIDE{}; + const RtcpSenderInfo& remote_sender_info) OVERRIDE{}; virtual void OnReceiverReferenceTimeReport( const RtcpReceiverReferenceTimeReport& remote_time_report) OVERRIDE{}; @@ -188,8 +189,8 @@ class RtcpReceiverTest : public ::testing::Test { MockRtcpRttFeedback mock_rtt_feedback_; MockRtcpSenderFeedback mock_sender_feedback_; scoped_ptr<RtcpReceiver> rtcp_receiver_; - transport::RtcpSenderInfo expected_sender_info_; - transport::RtcpReportBlock expected_report_block_; + RtcpSenderInfo expected_sender_info_; + RtcpReportBlock expected_report_block_; RtcpReceiverReferenceTimeReport expected_receiver_reference_report_; DISALLOW_COPY_AND_ASSIGN(RtcpReceiverTest); @@ -374,7 +375,7 @@ TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) { TestRtcpPacketBuilder p1; p1.AddRr(kSenderSsrc, 1); p1.AddRb(kUnknownSsrc); - p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelayMs); + p1.AddCast(kSenderSsrc, kUnknownSsrc, kTargetDelay); // Expected to be ignored since the source ssrc does not match our // local ssrc. @@ -391,7 +392,7 @@ TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastFeedback) { TestRtcpPacketBuilder p2; p2.AddRr(kSenderSsrc, 1); p2.AddRb(kSourceSsrc); - p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs); + p2.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); // Expected to be pass through since the sender ssrc match our local ssrc. InjectRtcpPacket(p2.Data(), p2.Length()); @@ -415,7 +416,7 @@ TEST_F(RtcpReceiverTest, InjectReceiverReportPacketWithCastVerification) { TestRtcpPacketBuilder p; p.AddRr(kSenderSsrc, 1); p.AddRb(kSourceSsrc); - p.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelayMs); + p.AddCast(kSenderSsrc, kSourceSsrc, kTargetDelay); // Expected to be pass through since the sender ssrc match our local ssrc. RtcpParser rtcp_parser(p.Data(), p.Length()); diff --git a/media/cast/rtcp/rtcp_sender.cc b/media/cast/net/rtcp/rtcp_sender.cc index bf7d30c84c..a44f87ebb0 100644 --- a/media/cast/rtcp/rtcp_sender.cc +++ b/media/cast/net/rtcp/rtcp_sender.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/rtcp_sender.h" +#include "media/cast/net/rtcp/rtcp_sender.h" #include <stdint.h> @@ -12,10 +12,10 @@ #include "base/big_endian.h" #include "base/logging.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_utility.h" namespace media { namespace cast { @@ -148,7 +148,7 @@ class NackStringBuilder { // TODO(mikhal): This is only used by the receiver. Consider renaming. RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment, - transport::PacedPacketSender* outgoing_transport, + PacedPacketSender* outgoing_transport, uint32 sending_ssrc, const std::string& c_name) : ssrc_(sending_ssrc), @@ -162,44 +162,44 @@ RtcpSender::~RtcpSender() {} void RtcpSender::SendRtcpFromRtpReceiver( uint32 packet_type_flags, - const transport::RtcpReportBlock* report_block, + const RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, - uint16 target_delay_ms) { - if (packet_type_flags & transport::kRtcpSr || - packet_type_flags & transport::kRtcpDlrr || - packet_type_flags & transport::kRtcpSenderLog) { + base::TimeDelta target_delay) { + if (packet_type_flags & kRtcpSr || + packet_type_flags & kRtcpDlrr || + packet_type_flags & kRtcpSenderLog) { NOTREACHED() << "Invalid argument"; } - if (packet_type_flags & transport::kRtcpPli || - packet_type_flags & transport::kRtcpRpsi || - packet_type_flags & transport::kRtcpRemb || - packet_type_flags & transport::kRtcpNack) { + if (packet_type_flags & kRtcpPli || + packet_type_flags & kRtcpRpsi || + packet_type_flags & kRtcpRemb || + packet_type_flags & kRtcpNack) { // Implement these for webrtc interop. NOTIMPLEMENTED(); } - transport::PacketRef packet(new base::RefCountedData<Packet>); + PacketRef packet(new base::RefCountedData<Packet>); packet->data.reserve(kMaxIpPacketSize); - if (packet_type_flags & transport::kRtcpRr) { + if (packet_type_flags & kRtcpRr) { BuildRR(report_block, &packet->data); if (!c_name_.empty()) { BuildSdec(&packet->data); } } - if (packet_type_flags & transport::kRtcpBye) { + if (packet_type_flags & kRtcpBye) { BuildBye(&packet->data); } - if (packet_type_flags & transport::kRtcpRrtr) { + if (packet_type_flags & kRtcpRrtr) { DCHECK(rrtr) << "Invalid argument"; BuildRrtr(rrtr, &packet->data); } - if (packet_type_flags & transport::kRtcpCast) { + if (packet_type_flags & kRtcpCast) { DCHECK(cast_message) << "Invalid argument"; - BuildCast(cast_message, target_delay_ms, &packet->data); + BuildCast(cast_message, target_delay, &packet->data); } - if (packet_type_flags & transport::kRtcpReceiverLog) { + if (packet_type_flags & kRtcpReceiverLog) { DCHECK(rtcp_events) << "Invalid argument"; BuildReceiverLog(*rtcp_events, &packet->data); } @@ -210,7 +210,7 @@ void RtcpSender::SendRtcpFromRtpReceiver( transport_->SendRtcpPacket(ssrc_, packet); } -void RtcpSender::BuildRR(const transport::RtcpReportBlock* report_block, +void RtcpSender::BuildRR(const RtcpReportBlock* report_block, Packet* packet) const { size_t start_size = packet->size(); DCHECK_LT(start_size + 32, kMaxIpPacketSize) << "Not enough buffer space"; @@ -223,7 +223,7 @@ void RtcpSender::BuildRR(const transport::RtcpReportBlock* report_block, base::BigEndianWriter big_endian_writer( reinterpret_cast<char*>(&((*packet)[start_size])), 8); big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); - big_endian_writer.WriteU8(transport::kPacketTypeReceiverReport); + big_endian_writer.WriteU8(kPacketTypeReceiverReport); big_endian_writer.WriteU16(number_of_rows); big_endian_writer.WriteU32(ssrc_); @@ -232,7 +232,7 @@ void RtcpSender::BuildRR(const transport::RtcpReportBlock* report_block, } } -void RtcpSender::AddReportBlocks(const transport::RtcpReportBlock& report_block, +void RtcpSender::AddReportBlocks(const RtcpReportBlock& report_block, Packet* packet) const { size_t start_size = packet->size(); DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space"; @@ -276,7 +276,7 @@ void RtcpSender::BuildSdec(Packet* packet) const { reinterpret_cast<char*>(&((*packet)[start_size])), 10); // We always need to add one SDES CNAME. big_endian_writer.WriteU8(0x80 + 1); - big_endian_writer.WriteU8(transport::kPacketTypeSdes); + big_endian_writer.WriteU8(kPacketTypeSdes); // Handle SDES length later on. uint32 sdes_length_position = static_cast<uint32>(start_size) + 3; @@ -319,7 +319,7 @@ void RtcpSender::BuildPli(uint32 remote_ssrc, Packet* packet) const { reinterpret_cast<char*>(&((*packet)[start_size])), 12); uint8 FMT = 1; // Picture loss indicator. big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); + big_endian_writer.WriteU8(kPacketTypePayloadSpecific); big_endian_writer.WriteU16(2); // Used fixed length of 2. big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. big_endian_writer.WriteU32(remote_ssrc); // Add the remote SSRC. @@ -346,7 +346,7 @@ void RtcpSender::BuildRpsi(const RtcpRpsiMessage* rpsi, Packet* packet) const { reinterpret_cast<char*>(&((*packet)[start_size])), 24); uint8 FMT = 3; // Reference Picture Selection Indication. big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); + big_endian_writer.WriteU8(kPacketTypePayloadSpecific); // Calculate length. uint32 bits_required = 7; @@ -404,7 +404,7 @@ void RtcpSender::BuildRemb(const RtcpRembMessage* remb, Packet* packet) const { // Add application layer feedback. uint8 FMT = 15; big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); + big_endian_writer.WriteU8(kPacketTypePayloadSpecific); big_endian_writer.WriteU8(0); big_endian_writer.WriteU8(static_cast<uint8>(remb->remb_ssrcs.size() + 4)); big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. @@ -442,7 +442,7 @@ void RtcpSender::BuildNack(const RtcpNackMessage* nack, Packet* packet) const { uint8 FMT = 1; big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(transport::kPacketTypeGenericRtpFeedback); + big_endian_writer.WriteU8(kPacketTypeGenericRtpFeedback); big_endian_writer.WriteU8(0); size_t nack_size_pos = start_size + 3; big_endian_writer.WriteU8(3); @@ -498,7 +498,7 @@ void RtcpSender::BuildBye(Packet* packet) const { base::BigEndianWriter big_endian_writer( reinterpret_cast<char*>(&((*packet)[start_size])), 8); big_endian_writer.WriteU8(0x80 + 1); - big_endian_writer.WriteU8(transport::kPacketTypeBye); + big_endian_writer.WriteU8(kPacketTypeBye); big_endian_writer.WriteU16(1); // Length. big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. } @@ -516,7 +516,7 @@ void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, reinterpret_cast<char*>(&((*packet)[start_size])), 20); big_endian_writer.WriteU8(0x80); - big_endian_writer.WriteU8(transport::kPacketTypeXr); + big_endian_writer.WriteU8(kPacketTypeXr); big_endian_writer.WriteU16(4); // Length. big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. big_endian_writer.WriteU8(4); // Add block type. @@ -529,7 +529,7 @@ void RtcpSender::BuildRrtr(const RtcpReceiverReferenceTimeReport* rrtr, } void RtcpSender::BuildCast(const RtcpCastMessage* cast, - uint16 target_delay_ms, + base::TimeDelta target_delay, Packet* packet) const { size_t start_size = packet->size(); DCHECK_LT(start_size + 20, kMaxIpPacketSize) << "Not enough buffer space"; @@ -542,7 +542,7 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, reinterpret_cast<char*>(&((*packet)[start_size])), 20); uint8 FMT = 15; // Application layer feedback. big_endian_writer.WriteU8(0x80 + FMT); - big_endian_writer.WriteU8(transport::kPacketTypePayloadSpecific); + big_endian_writer.WriteU8(kPacketTypePayloadSpecific); big_endian_writer.WriteU8(0); size_t cast_size_pos = start_size + 3; // Save length position. big_endian_writer.WriteU8(4); @@ -552,7 +552,9 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, big_endian_writer.WriteU8(static_cast<uint8>(cast->ack_frame_id_)); size_t cast_loss_field_pos = start_size + 17; // Save loss field position. big_endian_writer.WriteU8(0); // Overwritten with number_of_loss_fields. - big_endian_writer.WriteU16(target_delay_ms); + DCHECK_LE(target_delay.InMilliseconds(), + std::numeric_limits<uint16_t>::max()); + big_endian_writer.WriteU16(target_delay.InMilliseconds()); size_t number_of_loss_fields = 0; size_t max_number_of_loss_fields = std::min<size_t>( @@ -641,7 +643,7 @@ void RtcpSender::BuildReceiverLog( base::BigEndianWriter big_endian_writer( reinterpret_cast<char*>(&((*packet)[packet_start_size])), rtcp_log_size); big_endian_writer.WriteU8(0x80 + kReceiverLogSubtype); - big_endian_writer.WriteU8(transport::kPacketTypeApplicationDefined); + big_endian_writer.WriteU8(kPacketTypeApplicationDefined); big_endian_writer.WriteU16(static_cast<uint16>( 2 + 2 * number_of_frames + total_number_of_messages_to_send)); big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. diff --git a/media/cast/rtcp/rtcp_sender.h b/media/cast/net/rtcp/rtcp_sender.h index f09a4fb0e5..fe5af0dcd3 100644 --- a/media/cast/rtcp/rtcp_sender.h +++ b/media/cast/net/rtcp/rtcp_sender.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -11,11 +11,11 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/rtcp/rtcp_builder.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtcp/rtcp_builder.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { @@ -44,7 +44,7 @@ COMPILE_ASSERT(kSecondRedundancyOffset > class RtcpSender { public: RtcpSender(scoped_refptr<CastEnvironment> cast_environment, - transport::PacedPacketSender* outgoing_transport, + PacedPacketSender* outgoing_transport, uint32 sending_ssrc, const std::string& c_name); @@ -52,17 +52,17 @@ class RtcpSender { void SendRtcpFromRtpReceiver( uint32 packet_type_flags, - const transport::RtcpReportBlock* report_block, + const RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, - uint16 target_delay_ms); + base::TimeDelta target_delay); private: - void BuildRR(const transport::RtcpReportBlock* report_block, + void BuildRR(const RtcpReportBlock* report_block, Packet* packet) const; - void AddReportBlocks(const transport::RtcpReportBlock& report_block, + void AddReportBlocks(const RtcpReportBlock& report_block, Packet* packet) const; void BuildSdec(Packet* packet) const; @@ -81,7 +81,7 @@ class RtcpSender { Packet* packet) const; void BuildCast(const RtcpCastMessage* cast_message, - uint16 target_delay_ms, + base::TimeDelta target_delay, Packet* packet) const; void BuildReceiverLog( @@ -114,7 +114,7 @@ class RtcpSender { const std::string c_name_; // Not owned by this class. - transport::PacedPacketSender* const transport_; + PacedPacketSender* const transport_; scoped_refptr<CastEnvironment> cast_environment_; std::deque<RtcpReceiverLogMessage> rtcp_events_history_; diff --git a/media/cast/rtcp/rtcp_sender_unittest.cc b/media/cast/net/rtcp/rtcp_sender_unittest.cc index 0b0c7d3ab8..c0c321e2c8 100644 --- a/media/cast/rtcp/rtcp_sender_unittest.cc +++ b/media/cast/net/rtcp/rtcp_sender_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -6,13 +6,13 @@ #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/rtcp/rtcp_sender.h" -#include "media/cast/rtcp/rtcp_utility.h" -#include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/rtcp_sender.h" +#include "media/cast/net/rtcp/rtcp_utility.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -21,11 +21,12 @@ namespace cast { namespace { static const uint32 kSendingSsrc = 0x12345678; static const uint32 kMediaSsrc = 0x87654321; -static const int16 kDefaultDelay = 100; +static const base::TimeDelta kDefaultDelay = + base::TimeDelta::FromMilliseconds(100); static const std::string kCName("test@10.1.1.1"); -transport::RtcpReportBlock GetReportBlock() { - transport::RtcpReportBlock report_block; +RtcpReportBlock GetReportBlock() { + RtcpReportBlock report_block; // Initialize remote_ssrc to a "clearly illegal" value. report_block.remote_ssrc = 0xDEAD; report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. @@ -40,12 +41,12 @@ transport::RtcpReportBlock GetReportBlock() { } // namespace -class TestRtcpTransport : public transport::PacedPacketSender { +class TestRtcpTransport : public PacedPacketSender { public: TestRtcpTransport() : packet_count_(0) {} virtual bool SendRtcpPacket(uint32 ssrc, - transport::PacketRef packet) OVERRIDE { + PacketRef packet) OVERRIDE { EXPECT_EQ(expected_packet_.size(), packet->data.size()); EXPECT_EQ(0, memcmp(expected_packet_.data(), packet->data.data(), @@ -55,17 +56,17 @@ class TestRtcpTransport : public transport::PacedPacketSender { } virtual bool SendPackets( - const transport::SendPacketVector& packets) OVERRIDE { + const SendPacketVector& packets) OVERRIDE { return false; } virtual bool ResendPackets( - const transport::SendPacketVector& packets, + const SendPacketVector& packets, base::TimeDelta dedupe_window) OVERRIDE { return false; } virtual void CancelSendingPacket( - const transport::PacketKey& packet_key) OVERRIDE { + const PacketKey& packet_key) OVERRIDE { } void SetExpectedRtcpPacket(scoped_ptr<Packet> packet) { @@ -113,7 +114,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReport) { test_transport_.SetExpectedRtcpPacket(p1.GetPacket()); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr, NULL, NULL, NULL, NULL, kDefaultDelay); + kRtcpRr, NULL, NULL, NULL, NULL, kDefaultDelay); EXPECT_EQ(1, test_transport_.packet_count()); @@ -124,10 +125,10 @@ TEST_F(RtcpSenderTest, RtcpReceiverReport) { p2.AddSdesCname(kSendingSsrc, kCName); test_transport_.SetExpectedRtcpPacket(p2.GetPacket().Pass()); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr, &report_block, NULL, NULL, NULL, kDefaultDelay); + kRtcpRr, &report_block, NULL, NULL, NULL, kDefaultDelay); EXPECT_EQ(2, test_transport_.packet_count()); } @@ -142,14 +143,14 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { p.AddXrRrtrBlock(); test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); RtcpReceiverReferenceTimeReport rrtr; rrtr.ntp_seconds = kNtpHigh; rrtr.ntp_fraction = kNtpLow; rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpRrtr, + kRtcpRr | kRtcpRrtr, &report_block, &rrtr, NULL, @@ -168,7 +169,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); RtcpCastMessage cast_message(kMediaSsrc); cast_message.ack_frame_id_ = kAckFrameId; @@ -182,7 +183,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { missing_packets; rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpCast, + kRtcpRr | kRtcpCast, &report_block, NULL, &cast_message, @@ -202,7 +203,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); RtcpReceiverReferenceTimeReport rrtr; rrtr.ntp_seconds = kNtpHigh; @@ -220,7 +221,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { missing_packets; rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast, + kRtcpRr | kRtcpRrtr | kRtcpCast, &report_block, &rrtr, &cast_message, @@ -243,7 +244,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); RtcpReceiverReferenceTimeReport rrtr; rrtr.ntp_seconds = kNtpHigh; @@ -264,8 +265,8 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | - transport::kRtcpReceiverLog, + kRtcpRr | kRtcpRrtr | kRtcpCast | + kRtcpReceiverLog, &report_block, &rrtr, &cast_message, @@ -301,8 +302,8 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { EXPECT_EQ(2u, rtcp_events.size()); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | - transport::kRtcpReceiverLog, + kRtcpRr | kRtcpRrtr | kRtcpCast | + kRtcpReceiverLog, &report_block, &rrtr, &cast_message, @@ -321,7 +322,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { p.AddRb(kMediaSsrc); p.AddSdesCname(kSendingSsrc, kCName); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); base::SimpleTestTickClock testing_clock; testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); @@ -370,7 +371,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { event_subscriber.GetRtcpEventsAndReset(&rtcp_events); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpReceiverLog, + kRtcpRr | kRtcpReceiverLog, &report_block, NULL, NULL, @@ -389,7 +390,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { p.AddRb(kMediaSsrc); p.AddSdesCname(kSendingSsrc, kCName); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); base::SimpleTestTickClock testing_clock; testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); @@ -427,7 +428,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { event_subscriber.GetRtcpEventsAndReset(&rtcp_events); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpReceiverLog, + kRtcpRr | kRtcpReceiverLog, &report_block, NULL, NULL, @@ -445,7 +446,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { p.AddRb(kMediaSsrc); p.AddSdesCname(kSendingSsrc, kCName); - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); base::SimpleTestTickClock testing_clock; testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); @@ -478,7 +479,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { event_subscriber.GetRtcpEventsAndReset(&rtcp_events); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpReceiverLog, + kRtcpRr | kRtcpReceiverLog, &report_block, NULL, NULL, @@ -492,7 +493,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { uint32 time_base_ms = 12345678; int kTimeBetweenEventsMs = 10; - transport::RtcpReportBlock report_block = GetReportBlock(); + RtcpReportBlock report_block = GetReportBlock(); base::SimpleTestTickClock testing_clock; testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); @@ -537,7 +538,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { event_subscriber.GetRtcpEventsAndReset(&rtcp_events); rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpReceiverLog, + kRtcpRr | kRtcpReceiverLog, &report_block, NULL, NULL, diff --git a/media/cast/rtcp/rtcp_unittest.cc b/media/cast/net/rtcp/rtcp_unittest.cc index 095e6d24df..25d05b2239 100644 --- a/media/cast/rtcp/rtcp_unittest.cc +++ b/media/cast/net/rtcp/rtcp_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,14 +7,14 @@ #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/mock_rtcp_receiver_feedback.h" -#include "media/cast/rtcp/mock_rtcp_sender_feedback.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender_impl.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtcp/mock_rtcp_receiver_feedback.h" +#include "media/cast/net/rtcp/mock_rtcp_sender_feedback.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender_impl.h" -#include "media/cast/transport/pacing/paced_sender.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -29,7 +29,7 @@ static const uint32 kRtcpIntervalMs = 500; static const int64 kAddedDelay = 123; static const int64 kAddedShortDelay = 100; -class RtcpTestPacketSender : public transport::PacketSender { +class RtcpTestPacketSender : public PacketSender { public: explicit RtcpTestPacketSender(base::SimpleTestTickClock* testing_clock) : drop_packets_(false), @@ -45,7 +45,7 @@ class RtcpTestPacketSender : public transport::PacketSender { void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } // A singular packet implies a RTCP packet. - virtual bool SendPacket(transport::PacketRef packet, + virtual bool SendPacket(PacketRef packet, const base::Closure& cb) OVERRIDE { if (short_delay_) { testing_clock_->Advance( @@ -69,7 +69,7 @@ class RtcpTestPacketSender : public transport::PacketSender { DISALLOW_COPY_AND_ASSIGN(RtcpTestPacketSender); }; -class LocalRtcpTransport : public transport::PacedPacketSender { +class LocalRtcpTransport : public PacedPacketSender { public: LocalRtcpTransport(scoped_refptr<CastEnvironment> cast_environment, base::SimpleTestTickClock* testing_clock) @@ -84,7 +84,7 @@ class LocalRtcpTransport : public transport::PacedPacketSender { void set_drop_packets(bool drop_packets) { drop_packets_ = drop_packets; } virtual bool SendRtcpPacket(uint32 ssrc, - transport::PacketRef packet) OVERRIDE { + PacketRef packet) OVERRIDE { if (short_delay_) { testing_clock_->Advance( base::TimeDelta::FromMilliseconds(kAddedShortDelay)); @@ -99,18 +99,18 @@ class LocalRtcpTransport : public transport::PacedPacketSender { } virtual bool SendPackets( - const transport::SendPacketVector& packets) OVERRIDE { + const SendPacketVector& packets) OVERRIDE { return false; } virtual bool ResendPackets( - const transport::SendPacketVector& packets, + const SendPacketVector& packets, base::TimeDelta dedupe_window) OVERRIDE { return false; } virtual void CancelSendingPacket( - const transport::PacketKey& packet_key) OVERRIDE { + const PacketKey& packet_key) OVERRIDE { } private: @@ -127,8 +127,8 @@ class RtcpPeer : public Rtcp { public: RtcpPeer(scoped_refptr<CastEnvironment> cast_environment, RtcpSenderFeedback* sender_feedback, - transport::CastTransportSender* const transport_sender, - transport::PacedPacketSender* paced_packet_sender, + CastTransportSender* const transport_sender, + PacedPacketSender* paced_packet_sender, RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, const base::TimeDelta& rtcp_interval, @@ -165,27 +165,28 @@ class RtcpTest : public ::testing::Test { receiver_to_sender_(cast_environment_, testing_clock_) { testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); net::IPEndPoint dummy_endpoint; - transport_sender_.reset(new transport::CastTransportSenderImpl( + transport_sender_.reset(new CastTransportSenderImpl( NULL, testing_clock_, dummy_endpoint, base::Bind(&UpdateCastTransportStatus), - transport::BulkRawEventsCallback(), + BulkRawEventsCallback(), base::TimeDelta(), task_runner_, &sender_to_receiver_)); - transport::CastTransportAudioConfig config; - config.rtp.config.ssrc = kSenderSsrc; - config.rtp.max_outstanding_frames = 1; + CastTransportRtpConfig config; + config.ssrc = kSenderSsrc; + config.rtp_payload_type = 127; + config.stored_frames = 1; transport_sender_->InitializeAudio(config); EXPECT_CALL(mock_sender_feedback_, OnReceivedCastFeedback(_)).Times(0); } virtual ~RtcpTest() {} - static void UpdateCastTransportStatus(transport::CastTransportStatus status) { - bool result = (status == transport::TRANSPORT_AUDIO_INITIALIZED || - status == transport::TRANSPORT_VIDEO_INITIALIZED); + static void UpdateCastTransportStatus(CastTransportStatus status) { + bool result = (status == TRANSPORT_AUDIO_INITIALIZED || + status == TRANSPORT_VIDEO_INITIALIZED); EXPECT_TRUE(result); } @@ -201,7 +202,7 @@ class RtcpTest : public ::testing::Test { scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_refptr<CastEnvironment> cast_environment_; RtcpTestPacketSender sender_to_receiver_; - scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; + scoped_ptr<CastTransportSenderImpl> transport_sender_; LocalRtcpTransport receiver_to_sender_; MockRtcpSenderFeedback mock_sender_feedback_; diff --git a/media/cast/rtcp/rtcp_utility.cc b/media/cast/net/rtcp/rtcp_utility.cc index e29f82e9cf..91fccc1968 100644 --- a/media/cast/rtcp/rtcp_utility.cc +++ b/media/cast/net/rtcp/rtcp_utility.cc @@ -1,12 +1,12 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/rtcp_utility.h" +#include "media/cast/net/rtcp/rtcp_utility.h" #include "base/big_endian.h" #include "base/logging.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" namespace media { namespace cast { @@ -106,44 +106,44 @@ void RtcpParser::IterateTopLevel() { return; // Bad block! switch (header.PT) { - case transport::kPacketTypeSenderReport: + case kPacketTypeSenderReport: // number of Report blocks number_of_blocks_ = header.IC; ParseSR(); return; - case transport::kPacketTypeReceiverReport: + case kPacketTypeReceiverReport: // number of Report blocks number_of_blocks_ = header.IC; ParseRR(); return; - case transport::kPacketTypeSdes: + case kPacketTypeSdes: // number of Sdes blocks number_of_blocks_ = header.IC; if (!ParseSdes()) { break; // Nothing supported found, continue to next block! } return; - case transport::kPacketTypeBye: + case kPacketTypeBye: number_of_blocks_ = header.IC; if (!ParseBye()) { // Nothing supported found, continue to next block! break; } return; - case transport::kPacketTypeApplicationDefined: + case kPacketTypeApplicationDefined: if (!ParseApplicationDefined(header.IC)) { // Nothing supported found, continue to next block! break; } return; - case transport::kPacketTypeGenericRtpFeedback: // Fall through! - case transport::kPacketTypePayloadSpecific: + case kPacketTypeGenericRtpFeedback: // Fall through! + case kPacketTypePayloadSpecific: if (!ParseFeedBackCommon(header)) { // Nothing supported found, continue to next block! break; } return; - case transport::kPacketTypeXr: + case kPacketTypeXr: if (!ParseExtendedReport()) { break; // Nothing supported found, continue to next block! } @@ -609,8 +609,8 @@ bool RtcpParser::ParseCastReceiverLogEventItem() { } bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { - DCHECK((header.PT == transport::kPacketTypeGenericRtpFeedback) || - (header.PT == transport::kPacketTypePayloadSpecific)) + DCHECK((header.PT == kPacketTypeGenericRtpFeedback) || + (header.PT == kPacketTypePayloadSpecific)) << "Invalid state"; ptrdiff_t length = rtcp_block_end_ - rtcp_data_; @@ -630,7 +630,7 @@ bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { rtcp_data_ += 12; - if (header.PT == transport::kPacketTypeGenericRtpFeedback) { + if (header.PT == kPacketTypeGenericRtpFeedback) { // Transport layer feedback switch (header.IC) { case 1: @@ -663,7 +663,7 @@ bool RtcpParser::ParseFeedBackCommon(const RtcpCommonHeader& header) { EndCurrentBlock(); return false; - } else if (header.PT == transport::kPacketTypePayloadSpecific) { + } else if (header.PT == kPacketTypePayloadSpecific) { // Payload specific feedback switch (header.IC) { case 1: diff --git a/media/cast/rtcp/rtcp_utility.h b/media/cast/net/rtcp/rtcp_utility.h index 34f3f25a88..bf6717071a 100644 --- a/media/cast/rtcp/rtcp_utility.h +++ b/media/cast/net/rtcp/rtcp_utility.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -8,7 +8,7 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtcp/test_rtcp_packet_builder.cc b/media/cast/net/rtcp/test_rtcp_packet_builder.cc index 8d0809d928..b6d7cf208e 100644 --- a/media/cast/rtcp/test_rtcp_packet_builder.cc +++ b/media/cast/net/rtcp/test_rtcp_packet_builder.cc @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtcp/test_rtcp_packet_builder.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "base/logging.h" -#include "media/cast/rtcp/rtcp_utility.h" +#include "media/cast/net/rtcp/rtcp_utility.h" namespace media { namespace cast { @@ -65,21 +65,7 @@ void TestRtcpPacketBuilder::AddSdesCname(uint32 sender_ssrc, for (size_t i = 0; i < c_name.size(); ++i) { big_endian_writer_.WriteU8(c_name.c_str()[i]); } - int padding; - switch (c_name.size() % 4) { - case 0: - padding = 2; - break; - case 1: - padding = 1; - break; - case 2: - padding = 4; - break; - case 3: - padding = 3; - break; - } + const int padding = 4 - ((c_name.size() + 2) % 4); for (int j = 0; j < padding; ++j) { big_endian_writer_.WriteU8(0); } @@ -191,7 +177,7 @@ void TestRtcpPacketBuilder::AddRemb(uint32 sender_ssrc, uint32 media_ssrc) { void TestRtcpPacketBuilder::AddCast(uint32 sender_ssrc, uint32 media_ssrc, - uint16 target_delay_ms) { + base::TimeDelta target_delay) { AddRtcpHeader(206, 15); big_endian_writer_.WriteU32(sender_ssrc); big_endian_writer_.WriteU32(media_ssrc); @@ -201,7 +187,7 @@ void TestRtcpPacketBuilder::AddCast(uint32 sender_ssrc, big_endian_writer_.WriteU8('T'); big_endian_writer_.WriteU8(kAckFrameId); big_endian_writer_.WriteU8(3); // Loss fields. - big_endian_writer_.WriteU16(target_delay_ms); + big_endian_writer_.WriteU16(target_delay.InMilliseconds()); big_endian_writer_.WriteU8(kLostFrameId); big_endian_writer_.WriteU16(kRtcpCastAllPacketsLost); big_endian_writer_.WriteU8(0); // Lost packet id mask. diff --git a/media/cast/rtcp/test_rtcp_packet_builder.h b/media/cast/net/rtcp/test_rtcp_packet_builder.h index d4266670ab..153ced1fd6 100644 --- a/media/cast/rtcp/test_rtcp_packet_builder.h +++ b/media/cast/net/rtcp/test_rtcp_packet_builder.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -9,7 +9,8 @@ #include "base/big_endian.h" #include "media/cast/cast_config.h" -#include "media/cast/rtcp/rtcp_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { @@ -79,7 +80,9 @@ class TestRtcpPacketBuilder { void AddPli(uint32 sender_ssrc, uint32 media_ssrc); void AddRpsi(uint32 sender_ssrc, uint32 media_ssrc); void AddRemb(uint32 sender_ssrc, uint32 media_ssrc); - void AddCast(uint32 sender_ssrc, uint32 media_ssrc, uint16 target_delay_ms); + void AddCast(uint32 sender_ssrc, + uint32 media_ssrc, + base::TimeDelta target_delay); void AddReceiverLog(uint32 sender_ssrc); void AddReceiverFrameLog(uint32 rtp_timestamp, int num_events, diff --git a/media/cast/framer/cast_message_builder.cc b/media/cast/net/rtp/cast_message_builder.cc index f3473f9690..bb36613d2c 100644 --- a/media/cast/framer/cast_message_builder.cc +++ b/media/cast/net/rtp/cast_message_builder.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/framer/cast_message_builder.h" +#include "media/cast/net/rtp/cast_message_builder.h" #include "media/cast/cast_defines.h" diff --git a/media/cast/framer/cast_message_builder.h b/media/cast/net/rtp/cast_message_builder.h index 9db88d4a99..0136fed4a0 100644 --- a/media/cast/framer/cast_message_builder.h +++ b/media/cast/net/rtp/cast_message_builder.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -10,9 +10,9 @@ #include <deque> #include <map> -#include "media/cast/framer/frame_id_map.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtp/frame_id_map.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/framer/cast_message_builder_unittest.cc b/media/cast/net/rtp/cast_message_builder_unittest.cc index ef75162a08..b0e30c44cd 100644 --- a/media/cast/framer/cast_message_builder_unittest.cc +++ b/media/cast/net/rtp/cast_message_builder_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -6,9 +6,9 @@ #include "base/memory/scoped_ptr.h" #include "base/test/simple_test_tick_clock.h" -#include "media/cast/framer/cast_message_builder.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtp/cast_message_builder.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { diff --git a/media/cast/framer/frame_buffer.cc b/media/cast/net/rtp/frame_buffer.cc index 0b6fa8332c..a419ab6a46 100644 --- a/media/cast/framer/frame_buffer.cc +++ b/media/cast/net/rtp/frame_buffer.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/framer/frame_buffer.h" +#include "media/cast/net/rtp/frame_buffer.h" #include "base/logging.h" @@ -59,17 +59,17 @@ bool FrameBuffer::Complete() const { return num_packets_received_ - 1 == max_packet_id_; } -bool FrameBuffer::AssembleEncodedFrame(transport::EncodedFrame* frame) const { +bool FrameBuffer::AssembleEncodedFrame(EncodedFrame* frame) const { if (!Complete()) return false; // Frame is complete -> construct. if (is_key_frame_) - frame->dependency = transport::EncodedFrame::KEY; + frame->dependency = EncodedFrame::KEY; else if (frame_id_ == last_referenced_frame_id_) - frame->dependency = transport::EncodedFrame::INDEPENDENT; + frame->dependency = EncodedFrame::INDEPENDENT; else - frame->dependency = transport::EncodedFrame::DEPENDENT; + frame->dependency = EncodedFrame::DEPENDENT; frame->frame_id = frame_id_; frame->referenced_frame_id = last_referenced_frame_id_; frame->rtp_timestamp = rtp_timestamp_; diff --git a/media/cast/framer/frame_buffer.h b/media/cast/net/rtp/frame_buffer.h index d4d5dedbbd..1309a8785a 100644 --- a/media/cast/framer/frame_buffer.h +++ b/media/cast/net/rtp/frame_buffer.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -9,7 +9,7 @@ #include <vector> #include "media/cast/cast_config.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { @@ -29,7 +29,7 @@ class FrameBuffer { // and also copies the data from all packets into the data field in |frame|. // Returns true if the frame was complete; false if incomplete and |frame| // remains unchanged. - bool AssembleEncodedFrame(transport::EncodedFrame* frame) const; + bool AssembleEncodedFrame(EncodedFrame* frame) const; bool is_key_frame() const { return is_key_frame_; } diff --git a/media/cast/framer/frame_buffer_unittest.cc b/media/cast/net/rtp/frame_buffer_unittest.cc index d6844f3e95..69ce93dbbb 100644 --- a/media/cast/framer/frame_buffer_unittest.cc +++ b/media/cast/net/rtp/frame_buffer_unittest.cc @@ -1,8 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/framer/frame_buffer.h" +#include "media/cast/net/rtp/frame_buffer.h" +#include "media/cast/net/cast_transport_defines.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -29,9 +30,9 @@ TEST_F(FrameBufferTest, OnePacketInsertSanity) { rtp_header_.frame_id = 5; rtp_header_.reference_frame_id = 5; buffer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_); - transport::EncodedFrame frame; + EncodedFrame frame; EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame)); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(5u, frame.frame_id); EXPECT_EQ(5u, frame.referenced_frame_id); EXPECT_EQ(3000u, frame.rtp_timestamp); @@ -39,7 +40,7 @@ TEST_F(FrameBufferTest, OnePacketInsertSanity) { TEST_F(FrameBufferTest, EmptyBuffer) { EXPECT_FALSE(buffer_.Complete()); - transport::EncodedFrame frame; + EncodedFrame frame; EXPECT_FALSE(buffer_.AssembleEncodedFrame(&frame)); } @@ -47,7 +48,7 @@ TEST_F(FrameBufferTest, DefaultOnePacketFrame) { buffer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_); EXPECT_TRUE(buffer_.Complete()); EXPECT_FALSE(buffer_.is_key_frame()); - transport::EncodedFrame frame; + EncodedFrame frame; EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame)); EXPECT_EQ(payload_.size(), frame.data.size()); } @@ -63,7 +64,7 @@ TEST_F(FrameBufferTest, MultiplePacketFrame) { ++rtp_header_.packet_id; EXPECT_TRUE(buffer_.Complete()); EXPECT_TRUE(buffer_.is_key_frame()); - transport::EncodedFrame frame; + EncodedFrame frame; EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame)); EXPECT_EQ(3 * payload_.size(), frame.data.size()); } diff --git a/media/cast/framer/frame_id_map.cc b/media/cast/net/rtp/frame_id_map.cc index b4389fd532..f0b433c2fb 100644 --- a/media/cast/framer/frame_id_map.cc +++ b/media/cast/net/rtp/frame_id_map.cc @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/framer/frame_id_map.h" +#include "media/cast/net/rtp/frame_id_map.h" #include "base/logging.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/framer/frame_id_map.h b/media/cast/net/rtp/frame_id_map.h index 66e306f671..9c1b674ff4 100644 --- a/media/cast/framer/frame_id_map.h +++ b/media/cast/net/rtp/frame_id_map.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -11,8 +11,8 @@ #include "base/memory/linked_ptr.h" #include "base/memory/scoped_ptr.h" #include "media/cast/cast_config.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/framer/framer.cc b/media/cast/net/rtp/framer.cc index de4451a3b4..c94dc0c712 100644 --- a/media/cast/framer/framer.cc +++ b/media/cast/net/rtp/framer.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/framer/framer.h" +#include "media/cast/net/rtp/framer.h" #include "base/logging.h" @@ -62,7 +62,7 @@ bool Framer::InsertPacket(const uint8* payload_data, } // This does not release the frame. -bool Framer::GetEncodedFrame(transport::EncodedFrame* frame, +bool Framer::GetEncodedFrame(EncodedFrame* frame, bool* next_frame, bool* have_multiple_decodable_frames) { *have_multiple_decodable_frames = frame_id_map_.HaveMultipleDecodableFrames(); diff --git a/media/cast/framer/framer.h b/media/cast/net/rtp/framer.h index 0b7249eff3..cf70ef191e 100644 --- a/media/cast/framer/framer.h +++ b/media/cast/net/rtp/framer.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -12,11 +12,11 @@ #include "base/memory/scoped_ptr.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "media/cast/framer/cast_message_builder.h" -#include "media/cast/framer/frame_buffer.h" -#include "media/cast/framer/frame_id_map.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtp/cast_message_builder.h" +#include "media/cast/net/rtp/frame_buffer.h" +#include "media/cast/net/rtp/frame_id_map.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { @@ -45,7 +45,7 @@ class Framer { // |next_frame| will be set to true if the returned frame is the very // next frame. |have_multiple_complete_frames| will be set to true // if there are more decodadble frames available. - bool GetEncodedFrame(transport::EncodedFrame* video_frame, + bool GetEncodedFrame(EncodedFrame* video_frame, bool* next_frame, bool* have_multiple_complete_frames); diff --git a/media/cast/framer/framer_unittest.cc b/media/cast/net/rtp/framer_unittest.cc index ad53ef06ee..95e60d438d 100644 --- a/media/cast/framer/framer_unittest.cc +++ b/media/cast/net/rtp/framer_unittest.cc @@ -1,10 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. #include "base/test/simple_test_tick_clock.h" -#include "media/cast/framer/framer.h" -#include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtp/framer.h" +#include "media/cast/net/rtp/mock_rtp_payload_feedback.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -33,14 +34,14 @@ class FramerTest : public ::testing::Test { }; TEST_F(FramerTest, EmptyState) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = false; EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); } TEST_F(FramerTest, AlwaysStartWithKey) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool complete = false; bool multiple = false; @@ -60,14 +61,14 @@ TEST_F(FramerTest, AlwaysStartWithKey) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_TRUE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(1u, frame.frame_id); EXPECT_EQ(1u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); } TEST_F(FramerTest, CompleteFrame) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool complete = false; bool multiple = false; @@ -81,7 +82,7 @@ TEST_F(FramerTest, CompleteFrame) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(0u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -107,7 +108,7 @@ TEST_F(FramerTest, CompleteFrame) { } TEST_F(FramerTest, DuplicatePackets) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool complete = false; bool multiple = false; @@ -139,7 +140,7 @@ TEST_F(FramerTest, DuplicatePackets) { EXPECT_TRUE(complete); EXPECT_FALSE(duplicate); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_FALSE(multiple); EXPECT_EQ(0u, frame.referenced_frame_id); @@ -150,7 +151,7 @@ TEST_F(FramerTest, DuplicatePackets) { EXPECT_FALSE(complete); EXPECT_TRUE(duplicate); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(0u, frame.frame_id); EXPECT_FALSE(multiple); EXPECT_EQ(0u, frame.referenced_frame_id); @@ -184,7 +185,7 @@ TEST_F(FramerTest, DuplicatePackets) { EXPECT_TRUE(complete); EXPECT_FALSE(duplicate); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(1u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); EXPECT_FALSE(multiple); @@ -196,14 +197,14 @@ TEST_F(FramerTest, DuplicatePackets) { EXPECT_FALSE(complete); EXPECT_TRUE(duplicate); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(1u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); EXPECT_FALSE(multiple); } TEST_F(FramerTest, ContinuousSequence) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool complete = false; bool multiple = false; @@ -217,7 +218,7 @@ TEST_F(FramerTest, ContinuousSequence) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(0u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -234,7 +235,7 @@ TEST_F(FramerTest, ContinuousSequence) { TEST_F(FramerTest, Wrap) { // Insert key frame, frame_id = 255 (will jump to that) - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = true; bool duplicate = false; @@ -248,7 +249,7 @@ TEST_F(FramerTest, Wrap) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(255u, frame.frame_id); EXPECT_EQ(255u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -261,14 +262,14 @@ TEST_F(FramerTest, Wrap) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(256u, frame.frame_id); EXPECT_EQ(255u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); } TEST_F(FramerTest, Reset) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool complete = false; bool multiple = true; @@ -284,7 +285,7 @@ TEST_F(FramerTest, Reset) { } TEST_F(FramerTest, RequireKeyAfterReset) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = false; bool duplicate = false; @@ -308,7 +309,7 @@ TEST_F(FramerTest, RequireKeyAfterReset) { } TEST_F(FramerTest, BasicNonLastReferenceId) { - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = false; bool duplicate = false; @@ -335,7 +336,7 @@ TEST_F(FramerTest, BasicNonLastReferenceId) { TEST_F(FramerTest, InOrderReferenceFrameSelection) { // Create pattern: 0, 1, 4, 5. - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = false; bool duplicate = false; @@ -360,7 +361,7 @@ TEST_F(FramerTest, InOrderReferenceFrameSelection) { framer_.InsertPacket( payload_.data(), payload_.size(), rtp_header_, &duplicate); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(0u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); EXPECT_FALSE(multiple); @@ -368,14 +369,14 @@ TEST_F(FramerTest, InOrderReferenceFrameSelection) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_TRUE(multiple); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(1u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_FALSE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(4u, frame.frame_id); EXPECT_EQ(0u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -394,14 +395,14 @@ TEST_F(FramerTest, InOrderReferenceFrameSelection) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency); + EXPECT_EQ(EncodedFrame::DEPENDENT, frame.dependency); EXPECT_EQ(5u, frame.frame_id); EXPECT_EQ(4u, frame.referenced_frame_id); } TEST_F(FramerTest, AudioWrap) { // All audio frames are marked as key frames. - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = false; bool duplicate = false; @@ -415,7 +416,7 @@ TEST_F(FramerTest, AudioWrap) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(254u, frame.frame_id); EXPECT_EQ(254u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -434,7 +435,7 @@ TEST_F(FramerTest, AudioWrap) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_TRUE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(255u, frame.frame_id); EXPECT_EQ(255u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -442,7 +443,7 @@ TEST_F(FramerTest, AudioWrap) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(256u, frame.frame_id); EXPECT_EQ(256u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -450,7 +451,7 @@ TEST_F(FramerTest, AudioWrap) { TEST_F(FramerTest, AudioWrapWithMissingFrame) { // All audio frames are marked as key frames. - transport::EncodedFrame frame; + EncodedFrame frame; bool next_frame = false; bool multiple = true; bool duplicate = false; @@ -464,7 +465,7 @@ TEST_F(FramerTest, AudioWrapWithMissingFrame) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(253u, frame.frame_id); EXPECT_EQ(253u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); @@ -483,14 +484,14 @@ TEST_F(FramerTest, AudioWrapWithMissingFrame) { EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_FALSE(next_frame); EXPECT_TRUE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(255u, frame.frame_id); EXPECT_EQ(255u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple)); EXPECT_TRUE(next_frame); EXPECT_FALSE(multiple); - EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency); + EXPECT_EQ(EncodedFrame::KEY, frame.dependency); EXPECT_EQ(256u, frame.frame_id); EXPECT_EQ(256u, frame.referenced_frame_id); framer_.ReleaseFrame(frame.frame_id); diff --git a/media/cast/rtp_receiver/rtp_parser/include/mock/mock_rtp_feedback.h b/media/cast/net/rtp/mock_rtp_feedback.h index f5edf7c43f..44624ffc71 100644 --- a/media/cast/rtp_receiver/rtp_parser/include/mock/mock_rtp_feedback.h +++ b/media/cast/net/rtp/mock_rtp_feedback.h @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_RTP_INCLUDE_MOCK_RTP_FEEDBACK_H_ #define MEDIA_CAST_RTP_INCLUDE_MOCK_RTP_FEEDBACK_H_ -#include "media/cast/rtp_receiver/rtp_parser/rtp_feedback.h" +#include "media/cast/net/rtp/rtp_parser/rtp_feedback.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { diff --git a/media/cast/rtp_receiver/mock_rtp_payload_feedback.cc b/media/cast/net/rtp/mock_rtp_payload_feedback.cc index 02b6c0be45..cde8e3880a 100644 --- a/media/cast/rtp_receiver/mock_rtp_payload_feedback.cc +++ b/media/cast/net/rtp/mock_rtp_payload_feedback.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtp_receiver/mock_rtp_payload_feedback.h" +#include "media/cast/net/rtp/mock_rtp_payload_feedback.h" namespace media { namespace cast { diff --git a/media/cast/rtp_receiver/mock_rtp_payload_feedback.h b/media/cast/net/rtp/mock_rtp_payload_feedback.h index 14e48673bd..f46d318476 100644 --- a/media/cast/rtp_receiver/mock_rtp_payload_feedback.h +++ b/media/cast/net/rtp/mock_rtp_payload_feedback.h @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_RTP_COMMON_MOCK_RTP_PAYLOAD_FEEDBACK_H_ #define MEDIA_CAST_RTP_COMMON_MOCK_RTP_PAYLOAD_FEEDBACK_H_ -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { diff --git a/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc b/media/cast/net/rtp/packet_storage.cc index a748baa27a..59ac9ce44e 100644 --- a/media/cast/transport/rtp_sender/packet_storage/packet_storage.cc +++ b/media/cast/net/rtp/packet_storage.cc @@ -1,16 +1,16 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" +#include "media/cast/net/rtp/packet_storage.h" #include <string> #include "base/logging.h" +#include "media/cast/cast_defines.h" namespace media { namespace cast { -namespace transport { PacketStorage::PacketStorage(size_t stored_frames) : max_stored_frames_(stored_frames), @@ -60,6 +60,5 @@ const SendPacketVector* PacketStorage::GetFrame8(uint8 frame_id_8bits) const { return &(frames_[index_8bits]); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/rtp_sender/packet_storage/packet_storage.h b/media/cast/net/rtp/packet_storage.h index 037ead1edf..9330a6a0ae 100644 --- a/media/cast/transport/rtp_sender/packet_storage/packet_storage.h +++ b/media/cast/net/rtp/packet_storage.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ -#define MEDIA_CAST_TRANSPORT_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ +#ifndef MEDIA_CAST_NET_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ +#define MEDIA_CAST_NET_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ #include <deque> #include <list> @@ -15,13 +15,12 @@ #include "base/memory/scoped_ptr.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" namespace media { namespace cast { -namespace transport { // Stores a list of frames. Each frame consists a list of packets. typedef std::deque<SendPacketVector> FrameQueue; @@ -55,8 +54,7 @@ class PacketStorage { DISALLOW_COPY_AND_ASSIGN(PacketStorage); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ +#endif // MEDIA_CAST_NET_RTP_SENDER_PACKET_STORAGE_PACKET_STORAGE_H_ diff --git a/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc b/media/cast/net/rtp/packet_storage_unittest.cc index 298942c80a..5e9393da5d 100644 --- a/media/cast/transport/rtp_sender/packet_storage/packet_storage_unittest.cc +++ b/media/cast/net/rtp/packet_storage_unittest.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" +#include "media/cast/net/rtp/packet_storage.h" #include <stdint.h> @@ -14,7 +14,6 @@ namespace media { namespace cast { -namespace transport { static size_t kStoredFrames = 10; @@ -110,6 +109,5 @@ TEST(PacketStorageTest, GetFrameTooOld) { } } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/rtp_receiver/receiver_stats.cc b/media/cast/net/rtp/receiver_stats.cc index 7eff86763f..416cdd8ea5 100644 --- a/media/cast/rtp_receiver/receiver_stats.cc +++ b/media/cast/net/rtp/receiver_stats.cc @@ -1,11 +1,11 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtp_receiver/receiver_stats.h" +#include "media/cast/net/rtp/receiver_stats.h" #include "base/logging.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtp_receiver/receiver_stats.h b/media/cast/net/rtp/receiver_stats.h index 05a067f787..9de6b22c20 100644 --- a/media/cast/rtp_receiver/receiver_stats.h +++ b/media/cast/net/rtp/receiver_stats.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,8 +7,8 @@ #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtp_receiver/receiver_stats_unittest.cc b/media/cast/net/rtp/receiver_stats_unittest.cc index 98059cdde7..caedf84c06 100644 --- a/media/cast/rtp_receiver/receiver_stats_unittest.cc +++ b/media/cast/net/rtp/receiver_stats_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -8,8 +8,8 @@ #include "base/test/simple_test_tick_clock.h" #include "base/time/time.h" -#include "media/cast/rtp_receiver/receiver_stats.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/receiver_stats.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.cc b/media/cast/net/rtp/rtp_header_parser.cc index ddadcb2cf2..2d70f9827d 100644 --- a/media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.cc +++ b/media/cast/net/rtp/rtp_header_parser.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h" +#include "media/cast/net/rtp/rtp_header_parser.h" #include <cstddef> @@ -10,7 +10,6 @@ namespace media { namespace cast { -namespace transport { static const uint8 kCastKeyFrameBitMask = 0x80; static const uint8 kCastReferenceFrameIdBitMask = 0x40; @@ -100,6 +99,5 @@ bool RtpHeaderParser::ParseCast(RtpCastTestHeader* parsed_packet) const { return true; } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h b/media/cast/net/rtp/rtp_header_parser.h index bb6e0fae54..fd235c2aa5 100644 --- a/media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h +++ b/media/cast/net/rtp/rtp_header_parser.h @@ -1,17 +1,16 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. // Utility parser for rtp packetizer unittests -#ifndef MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_TEST_RTP_HEADER_PARSER_H_ -#define MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_TEST_RTP_HEADER_PARSER_H_ +#ifndef MEDIA_CAST_NET_RTP_RTP_HEADER_PARSER_H_ +#define MEDIA_CAST_NET_RTP_RTP_HEADER_PARSER_H_ #include "base/basictypes.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" namespace media { namespace cast { -namespace transport { // TODO(miu): Kill this and use RtpCastHeader instead. struct RtpCastTestHeader { @@ -51,14 +50,13 @@ class RtpHeaderParser { const uint8* const rtp_data_begin_; size_t length_; - mutable transport::FrameIdWrapHelper frame_id_wrap_helper_; - mutable transport::FrameIdWrapHelper reference_frame_id_wrap_helper_; + mutable FrameIdWrapHelper frame_id_wrap_helper_; + mutable FrameIdWrapHelper reference_frame_id_wrap_helper_; DISALLOW_COPY_AND_ASSIGN(RtpHeaderParser); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_TEST_RTP_HEADER_PARSER_H_ +#endif // MEDIA_CAST_NET_RTP_RTP_HEADER_PARSER_H_ diff --git a/media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.cc b/media/cast/net/rtp/rtp_packet_builder.cc index b8ab3baa29..2f279f4e96 100644 --- a/media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.cc +++ b/media/cast/net/rtp/rtp_packet_builder.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h" +#include "media/cast/net/rtp/rtp_packet_builder.h" #include "base/big_endian.h" #include "base/logging.h" diff --git a/media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h b/media/cast/net/rtp/rtp_packet_builder.h index 7337798e31..3d6579720b 100644 --- a/media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h +++ b/media/cast/net/rtp/rtp_packet_builder.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,7 +7,7 @@ #ifndef MEDIA_CAST_RTP_RECEIVER_RTP_PARSER_TEST_RTP_PACKET_BUILDER_H_ #define MEDIA_CAST_RTP_RECEIVER_RTP_PARSER_TEST_RTP_PACKET_BUILDER_H_ -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.cc b/media/cast/net/rtp/rtp_packetizer.cc index d40f99f144..dcfcc8bba4 100644 --- a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.cc +++ b/media/cast/net/rtp/rtp_packetizer.cc @@ -1,16 +1,15 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" +#include "media/cast/net/rtp/rtp_packetizer.h" #include "base/big_endian.h" #include "base/logging.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/pacing/paced_sender.h" namespace media { namespace cast { -namespace transport { static const uint16 kCommonRtpHeaderLength = 12; static const uint16 kCastRtpHeaderLength = 7; @@ -19,13 +18,10 @@ static const uint8 kCastReferenceFrameIdBitMask = 0x40; static const uint8 kRtpMarkerBitMask = 0x80; RtpPacketizerConfig::RtpPacketizerConfig() - : audio(false), - payload_type(-1), + : payload_type(-1), max_payload_length(kMaxIpPacketSize - 28), // Default is IP-v4/UDP. sequence_number(0), - frequency(8000), - ssrc(0), - channels(0) {} + ssrc(0) {} RtpPacketizerConfig::~RtpPacketizerConfig() {} @@ -132,6 +128,5 @@ void RtpPacketizer::BuildCommonRTPheader(Packet* packet, ++sequence_number_; } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h b/media/cast/net/rtp/rtp_packetizer.h index ebdbf01018..034a74a2a5 100644 --- a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h +++ b/media/cast/net/rtp/rtp_packetizer.h @@ -1,16 +1,16 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_RTP_PACKETIZER_H_ -#define MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_RTP_PACKETIZER_H_ +#ifndef MEDIA_CAST_NET_RTP_RTP_PACKETIZER_H_ +#define MEDIA_CAST_NET_RTP_RTP_PACKETIZER_H_ #include <cmath> #include <list> #include <map> #include "base/time/time.h" -#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" +#include "media/cast/net/rtp/packet_storage.h" namespace base { class TickClock; @@ -19,8 +19,6 @@ class TickClock; namespace media { namespace cast { -namespace transport { - class PacedSender; struct RtpPacketizerConfig { @@ -28,21 +26,12 @@ struct RtpPacketizerConfig { ~RtpPacketizerConfig(); // General. - bool audio; int payload_type; uint16 max_payload_length; uint16 sequence_number; - int frequency; // SSRC. unsigned int ssrc; - - // Video. - VideoCodec video_codec; - - // Audio. - uint8 channels; - AudioCodec audio_codec; }; // This object is only called from the main cast thread. @@ -79,8 +68,7 @@ class RtpPacketizer { size_t send_octet_count_; }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_PACKETIZER_RTP_PACKETIZER_H_ +#endif // MEDIA_CAST_NET_RTP_RTP_PACKETIZER_H_ diff --git a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer_unittest.cc b/media/cast/net/rtp/rtp_packetizer_unittest.cc index 64def4ce7f..1e39e5924f 100644 --- a/media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer_unittest.cc +++ b/media/cast/net/rtp/rtp_packetizer_unittest.cc @@ -1,23 +1,23 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" +#include "media/cast/net/rtp/rtp_packetizer.h" #include <stdint.h> #include "base/memory/scoped_ptr.h" #include "base/test/simple_test_tick_clock.h" +#include "media/cast/logging/logging_impl.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtp/packet_storage.h" +#include "media/cast/net/rtp/rtp_header_parser.h" #include "media/cast/test/fake_single_thread_task_runner.h" -#include "media/cast/transport/pacing/paced_sender.h" -#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" -#include "media/cast/transport/rtp_sender/rtp_packetizer/test/rtp_header_parser.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { namespace cast { -namespace transport { namespace { static const int kPayload = 127; @@ -26,7 +26,6 @@ static const uint16 kSeqNum = 33; static const int kMaxPacketLength = 1500; static const int kSsrc = 0x12345; static const unsigned int kFrameSize = 5000; -static const uint32 kStartFrameId = UINT32_C(0xffffffff); } class TestRtpPacketTransport : public PacketSender { @@ -170,6 +169,5 @@ TEST_F(RtpPacketizerTest, Stats) { EXPECT_EQ(expected_num_of_packets, transport_->number_of_packets_received()); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/rtp_receiver/rtp_parser/rtp_parser.cc b/media/cast/net/rtp/rtp_parser.cc index f44e82dac2..bed1d7c8d8 100644 --- a/media/cast/rtp_receiver/rtp_parser/rtp_parser.cc +++ b/media/cast/net/rtp/rtp_parser.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h" +#include "media/cast/net/rtp/rtp_parser.h" #include "base/big_endian.h" #include "base/logging.h" diff --git a/media/cast/rtp_receiver/rtp_parser/rtp_parser.h b/media/cast/net/rtp/rtp_parser.h index 35118cf144..64586d27c9 100644 --- a/media/cast/rtp_receiver/rtp_parser/rtp_parser.h +++ b/media/cast/net/rtp/rtp_parser.h @@ -1,12 +1,12 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_RTP_RECEIVER_RTP_PARSER_RTP_PARSER_H_ -#define MEDIA_CAST_RTP_RECEIVER_RTP_PARSER_RTP_PARSER_H_ +#ifndef MEDIA_CAST_NET_RTP_RTP_PARSER_H_ +#define MEDIA_CAST_NET_RTP_RTP_PARSER_H_ -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" -#include "media/cast/transport/cast_transport_defines.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { @@ -36,7 +36,7 @@ class RtpParser { private: const uint32 expected_sender_ssrc_; const uint8 expected_payload_type_; - transport::FrameIdWrapHelper frame_id_wrap_helper_; + FrameIdWrapHelper frame_id_wrap_helper_; DISALLOW_COPY_AND_ASSIGN(RtpParser); }; @@ -44,4 +44,4 @@ class RtpParser { } // namespace cast } // namespace media -#endif // MEDIA_CAST_RTP_RECEIVER_RTP_PARSER_RTP_PARSER_H_ +#endif // MEDIA_CAST_NET_RTP_RTP_PARSER_H_ diff --git a/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc b/media/cast/net/rtp/rtp_parser_unittest.cc index 47c79139ff..e5c08fe60e 100644 --- a/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc +++ b/media/cast/net/rtp/rtp_parser_unittest.cc @@ -1,12 +1,12 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. #include "base/memory/scoped_ptr.h" #include "base/rand_util.h" -#include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h" -#include "media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_packet_builder.h" +#include "media/cast/net/rtp/rtp_parser.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -39,7 +39,7 @@ class RtpParserTest : public ::testing::Test { void ExpectParsesPacket() { RtpCastHeader parsed_header; const uint8* payload = NULL; - size_t payload_size = -1; + size_t payload_size = static_cast<size_t>(-1); EXPECT_TRUE(rtp_parser_.ParsePacket( packet_, kPacketLength, &parsed_header, &payload, &payload_size)); @@ -63,7 +63,7 @@ class RtpParserTest : public ::testing::Test { void ExpectDoesNotParsePacket() { RtpCastHeader parsed_header; const uint8* payload = NULL; - size_t payload_size = -1; + size_t payload_size = static_cast<size_t>(-1); EXPECT_FALSE(rtp_parser_.ParsePacket( packet_, kPacketLength, &parsed_header, &payload, &payload_size)); } diff --git a/media/cast/rtp_receiver/rtp_receiver_defines.cc b/media/cast/net/rtp/rtp_receiver_defines.cc index e42b2b733c..9b20b5f904 100644 --- a/media/cast/rtp_receiver/rtp_receiver_defines.cc +++ b/media/cast/net/rtp/rtp_receiver_defines.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { diff --git a/media/cast/rtp_receiver/rtp_receiver_defines.h b/media/cast/net/rtp/rtp_receiver_defines.h index d907436f48..86fbd2296f 100644 --- a/media/cast/rtp_receiver/rtp_receiver_defines.h +++ b/media/cast/net/rtp/rtp_receiver_defines.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -7,7 +7,7 @@ #include "base/basictypes.h" #include "media/cast/cast_config.h" -#include "media/cast/rtcp/rtcp_defines.h" +#include "media/cast/net/rtcp/rtcp_defines.h" namespace media { namespace cast { diff --git a/media/cast/transport/rtp_sender/rtp_sender.cc b/media/cast/net/rtp/rtp_sender.cc index b807b34757..0f88c444ec 100644 --- a/media/cast/transport/rtp_sender/rtp_sender.cc +++ b/media/cast/net/rtp/rtp_sender.cc @@ -1,18 +1,17 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/transport/rtp_sender/rtp_sender.h" +#include "media/cast/net/rtp/rtp_sender.h" #include "base/big_endian.h" #include "base/logging.h" #include "base/rand_util.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/pacing/paced_sender.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/pacing/paced_sender.h" namespace media { namespace cast { -namespace transport { namespace { @@ -41,30 +40,13 @@ RtpSender::RtpSender( RtpSender::~RtpSender() {} -bool RtpSender::InitializeAudio(const CastTransportAudioConfig& config) { - storage_.reset(new PacketStorage(config.rtp.max_outstanding_frames)); +bool RtpSender::Initialize(const CastTransportRtpConfig& config) { + storage_.reset(new PacketStorage(config.stored_frames)); if (!storage_->IsValid()) { return false; } - config_.audio = true; - config_.ssrc = config.rtp.config.ssrc; - config_.payload_type = config.rtp.config.payload_type; - config_.frequency = config.frequency; - config_.audio_codec = config.codec; - packetizer_.reset(new RtpPacketizer(transport_, storage_.get(), config_)); - return true; -} - -bool RtpSender::InitializeVideo(const CastTransportVideoConfig& config) { - storage_.reset(new PacketStorage(config.rtp.max_outstanding_frames)); - if (!storage_->IsValid()) { - return false; - } - config_.audio = false; - config_.ssrc = config.rtp.config.ssrc; - config_.payload_type = config.rtp.config.payload_type; - config_.frequency = kVideoFrequency; - config_.video_codec = config.codec; + config_.ssrc = config.ssrc; + config_.payload_type = config.rtp_payload_type; packetizer_.reset(new RtpPacketizer(transport_, storage_.get(), config_)); return true; } @@ -145,6 +127,5 @@ void RtpSender::UpdateSequenceNumber(Packet* packet) { big_endian_writer.WriteU16(packetizer_->NextSequenceNumber()); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/rtp_sender/rtp_sender.h b/media/cast/net/rtp/rtp_sender.h index e65326abf1..4dd7966a68 100644 --- a/media/cast/transport/rtp_sender/rtp_sender.h +++ b/media/cast/net/rtp/rtp_sender.h @@ -1,32 +1,30 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 contains the interface to the cast RTP sender. -#ifndef MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ -#define MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ +#ifndef MEDIA_CAST_NET_RTP_RTP_SENDER_H_ +#define MEDIA_CAST_NET_RTP_RTP_SENDER_H_ #include <map> #include <set> #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/time/tick_clock.h" #include "base/time/time.h" -#include "base/memory/weak_ptr.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/pacing/paced_sender.h" -#include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" -#include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/net/rtp/packet_storage.h" +#include "media/cast/net/rtp/rtp_packetizer.h" namespace media { namespace cast { -namespace transport { - // This object is only called from the main cast thread. // This class handles splitting encoded audio and video frames into packets and // add an RTP header to each packet. The sent packets are stored until they are @@ -40,13 +38,9 @@ class RtpSender { ~RtpSender(); - // Initialize audio stack. Audio must be initialized prior to sending encoded - // audio frames. Returns false if configuration is invalid. - bool InitializeAudio(const CastTransportAudioConfig& config); - - // Initialize video stack. Video must be initialized prior to sending encoded - // video frames. Returns false if configuration is invalid. - bool InitializeVideo(const CastTransportVideoConfig& config); + // This must be called before sending any frames. Returns false if + // configuration is invalid. + bool Initialize(const CastTransportRtpConfig& config); void SendFrame(const EncodedFrame& frame); @@ -78,8 +72,7 @@ class RtpSender { DISALLOW_COPY_AND_ASSIGN(RtpSender); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ +#endif // MEDIA_CAST_NET_RTP_SENDER_RTP_SENDER_H_ diff --git a/media/cast/transport/transport/udp_transport.cc b/media/cast/net/udp_transport.cc index 9669b17d43..ae0593d3ac 100644 --- a/media/cast/transport/transport/udp_transport.cc +++ b/media/cast/net/udp_transport.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/transport/transport/udp_transport.h" +#include "media/cast/net/udp_transport.h" #include <algorithm> #include <string> @@ -19,7 +19,6 @@ namespace media { namespace cast { -namespace transport { namespace { const int kMaxPacketSize = 1500; @@ -237,6 +236,5 @@ void UdpTransport::OnSent(const scoped_refptr<net::IOBuffer>& buf, } } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/transport/transport/udp_transport.h b/media/cast/net/udp_transport.h index 1a568501d5..951e9c12d3 100644 --- a/media/cast/transport/transport/udp_transport.h +++ b/media/cast/net/udp_transport.h @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_TRANSPORT_TRANSPORT_UDP_TRANSPORT_H_ -#define MEDIA_CAST_TRANSPORT_TRANSPORT_UDP_TRANSPORT_H_ +#ifndef MEDIA_CAST_NET_UDP_TRANSPORT_H_ +#define MEDIA_CAST_NET_UDP_TRANSPORT_H_ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "media/cast/cast_environment.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender.h" #include "net/base/ip_endpoint.h" #include "net/base/net_util.h" #include "net/udp/udp_socket.h" @@ -23,7 +23,6 @@ class NetLog; namespace media { namespace cast { -namespace transport { // This class implements UDP transport mechanism for Cast. class UdpTransport : public PacketSender { @@ -90,8 +89,7 @@ class UdpTransport : public PacketSender { DISALLOW_COPY_AND_ASSIGN(UdpTransport); }; -} // namespace transport } // namespace cast } // namespace media -#endif // MEDIA_CAST_TRANSPORT_TRANSPORT_UDP_TRANSPORT_H_ +#endif // MEDIA_CAST_NET_UDP_TRANSPORT_H_ diff --git a/media/cast/transport/transport/udp_transport_unittest.cc b/media/cast/net/udp_transport_unittest.cc index 26879492f0..7ae938b4ca 100644 --- a/media/cast/transport/transport/udp_transport_unittest.cc +++ b/media/cast/net/udp_transport_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/transport/transport/udp_transport.h" +#include "media/cast/net/udp_transport.h" #include <algorithm> #include <string> @@ -12,14 +12,13 @@ #include "base/callback.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "media/cast/net/cast_transport_config.h" #include "media/cast/test/utility/net_utility.h" -#include "media/cast/transport/cast_transport_config.h" #include "net/base/net_util.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { namespace cast { -namespace transport { class MockPacketReceiver { public: @@ -33,7 +32,7 @@ class MockPacketReceiver { } std::string packet() const { return packet_; } - transport::PacketReceiverCallback packet_receiver() { + PacketReceiverCallback packet_receiver() { return base::Bind(&MockPacketReceiver::ReceivedPacket, base::Unretained(this)); } @@ -50,7 +49,7 @@ void SendPacket(UdpTransport* transport, Packet packet) { transport->SendPacket(new base::RefCountedData<Packet>(packet), cb); } -static void UpdateCastTransportStatus(transport::CastTransportStatus status) { +static void UpdateCastTransportStatus(CastTransportStatus status) { NOTREACHED(); } @@ -95,6 +94,5 @@ TEST(UdpTransport, SendAndReceive) { std::equal(packet.begin(), packet.end(), receiver2.packet().begin())); } -} // namespace transport } // namespace cast } // namespace media diff --git a/media/cast/receiver/audio_decoder.cc b/media/cast/receiver/audio_decoder.cc index a4d1896835..dac0a5e9a1 100644 --- a/media/cast/receiver/audio_decoder.cc +++ b/media/cast/receiver/audio_decoder.cc @@ -23,7 +23,7 @@ class AudioDecoder::ImplBase : public base::RefCountedThreadSafe<AudioDecoder::ImplBase> { public: ImplBase(const scoped_refptr<CastEnvironment>& cast_environment, - transport::AudioCodec codec, + Codec codec, int num_channels, int sampling_rate) : cast_environment_(cast_environment), @@ -39,7 +39,7 @@ class AudioDecoder::ImplBase return cast_initialization_status_; } - void DecodeFrame(scoped_ptr<transport::EncodedFrame> encoded_frame, + void DecodeFrame(scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback) { DCHECK_EQ(cast_initialization_status_, STATUS_AUDIO_INITIALIZED); @@ -77,7 +77,7 @@ class AudioDecoder::ImplBase virtual scoped_ptr<AudioBus> Decode(uint8* data, int len) = 0; const scoped_refptr<CastEnvironment> cast_environment_; - const transport::AudioCodec codec_; + const Codec codec_; const int num_channels_; // Subclass' ctor is expected to set this to STATUS_AUDIO_INITIALIZED. @@ -96,7 +96,7 @@ class AudioDecoder::OpusImpl : public AudioDecoder::ImplBase { int num_channels, int sampling_rate) : ImplBase(cast_environment, - transport::kOpus, + CODEC_AUDIO_OPUS, num_channels, sampling_rate), decoder_memory_(new uint8[opus_decoder_get_size(num_channels)]), @@ -166,7 +166,7 @@ class AudioDecoder::Pcm16Impl : public AudioDecoder::ImplBase { int num_channels, int sampling_rate) : ImplBase(cast_environment, - transport::kPcm16, + CODEC_AUDIO_PCM16, num_channels, sampling_rate) { if (ImplBase::cast_initialization_status_ != STATUS_AUDIO_UNINITIALIZED) @@ -202,13 +202,13 @@ AudioDecoder::AudioDecoder( const scoped_refptr<CastEnvironment>& cast_environment, int channels, int sampling_rate, - transport::AudioCodec codec) + Codec codec) : cast_environment_(cast_environment) { switch (codec) { - case transport::kOpus: + case CODEC_AUDIO_OPUS: impl_ = new OpusImpl(cast_environment, channels, sampling_rate); break; - case transport::kPcm16: + case CODEC_AUDIO_PCM16: impl_ = new Pcm16Impl(cast_environment, channels, sampling_rate); break; default: @@ -226,7 +226,7 @@ CastInitializationStatus AudioDecoder::InitializationResult() const { } void AudioDecoder::DecodeFrame( - scoped_ptr<transport::EncodedFrame> encoded_frame, + scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback) { DCHECK(encoded_frame.get()); DCHECK(!callback.is_null()); diff --git a/media/cast/receiver/audio_decoder.h b/media/cast/receiver/audio_decoder.h index c66735e4e6..0b13eae6a8 100644 --- a/media/cast/receiver/audio_decoder.h +++ b/media/cast/receiver/audio_decoder.h @@ -10,7 +10,7 @@ #include "media/base/audio_bus.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace media { namespace cast { @@ -29,7 +29,7 @@ class AudioDecoder { AudioDecoder(const scoped_refptr<CastEnvironment>& cast_environment, int channels, int sampling_rate, - transport::AudioCodec codec); + Codec codec); virtual ~AudioDecoder(); // Returns STATUS_AUDIO_INITIALIZED if the decoder was successfully @@ -44,7 +44,7 @@ class AudioDecoder { // monotonically-increasing by 1 for each successive call to this method. // When it is not, the decoder will assume one or more frames have been // dropped (e.g., due to packet loss), and will perform recovery actions. - void DecodeFrame(scoped_ptr<transport::EncodedFrame> encoded_frame, + void DecodeFrame(scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback); private: diff --git a/media/cast/receiver/audio_decoder_unittest.cc b/media/cast/receiver/audio_decoder_unittest.cc index 6985a69423..576e9dbce5 100644 --- a/media/cast/receiver/audio_decoder_unittest.cc +++ b/media/cast/receiver/audio_decoder_unittest.cc @@ -20,11 +20,11 @@ namespace cast { namespace { struct TestScenario { - transport::AudioCodec codec; + Codec codec; int num_channels; int sampling_rate; - TestScenario(transport::AudioCodec c, int n, int s) + TestScenario(Codec c, int n, int s) : codec(c), num_channels(n), sampling_rate(s) {} }; } // namespace @@ -51,7 +51,7 @@ class AudioDecoderTest : public ::testing::TestWithParam<TestScenario> { last_frame_id_ = 0; seen_a_decoded_frame_ = false; - if (GetParam().codec == transport::kOpus) { + if (GetParam().codec == CODEC_AUDIO_OPUS) { opus_encoder_memory_.reset( new uint8[opus_encoder_get_size(GetParam().num_channels)]); OpusEncoder* const opus_encoder = @@ -73,9 +73,9 @@ class AudioDecoderTest : public ::testing::TestWithParam<TestScenario> { void FeedMoreAudio(const base::TimeDelta& duration, int num_dropped_frames) { // Prepare a simulated EncodedFrame to feed into the AudioDecoder. - scoped_ptr<transport::EncodedFrame> encoded_frame( - new transport::EncodedFrame()); - encoded_frame->dependency = transport::EncodedFrame::KEY; + scoped_ptr<EncodedFrame> encoded_frame( + new EncodedFrame()); + encoded_frame->dependency = EncodedFrame::KEY; encoded_frame->frame_id = last_frame_id_ + 1 + num_dropped_frames; encoded_frame->referenced_frame_id = encoded_frame->frame_id; last_frame_id_ = encoded_frame->frame_id; @@ -88,13 +88,13 @@ class AudioDecoderTest : public ::testing::TestWithParam<TestScenario> { std::vector<int16> interleaved(num_elements); audio_bus->ToInterleaved( audio_bus->frames(), sizeof(int16), &interleaved.front()); - if (GetParam().codec == transport::kPcm16) { + if (GetParam().codec == CODEC_AUDIO_PCM16) { encoded_frame->data.resize(num_elements * sizeof(int16)); int16* const pcm_data = reinterpret_cast<int16*>(encoded_frame->mutable_bytes()); for (size_t i = 0; i < interleaved.size(); ++i) pcm_data[i] = static_cast<int16>(base::HostToNet16(interleaved[i])); - } else if (GetParam().codec == transport::kOpus) { + } else if (GetParam().codec == CODEC_AUDIO_OPUS) { OpusEncoder* const opus_encoder = reinterpret_cast<OpusEncoder*>(opus_encoder_memory_.get()); const int kOpusEncodeBufferSize = 4000; @@ -154,7 +154,7 @@ class AudioDecoderTest : public ::testing::TestWithParam<TestScenario> { // first frame seen at the start (and immediately after dropped packet // recovery) because it introduces a tiny, significant delay. bool examine_signal = true; - if (GetParam().codec == transport::kOpus) { + if (GetParam().codec == CODEC_AUDIO_OPUS) { examine_signal = seen_a_decoded_frame_ && should_be_continuous; seen_a_decoded_frame_ = true; } @@ -229,13 +229,14 @@ TEST_P(AudioDecoderTest, RecoversFromDroppedFrames) { WaitForAllAudioToBeDecoded(); } -INSTANTIATE_TEST_CASE_P(AudioDecoderTestScenarios, - AudioDecoderTest, - ::testing::Values( - TestScenario(transport::kPcm16, 1, 8000), - TestScenario(transport::kPcm16, 2, 48000), - TestScenario(transport::kOpus, 1, 8000), - TestScenario(transport::kOpus, 2, 48000))); +INSTANTIATE_TEST_CASE_P( + AudioDecoderTestScenarios, + AudioDecoderTest, + ::testing::Values( + TestScenario(CODEC_AUDIO_PCM16, 1, 8000), + TestScenario(CODEC_AUDIO_PCM16, 2, 48000), + TestScenario(CODEC_AUDIO_OPUS, 1, 8000), + TestScenario(CODEC_AUDIO_OPUS, 2, 48000))); } // namespace cast } // namespace media diff --git a/media/cast/receiver/cast_receiver_impl.cc b/media/cast/receiver/cast_receiver_impl.cc index 7cff354c14..36669b9e62 100644 --- a/media/cast/receiver/cast_receiver_impl.cc +++ b/media/cast/receiver/cast_receiver_impl.cc @@ -20,7 +20,7 @@ scoped_ptr<CastReceiver> CastReceiver::Create( scoped_refptr<CastEnvironment> cast_environment, const FrameReceiverConfig& audio_config, const FrameReceiverConfig& video_config, - transport::PacketSender* const packet_sender) { + PacketSender* const packet_sender) { return scoped_ptr<CastReceiver>(new CastReceiverImpl( cast_environment, audio_config, video_config, packet_sender)); } @@ -29,7 +29,7 @@ CastReceiverImpl::CastReceiverImpl( scoped_refptr<CastEnvironment> cast_environment, const FrameReceiverConfig& audio_config, const FrameReceiverConfig& video_config, - transport::PacketSender* const packet_sender) + PacketSender* const packet_sender) : cast_environment_(cast_environment), pacer_(cast_environment->Clock(), cast_environment->Logging(), @@ -41,8 +41,8 @@ CastReceiverImpl::CastReceiverImpl( ssrc_of_video_sender_(video_config.incoming_ssrc), num_audio_channels_(audio_config.channels), audio_sampling_rate_(audio_config.frequency), - audio_codec_(audio_config.codec.audio), - video_codec_(video_config.codec.video) {} + audio_codec_(audio_config.codec), + video_codec_(video_config.codec) {} CastReceiverImpl::~CastReceiverImpl() {} @@ -76,7 +76,7 @@ void CastReceiverImpl::DispatchReceivedPacket(scoped_ptr<Packet> packet) { base::Passed(&packet))); } -transport::PacketReceiverCallback CastReceiverImpl::packet_receiver() { +PacketReceiverCallback CastReceiverImpl::packet_receiver() { return base::Bind(&CastReceiverImpl::DispatchReceivedPacket, // TODO(miu): This code structure is dangerous, since the // callback could be stored and then invoked after @@ -122,7 +122,7 @@ void CastReceiverImpl::RequestEncodedVideoFrame( void CastReceiverImpl::DecodeEncodedAudioFrame( const AudioFrameDecodedCallback& callback, - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); if (!encoded_frame) { callback.Run(make_scoped_ptr<AudioBus>(NULL), base::TimeTicks(), false); @@ -150,7 +150,7 @@ void CastReceiverImpl::DecodeEncodedAudioFrame( void CastReceiverImpl::DecodeEncodedVideoFrame( const VideoFrameDecodedCallback& callback, - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); if (!encoded_frame) { callback.Run( diff --git a/media/cast/receiver/cast_receiver_impl.h b/media/cast/receiver/cast_receiver_impl.h index c0dd5f38d1..3443561257 100644 --- a/media/cast/receiver/cast_receiver_impl.h +++ b/media/cast/receiver/cast_receiver_impl.h @@ -10,8 +10,8 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" #include "media/cast/cast_receiver.h" +#include "media/cast/net/pacing/paced_sender.h" #include "media/cast/receiver/frame_receiver.h" -#include "media/cast/transport/pacing/paced_sender.h" namespace media { namespace cast { @@ -27,12 +27,12 @@ class CastReceiverImpl : public CastReceiver { CastReceiverImpl(scoped_refptr<CastEnvironment> cast_environment, const FrameReceiverConfig& audio_config, const FrameReceiverConfig& video_config, - transport::PacketSender* const packet_sender); + PacketSender* const packet_sender); virtual ~CastReceiverImpl(); // CastReceiver implementation. - virtual transport::PacketReceiverCallback packet_receiver() OVERRIDE; + virtual PacketReceiverCallback packet_receiver() OVERRIDE; virtual void RequestDecodedAudioFrame( const AudioFrameDecodedCallback& callback) OVERRIDE; virtual void RequestEncodedAudioFrame( @@ -51,13 +51,13 @@ class CastReceiverImpl : public CastReceiver { // uses this as a callback for RequestEncodedAudioFrame(). void DecodeEncodedAudioFrame( const AudioFrameDecodedCallback& callback, - scoped_ptr<transport::EncodedFrame> encoded_frame); + scoped_ptr<EncodedFrame> encoded_frame); // Feeds an EncodedFrame into |video_decoder_|. RequestDecodedVideoFrame() // uses this as a callback for RequestEncodedVideoFrame(). void DecodeEncodedVideoFrame( const VideoFrameDecodedCallback& callback, - scoped_ptr<transport::EncodedFrame> encoded_frame); + scoped_ptr<EncodedFrame> encoded_frame); // Receives an AudioBus from |audio_decoder_|, logs the event, and passes the // data on by running the given |callback|. This method is static to ensure @@ -88,7 +88,7 @@ class CastReceiverImpl : public CastReceiver { bool is_continuous); const scoped_refptr<CastEnvironment> cast_environment_; - transport::PacedSender pacer_; + PacedSender pacer_; FrameReceiver audio_receiver_; FrameReceiver video_receiver_; @@ -102,8 +102,8 @@ class CastReceiverImpl : public CastReceiver { // the internal software-based decoders. const int num_audio_channels_; const int audio_sampling_rate_; - const transport::AudioCodec audio_codec_; - const transport::VideoCodec video_codec_; + const Codec audio_codec_; + const Codec video_codec_; // Created on-demand to decode frames from |audio_receiver_| into AudioBuses // for playback. diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/receiver/frame_receiver.cc index e189cc99a7..951e958b80 100644 --- a/media/cast/receiver/frame_receiver.cc +++ b/media/cast/receiver/frame_receiver.cc @@ -23,7 +23,7 @@ FrameReceiver::FrameReceiver( const scoped_refptr<CastEnvironment>& cast_environment, const FrameReceiverConfig& config, EventMediaType event_media_type, - transport::PacedPacketSender* const packet_sender) + PacedPacketSender* const packet_sender) : cast_environment_(cast_environment), packet_parser_(config.incoming_ssrc, config.rtp_payload_type), stats_(cast_environment->Clock()), @@ -193,8 +193,8 @@ void FrameReceiver::EmitAvailableEncodedFrames() { // Attempt to peek at the next completed frame from the |framer_|. // TODO(miu): We should only be peeking at the metadata, and not copying the // payload yet! Or, at least, peek using a StringPiece instead of a copy. - scoped_ptr<transport::EncodedFrame> encoded_frame( - new transport::EncodedFrame()); + scoped_ptr<EncodedFrame> encoded_frame( + new EncodedFrame()); bool is_consecutively_next_frame = false; bool have_multiple_complete_frames = false; if (!framer_.GetEncodedFrame(encoded_frame.get(), @@ -239,7 +239,7 @@ void FrameReceiver::EmitAvailableEncodedFrames() { } // Decrypt the payload data in the frame, if crypto is being used. - if (decryptor_.initialized()) { + if (decryptor_.is_activated()) { std::string decrypted_data; if (!decryptor_.Decrypt(encoded_frame->frame_id, encoded_frame->data, diff --git a/media/cast/receiver/frame_receiver.h b/media/cast/receiver/frame_receiver.h index ac14ab1e0f..f8e4481db2 100644 --- a/media/cast/receiver/frame_receiver.h +++ b/media/cast/receiver/frame_receiver.h @@ -9,17 +9,17 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" -#include "media/cast/base/clock_drift_smoother.h" #include "media/cast/cast_config.h" #include "media/cast/cast_receiver.h" -#include "media/cast/framer/framer.h" +#include "media/cast/common/clock_drift_smoother.h" +#include "media/cast/common/transport_encryption_handler.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_receiver/receiver_stats.h" -#include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h" -#include "media/cast/rtp_receiver/rtp_receiver_defines.h" -#include "media/cast/transport/utility/transport_encryption_handler.h" +#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/net/rtp/framer.h" +#include "media/cast/net/rtp/receiver_stats.h" +#include "media/cast/net/rtp/rtp_parser.h" +#include "media/cast/net/rtp/rtp_receiver_defines.h" namespace media { namespace cast { @@ -50,7 +50,7 @@ class FrameReceiver : public RtpPayloadFeedback, FrameReceiver(const scoped_refptr<CastEnvironment>& cast_environment, const FrameReceiverConfig& config, EventMediaType event_media_type, - transport::PacedPacketSender* const packet_sender); + PacedPacketSender* const packet_sender); virtual ~FrameReceiver(); @@ -152,7 +152,7 @@ class FrameReceiver : public RtpPayloadFeedback, Rtcp rtcp_; // Decrypts encrypted frames. - transport::TransportEncryptionHandler decryptor_; + TransportEncryptionHandler decryptor_; // Outstanding callbacks to run to deliver on client requests for frames. std::list<ReceiveEncodedFrameCallback> frame_request_queue_; diff --git a/media/cast/receiver/frame_receiver_unittest.cc b/media/cast/receiver/frame_receiver_unittest.cc index 4d8273e132..121d12e812 100644 --- a/media/cast/receiver/frame_receiver_unittest.cc +++ b/media/cast/receiver/frame_receiver_unittest.cc @@ -12,11 +12,11 @@ #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/pacing/mock_paced_packet_sender.h" +#include "media/cast/net/rtcp/test_rtcp_packet_builder.h" #include "media/cast/receiver/frame_receiver.h" -#include "media/cast/rtcp/test_rtcp_packet_builder.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/utility/default_config.h" -#include "media/cast/transport/pacing/mock_paced_packet_sender.h" #include "testing/gmock/include/gmock/gmock.h" using ::testing::_; @@ -41,7 +41,7 @@ class FakeFrameClient { std::make_pair(expected_frame_id, expected_playout_time)); } - void DeliverEncodedFrame(scoped_ptr<transport::EncodedFrame> frame) { + void DeliverEncodedFrame(scoped_ptr<EncodedFrame> frame) { SCOPED_TRACE(::testing::Message() << "num_called_ is " << num_called_); ASSERT_FALSE(!frame) << "If at shutdown: There were unsatisfied requests enqueued."; @@ -136,7 +136,7 @@ class FrameReceiverTest : public ::testing::Test { RtpCastHeader rtp_header_; base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. base::TimeTicks start_time_; - transport::MockPacedPacketSender mock_transport_; + MockPacedPacketSender mock_transport_; scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_refptr<CastEnvironment> cast_environment_; FakeFrameClient frame_client_; diff --git a/media/cast/receiver/video_decoder.cc b/media/cast/receiver/video_decoder.cc index 6db3fd35f3..f4de9c3b31 100644 --- a/media/cast/receiver/video_decoder.cc +++ b/media/cast/receiver/video_decoder.cc @@ -30,7 +30,7 @@ class VideoDecoder::ImplBase : public base::RefCountedThreadSafe<VideoDecoder::ImplBase> { public: ImplBase(const scoped_refptr<CastEnvironment>& cast_environment, - transport::VideoCodec codec) + Codec codec) : cast_environment_(cast_environment), codec_(codec), cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED), @@ -40,7 +40,7 @@ class VideoDecoder::ImplBase return cast_initialization_status_; } - void DecodeFrame(scoped_ptr<transport::EncodedFrame> encoded_frame, + void DecodeFrame(scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback) { DCHECK_EQ(cast_initialization_status_, STATUS_VIDEO_INITIALIZED); @@ -77,7 +77,7 @@ class VideoDecoder::ImplBase virtual scoped_refptr<VideoFrame> Decode(uint8* data, int len) = 0; const scoped_refptr<CastEnvironment> cast_environment_; - const transport::VideoCodec codec_; + const Codec codec_; // Subclass' ctor is expected to set this to STATUS_VIDEO_INITIALIZED. CastInitializationStatus cast_initialization_status_; @@ -92,7 +92,7 @@ class VideoDecoder::ImplBase class VideoDecoder::Vp8Impl : public VideoDecoder::ImplBase { public: explicit Vp8Impl(const scoped_refptr<CastEnvironment>& cast_environment) - : ImplBase(cast_environment, transport::kVp8) { + : ImplBase(cast_environment, CODEC_VIDEO_VP8) { if (ImplBase::cast_initialization_status_ != STATUS_VIDEO_UNINITIALIZED) return; @@ -173,7 +173,7 @@ class VideoDecoder::Vp8Impl : public VideoDecoder::ImplBase { class VideoDecoder::FakeImpl : public VideoDecoder::ImplBase { public: explicit FakeImpl(const scoped_refptr<CastEnvironment>& cast_environment) - : ImplBase(cast_environment, transport::kFakeSoftwareVideo), + : ImplBase(cast_environment, CODEC_VIDEO_FAKE), last_decoded_id_(-1) { if (ImplBase::cast_initialization_status_ != STATUS_VIDEO_UNINITIALIZED) return; @@ -184,9 +184,14 @@ class VideoDecoder::FakeImpl : public VideoDecoder::ImplBase { virtual ~FakeImpl() {} virtual scoped_refptr<VideoFrame> Decode(uint8* data, int len) OVERRIDE { + // Make sure this is a JSON string. + if (!len || data[0] != '{') + return NULL; base::JSONReader reader; scoped_ptr<base::Value> values( - reader.Read(base::StringPiece(reinterpret_cast<char*>(data)))); + reader.Read(base::StringPiece(reinterpret_cast<char*>(data), len))); + if (!values) + return NULL; base::DictionaryValue* dict = NULL; values->GetAsDictionary(&dict); @@ -209,18 +214,18 @@ class VideoDecoder::FakeImpl : public VideoDecoder::ImplBase { VideoDecoder::VideoDecoder( const scoped_refptr<CastEnvironment>& cast_environment, - transport::VideoCodec codec) + Codec codec) : cast_environment_(cast_environment) { switch (codec) { #ifndef OFFICIAL_BUILD - case transport::kFakeSoftwareVideo: + case CODEC_VIDEO_FAKE: impl_ = new FakeImpl(cast_environment); break; #endif - case transport::kVp8: + case CODEC_VIDEO_VP8: impl_ = new Vp8Impl(cast_environment); break; - case transport::kH264: + case CODEC_VIDEO_H264: // TODO(miu): Need implementation. NOTIMPLEMENTED(); break; @@ -239,7 +244,7 @@ CastInitializationStatus VideoDecoder::InitializationResult() const { } void VideoDecoder::DecodeFrame( - scoped_ptr<transport::EncodedFrame> encoded_frame, + scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback) { DCHECK(encoded_frame.get()); DCHECK(!callback.is_null()); diff --git a/media/cast/receiver/video_decoder.h b/media/cast/receiver/video_decoder.h index 66dc36bb2a..f3d8ca202e 100644 --- a/media/cast/receiver/video_decoder.h +++ b/media/cast/receiver/video_decoder.h @@ -10,7 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "media/base/video_frame.h" #include "media/cast/cast_config.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace media { namespace cast { @@ -28,7 +28,7 @@ class VideoDecoder { bool is_continuous)> DecodeFrameCallback; VideoDecoder(const scoped_refptr<CastEnvironment>& cast_environment, - transport::VideoCodec codec); + Codec codec); virtual ~VideoDecoder(); // Returns STATUS_VIDEO_INITIALIZED if the decoder was successfully @@ -43,7 +43,7 @@ class VideoDecoder { // monotonically-increasing by 1 for each successive call to this method. // When it is not, the decoder will assume one or more frames have been // dropped (e.g., due to packet loss), and will perform recovery actions. - void DecodeFrame(scoped_ptr<transport::EncodedFrame> encoded_frame, + void DecodeFrame(scoped_ptr<EncodedFrame> encoded_frame, const DecodeFrameCallback& callback); private: diff --git a/media/cast/receiver/video_decoder_unittest.cc b/media/cast/receiver/video_decoder_unittest.cc index 1d16534b96..c7c39ad2d0 100644 --- a/media/cast/receiver/video_decoder_unittest.cc +++ b/media/cast/receiver/video_decoder_unittest.cc @@ -11,9 +11,9 @@ #include "base/time/time.h" #include "media/cast/cast_config.h" #include "media/cast/receiver/video_decoder.h" +#include "media/cast/sender/vp8_encoder.h" #include "media/cast/test/utility/standalone_cast_environment.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -35,8 +35,7 @@ VideoSenderConfig GetVideoSenderConfigForTest() { } // namespace -class VideoDecoderTest - : public ::testing::TestWithParam<transport::VideoCodec> { +class VideoDecoderTest : public ::testing::TestWithParam<Codec> { public: VideoDecoderTest() : cast_environment_(new StandaloneCastEnvironment()), @@ -74,9 +73,10 @@ class VideoDecoderTest PopulateVideoFrame(video_frame, 0); // Encode |frame| into |encoded_frame->data|. - scoped_ptr<transport::EncodedFrame> encoded_frame( - new transport::EncodedFrame()); - CHECK_EQ(transport::kVp8, GetParam()); // Only support VP8 test currently. + scoped_ptr<EncodedFrame> encoded_frame( + new EncodedFrame()); + // Test only supports VP8, currently. + CHECK_EQ(CODEC_VIDEO_VP8, GetParam()); vp8_encoder_.Encode(video_frame, encoded_frame.get()); encoded_frame->frame_id = last_frame_id_ + 1 + num_dropped_frames; last_frame_id_ = encoded_frame->frame_id; @@ -177,7 +177,7 @@ TEST_P(VideoDecoderTest, RecoversFromDroppedFrames) { INSTANTIATE_TEST_CASE_P(VideoDecoderTestScenarios, VideoDecoderTest, - ::testing::Values(transport::kVp8)); + ::testing::Values(CODEC_VIDEO_VP8)); } // namespace cast } // namespace media diff --git a/media/cast/audio_sender/audio_encoder.cc b/media/cast/sender/audio_encoder.cc index 8860c7dd2d..83bd594fb6 100644 --- a/media/cast/audio_sender/audio_encoder.cc +++ b/media/cast/sender/audio_encoder.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/audio_sender/audio_encoder.h" +#include "media/cast/sender/audio_encoder.h" #include <algorithm> @@ -44,7 +44,7 @@ class AudioEncoder::ImplBase : public base::RefCountedThreadSafe<AudioEncoder::ImplBase> { public: ImplBase(const scoped_refptr<CastEnvironment>& cast_environment, - transport::AudioCodec codec, + Codec codec, int num_channels, int sampling_rate, const FrameEncodedCallback& callback) @@ -117,9 +117,9 @@ class AudioEncoder::ImplBase if (buffer_fill_end_ < samples_per_frame_) break; - scoped_ptr<transport::EncodedFrame> audio_frame( - new transport::EncodedFrame()); - audio_frame->dependency = transport::EncodedFrame::KEY; + scoped_ptr<EncodedFrame> audio_frame( + new EncodedFrame()); + audio_frame->dependency = EncodedFrame::KEY; audio_frame->frame_id = frame_id_; audio_frame->referenced_frame_id = frame_id_; audio_frame->rtp_timestamp = frame_rtp_timestamp_; @@ -151,7 +151,7 @@ class AudioEncoder::ImplBase virtual bool EncodeFromFilledBuffer(std::string* out) = 0; const scoped_refptr<CastEnvironment> cast_environment_; - const transport::AudioCodec codec_; + const Codec codec_; const int num_channels_; const int samples_per_frame_; const FrameEncodedCallback callback_; @@ -193,7 +193,7 @@ class AudioEncoder::OpusImpl : public AudioEncoder::ImplBase { int bitrate, const FrameEncodedCallback& callback) : ImplBase(cast_environment, - transport::kOpus, + CODEC_AUDIO_OPUS, num_channels, sampling_rate, callback), @@ -283,7 +283,7 @@ class AudioEncoder::Pcm16Impl : public AudioEncoder::ImplBase { int sampling_rate, const FrameEncodedCallback& callback) : ImplBase(cast_environment, - transport::kPcm16, + CODEC_AUDIO_PCM16, num_channels, sampling_rate, callback), @@ -326,24 +326,27 @@ class AudioEncoder::Pcm16Impl : public AudioEncoder::ImplBase { AudioEncoder::AudioEncoder( const scoped_refptr<CastEnvironment>& cast_environment, - const AudioSenderConfig& audio_config, + int num_channels, + int sampling_rate, + int bitrate, + Codec codec, const FrameEncodedCallback& frame_encoded_callback) : cast_environment_(cast_environment) { // Note: It doesn't matter which thread constructs AudioEncoder, just so long // as all calls to InsertAudio() are by the same thread. insert_thread_checker_.DetachFromThread(); - switch (audio_config.codec) { - case transport::kOpus: + switch (codec) { + case CODEC_AUDIO_OPUS: impl_ = new OpusImpl(cast_environment, - audio_config.channels, - audio_config.frequency, - audio_config.bitrate, + num_channels, + sampling_rate, + bitrate, frame_encoded_callback); break; - case transport::kPcm16: + case CODEC_AUDIO_PCM16: impl_ = new Pcm16Impl(cast_environment, - audio_config.channels, - audio_config.frequency, + num_channels, + sampling_rate, frame_encoded_callback); break; default: diff --git a/media/cast/audio_sender/audio_encoder.h b/media/cast/sender/audio_encoder.h index 2297672b74..5f080c6cb6 100644 --- a/media/cast/audio_sender/audio_encoder.h +++ b/media/cast/sender/audio_encoder.h @@ -1,15 +1,14 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_AUDIO_SENDER_AUDIO_ENCODER_H_ -#define MEDIA_CAST_AUDIO_SENDER_AUDIO_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_AUDIO_ENCODER_H_ +#define MEDIA_CAST_SENDER_AUDIO_ENCODER_H_ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "media/base/audio_bus.h" -#include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" namespace base { @@ -21,11 +20,14 @@ namespace cast { class AudioEncoder { public: - typedef base::Callback<void(scoped_ptr<transport::EncodedFrame>)> + typedef base::Callback<void(scoped_ptr<EncodedFrame>)> FrameEncodedCallback; AudioEncoder(const scoped_refptr<CastEnvironment>& cast_environment, - const AudioSenderConfig& audio_config, + int num_channels, + int sampling_rate, + int bitrate, + Codec codec, const FrameEncodedCallback& frame_encoded_callback); virtual ~AudioEncoder(); @@ -51,4 +53,4 @@ class AudioEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_AUDIO_SENDER_AUDIO_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_AUDIO_ENCODER_H_ diff --git a/media/cast/audio_sender/audio_encoder_unittest.cc b/media/cast/sender/audio_encoder_unittest.cc index b521099243..0764148a4c 100644 --- a/media/cast/audio_sender/audio_encoder_unittest.cc +++ b/media/cast/sender/audio_encoder_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -12,9 +12,8 @@ #include "base/memory/scoped_ptr.h" #include "media/base/audio_bus.h" #include "media/base/media.h" -#include "media/cast/audio_sender/audio_encoder.h" -#include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" +#include "media/cast/sender/audio_encoder.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/utility/audio_utility.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,13 +21,13 @@ namespace media { namespace cast { -static const int64 kStartMillisecond = INT64_C(12345678900000); +static const int kNumChannels = 2; namespace { class TestEncodedAudioFrameReceiver { public: - explicit TestEncodedAudioFrameReceiver(transport::AudioCodec codec) + explicit TestEncodedAudioFrameReceiver(Codec codec) : codec_(codec), frames_received_(0), rtp_lower_bound_(0) {} virtual ~TestEncodedAudioFrameReceiver() {} @@ -40,8 +39,8 @@ class TestEncodedAudioFrameReceiver { upper_bound_ = upper_bound; } - void FrameEncoded(scoped_ptr<transport::EncodedFrame> encoded_frame) { - EXPECT_EQ(encoded_frame->dependency, transport::EncodedFrame::KEY); + void FrameEncoded(scoped_ptr<EncodedFrame> encoded_frame) { + EXPECT_EQ(encoded_frame->dependency, EncodedFrame::KEY); EXPECT_EQ(static_cast<uint8>(frames_received_ & 0xff), encoded_frame->frame_id); EXPECT_EQ(encoded_frame->frame_id, encoded_frame->referenced_frame_id); @@ -62,7 +61,7 @@ class TestEncodedAudioFrameReceiver { } private: - const transport::AudioCodec codec_; + const Codec codec_; int frames_received_; uint32 rtp_lower_bound_; base::TimeTicks lower_bound_; @@ -96,8 +95,7 @@ class AudioEncoderTest : public ::testing::TestWithParam<TestScenario> { AudioEncoderTest() { InitializeMediaLibraryForTesting(); testing_clock_ = new base::SimpleTestTickClock(); - testing_clock_->Advance( - base::TimeDelta::FromMilliseconds(kStartMillisecond)); + testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); } virtual void SetUp() { @@ -111,7 +109,7 @@ class AudioEncoderTest : public ::testing::TestWithParam<TestScenario> { virtual ~AudioEncoderTest() {} - void RunTestForCodec(transport::AudioCodec codec) { + void RunTestForCodec(Codec codec) { const TestScenario& scenario = GetParam(); SCOPED_TRACE(::testing::Message() << "Durations: " << scenario.ToString()); @@ -144,18 +142,10 @@ class AudioEncoderTest : public ::testing::TestWithParam<TestScenario> { } private: - void CreateObjectsForCodec(transport::AudioCodec codec) { - AudioSenderConfig audio_config; - audio_config.codec = codec; - audio_config.use_external_encoder = false; - audio_config.frequency = kDefaultAudioSamplingRate; - audio_config.channels = 2; - audio_config.bitrate = kDefaultAudioEncoderBitrate; - audio_config.rtp_config.payload_type = 127; - + void CreateObjectsForCodec(Codec codec) { audio_bus_factory_.reset( - new TestAudioBusFactory(audio_config.channels, - audio_config.frequency, + new TestAudioBusFactory(kNumChannels, + kDefaultAudioSamplingRate, TestAudioBusFactory::kMiddleANoteFreq, 0.5f)); @@ -163,7 +153,10 @@ class AudioEncoderTest : public ::testing::TestWithParam<TestScenario> { audio_encoder_.reset(new AudioEncoder( cast_environment_, - audio_config, + kNumChannels, + kDefaultAudioSamplingRate, + kDefaultAudioEncoderBitrate, + codec, base::Bind(&TestEncodedAudioFrameReceiver::FrameEncoded, base::Unretained(receiver_.get())))); } @@ -178,9 +171,13 @@ class AudioEncoderTest : public ::testing::TestWithParam<TestScenario> { DISALLOW_COPY_AND_ASSIGN(AudioEncoderTest); }; -TEST_P(AudioEncoderTest, EncodeOpus) { RunTestForCodec(transport::kOpus); } +TEST_P(AudioEncoderTest, EncodeOpus) { + RunTestForCodec(CODEC_AUDIO_OPUS); +} -TEST_P(AudioEncoderTest, EncodePcm16) { RunTestForCodec(transport::kPcm16); } +TEST_P(AudioEncoderTest, EncodePcm16) { + RunTestForCodec(CODEC_AUDIO_PCM16); +} static const int64 kOneCall_3Millis[] = {3}; static const int64 kOneCall_10Millis[] = {10}; diff --git a/media/cast/audio_sender/audio_sender.cc b/media/cast/sender/audio_sender.cc index 878f3456c8..7c7c696125 100644 --- a/media/cast/audio_sender/audio_sender.cc +++ b/media/cast/sender/audio_sender.cc @@ -1,19 +1,20 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/audio_sender/audio_sender.h" +#include "media/cast/sender/audio_sender.h" #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" -#include "media/cast/audio_sender/audio_encoder.h" #include "media/cast/cast_defines.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/sender/audio_encoder.h" namespace media { namespace cast { +namespace { const int kNumAggressiveReportsSentAtStart = 100; const int kMinSchedulingDelayMs = 1; @@ -23,18 +24,25 @@ const int kMinSchedulingDelayMs = 1; // well. const int kAudioFrameRate = 100; +// Helper function to compute the maximum unacked audio frames that is sent. +int GetMaxUnackedFrames(base::TimeDelta target_delay) { + // As long as it doesn't go over |kMaxUnackedFrames|, it is okay to send more + // audio data than the target delay would suggest. Audio packets are tiny and + // receiver has the ability to drop any one of the packets. + // We send up to three times of the target delay of audio frames. + int frames = + 1 + 3 * target_delay * kAudioFrameRate / base::TimeDelta::FromSeconds(1); + return std::min(kMaxUnackedFrames, frames); +} +} // namespace + AudioSender::AudioSender(scoped_refptr<CastEnvironment> cast_environment, const AudioSenderConfig& audio_config, - transport::CastTransportSender* const transport_sender) + CastTransportSender* const transport_sender) : cast_environment_(cast_environment), - target_playout_delay_(base::TimeDelta::FromMilliseconds( - audio_config.rtp_config.max_delay_ms)), + target_playout_delay_(audio_config.target_playout_delay), transport_sender_(transport_sender), - max_unacked_frames_( - std::min(kMaxUnackedFrames, - 1 + static_cast<int>(target_playout_delay_ * - kAudioFrameRate / - base::TimeDelta::FromSeconds(1)))), + max_unacked_frames_(GetMaxUnackedFrames(target_playout_delay_)), configured_encoder_bitrate_(audio_config.bitrate), rtcp_(cast_environment, this, @@ -43,7 +51,7 @@ AudioSender::AudioSender(scoped_refptr<CastEnvironment> cast_environment, NULL, audio_config.rtcp_mode, base::TimeDelta::FromMilliseconds(audio_config.rtcp_interval), - audio_config.rtp_config.ssrc, + audio_config.ssrc, audio_config.incoming_feedback_ssrc, audio_config.rtcp_c_name, AUDIO_EVENT), @@ -60,7 +68,10 @@ AudioSender::AudioSender(scoped_refptr<CastEnvironment> cast_environment, if (!audio_config.use_external_encoder) { audio_encoder_.reset( new AudioEncoder(cast_environment, - audio_config, + audio_config.channels, + audio_config.frequency, + audio_config.bitrate, + audio_config.codec, base::Bind(&AudioSender::SendEncodedAudioFrame, weak_factory_.GetWeakPtr()))); cast_initialization_status_ = audio_encoder_->InitializationResult(); @@ -69,12 +80,14 @@ AudioSender::AudioSender(scoped_refptr<CastEnvironment> cast_environment, cast_initialization_status_ = STATUS_AUDIO_UNINITIALIZED; } - media::cast::transport::CastTransportAudioConfig transport_config; - transport_config.codec = audio_config.codec; - transport_config.rtp.config = audio_config.rtp_config; - transport_config.frequency = audio_config.frequency; - transport_config.channels = audio_config.channels; - transport_config.rtp.max_outstanding_frames = max_unacked_frames_; + media::cast::CastTransportRtpConfig transport_config; + transport_config.ssrc = audio_config.ssrc; + transport_config.rtp_payload_type = audio_config.rtp_payload_type; + // TODO(miu): AudioSender needs to be like VideoSender in providing an upper + // limit on the number of in-flight frames. + transport_config.stored_frames = max_unacked_frames_; + transport_config.aes_key = audio_config.aes_key; + transport_config.aes_iv_mask = audio_config.aes_iv_mask; transport_sender_->InitializeAudio(transport_config); rtcp_.SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); @@ -102,7 +115,7 @@ void AudioSender::InsertAudio(scoped_ptr<AudioBus> audio_bus, } void AudioSender::SendEncodedAudioFrame( - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); const uint32 frame_id = encoded_frame->frame_id; @@ -121,7 +134,7 @@ void AudioSender::SendEncodedAudioFrame( cast_environment_->Logging()->InsertEncodedFrameEvent( last_send_time_, FRAME_ENCODED, AUDIO_EVENT, encoded_frame->rtp_timestamp, frame_id, static_cast<int>(encoded_frame->data.size()), - encoded_frame->dependency == transport::EncodedFrame::KEY, + encoded_frame->dependency == EncodedFrame::KEY, configured_encoder_bitrate_); // Only use lowest 8 bits as key. frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp; diff --git a/media/cast/audio_sender/audio_sender.h b/media/cast/sender/audio_sender.h index 80cf8a4e9e..efaa2b3d03 100644 --- a/media/cast/audio_sender/audio_sender.h +++ b/media/cast/sender/audio_sender.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_AUDIO_SENDER_H_ -#define MEDIA_CAST_AUDIO_SENDER_H_ +#ifndef MEDIA_CAST_SENDER_AUDIO_SENDER_H_ +#define MEDIA_CAST_SENDER_AUDIO_SENDER_H_ #include "base/callback.h" #include "base/memory/ref_counted.h" @@ -16,8 +16,8 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_timestamp_helper.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/sender/rtp_timestamp_helper.h" namespace media { namespace cast { @@ -36,7 +36,7 @@ class AudioSender : public RtcpSenderFeedback, public: AudioSender(scoped_refptr<CastEnvironment> cast_environment, const AudioSenderConfig& audio_config, - transport::CastTransportSender* const transport_sender); + CastTransportSender* const transport_sender); virtual ~AudioSender(); @@ -82,7 +82,7 @@ class AudioSender : public RtcpSenderFeedback, bool AreTooManyFramesInFlight() const; // Called by the |audio_encoder_| with the next EncodedFrame to send. - void SendEncodedAudioFrame(scoped_ptr<transport::EncodedFrame> audio_frame); + void SendEncodedAudioFrame(scoped_ptr<EncodedFrame> audio_frame); const scoped_refptr<CastEnvironment> cast_environment_; @@ -99,7 +99,7 @@ class AudioSender : public RtcpSenderFeedback, // process to the browser process over IPC, with the browser process being // responsible for "packetizing" the frames and pushing packets into the // network layer. - transport::CastTransportSender* const transport_sender_; + CastTransportSender* const transport_sender_; // Maximum number of outstanding frames before the encoding and sending of // new frames shall halt. @@ -159,4 +159,4 @@ class AudioSender : public RtcpSenderFeedback, } // namespace cast } // namespace media -#endif // MEDIA_CAST_AUDIO_SENDER_H_ +#endif // MEDIA_CAST_SENDER_AUDIO_SENDER_H_ diff --git a/media/cast/audio_sender/audio_sender_unittest.cc b/media/cast/sender/audio_sender_unittest.cc index 51edd49602..ab923811aa 100644 --- a/media/cast/audio_sender/audio_sender_unittest.cc +++ b/media/cast/sender/audio_sender_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -9,24 +9,24 @@ #include "base/memory/scoped_ptr.h" #include "base/test/simple_test_tick_clock.h" #include "media/base/media.h" -#include "media/cast/audio_sender/audio_sender.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/rtcp/rtcp.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender_impl.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/sender/audio_sender.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/utility/audio_utility.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender_impl.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { namespace cast { -class TestPacketSender : public transport::PacketSender { +class TestPacketSender : public PacketSender { public: TestPacketSender() : number_of_rtp_packets_(0), number_of_rtcp_packets_(0) {} - virtual bool SendPacket(transport::PacketRef packet, + virtual bool SendPacket(PacketRef packet, const base::Closure& cb) OVERRIDE { if (Rtcp::IsRtcpPacket(&packet->data[0], packet->data.size())) { ++number_of_rtcp_packets_; @@ -65,21 +65,21 @@ class AudioSenderTest : public ::testing::Test { task_runner_, task_runner_, task_runner_); - audio_config_.codec = transport::kOpus; + audio_config_.codec = CODEC_AUDIO_OPUS; audio_config_.use_external_encoder = false; audio_config_.frequency = kDefaultAudioSamplingRate; audio_config_.channels = 2; audio_config_.bitrate = kDefaultAudioEncoderBitrate; - audio_config_.rtp_config.payload_type = 127; + audio_config_.rtp_payload_type = 127; net::IPEndPoint dummy_endpoint; - transport_sender_.reset(new transport::CastTransportSenderImpl( + transport_sender_.reset(new CastTransportSenderImpl( NULL, testing_clock_, dummy_endpoint, base::Bind(&UpdateCastTransportStatus), - transport::BulkRawEventsCallback(), + BulkRawEventsCallback(), base::TimeDelta(), task_runner_, &transport_)); @@ -90,13 +90,13 @@ class AudioSenderTest : public ::testing::Test { virtual ~AudioSenderTest() {} - static void UpdateCastTransportStatus(transport::CastTransportStatus status) { - EXPECT_EQ(transport::TRANSPORT_AUDIO_INITIALIZED, status); + static void UpdateCastTransportStatus(CastTransportStatus status) { + EXPECT_EQ(TRANSPORT_AUDIO_INITIALIZED, status); } base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. TestPacketSender transport_; - scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; + scoped_ptr<CastTransportSenderImpl> transport_sender_; scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_ptr<AudioSender> audio_sender_; scoped_refptr<CastEnvironment> cast_environment_; diff --git a/media/cast/congestion_control/congestion_control.cc b/media/cast/sender/congestion_control.cc index d24e0ac3d0..70fcfe9dc9 100644 --- a/media/cast/congestion_control/congestion_control.cc +++ b/media/cast/sender/congestion_control.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -13,7 +13,7 @@ // If we estimate that our virtual buffer is mostly empty, we try to use // more bandwidth than our recent usage, otherwise we use less. -#include "media/cast/congestion_control/congestion_control.h" +#include "media/cast/sender/congestion_control.h" #include "base/logging.h" #include "media/cast/cast_config.h" @@ -59,8 +59,7 @@ CongestionControl::CongestionControl(base::TickClock* clock, CongestionControl::~CongestionControl() {} void CongestionControl::UpdateRtt(base::TimeDelta rtt) { - rtt_ = base::TimeDelta::FromSecondsD( - (rtt_.InSecondsF() * 7 + rtt.InSecondsF()) / 8); + rtt_ = (7 * rtt_ + rtt) / 8; } // Calculate how much "dead air" there is between two frames. diff --git a/media/cast/congestion_control/congestion_control.h b/media/cast/sender/congestion_control.h index 54622ab114..8537037c71 100644 --- a/media/cast/congestion_control/congestion_control.h +++ b/media/cast/sender/congestion_control.h @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -54,7 +54,7 @@ class CongestionControl { // Get the FrameStats for a given |frame_id|. // Note: Older FrameStats will be removed automatically. FrameStats* GetFrameStats(uint32 frame_id); - // Calculata safe bitrate. This is based on how much we've been + // Calculate a safe bitrate. This is based on how much we've been // sending in the past. double CalculateSafeBitrate(); @@ -63,7 +63,7 @@ class CongestionControl { base::TimeTicks EstimatedAckTime(uint32 frame_id, double bitrate); // Calculate when we start sending the data for a given frame. // This is done by calculating when we were done sending the previous - // frame, but obvoiusly can't be less than |sent_time| (if known). + // frame, but obviously can't be less than |sent_time| (if known). base::TimeTicks EstimatedSendingTime(uint32 frame_id, double bitrate); base::TickClock* const clock_; // Not owned by this class. diff --git a/media/cast/congestion_control/congestion_control_unittest.cc b/media/cast/sender/congestion_control_unittest.cc index 5745eab21d..afdce0031f 100644 --- a/media/cast/congestion_control/congestion_control_unittest.cc +++ b/media/cast/sender/congestion_control_unittest.cc @@ -1,12 +1,13 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. #include <stdint.h> +#include "base/bind.h" #include "base/test/simple_test_tick_clock.h" #include "media/cast/cast_defines.h" -#include "media/cast/congestion_control/congestion_control.h" +#include "media/cast/sender/congestion_control.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/media/cast/video_sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc index ca30bcd47a..e3abecd407 100644 --- a/media/cast/video_sender/external_video_encoder.cc +++ b/media/cast/sender/external_video_encoder.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/video_sender/external_video_encoder.h" +#include "media/cast/sender/external_video_encoder.h" #include "base/bind.h" #include "base/logging.h" @@ -13,7 +13,7 @@ #include "media/base/video_util.h" #include "media/cast/cast_defines.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" #include "media/video/video_encode_accelerator.h" namespace media { @@ -99,20 +99,19 @@ class LocalVideoEncodeAcceleratorClient VideoCodecProfile output_profile = media::VIDEO_CODEC_PROFILE_UNKNOWN; switch (video_config.codec) { - case transport::kVp8: + case CODEC_VIDEO_VP8: output_profile = media::VP8PROFILE_MAIN; break; - case transport::kH264: + case CODEC_VIDEO_H264: output_profile = media::H264PROFILE_MAIN; break; - case transport::kFakeSoftwareVideo: + case CODEC_VIDEO_FAKE: NOTREACHED() << "Fake software video encoder cannot be external"; break; - case transport::kUnknownVideoCodec: - NOTREACHED() << "Video codec not specified"; + default: + NOTREACHED() << "Video codec not specified or not supported"; break; } - codec_ = video_config.codec; max_frame_rate_ = video_config.max_frame_rate; if (!video_encode_accelerator_->Initialize( @@ -221,10 +220,10 @@ class LocalVideoEncodeAcceleratorClient stream_header_.append(static_cast<const char*>(output_buffer->memory()), payload_size); } else if (!encoded_frame_data_storage_.empty()) { - scoped_ptr<transport::EncodedFrame> encoded_frame( - new transport::EncodedFrame()); - encoded_frame->dependency = key_frame ? transport::EncodedFrame::KEY : - transport::EncodedFrame::DEPENDENT; + scoped_ptr<EncodedFrame> encoded_frame( + new EncodedFrame()); + encoded_frame->dependency = key_frame ? EncodedFrame::KEY : + EncodedFrame::DEPENDENT; encoded_frame->frame_id = ++last_encoded_frame_id_; if (key_frame) encoded_frame->referenced_frame_id = encoded_frame->frame_id; @@ -313,7 +312,6 @@ class LocalVideoEncodeAcceleratorClient const CreateVideoEncodeMemoryCallback create_video_encode_memory_cb_; const base::WeakPtr<ExternalVideoEncoder> weak_owner_; int max_frame_rate_; - transport::VideoCodec codec_; uint32 last_encoded_frame_id_; bool key_frame_encountered_; std::string stream_header_; diff --git a/media/cast/video_sender/external_video_encoder.h b/media/cast/sender/external_video_encoder.h index 29fe0c5fcd..84de7f08f4 100644 --- a/media/cast/video_sender/external_video_encoder.h +++ b/media/cast/sender/external_video_encoder.h @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ -#define MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_ +#define MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/video_sender/video_encoder.h" +#include "media/cast/sender/video_encoder.h" #include "media/video/video_encode_accelerator.h" namespace media { @@ -83,4 +83,4 @@ class ExternalVideoEncoder : public VideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_ diff --git a/media/cast/video_sender/external_video_encoder_unittest.cc b/media/cast/sender/external_video_encoder_unittest.cc index 853258ce30..0b446f866e 100644 --- a/media/cast/video_sender/external_video_encoder_unittest.cc +++ b/media/cast/sender/external_video_encoder_unittest.cc @@ -10,10 +10,10 @@ #include "media/base/video_frame.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" +#include "media/cast/sender/external_video_encoder.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/fake_video_encode_accelerator.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/video_sender/external_video_encoder.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -54,11 +54,11 @@ class TestVideoEncoderCallback } void DeliverEncodedVideoFrame( - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { if (expected_frame_id_ == expected_last_referenced_frame_id_) { - EXPECT_EQ(transport::EncodedFrame::KEY, encoded_frame->dependency); + EXPECT_EQ(EncodedFrame::KEY, encoded_frame->dependency); } else { - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, + EXPECT_EQ(EncodedFrame::DEPENDENT, encoded_frame->dependency); } EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); @@ -86,9 +86,9 @@ class ExternalVideoEncoderTest : public ::testing::Test { protected: ExternalVideoEncoderTest() : test_video_encoder_callback_(new TestVideoEncoderCallback()) { - video_config_.rtp_config.ssrc = 1; + video_config_.ssrc = 1; video_config_.incoming_feedback_ssrc = 2; - video_config_.rtp_config.payload_type = 127; + video_config_.rtp_payload_type = 127; video_config_.use_external_encoder = true; video_config_.width = 320; video_config_.height = 240; @@ -99,7 +99,7 @@ class ExternalVideoEncoderTest : public ::testing::Test { video_config_.min_qp = 0; video_config_.max_frame_rate = 30; video_config_.max_number_of_video_buffers_used = 3; - video_config_.codec = transport::kVp8; + video_config_.codec = CODEC_VIDEO_VP8; gfx::Size size(video_config_.width, video_config_.height); video_frame_ = media::VideoFrame::CreateFrame( VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); diff --git a/media/cast/video_sender/fake_software_video_encoder.cc b/media/cast/sender/fake_software_video_encoder.cc index 7c5c952641..bd96f78c89 100644 --- a/media/cast/video_sender/fake_software_video_encoder.cc +++ b/media/cast/sender/fake_software_video_encoder.cc @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/video_sender/fake_software_video_encoder.h" +#include "media/cast/sender/fake_software_video_encoder.h" #include "base/json/json_writer.h" #include "base/values.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" #ifndef OFFICIAL_BUILD @@ -28,26 +28,26 @@ void FakeSoftwareVideoEncoder::Initialize() {} bool FakeSoftwareVideoEncoder::Encode( const scoped_refptr<media::VideoFrame>& video_frame, - transport::EncodedFrame* encoded_image) { + EncodedFrame* encoded_image) { encoded_image->frame_id = frame_id_++; if (next_frame_is_key_) { - encoded_image->dependency = transport::EncodedFrame::KEY; + encoded_image->dependency = EncodedFrame::KEY; encoded_image->referenced_frame_id = encoded_image->frame_id; next_frame_is_key_ = false; } else { - encoded_image->dependency = transport::EncodedFrame::DEPENDENT; + encoded_image->dependency = EncodedFrame::DEPENDENT; encoded_image->referenced_frame_id = encoded_image->frame_id - 1; } base::DictionaryValue values; values.SetBoolean("key", - encoded_image->dependency == transport::EncodedFrame::KEY); + encoded_image->dependency == EncodedFrame::KEY); values.SetInteger("ref", encoded_image->referenced_frame_id); values.SetInteger("id", encoded_image->frame_id); values.SetInteger("size", frame_size_); base::JSONWriter::Write(&values, &encoded_image->data); encoded_image->data.resize( - std::max<size_t>(encoded_image->data.size(), frame_size_)); + std::max<size_t>(encoded_image->data.size(), frame_size_), ' '); return true; } diff --git a/media/cast/video_sender/fake_software_video_encoder.h b/media/cast/sender/fake_software_video_encoder.h index 0eb88ddfe1..5491ae0cc8 100644 --- a/media/cast/video_sender/fake_software_video_encoder.h +++ b/media/cast/sender/fake_software_video_encoder.h @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_VIDEO_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ -#define MEDIA_CAST_VIDEO_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ +#define MEDIA_CAST_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ #include "media/cast/cast_config.h" -#include "media/cast/video_sender/software_video_encoder.h" +#include "media/cast/sender/software_video_encoder.h" namespace media { namespace cast { @@ -19,7 +19,7 @@ class FakeSoftwareVideoEncoder : public SoftwareVideoEncoder { // SoftwareVideoEncoder implementations. virtual void Initialize() OVERRIDE; virtual bool Encode(const scoped_refptr<media::VideoFrame>& video_frame, - transport::EncodedFrame* encoded_image) OVERRIDE; + EncodedFrame* encoded_image) OVERRIDE; virtual void UpdateRates(uint32 new_bitrate) OVERRIDE; virtual void GenerateKeyFrame() OVERRIDE; virtual void LatestFrameIdToReference(uint32 frame_id) OVERRIDE; @@ -35,4 +35,4 @@ class FakeSoftwareVideoEncoder : public SoftwareVideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_FAKE_SOFTWARE_VIDEO_ENCODER_H_ diff --git a/media/cast/rtp_timestamp_helper.cc b/media/cast/sender/rtp_timestamp_helper.cc index 3349e7b33f..ea0c35c66f 100644 --- a/media/cast/rtp_timestamp_helper.cc +++ b/media/cast/sender/rtp_timestamp_helper.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/rtp_timestamp_helper.h" +#include "media/cast/sender/rtp_timestamp_helper.h" namespace media { namespace cast { diff --git a/media/cast/rtp_timestamp_helper.h b/media/cast/sender/rtp_timestamp_helper.h index b9c650c506..8f56681dac 100644 --- a/media/cast/rtp_timestamp_helper.h +++ b/media/cast/sender/rtp_timestamp_helper.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_RTP_TIMESTAMP_HELPER_H_ -#define MEDIA_CAST_RTP_TIMESTAMP_HELPER_H_ +#ifndef MEDIA_CAST_SENDER_RTP_TIMESTAMP_HELPER_H_ +#define MEDIA_CAST_SENDER_RTP_TIMESTAMP_HELPER_H_ #include "base/basictypes.h" #include "base/time/time.h" @@ -38,4 +38,4 @@ class RtpTimestampHelper { } // namespace cast } // namespace media -#endif // MEDIA_CAST_CAST_DEFINES_H_ +#endif // MEDIA_CAST_SENDER_RTP_TIMESTAMP_HELPER_H_ diff --git a/media/cast/video_sender/software_video_encoder.h b/media/cast/sender/software_video_encoder.h index f1bf6f6331..16c8cd3473 100644 --- a/media/cast/video_sender/software_video_encoder.h +++ b/media/cast/sender/software_video_encoder.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_VIDEO_SENDER_SOFTWARE_VIDEO_ENCODER_H_ -#define MEDIA_CAST_VIDEO_SENDER_SOFTWARE_VIDEO_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_ +#define MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" @@ -14,9 +14,7 @@ class VideoFrame; namespace media { namespace cast { -namespace transport { struct EncodedFrame; -} // namespace transport class SoftwareVideoEncoder { public: @@ -28,7 +26,7 @@ class SoftwareVideoEncoder { // Encode a raw image (as a part of a video stream). virtual bool Encode(const scoped_refptr<media::VideoFrame>& video_frame, - transport::EncodedFrame* encoded_image) = 0; + EncodedFrame* encoded_image) = 0; // Update the encoder with a new target bit rate. virtual void UpdateRates(uint32 new_bitrate) = 0; @@ -43,4 +41,4 @@ class SoftwareVideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_SOFTWARE_VIDEO_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_ diff --git a/media/cast/video_sender/video_encoder.h b/media/cast/sender/video_encoder.h index c7b1049ce6..d788c7b2aa 100644 --- a/media/cast/video_sender/video_encoder.h +++ b/media/cast/sender/video_encoder.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_H_ -#define MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ +#define MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ #include "base/callback.h" #include "base/memory/ref_counted.h" @@ -20,7 +20,7 @@ namespace cast { // All these functions are called from the main cast thread. class VideoEncoder { public: - typedef base::Callback<void(scoped_ptr<transport::EncodedFrame>)> + typedef base::Callback<void(scoped_ptr<EncodedFrame>)> FrameEncodedCallback; virtual ~VideoEncoder() {} @@ -48,4 +48,4 @@ class VideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ diff --git a/media/cast/video_sender/video_encoder_impl.cc b/media/cast/sender/video_encoder_impl.cc index b90ef0f07e..d21649784e 100644 --- a/media/cast/video_sender/video_encoder_impl.cc +++ b/media/cast/sender/video_encoder_impl.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/cast/video_sender/video_encoder_impl.h" +#include "media/cast/sender/video_encoder_impl.h" #include "base/bind.h" #include "base/bind_helpers.h" @@ -11,8 +11,8 @@ #include "base/message_loop/message_loop.h" #include "media/base/video_frame.h" #include "media/cast/cast_defines.h" -#include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" -#include "media/cast/video_sender/fake_software_video_encoder.h" +#include "media/cast/sender/fake_software_video_encoder.h" +#include "media/cast/sender/vp8_encoder.h" namespace media { namespace cast { @@ -43,8 +43,8 @@ void EncodeVideoFrameOnEncoderThread( dynamic_config.latest_frame_id_to_reference); encoder->UpdateRates(dynamic_config.bit_rate); - scoped_ptr<transport::EncodedFrame> encoded_frame( - new transport::EncodedFrame()); + scoped_ptr<EncodedFrame> encoded_frame( + new EncodedFrame()); if (!encoder->Encode(video_frame, encoded_frame.get())) { VLOG(1) << "Encoding failed"; return; @@ -53,7 +53,7 @@ void EncodeVideoFrameOnEncoderThread( VLOG(1) << "Encoding resulted in an empty frame"; return; } - encoded_frame->rtp_timestamp = transport::GetVideoRtpTimestamp(capture_time); + encoded_frame->rtp_timestamp = GetVideoRtpTimestamp(capture_time); encoded_frame->reference_time = capture_time; environment->PostTask( @@ -68,9 +68,8 @@ VideoEncoderImpl::VideoEncoderImpl( scoped_refptr<CastEnvironment> cast_environment, const VideoSenderConfig& video_config, int max_unacked_frames) - : video_config_(video_config), - cast_environment_(cast_environment) { - if (video_config.codec == transport::kVp8) { + : cast_environment_(cast_environment) { + if (video_config.codec == CODEC_VIDEO_VP8) { encoder_.reset(new Vp8Encoder(video_config, max_unacked_frames)); cast_environment_->PostTask(CastEnvironment::VIDEO, FROM_HERE, @@ -78,7 +77,7 @@ VideoEncoderImpl::VideoEncoderImpl( cast_environment, encoder_.get())); #ifndef OFFICIAL_BUILD - } else if (video_config.codec == transport::kFakeSoftwareVideo) { + } else if (video_config.codec == CODEC_VIDEO_FAKE) { encoder_.reset(new FakeSoftwareVideoEncoder(video_config)); #endif } else { diff --git a/media/cast/video_sender/video_encoder_impl.h b/media/cast/sender/video_encoder_impl.h index b34b440c93..54a380265c 100644 --- a/media/cast/video_sender/video_encoder_impl.h +++ b/media/cast/sender/video_encoder_impl.h @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_IMPL_H_ -#define MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_IMPL_H_ +#ifndef MEDIA_CAST_SENDER_VIDEO_ENCODER_IMPL_H_ +#define MEDIA_CAST_SENDER_VIDEO_ENCODER_IMPL_H_ #include "base/memory/scoped_ptr.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/video_sender/software_video_encoder.h" -#include "media/cast/video_sender/video_encoder.h" +#include "media/cast/sender/software_video_encoder.h" +#include "media/cast/sender/video_encoder.h" namespace media { class VideoFrame; @@ -26,7 +26,7 @@ class VideoEncoderImpl : public VideoEncoder { int bit_rate; }; - typedef base::Callback<void(scoped_ptr<transport::EncodedFrame>)> + typedef base::Callback<void(scoped_ptr<EncodedFrame>)> FrameEncodedCallback; VideoEncoderImpl(scoped_refptr<CastEnvironment> cast_environment, @@ -53,7 +53,6 @@ class VideoEncoderImpl : public VideoEncoder { virtual void LatestFrameIdToReference(uint32 frame_id) OVERRIDE; private: - const VideoSenderConfig video_config_; scoped_refptr<CastEnvironment> cast_environment_; CodecDynamicConfig dynamic_config_; @@ -69,4 +68,4 @@ class VideoEncoderImpl : public VideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_VIDEO_ENCODER_IMPL_H_ +#endif // MEDIA_CAST_SENDER_VIDEO_ENCODER_IMPL_H_ diff --git a/media/cast/video_sender/video_encoder_impl_unittest.cc b/media/cast/sender/video_encoder_impl_unittest.cc index a60812304f..190ca2aacc 100644 --- a/media/cast/video_sender/video_encoder_impl_unittest.cc +++ b/media/cast/sender/video_encoder_impl_unittest.cc @@ -10,9 +10,9 @@ #include "media/base/video_frame.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" +#include "media/cast/sender/video_encoder_impl.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/video_sender/video_encoder_impl.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -35,11 +35,11 @@ class TestVideoEncoderCallback } void DeliverEncodedVideoFrame( - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { if (expected_frame_id_ == expected_last_referenced_frame_id_) { - EXPECT_EQ(transport::EncodedFrame::KEY, encoded_frame->dependency); + EXPECT_EQ(EncodedFrame::KEY, encoded_frame->dependency); } else { - EXPECT_EQ(transport::EncodedFrame::DEPENDENT, + EXPECT_EQ(EncodedFrame::DEPENDENT, encoded_frame->dependency); } EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); @@ -66,9 +66,9 @@ class VideoEncoderImplTest : public ::testing::Test { protected: VideoEncoderImplTest() : test_video_encoder_callback_(new TestVideoEncoderCallback()) { - video_config_.rtp_config.ssrc = 1; + video_config_.ssrc = 1; video_config_.incoming_feedback_ssrc = 2; - video_config_.rtp_config.payload_type = 127; + video_config_.rtp_payload_type = 127; video_config_.use_external_encoder = false; video_config_.width = 320; video_config_.height = 240; @@ -79,7 +79,7 @@ class VideoEncoderImplTest : public ::testing::Test { video_config_.min_qp = 0; video_config_.max_frame_rate = 30; video_config_.max_number_of_video_buffers_used = 3; - video_config_.codec = transport::kVp8; + video_config_.codec = CODEC_VIDEO_VP8; gfx::Size size(video_config_.width, video_config_.height); video_frame_ = media::VideoFrame::CreateFrame( VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); diff --git a/media/cast/video_sender/video_sender.cc b/media/cast/sender/video_sender.cc index cf050b7f10..0d826903fd 100644 --- a/media/cast/video_sender/video_sender.cc +++ b/media/cast/sender/video_sender.cc @@ -1,8 +1,8 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -#include "media/cast/video_sender/video_sender.h" +#include "media/cast/sender/video_sender.h" #include <algorithm> #include <cstring> @@ -12,10 +12,10 @@ #include "base/logging.h" #include "base/message_loop/message_loop.h" #include "media/cast/cast_defines.h" -#include "media/cast/rtcp/rtcp_defines.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/video_sender/external_video_encoder.h" -#include "media/cast/video_sender/video_encoder_impl.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/rtcp/rtcp_defines.h" +#include "media/cast/sender/external_video_encoder.h" +#include "media/cast/sender/video_encoder_impl.h" namespace media { namespace cast { @@ -28,10 +28,9 @@ VideoSender::VideoSender( const VideoSenderConfig& video_config, const CreateVideoEncodeAcceleratorCallback& create_vea_cb, const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, - transport::CastTransportSender* const transport_sender) + CastTransportSender* const transport_sender) : cast_environment_(cast_environment), - target_playout_delay_(base::TimeDelta::FromMilliseconds( - video_config.rtp_config.max_delay_ms)), + target_playout_delay_(video_config.target_playout_delay), transport_sender_(transport_sender), max_unacked_frames_( std::min(kMaxUnackedFrames, @@ -45,7 +44,7 @@ VideoSender::VideoSender( NULL, video_config.rtcp_mode, base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), - video_config.rtp_config.ssrc, + video_config.ssrc, video_config.incoming_feedback_ssrc, video_config.rtcp_c_name, VIDEO_EVENT), @@ -75,10 +74,12 @@ VideoSender::VideoSender( } cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; - media::cast::transport::CastTransportVideoConfig transport_config; - transport_config.codec = video_config.codec; - transport_config.rtp.config = video_config.rtp_config; - transport_config.rtp.max_outstanding_frames = max_unacked_frames_; + media::cast::CastTransportRtpConfig transport_config; + transport_config.ssrc = video_config.ssrc; + transport_config.rtp_payload_type = video_config.rtp_payload_type; + transport_config.stored_frames = max_unacked_frames_; + transport_config.aes_key = video_config.aes_key; + transport_config.aes_iv_mask = video_config.aes_iv_mask; transport_sender_->InitializeVideo(transport_config); rtcp_.SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); @@ -140,7 +141,7 @@ void VideoSender::InsertRawVideoFrame( void VideoSender::SendEncodedVideoFrame( int requested_bitrate_before_encode, - scoped_ptr<transport::EncodedFrame> encoded_frame) { + scoped_ptr<EncodedFrame> encoded_frame) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); DCHECK_GT(frames_in_encoder_, 0); @@ -159,13 +160,13 @@ void VideoSender::SendEncodedVideoFrame( ScheduleNextResendCheck(); } - VLOG_IF(1, encoded_frame->dependency == transport::EncodedFrame::KEY) + VLOG_IF(1, encoded_frame->dependency == EncodedFrame::KEY) << "Send encoded key frame; frame_id: " << frame_id; cast_environment_->Logging()->InsertEncodedFrameEvent( last_send_time_, FRAME_ENCODED, VIDEO_EVENT, encoded_frame->rtp_timestamp, frame_id, static_cast<int>(encoded_frame->data.size()), - encoded_frame->dependency == transport::EncodedFrame::KEY, + encoded_frame->dependency == EncodedFrame::KEY, requested_bitrate_before_encode); // Only use lowest 8 bits as key. frame_id_to_rtp_timestamp_[frame_id & 0xff] = encoded_frame->rtp_timestamp; diff --git a/media/cast/video_sender/video_sender.h b/media/cast/sender/video_sender.h index cf8d27511c..6587572806 100644 --- a/media/cast/video_sender/video_sender.h +++ b/media/cast/sender/video_sender.h @@ -1,9 +1,9 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_VIDEO_SENDER_VIDEO_SENDER_H_ -#define MEDIA_CAST_VIDEO_SENDER_VIDEO_SENDER_H_ +#ifndef MEDIA_CAST_SENDER_VIDEO_SENDER_H_ +#define MEDIA_CAST_SENDER_VIDEO_SENDER_H_ #include "base/callback.h" #include "base/memory/ref_counted.h" @@ -14,10 +14,10 @@ #include "base/time/time.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" -#include "media/cast/congestion_control/congestion_control.h" #include "media/cast/logging/logging_defines.h" -#include "media/cast/rtcp/rtcp.h" -#include "media/cast/rtp_timestamp_helper.h" +#include "media/cast/net/rtcp/rtcp.h" +#include "media/cast/sender/congestion_control.h" +#include "media/cast/sender/rtp_timestamp_helper.h" namespace media { @@ -25,13 +25,10 @@ class VideoFrame; namespace cast { +class CastTransportSender; class LocalVideoEncoderCallback; class VideoEncoder; -namespace transport { -class CastTransportSender; -} - // Not thread safe. Only called from the main cast thread. // This class owns all objects related to sending video, objects that create RTP // packets, congestion control, video encoder, parsing and sending of @@ -46,7 +43,7 @@ class VideoSender : public RtcpSenderFeedback, const VideoSenderConfig& video_config, const CreateVideoEncodeAcceleratorCallback& create_vea_cb, const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, - transport::CastTransportSender* const transport_sender); + CastTransportSender* const transport_sender); virtual ~VideoSender(); @@ -93,7 +90,7 @@ class VideoSender : public RtcpSenderFeedback, // Called by the |video_encoder_| with the next EncodeFrame to send. void SendEncodedVideoFrame(int requested_bitrate_before_encode, - scoped_ptr<transport::EncodedFrame> encoded_frame); + scoped_ptr<EncodedFrame> encoded_frame); const scoped_refptr<CastEnvironment> cast_environment_; @@ -110,7 +107,7 @@ class VideoSender : public RtcpSenderFeedback, // process to the browser process over IPC, with the browser process being // responsible for "packetizing" the frames and pushing packets into the // network layer. - transport::CastTransportSender* const transport_sender_; + CastTransportSender* const transport_sender_; // Maximum number of outstanding frames before the encoding and sending of // new frames shall halt. @@ -179,4 +176,4 @@ class VideoSender : public RtcpSenderFeedback, } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_VIDEO_SENDER_H_ +#endif // MEDIA_CAST_SENDER_VIDEO_SENDER_H_ diff --git a/media/cast/video_sender/video_sender_unittest.cc b/media/cast/sender/video_sender_unittest.cc index 49fae46c73..bccc248680 100644 --- a/media/cast/video_sender/video_sender_unittest.cc +++ b/media/cast/sender/video_sender_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -12,14 +12,14 @@ #include "media/base/video_frame.h" #include "media/cast/cast_environment.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_sender_impl.h" +#include "media/cast/net/pacing/paced_sender.h" +#include "media/cast/sender/video_sender.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/fake_video_encode_accelerator.h" #include "media/cast/test/utility/default_config.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_sender_impl.h" -#include "media/cast/transport/pacing/paced_sender.h" -#include "media/cast/video_sender/video_sender.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -51,7 +51,7 @@ void CreateSharedMemory( callback.Run(shm.Pass()); } -class TestPacketSender : public transport::PacketSender { +class TestPacketSender : public PacketSender { public: TestPacketSender() : number_of_rtp_packets_(0), @@ -59,7 +59,7 @@ class TestPacketSender : public transport::PacketSender { paused_(false) {} // A singular packet implies a RTCP packet. - virtual bool SendPacket(transport::PacketRef packet, + virtual bool SendPacket(PacketRef packet, const base::Closure& cb) OVERRIDE { if (paused_) { stored_packet_ = packet; @@ -97,7 +97,7 @@ class TestPacketSender : public transport::PacketSender { int number_of_rtcp_packets_; bool paused_; base::Closure callback_; - transport::PacketRef stored_packet_; + PacketRef stored_packet_; DISALLOW_COPY_AND_ASSIGN(TestPacketSender); }; @@ -109,7 +109,7 @@ class PeerVideoSender : public VideoSender { const VideoSenderConfig& video_config, const CreateVideoEncodeAcceleratorCallback& create_vea_cb, const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, - transport::CastTransportSender* const transport_sender) + CastTransportSender* const transport_sender) : VideoSender(cast_environment, video_config, create_vea_cb, @@ -132,12 +132,12 @@ class VideoSenderTest : public ::testing::Test { task_runner_); last_pixel_value_ = kPixelValue; net::IPEndPoint dummy_endpoint; - transport_sender_.reset(new transport::CastTransportSenderImpl( + transport_sender_.reset(new CastTransportSenderImpl( NULL, testing_clock_, dummy_endpoint, base::Bind(&UpdateCastTransportStatus), - transport::BulkRawEventsCallback(), + BulkRawEventsCallback(), base::TimeDelta(), task_runner_, &transport_)); @@ -150,16 +150,16 @@ class VideoSenderTest : public ::testing::Test { task_runner_->RunTasks(); } - static void UpdateCastTransportStatus(transport::CastTransportStatus status) { - EXPECT_EQ(transport::TRANSPORT_VIDEO_INITIALIZED, status); + static void UpdateCastTransportStatus(CastTransportStatus status) { + EXPECT_EQ(TRANSPORT_VIDEO_INITIALIZED, status); } void InitEncoder(bool external) { VideoSenderConfig video_config; - video_config.rtp_config.ssrc = 1; + video_config.ssrc = 1; video_config.incoming_feedback_ssrc = 2; video_config.rtcp_c_name = "video_test@10.1.1.1"; - video_config.rtp_config.payload_type = 127; + video_config.rtp_payload_type = 127; video_config.use_external_encoder = external; video_config.width = kWidth; video_config.height = kHeight; @@ -170,7 +170,7 @@ class VideoSenderTest : public ::testing::Test { video_config.min_qp = 0; video_config.max_frame_rate = 30; video_config.max_number_of_video_buffers_used = 1; - video_config.codec = transport::kVp8; + video_config.codec = CODEC_VIDEO_VP8; if (external) { scoped_ptr<VideoEncodeAccelerator> fake_vea( @@ -218,7 +218,7 @@ class VideoSenderTest : public ::testing::Test { base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. TestPacketSender transport_; - scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; + scoped_ptr<CastTransportSenderImpl> transport_sender_; scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_ptr<PeerVideoSender> video_sender_; scoped_refptr<CastEnvironment> cast_environment_; diff --git a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc b/media/cast/sender/vp8_encoder.cc index c7374babd1..b43b5c881e 100644 --- a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc +++ b/media/cast/sender/vp8_encoder.cc @@ -1,17 +1,15 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. -// -// TODO (pwestin): add a link to the design document describing the generic -// protocol and the VP8 specific details. -#include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" + +#include "media/cast/sender/vp8_encoder.h" #include <vector> #include "base/logging.h" #include "media/base/video_frame.h" #include "media/cast/cast_defines.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" #include "third_party/libvpx/source/libvpx/vpx/vp8cx.h" namespace media { @@ -135,7 +133,7 @@ void Vp8Encoder::InitEncode(int number_of_encode_threads) { } bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, - transport::EncodedFrame* encoded_image) { + EncodedFrame* encoded_image) { DCHECK(thread_checker_.CalledOnValidThread()); // Image in vpx_image_t format. // Input image is const. VP8's raw image is not defined as const. @@ -216,10 +214,10 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, // Populate the encoded frame. encoded_image->frame_id = ++last_encoded_frame_id_; if (is_key_frame) { - encoded_image->dependency = transport::EncodedFrame::KEY; + encoded_image->dependency = EncodedFrame::KEY; encoded_image->referenced_frame_id = encoded_image->frame_id; } else { - encoded_image->dependency = transport::EncodedFrame::DEPENDENT; + encoded_image->dependency = EncodedFrame::DEPENDENT; encoded_image->referenced_frame_id = latest_frame_id_to_reference; } diff --git a/media/cast/video_sender/codecs/vp8/vp8_encoder.h b/media/cast/sender/vp8_encoder.h index 2421cf1511..0437dbc2f5 100644 --- a/media/cast/video_sender/codecs/vp8/vp8_encoder.h +++ b/media/cast/sender/vp8_encoder.h @@ -1,16 +1,16 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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 MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ -#define MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ +#ifndef MEDIA_CAST_SENDER_CODECS_VP8_VP8_ENCODER_H_ +#define MEDIA_CAST_SENDER_CODECS_VP8_VP8_ENCODER_H_ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "media/cast/cast_config.h" -#include "media/cast/video_sender/software_video_encoder.h" +#include "media/cast/sender/software_video_encoder.h" #include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h" namespace media { @@ -37,7 +37,7 @@ class Vp8Encoder : public SoftwareVideoEncoder { // Encode a raw image (as a part of a video stream). virtual bool Encode(const scoped_refptr<media::VideoFrame>& video_frame, - transport::EncodedFrame* encoded_image) OVERRIDE; + EncodedFrame* encoded_image) OVERRIDE; // Update the encoder with a new target bit rate. virtual void UpdateRates(uint32 new_bitrate) OVERRIDE; @@ -100,4 +100,4 @@ class Vp8Encoder : public SoftwareVideoEncoder { } // namespace cast } // namespace media -#endif // MEDIA_CAST_VIDEO_SENDER_CODECS_VP8_VP8_ENCODER_H_ +#endif // MEDIA_CAST_SENDER_CODECS_VP8_VP8_ENCODER_H_ diff --git a/media/cast/test/cast_benchmarks.cc b/media/cast/test/cast_benchmarks.cc index 66257626bd..a2483facff 100644 --- a/media/cast/test/cast_benchmarks.cc +++ b/media/cast/test/cast_benchmarks.cc @@ -45,7 +45,12 @@ #include "media/cast/cast_receiver.h" #include "media/cast/cast_sender.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/cast_transport_sender_impl.h" #include "media/cast/test/fake_single_thread_task_runner.h" +#include "media/cast/test/loopback_transport.h" #include "media/cast/test/skewed_single_thread_task_runner.h" #include "media/cast/test/skewed_tick_clock.h" #include "media/cast/test/utility/audio_utility.h" @@ -53,10 +58,6 @@ #include "media/cast/test/utility/test_util.h" #include "media/cast/test/utility/udp_proxy.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/cast_transport_sender_impl.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -68,15 +69,15 @@ static const int64 kStartMillisecond = INT64_C(1245); static const int kAudioChannels = 2; static const int kVideoHdWidth = 1280; static const int kVideoHdHeight = 720; -static const int kTargetDelay = 300; +static const int kTargetPlayoutDelayMs = 300; // The tests are commonly implemented with |kFrameTimerMs| RunTask function; // a normal video is 30 fps hence the 33 ms between frames. static const int kFrameTimerMs = 33; -void UpdateCastTransportStatus(transport::CastTransportStatus status) { - bool result = (status == transport::TRANSPORT_AUDIO_INITIALIZED || - status == transport::TRANSPORT_VIDEO_INITIALIZED); +void UpdateCastTransportStatus(CastTransportStatus status) { + bool result = (status == TRANSPORT_AUDIO_INITIALIZED || + status == TRANSPORT_VIDEO_INITIALIZED); EXPECT_TRUE(result); } @@ -93,68 +94,9 @@ void IgnoreRawEvents(const std::vector<PacketEvent>& packet_events) { } // namespace -// Shim that turns forwards packets from a test::PacketPipe to a -// PacketReceiverCallback. -class LoopBackPacketPipe : public test::PacketPipe { - public: - LoopBackPacketPipe(const transport::PacketReceiverCallback& packet_receiver) - : packet_receiver_(packet_receiver) {} - - virtual ~LoopBackPacketPipe() {} - - // PacketPipe implementations. - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { - packet_receiver_.Run(packet.Pass()); - } - - private: - transport::PacketReceiverCallback packet_receiver_; -}; - -// Class that sends the packet direct from sender into the receiver with the -// ability to drop packets between the two. -// TODO(hubbe): Break this out and share code with end2end_unittest.cc -class LoopBackTransport : public transport::PacketSender { - public: - explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) - : cast_environment_(cast_environment) {} - - void SetPacketReceiver( - const transport::PacketReceiverCallback& packet_receiver, - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, - base::TickClock* clock) { - scoped_ptr<test::PacketPipe> loopback_pipe( - new LoopBackPacketPipe(packet_receiver)); - if (packet_pipe_) { - packet_pipe_->AppendToPipe(loopback_pipe.Pass()); - } else { - packet_pipe_ = loopback_pipe.Pass(); - } - packet_pipe_->InitOnIOThread(task_runner, clock); - } - - virtual bool SendPacket(transport::PacketRef packet, - const base::Closure& cb) OVERRIDE { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - scoped_ptr<Packet> packet_copy(new Packet(packet->data)); - packet_pipe_->Send(packet_copy.Pass()); - return true; - } - - void SetPacketPipe(scoped_ptr<test::PacketPipe> pipe) { - // Append the loopback pipe to the end. - pipe->AppendToPipe(packet_pipe_.Pass()); - packet_pipe_ = pipe.Pass(); - } - - private: - scoped_refptr<CastEnvironment> cast_environment_; - scoped_ptr<test::PacketPipe> packet_pipe_; -}; - // Wraps a CastTransportSender and records some statistics about // the data that goes through it. -class CastTransportSenderWrapper : public transport::CastTransportSender { +class CastTransportSenderWrapper : public CastTransportSender { public: // Takes ownership of |transport|. void Init(CastTransportSender* transport, @@ -166,28 +108,28 @@ class CastTransportSenderWrapper : public transport::CastTransportSender { } virtual void InitializeAudio( - const transport::CastTransportAudioConfig& config) OVERRIDE { + const CastTransportRtpConfig& config) OVERRIDE { transport_->InitializeAudio(config); } virtual void InitializeVideo( - const transport::CastTransportVideoConfig& config) OVERRIDE { + const CastTransportRtpConfig& config) OVERRIDE { transport_->InitializeVideo(config); } virtual void SetPacketReceiver( - const transport::PacketReceiverCallback& packet_receiver) OVERRIDE { + const PacketReceiverCallback& packet_receiver) OVERRIDE { transport_->SetPacketReceiver(packet_receiver); } virtual void InsertCodedAudioFrame( - const transport::EncodedFrame& audio_frame) OVERRIDE { + const EncodedFrame& audio_frame) OVERRIDE { *encoded_audio_bytes_ += audio_frame.data.size(); transport_->InsertCodedAudioFrame(audio_frame); } virtual void InsertCodedVideoFrame( - const transport::EncodedFrame& video_frame) OVERRIDE { + const EncodedFrame& video_frame) OVERRIDE { *encoded_video_bytes_ += video_frame.data.size(); transport_->InsertCodedVideoFrame(video_frame); } @@ -196,7 +138,7 @@ class CastTransportSenderWrapper : public transport::CastTransportSender { uint32 ntp_seconds, uint32 ntp_fraction, uint32 rtp_timestamp, - const transport::RtcpDlrrReportBlock& dlrr, + const RtcpDlrrReportBlock& dlrr, uint32 sending_ssrc, const std::string& c_name) OVERRIDE { transport_->SendRtcpFromRtpSender(packet_type_flags, @@ -219,7 +161,7 @@ class CastTransportSenderWrapper : public transport::CastTransportSender { } private: - scoped_ptr<transport::CastTransportSender> transport_; + scoped_ptr<CastTransportSender> transport_; uint64* encoded_video_bytes_; uint64* encoded_audio_bytes_; }; @@ -278,34 +220,37 @@ class RunOneBenchmark { base::TimeDelta::FromMilliseconds(kStartMillisecond)); } - void Configure(transport::VideoCodec video_codec, - transport::AudioCodec audio_codec, + void Configure(Codec video_codec, + Codec audio_codec, int audio_sampling_frequency, int max_number_of_video_buffers_used) { - audio_sender_config_.rtp_config.ssrc = 1; + audio_sender_config_.ssrc = 1; audio_sender_config_.incoming_feedback_ssrc = 2; - audio_sender_config_.rtp_config.payload_type = 96; + audio_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); + audio_sender_config_.rtp_payload_type = 96; audio_sender_config_.use_external_encoder = false; audio_sender_config_.frequency = audio_sampling_frequency; audio_sender_config_.channels = kAudioChannels; audio_sender_config_.bitrate = kDefaultAudioEncoderBitrate; audio_sender_config_.codec = audio_codec; - audio_sender_config_.rtp_config.max_delay_ms = kTargetDelay; audio_receiver_config_.feedback_ssrc = audio_sender_config_.incoming_feedback_ssrc; - audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc; + audio_receiver_config_.incoming_ssrc = audio_sender_config_.ssrc; audio_receiver_config_.rtp_payload_type = - audio_sender_config_.rtp_config.payload_type; + audio_sender_config_.rtp_payload_type; audio_receiver_config_.frequency = audio_sender_config_.frequency; audio_receiver_config_.channels = kAudioChannels; audio_receiver_config_.max_frame_rate = 100; - audio_receiver_config_.codec.audio = audio_sender_config_.codec; - audio_receiver_config_.rtp_max_delay_ms = kTargetDelay; + audio_receiver_config_.codec = audio_sender_config_.codec; + audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; - video_sender_config_.rtp_config.ssrc = 3; + video_sender_config_.ssrc = 3; video_sender_config_.incoming_feedback_ssrc = 4; - video_sender_config_.rtp_config.payload_type = 97; + video_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); + video_sender_config_.rtp_payload_type = 97; video_sender_config_.use_external_encoder = false; video_sender_config_.width = kVideoHdWidth; video_sender_config_.height = kVideoHdHeight; @@ -324,18 +269,17 @@ class RunOneBenchmark { video_sender_config_.max_number_of_video_buffers_used = max_number_of_video_buffers_used; video_sender_config_.codec = video_codec; - video_sender_config_.rtp_config.max_delay_ms = kTargetDelay; video_receiver_config_.feedback_ssrc = video_sender_config_.incoming_feedback_ssrc; - video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; + video_receiver_config_.incoming_ssrc = video_sender_config_.ssrc; video_receiver_config_.rtp_payload_type = - video_sender_config_.rtp_config.payload_type; - video_receiver_config_.codec.video = video_sender_config_.codec; + video_sender_config_.rtp_payload_type; + video_receiver_config_.codec = video_sender_config_.codec; video_receiver_config_.frequency = kVideoFrequency; video_receiver_config_.channels = 1; video_receiver_config_.max_frame_rate = 100; - video_receiver_config_.rtp_max_delay_ms = kTargetDelay; + video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; } void SetSenderClockSkew(double skew, base::TimeDelta offset) { @@ -348,13 +292,13 @@ class RunOneBenchmark { task_runner_receiver_->SetSkew(1.0 / skew); } - void Create() { + void Create(const MeasuringPoint& p) { cast_receiver_ = CastReceiver::Create(cast_environment_receiver_, audio_receiver_config_, video_receiver_config_, &receiver_to_sender_); net::IPEndPoint dummy_endpoint; - transport_sender_.Init(new transport::CastTransportSenderImpl( + transport_sender_.Init(new CastTransportSenderImpl( NULL, testing_clock_sender_, dummy_endpoint, @@ -377,10 +321,12 @@ class RunOneBenchmark { CreateDefaultVideoEncodeAcceleratorCallback(), CreateDefaultVideoEncodeMemoryCallback()); - receiver_to_sender_.SetPacketReceiver( - cast_sender_->packet_receiver(), task_runner_, &testing_clock_); - sender_to_receiver_.SetPacketReceiver( - cast_receiver_->packet_receiver(), task_runner_, &testing_clock_); + receiver_to_sender_.Initialize( + CreateSimplePipe(p).Pass(), cast_sender_->packet_receiver(), + task_runner_, &testing_clock_); + sender_to_receiver_.Initialize( + CreateSimplePipe(p).Pass(), cast_receiver_->packet_receiver(), + task_runner_, &testing_clock_); } virtual ~RunOneBenchmark() { @@ -436,10 +382,9 @@ class RunOneBenchmark { void Run(const MeasuringPoint& p) { available_bitrate_ = p.bitrate; - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); - receiver_to_sender_.SetPacketPipe(CreateSimplePipe(p).Pass()); - sender_to_receiver_.SetPacketPipe(CreateSimplePipe(p).Pass()); - Create(); + Configure( + CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, 1); + Create(p); StartBasicPlayer(); for (int frame = 0; frame < 1000; frame++) { diff --git a/media/cast/test/end2end_unittest.cc b/media/cast/test/end2end_unittest.cc index 4a0d820214..a1d4a3ab34 100644 --- a/media/cast/test/end2end_unittest.cc +++ b/media/cast/test/end2end_unittest.cc @@ -29,6 +29,10 @@ #include "media/cast/cast_receiver.h" #include "media/cast/cast_sender.h" #include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/cast_transport_sender_impl.h" #include "media/cast/test/fake_single_thread_task_runner.h" #include "media/cast/test/skewed_single_thread_task_runner.h" #include "media/cast/test/skewed_tick_clock.h" @@ -36,10 +40,6 @@ #include "media/cast/test/utility/default_config.h" #include "media/cast/test/utility/udp_proxy.h" #include "media/cast/test/utility/video_utility.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/cast_transport_sender_impl.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { @@ -97,9 +97,9 @@ std::string ConvertFromBase16String(const std::string base_16) { return compressed; } -void UpdateCastTransportStatus(transport::CastTransportStatus status) { - bool result = (status == transport::TRANSPORT_AUDIO_INITIALIZED || - status == transport::TRANSPORT_VIDEO_INITIALIZED); +void UpdateCastTransportStatus(CastTransportStatus status) { + bool result = (status == TRANSPORT_AUDIO_INITIALIZED || + status == TRANSPORT_VIDEO_INITIALIZED); EXPECT_TRUE(result); } @@ -168,23 +168,23 @@ std::map<uint16, LoggingEventCounts> GetEventCountForPacketEvents( // PacketReceiverCallback. class LoopBackPacketPipe : public test::PacketPipe { public: - LoopBackPacketPipe(const transport::PacketReceiverCallback& packet_receiver) + LoopBackPacketPipe(const PacketReceiverCallback& packet_receiver) : packet_receiver_(packet_receiver) {} virtual ~LoopBackPacketPipe() {} // PacketPipe implementations. - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { packet_receiver_.Run(packet.Pass()); } private: - transport::PacketReceiverCallback packet_receiver_; + PacketReceiverCallback packet_receiver_; }; // Class that sends the packet direct from sender into the receiver with the // ability to drop packets between the two. -class LoopBackTransport : public transport::PacketSender { +class LoopBackTransport : public PacketSender { public: explicit LoopBackTransport(scoped_refptr<CastEnvironment> cast_environment) : send_packets_(true), @@ -192,7 +192,7 @@ class LoopBackTransport : public transport::PacketSender { cast_environment_(cast_environment) {} void SetPacketReceiver( - const transport::PacketReceiverCallback& packet_receiver, + const PacketReceiverCallback& packet_receiver, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, base::TickClock* clock) { scoped_ptr<test::PacketPipe> loopback_pipe( @@ -205,7 +205,7 @@ class LoopBackTransport : public transport::PacketSender { packet_pipe_->InitOnIOThread(task_runner, clock); } - virtual bool SendPacket(transport::PacketRef packet, + virtual bool SendPacket(PacketRef packet, const base::Closure& cb) OVERRIDE { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); if (!send_packets_) @@ -307,7 +307,7 @@ class TestReceiverAudioCallback EXPECT_TRUE(is_continuous); } - void CheckCodedAudioFrame(scoped_ptr<transport::EncodedFrame> audio_frame) { + void CheckCodedAudioFrame(scoped_ptr<EncodedFrame> audio_frame) { ASSERT_TRUE(!!audio_frame); ASSERT_FALSE(expected_frames_.empty()); const ExpectedAudioFrame& expected_audio_frame = @@ -458,14 +458,15 @@ class End2EndTest : public ::testing::Test { &event_subscriber_sender_); } - void Configure(transport::VideoCodec video_codec, - transport::AudioCodec audio_codec, + void Configure(Codec video_codec, + Codec audio_codec, int audio_sampling_frequency, int max_number_of_video_buffers_used) { - audio_sender_config_.rtp_config.ssrc = 1; - audio_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; + audio_sender_config_.ssrc = 1; audio_sender_config_.incoming_feedback_ssrc = 2; - audio_sender_config_.rtp_config.payload_type = 96; + audio_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); + audio_sender_config_.rtp_payload_type = 96; audio_sender_config_.use_external_encoder = false; audio_sender_config_.frequency = audio_sampling_frequency; audio_sender_config_.channels = kAudioChannels; @@ -474,22 +475,23 @@ class End2EndTest : public ::testing::Test { audio_receiver_config_.feedback_ssrc = audio_sender_config_.incoming_feedback_ssrc; - audio_receiver_config_.incoming_ssrc = audio_sender_config_.rtp_config.ssrc; + audio_receiver_config_.incoming_ssrc = audio_sender_config_.ssrc; audio_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; audio_receiver_config_.rtp_payload_type = - audio_sender_config_.rtp_config.payload_type; + audio_sender_config_.rtp_payload_type; audio_receiver_config_.frequency = audio_sender_config_.frequency; audio_receiver_config_.channels = kAudioChannels; audio_receiver_config_.max_frame_rate = 100; - audio_receiver_config_.codec.audio = audio_sender_config_.codec; + audio_receiver_config_.codec = audio_sender_config_.codec; test_receiver_audio_callback_->SetExpectedSamplingFrequency( audio_receiver_config_.frequency); - video_sender_config_.rtp_config.ssrc = 3; - video_sender_config_.rtp_config.max_delay_ms = kTargetPlayoutDelayMs; + video_sender_config_.ssrc = 3; video_sender_config_.incoming_feedback_ssrc = 4; - video_sender_config_.rtp_config.payload_type = 97; + video_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetPlayoutDelayMs); + video_sender_config_.rtp_payload_type = 97; video_sender_config_.use_external_encoder = false; video_sender_config_.width = kVideoHdWidth; video_sender_config_.height = kVideoHdHeight; @@ -505,14 +507,14 @@ class End2EndTest : public ::testing::Test { video_receiver_config_.feedback_ssrc = video_sender_config_.incoming_feedback_ssrc; - video_receiver_config_.incoming_ssrc = video_sender_config_.rtp_config.ssrc; + video_receiver_config_.incoming_ssrc = video_sender_config_.ssrc; video_receiver_config_.rtp_max_delay_ms = kTargetPlayoutDelayMs; video_receiver_config_.rtp_payload_type = - video_sender_config_.rtp_config.payload_type; + video_sender_config_.rtp_payload_type; video_receiver_config_.frequency = kVideoFrequency; video_receiver_config_.channels = 1; video_receiver_config_.max_frame_rate = video_sender_config_.max_frame_rate; - video_receiver_config_.codec.video = video_sender_config_.codec; + video_receiver_config_.codec = video_sender_config_.codec; } void SetReceiverSkew(double skew, base::TimeDelta offset) { @@ -580,7 +582,7 @@ class End2EndTest : public ::testing::Test { &receiver_to_sender_); net::IPEndPoint dummy_endpoint; - transport_sender_.reset(new transport::CastTransportSenderImpl( + transport_sender_.reset(new CastTransportSenderImpl( NULL, testing_clock_sender_, dummy_endpoint, @@ -760,7 +762,7 @@ class End2EndTest : public ::testing::Test { LoopBackTransport receiver_to_sender_; LoopBackTransport sender_to_receiver_; - scoped_ptr<transport::CastTransportSenderImpl> transport_sender_; + scoped_ptr<CastTransportSenderImpl> transport_sender_; scoped_ptr<CastReceiver> cast_receiver_; scoped_ptr<CastSender> cast_sender_; @@ -782,7 +784,7 @@ class End2EndTest : public ::testing::Test { }; TEST_F(End2EndTest, LoopNoLossPcm16) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); // Reduce video resolution to allow processing multiple frames within a // reasonable time frame. video_sender_config_.width = kVideoQcifWidth; @@ -836,7 +838,7 @@ TEST_F(End2EndTest, LoopNoLossPcm16) { // This tests our external decoder interface for Audio. // Audio test without packet loss using raw PCM 16 audio "codec"; TEST_F(End2EndTest, LoopNoLossPcm16ExternalDecoder) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); Create(); const int kNumIterations = 10; @@ -854,7 +856,8 @@ TEST_F(End2EndTest, LoopNoLossPcm16ExternalDecoder) { // This tests our Opus audio codec without video. TEST_F(End2EndTest, LoopNoLossOpus) { - Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_OPUS, + kDefaultAudioSamplingRate, 1); Create(); const int kNumIterations = 300; @@ -880,7 +883,8 @@ TEST_F(End2EndTest, LoopNoLossOpus) { // in audio_receiver.cc for likely cause(s) of this bug. // http://crbug.com/356942 TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { - Configure(transport::kVp8, transport::kPcm16, kDefaultAudioSamplingRate, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, + kDefaultAudioSamplingRate, 1); Create(); int video_start = kVideoStart; @@ -968,8 +972,10 @@ TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { // This tests a network glitch lasting for 10 video frames. // Flaky. See crbug.com/351596. TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { - Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 3); - video_sender_config_.rtp_config.max_delay_ms = 67; + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_OPUS, + kDefaultAudioSamplingRate, 3); + video_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(67); video_receiver_config_.rtp_max_delay_ms = 67; Create(); @@ -1031,8 +1037,10 @@ TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { // Disabled due to flakiness and crashiness. http://crbug.com/360951 TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { - Configure(transport::kVp8, transport::kOpus, kDefaultAudioSamplingRate, 3); - video_sender_config_.rtp_config.max_delay_ms = 67; + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_OPUS, + kDefaultAudioSamplingRate, 3); + video_sender_config_.target_playout_delay = + base::TimeDelta::FromMilliseconds(67); video_receiver_config_.rtp_max_delay_ms = 67; Create(); sender_to_receiver_.DropAllPacketsBelongingToOddFrames(); @@ -1069,17 +1077,17 @@ TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { } TEST_F(End2EndTest, CryptoVideo) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); - video_sender_config_.rtp_config.aes_iv_mask = + video_sender_config_.aes_iv_mask = ConvertFromBase16String("1234567890abcdeffedcba0987654321"); - video_sender_config_.rtp_config.aes_key = + video_sender_config_.aes_key = ConvertFromBase16String("deadbeefcafeb0b0b0b0cafedeadbeef"); video_receiver_config_.aes_iv_mask = - video_sender_config_.rtp_config.aes_iv_mask; + video_sender_config_.aes_iv_mask; video_receiver_config_.aes_key = - video_sender_config_.rtp_config.aes_key; + video_sender_config_.aes_key; Create(); @@ -1107,17 +1115,17 @@ TEST_F(End2EndTest, CryptoVideo) { } TEST_F(End2EndTest, CryptoAudio) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); - audio_sender_config_.rtp_config.aes_iv_mask = + audio_sender_config_.aes_iv_mask = ConvertFromBase16String("abcdeffedcba12345678900987654321"); - audio_sender_config_.rtp_config.aes_key = + audio_sender_config_.aes_key = ConvertFromBase16String("deadbeefcafecafedeadbeefb0b0b0b0"); audio_receiver_config_.aes_iv_mask = - audio_sender_config_.rtp_config.aes_iv_mask; + audio_sender_config_.aes_iv_mask; audio_receiver_config_.aes_key = - audio_sender_config_.rtp_config.aes_key; + audio_sender_config_.aes_key; Create(); @@ -1136,7 +1144,7 @@ TEST_F(End2EndTest, CryptoAudio) { // Video test without packet loss - tests the logging aspects of the end2end, // but is basically equivalent to LoopNoLossPcm16. TEST_F(End2EndTest, VideoLogging) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); Create(); int video_start = kVideoStart; @@ -1260,7 +1268,7 @@ TEST_F(End2EndTest, VideoLogging) { // Audio test without packet loss - tests the logging aspects of the end2end, // but is basically equivalent to LoopNoLossPcm16. TEST_F(End2EndTest, AudioLogging) { - Configure(transport::kVp8, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_VP8, CODEC_AUDIO_PCM16, 32000, 1); Create(); int audio_diff = kFrameTimerMs; @@ -1341,7 +1349,8 @@ TEST_F(End2EndTest, AudioLogging) { } TEST_F(End2EndTest, BasicFakeSoftwareVideo) { - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, + 1); Create(); StartBasicPlayer(); SetReceiverSkew(1.0, base::TimeDelta::FromMilliseconds(1)); @@ -1362,7 +1371,8 @@ TEST_F(End2EndTest, BasicFakeSoftwareVideo) { } TEST_F(End2EndTest, ReceiverClockFast) { - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, + 1); Create(); StartBasicPlayer(); SetReceiverSkew(2.0, base::TimeDelta::FromMicroseconds(1234567)); @@ -1377,7 +1387,8 @@ TEST_F(End2EndTest, ReceiverClockFast) { } TEST_F(End2EndTest, ReceiverClockSlow) { - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, + 1); Create(); StartBasicPlayer(); SetReceiverSkew(0.5, base::TimeDelta::FromMicroseconds(-765432)); @@ -1392,7 +1403,8 @@ TEST_F(End2EndTest, ReceiverClockSlow) { } TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, + 1); Create(); StartBasicPlayer(); SetReceiverSkew(1.05, base::TimeDelta::FromMilliseconds(-42)); @@ -1413,7 +1425,8 @@ TEST_F(End2EndTest, SmoothPlayoutWithFivePercentClockRateSkew) { } TEST_F(End2EndTest, EvilNetwork) { - Configure(transport::kFakeSoftwareVideo, transport::kPcm16, 32000, 1); + Configure(CODEC_VIDEO_FAKE, CODEC_AUDIO_PCM16, 32000, + 1); receiver_to_sender_.SetPacketPipe(test::EvilNetwork().Pass()); sender_to_receiver_.SetPacketPipe(test::EvilNetwork().Pass()); Create(); diff --git a/media/cast/test/fake_media_source.cc b/media/cast/test/fake_media_source.cc new file mode 100644 index 0000000000..07baebe6e3 --- /dev/null +++ b/media/cast/test/fake_media_source.cc @@ -0,0 +1,594 @@ +// Copyright 2014 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. + +#include "media/cast/test/fake_media_source.h" + +#include "base/files/memory_mapped_file.h" +#include "base/files/scoped_file.h" +#include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "media/audio/audio_parameters.h" +#include "media/base/audio_buffer.h" +#include "media/base/audio_bus.h" +#include "media/base/audio_fifo.h" +#include "media/base/audio_timestamp_helper.h" +#include "media/base/media.h" +#include "media/base/multi_channel_resampler.h" +#include "media/base/video_frame.h" +#include "media/base/video_util.h" +#include "media/cast/cast_sender.h" +#include "media/cast/test/utility/audio_utility.h" +#include "media/cast/test/utility/video_utility.h" +#include "media/ffmpeg/ffmpeg_common.h" +#include "media/ffmpeg/ffmpeg_deleters.h" +#include "media/filters/audio_renderer_algorithm.h" +#include "media/filters/ffmpeg_demuxer.h" +#include "media/filters/ffmpeg_glue.h" +#include "media/filters/in_memory_url_protocol.h" +#include "ui/gfx/size.h" + +namespace { + +static const int kAudioChannels = 2; +static const int kAudioSamplingFrequency = 48000; +static const int kSoundFrequency = 1234; // Frequency of sinusoid wave. +static const float kSoundVolume = 0.5f; +static const int kAudioFrameMs = 10; // Each audio frame is exactly 10ms. +static const int kAudioPacketsPerSecond = 1000 / kAudioFrameMs; + +void AVFreeFrame(AVFrame* frame) { + av_frame_free(&frame); +} + +} // namespace + +namespace media { +namespace cast { + +FakeMediaSource::FakeMediaSource( + scoped_refptr<base::SingleThreadTaskRunner> task_runner, + base::TickClock* clock, + const VideoSenderConfig& video_config) + : task_runner_(task_runner), + video_config_(video_config), + synthetic_count_(0), + clock_(clock), + audio_frame_count_(0), + video_frame_count_(0), + weak_factory_(this), + av_format_context_(NULL), + audio_stream_index_(-1), + playback_rate_(1.0), + video_stream_index_(-1), + video_frame_rate_numerator_(video_config.max_frame_rate), + video_frame_rate_denominator_(1), + video_first_pts_(0), + video_first_pts_set_(false) { + audio_bus_factory_.reset(new TestAudioBusFactory(kAudioChannels, + kAudioSamplingFrequency, + kSoundFrequency, + kSoundVolume)); +} + +FakeMediaSource::~FakeMediaSource() { +} + +void FakeMediaSource::SetSourceFile(const base::FilePath& video_file, + int override_fps) { + DCHECK(!video_file.empty()); + + if (override_fps) { + video_config_.max_frame_rate = override_fps; + video_frame_rate_numerator_ = override_fps; + } + + LOG(INFO) << "Source: " << video_file.value(); + if (!file_data_.Initialize(video_file)) { + LOG(ERROR) << "Cannot load file."; + return; + } + protocol_.reset( + new InMemoryUrlProtocol(file_data_.data(), file_data_.length(), false)); + glue_.reset(new FFmpegGlue(protocol_.get())); + + if (!glue_->OpenContext()) { + LOG(ERROR) << "Cannot open file."; + return; + } + + // AVFormatContext is owned by the glue. + av_format_context_ = glue_->format_context(); + if (avformat_find_stream_info(av_format_context_, NULL) < 0) { + LOG(ERROR) << "Cannot find stream information."; + return; + } + + // Prepare FFmpeg decoders. + for (unsigned int i = 0; i < av_format_context_->nb_streams; ++i) { + AVStream* av_stream = av_format_context_->streams[i]; + AVCodecContext* av_codec_context = av_stream->codec; + AVCodec* av_codec = avcodec_find_decoder(av_codec_context->codec_id); + + if (!av_codec) { + LOG(ERROR) << "Cannot find decoder for the codec: " + << av_codec_context->codec_id; + continue; + } + + // Number of threads for decoding. + av_codec_context->thread_count = 2; + av_codec_context->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; + av_codec_context->request_sample_fmt = AV_SAMPLE_FMT_S16; + + if (avcodec_open2(av_codec_context, av_codec, NULL) < 0) { + LOG(ERROR) << "Cannot open AVCodecContext for the codec: " + << av_codec_context->codec_id; + return; + } + + if (av_codec->type == AVMEDIA_TYPE_AUDIO) { + if (av_codec_context->sample_fmt == AV_SAMPLE_FMT_S16P) { + LOG(ERROR) << "Audio format not supported."; + continue; + } + ChannelLayout layout = ChannelLayoutToChromeChannelLayout( + av_codec_context->channel_layout, + av_codec_context->channels); + if (layout == CHANNEL_LAYOUT_UNSUPPORTED) { + LOG(ERROR) << "Unsupported audio channels layout."; + continue; + } + if (audio_stream_index_ != -1) { + LOG(WARNING) << "Found multiple audio streams."; + } + audio_stream_index_ = static_cast<int>(i); + audio_params_.Reset( + AudioParameters::AUDIO_PCM_LINEAR, + layout, + av_codec_context->channels, + av_codec_context->channels, + av_codec_context->sample_rate, + 8 * av_get_bytes_per_sample(av_codec_context->sample_fmt), + av_codec_context->sample_rate / kAudioPacketsPerSecond); + LOG(INFO) << "Source file has audio."; + } else if (av_codec->type == AVMEDIA_TYPE_VIDEO) { + VideoFrame::Format format = + PixelFormatToVideoFormat(av_codec_context->pix_fmt); + if (format != VideoFrame::YV12) { + LOG(ERROR) << "Cannot handle non YV12 video format: " << format; + continue; + } + if (video_stream_index_ != -1) { + LOG(WARNING) << "Found multiple video streams."; + } + video_stream_index_ = static_cast<int>(i); + if (!override_fps) { + video_frame_rate_numerator_ = av_stream->r_frame_rate.num; + video_frame_rate_denominator_ = av_stream->r_frame_rate.den; + // Max frame rate is rounded up. + video_config_.max_frame_rate = + video_frame_rate_denominator_ + + video_frame_rate_numerator_ - 1; + video_config_.max_frame_rate /= video_frame_rate_denominator_; + } else { + // If video is played at a manual speed audio needs to match. + playback_rate_ = 1.0 * override_fps * + av_stream->r_frame_rate.den / av_stream->r_frame_rate.num; + } + LOG(INFO) << "Source file has video."; + } else { + LOG(ERROR) << "Unknown stream type; ignore."; + } + } + + Rewind(); +} + +void FakeMediaSource::Start(scoped_refptr<AudioFrameInput> audio_frame_input, + scoped_refptr<VideoFrameInput> video_frame_input) { + audio_frame_input_ = audio_frame_input; + video_frame_input_ = video_frame_input; + + LOG(INFO) << "Max Frame rate: " << video_config_.max_frame_rate; + LOG(INFO) << "Real Frame rate: " + << video_frame_rate_numerator_ << "/" + << video_frame_rate_denominator_ << " fps."; + LOG(INFO) << "Audio playback rate: " << playback_rate_; + + if (!is_transcoding_audio() && !is_transcoding_video()) { + // Send fake patterns. + task_runner_->PostTask( + FROM_HERE, + base::Bind( + &FakeMediaSource::SendNextFakeFrame, + base::Unretained(this))); + return; + } + + // Send transcoding streams. + audio_algo_.Initialize(playback_rate_, audio_params_); + audio_algo_.FlushBuffers(); + audio_fifo_input_bus_ = + AudioBus::Create( + audio_params_.channels(), audio_params_.frames_per_buffer()); + // Audio FIFO can carry all data fron AudioRendererAlgorithm. + audio_fifo_.reset( + new AudioFifo(audio_params_.channels(), + audio_algo_.QueueCapacity())); + audio_resampler_.reset(new media::MultiChannelResampler( + audio_params_.channels(), + static_cast<double>(audio_params_.sample_rate()) / + kAudioSamplingFrequency, + audio_params_.frames_per_buffer(), + base::Bind(&FakeMediaSource::ProvideData, base::Unretained(this)))); + task_runner_->PostTask( + FROM_HERE, + base::Bind( + &FakeMediaSource::SendNextFrame, + base::Unretained(this))); +} + +void FakeMediaSource::SendNextFakeFrame() { + gfx::Size size(video_config_.width, video_config_.height); + scoped_refptr<VideoFrame> video_frame = + VideoFrame::CreateBlackFrame(size); + PopulateVideoFrame(video_frame, synthetic_count_); + ++synthetic_count_; + + base::TimeTicks now = clock_->NowTicks(); + if (start_time_.is_null()) + start_time_ = now; + + base::TimeDelta video_time = VideoFrameTime(++video_frame_count_); + video_frame->set_timestamp(video_time); + video_frame_input_->InsertRawVideoFrame(video_frame, + start_time_ + video_time); + + // Send just enough audio data to match next video frame's time. + base::TimeDelta audio_time = AudioFrameTime(audio_frame_count_); + while (audio_time < video_time) { + if (is_transcoding_audio()) { + Decode(true); + CHECK(!audio_bus_queue_.empty()) << "No audio decoded."; + scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); + audio_bus_queue_.pop(); + audio_frame_input_->InsertAudio( + bus.Pass(), start_time_ + audio_time); + } else { + audio_frame_input_->InsertAudio( + audio_bus_factory_->NextAudioBus( + base::TimeDelta::FromMilliseconds(kAudioFrameMs)), + start_time_ + audio_time); + } + audio_time = AudioFrameTime(++audio_frame_count_); + } + + // This is the time since the stream started. + const base::TimeDelta elapsed_time = now - start_time_; + + // Handle the case when frame generation cannot keep up. + // Move the time ahead to match the next frame. + while (video_time < elapsed_time) { + LOG(WARNING) << "Skipping one frame."; + video_time = VideoFrameTime(++video_frame_count_); + } + + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&FakeMediaSource::SendNextFakeFrame, + weak_factory_.GetWeakPtr()), + video_time - elapsed_time); +} + +bool FakeMediaSource::SendNextTranscodedVideo(base::TimeDelta elapsed_time) { + if (!is_transcoding_video()) + return false; + + Decode(false); + if (video_frame_queue_.empty()) + return false; + + scoped_refptr<VideoFrame> decoded_frame = + video_frame_queue_.front(); + if (elapsed_time < decoded_frame->timestamp()) + return false; + + gfx::Size size(video_config_.width, video_config_.height); + scoped_refptr<VideoFrame> video_frame = + VideoFrame::CreateBlackFrame(size); + video_frame_queue_.pop(); + media::CopyPlane(VideoFrame::kYPlane, + decoded_frame->data(VideoFrame::kYPlane), + decoded_frame->stride(VideoFrame::kYPlane), + decoded_frame->rows(VideoFrame::kYPlane), + video_frame); + media::CopyPlane(VideoFrame::kUPlane, + decoded_frame->data(VideoFrame::kUPlane), + decoded_frame->stride(VideoFrame::kUPlane), + decoded_frame->rows(VideoFrame::kUPlane), + video_frame); + media::CopyPlane(VideoFrame::kVPlane, + decoded_frame->data(VideoFrame::kVPlane), + decoded_frame->stride(VideoFrame::kVPlane), + decoded_frame->rows(VideoFrame::kVPlane), + video_frame); + + base::TimeDelta video_time; + // Use the timestamp from the file if we're transcoding. + video_time = ScaleTimestamp(decoded_frame->timestamp()); + video_frame_input_->InsertRawVideoFrame( + video_frame, start_time_ + video_time); + + // Make sure queue is not empty. + Decode(false); + return true; +} + +bool FakeMediaSource::SendNextTranscodedAudio(base::TimeDelta elapsed_time) { + if (!is_transcoding_audio()) + return false; + + Decode(true); + if (audio_bus_queue_.empty()) + return false; + + base::TimeDelta audio_time = audio_sent_ts_->GetTimestamp(); + if (elapsed_time < audio_time) + return false; + scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); + audio_bus_queue_.pop(); + audio_sent_ts_->AddFrames(bus->frames()); + audio_frame_input_->InsertAudio( + bus.Pass(), start_time_ + audio_time); + + // Make sure queue is not empty. + Decode(true); + return true; +} + +void FakeMediaSource::SendNextFrame() { + if (start_time_.is_null()) + start_time_ = clock_->NowTicks(); + if (start_time_.is_null()) + start_time_ = clock_->NowTicks(); + + // Send as much as possible. Audio is sent according to + // system time. + while (SendNextTranscodedAudio(clock_->NowTicks() - start_time_)); + + // Video is sync'ed to audio. + while (SendNextTranscodedVideo(audio_sent_ts_->GetTimestamp())); + + if (audio_bus_queue_.empty() && video_frame_queue_.empty()) { + // Both queues are empty can only mean that we have reached + // the end of the stream. + LOG(INFO) << "Rewind."; + Rewind(); + start_time_ = base::TimeTicks(); + audio_sent_ts_.reset(); + video_first_pts_set_ = false; + } + + // Send next send. + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind( + &FakeMediaSource::SendNextFrame, + base::Unretained(this)), + base::TimeDelta::FromMilliseconds(kAudioFrameMs)); +} + +base::TimeDelta FakeMediaSource::VideoFrameTime(int frame_number) { + return frame_number * base::TimeDelta::FromSeconds(1) * + video_frame_rate_denominator_ / video_frame_rate_numerator_; +} + +base::TimeDelta FakeMediaSource::ScaleTimestamp(base::TimeDelta timestamp) { + return base::TimeDelta::FromMicroseconds( + timestamp.InMicroseconds() / playback_rate_); +} + +base::TimeDelta FakeMediaSource::AudioFrameTime(int frame_number) { + return frame_number * base::TimeDelta::FromMilliseconds(kAudioFrameMs); +} + +void FakeMediaSource::Rewind() { + CHECK(av_seek_frame(av_format_context_, -1, 0, AVSEEK_FLAG_BACKWARD) >= 0) + << "Failed to rewind to the beginning."; +} + +ScopedAVPacket FakeMediaSource::DemuxOnePacket(bool* audio) { + ScopedAVPacket packet(new AVPacket()); + if (av_read_frame(av_format_context_, packet.get()) < 0) { + LOG(ERROR) << "Failed to read one AVPacket."; + packet.reset(); + return packet.Pass(); + } + + int stream_index = static_cast<int>(packet->stream_index); + if (stream_index == audio_stream_index_) { + *audio = true; + } else if (stream_index == video_stream_index_) { + *audio = false; + } else { + // Ignore unknown packet. + LOG(INFO) << "Unknown packet."; + packet.reset(); + } + return packet.Pass(); +} + +void FakeMediaSource::DecodeAudio(ScopedAVPacket packet) { + // Audio. + AVFrame* avframe = av_frame_alloc(); + + // Make a shallow copy of packet so we can slide packet.data as frames are + // decoded from the packet; otherwise av_free_packet() will corrupt memory. + AVPacket packet_temp = *packet.get(); + + do { + int frame_decoded = 0; + int result = avcodec_decode_audio4( + av_audio_context(), avframe, &frame_decoded, &packet_temp); + CHECK(result >= 0) << "Failed to decode audio."; + packet_temp.size -= result; + packet_temp.data += result; + if (!frame_decoded) + continue; + + int frames_read = avframe->nb_samples; + if (frames_read < 0) + break; + + if (!audio_sent_ts_) { + // Initialize the base time to the first packet in the file. + // This is set to the frequency we send to the receiver. + // Not the frequency of the source file. This is because we + // increment the frame count by samples we sent. + audio_sent_ts_.reset( + new AudioTimestampHelper(kAudioSamplingFrequency)); + // For some files this is an invalid value. + base::TimeDelta base_ts; + audio_sent_ts_->SetBaseTimestamp(base_ts); + } + + scoped_refptr<AudioBuffer> buffer = + AudioBuffer::CopyFrom( + AVSampleFormatToSampleFormat( + av_audio_context()->sample_fmt), + ChannelLayoutToChromeChannelLayout( + av_audio_context()->channel_layout, + av_audio_context()->channels), + av_audio_context()->channels, + av_audio_context()->sample_rate, + frames_read, + &avframe->data[0], + // Note: Not all files have correct values for pkt_pts. + base::TimeDelta::FromMilliseconds(avframe->pkt_pts)); + audio_algo_.EnqueueBuffer(buffer); + av_frame_unref(avframe); + } while (packet_temp.size > 0); + av_frame_free(&avframe); + + const int frames_needed_to_scale = + playback_rate_ * av_audio_context()->sample_rate / + kAudioPacketsPerSecond; + while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { + if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), + audio_fifo_input_bus_->frames())) { + // Nothing can be scaled. Decode some more. + return; + } + + // Prevent overflow of audio data in the FIFO. + if (audio_fifo_input_bus_->frames() + audio_fifo_->frames() + <= audio_fifo_->max_frames()) { + audio_fifo_->Push(audio_fifo_input_bus_.get()); + } else { + LOG(WARNING) << "Audio FIFO full; dropping samples."; + } + + // Make sure there's enough data to resample audio. + if (audio_fifo_->frames() < + 2 * audio_params_.sample_rate() / kAudioPacketsPerSecond) { + continue; + } + + scoped_ptr<media::AudioBus> resampled_bus( + media::AudioBus::Create( + audio_params_.channels(), + kAudioSamplingFrequency / kAudioPacketsPerSecond)); + audio_resampler_->Resample(resampled_bus->frames(), + resampled_bus.get()); + audio_bus_queue_.push(resampled_bus.release()); + } +} + +void FakeMediaSource::DecodeVideo(ScopedAVPacket packet) { + // Video. + int got_picture; + AVFrame* avframe = av_frame_alloc(); + // Tell the decoder to reorder for us. + avframe->reordered_opaque = + av_video_context()->reordered_opaque = packet->pts; + CHECK(avcodec_decode_video2( + av_video_context(), avframe, &got_picture, packet.get()) >= 0) + << "Video decode error."; + if (!got_picture) { + av_frame_free(&avframe); + return; + } + gfx::Size size(av_video_context()->width, av_video_context()->height); + if (!video_first_pts_set_ || + avframe->reordered_opaque < video_first_pts_) { + video_first_pts_set_ = true; + video_first_pts_ = avframe->reordered_opaque; + } + int64 pts = avframe->reordered_opaque - video_first_pts_; + video_frame_queue_.push( + VideoFrame::WrapExternalYuvData( + media::VideoFrame::YV12, + size, + gfx::Rect(size), + size, + avframe->linesize[0], + avframe->linesize[1], + avframe->linesize[2], + avframe->data[0], + avframe->data[1], + avframe->data[2], + base::TimeDelta::FromMilliseconds(pts), + base::Bind(&AVFreeFrame, avframe))); +} + +void FakeMediaSource::Decode(bool decode_audio) { + // Read the stream until one video frame can be decoded. + while (true) { + if (decode_audio && !audio_bus_queue_.empty()) + return; + if (!decode_audio && !video_frame_queue_.empty()) + return; + + bool audio_packet = false; + ScopedAVPacket packet = DemuxOnePacket(&audio_packet); + if (!packet) { + LOG(INFO) << "End of stream."; + return; + } + + if (audio_packet) + DecodeAudio(packet.Pass()); + else + DecodeVideo(packet.Pass()); + } +} + +void FakeMediaSource::ProvideData(int frame_delay, + media::AudioBus* output_bus) { + if (audio_fifo_->frames() >= output_bus->frames()) { + audio_fifo_->Consume(output_bus, 0, output_bus->frames()); + } else { + LOG(WARNING) << "Not enough audio data for resampling."; + output_bus->Zero(); + } +} + +AVStream* FakeMediaSource::av_audio_stream() { + return av_format_context_->streams[audio_stream_index_]; +} + +AVStream* FakeMediaSource::av_video_stream() { + return av_format_context_->streams[video_stream_index_]; +} + +AVCodecContext* FakeMediaSource::av_audio_context() { + return av_audio_stream()->codec; +} + +AVCodecContext* FakeMediaSource::av_video_context() { + return av_video_stream()->codec; +} + +} // namespace cast +} // namespace media diff --git a/media/cast/test/fake_media_source.h b/media/cast/test/fake_media_source.h new file mode 100644 index 0000000000..b18d44ea2a --- /dev/null +++ b/media/cast/test/fake_media_source.h @@ -0,0 +1,152 @@ +// Copyright 2014 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. + +// A fake media source that generates video and audio frames to a cast +// sender. +// This class can transcode a WebM file using FFmpeg. It can also +// generate an animation and audio of fixed frequency. + +#ifndef MEDIA_CAST_TEST_FAKE_MEDIA_SOURCE_H_ +#define MEDIA_CAST_TEST_FAKE_MEDIA_SOURCE_H_ + +#include <queue> + +#include "base/files/file_path.h" +#include "base/files/memory_mapped_file.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "base/time/tick_clock.h" +#include "media/audio/audio_parameters.h" +#include "media/cast/cast_config.h" +#include "media/filters/audio_renderer_algorithm.h" +#include "media/filters/ffmpeg_demuxer.h" + +struct AVCodecContext; +struct AVFormatContext; + +namespace media { + +class AudioBus; +class AudioFifo; +class AudioTimestampHelper; +class FFmpegGlue; +class InMemoryUrlProtocol; +class MultiChannelResampler; + +namespace cast { + +class AudioFrameInput; +class VideoFrameInput; +class TestAudioBusFactory; + +class FakeMediaSource { + public: + // |task_runner| is to schedule decoding tasks. + // |clock| is used by this source but is not owned. + // |video_config| is the desired video config. + FakeMediaSource(scoped_refptr<base::SingleThreadTaskRunner> task_runner, + base::TickClock* clock, + const VideoSenderConfig& video_config); + ~FakeMediaSource(); + + // Transcode this file as the source of video and audio frames. + // If |override_fps| is non zero then the file is played at the desired rate. + void SetSourceFile(const base::FilePath& video_file, int override_fps); + + void Start(scoped_refptr<AudioFrameInput> audio_frame_input, + scoped_refptr<VideoFrameInput> video_frame_input); + + const VideoSenderConfig& get_video_config() const { return video_config_; } + + private: + bool is_transcoding_audio() const { return audio_stream_index_ >= 0; } + bool is_transcoding_video() const { return video_stream_index_ >= 0; } + + void SendNextFrame(); + void SendNextFakeFrame(); + + // Return true if a frame was sent. + bool SendNextTranscodedVideo(base::TimeDelta elapsed_time); + + // Return true if a frame was sent. + bool SendNextTranscodedAudio(base::TimeDelta elapsed_time); + + // Helper methods to compute timestamps for the frame number specified. + base::TimeDelta VideoFrameTime(int frame_number); + + base::TimeDelta ScaleTimestamp(base::TimeDelta timestamp); + + base::TimeDelta AudioFrameTime(int frame_number); + + // Go to the beginning of the stream. + void Rewind(); + + // Call FFmpeg to fetch one packet. + ScopedAVPacket DemuxOnePacket(bool* audio); + + void DecodeAudio(ScopedAVPacket packet); + void DecodeVideo(ScopedAVPacket packet); + void Decode(bool decode_audio); + + void ProvideData(int frame_delay, media::AudioBus* output_bus); + + AVStream* av_audio_stream(); + AVStream* av_video_stream(); + AVCodecContext* av_audio_context(); + AVCodecContext* av_video_context(); + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + VideoSenderConfig video_config_; + scoped_refptr<AudioFrameInput> audio_frame_input_; + scoped_refptr<VideoFrameInput> video_frame_input_; + uint8 synthetic_count_; + base::TickClock* const clock_; // Not owned by this class. + + // Time when the stream starts. + base::TimeTicks start_time_; + + // The following three members are used only for fake frames. + int audio_frame_count_; // Each audio frame is exactly 10ms. + int video_frame_count_; + scoped_ptr<TestAudioBusFactory> audio_bus_factory_; + + // NOTE: Weak pointers must be invalidated before all other member variables. + base::WeakPtrFactory<FakeMediaSource> weak_factory_; + + base::MemoryMappedFile file_data_; + scoped_ptr<InMemoryUrlProtocol> protocol_; + scoped_ptr<FFmpegGlue> glue_; + AVFormatContext* av_format_context_; + + int audio_stream_index_; + AudioParameters audio_params_; + double playback_rate_; + + int video_stream_index_; + int video_frame_rate_numerator_; + int video_frame_rate_denominator_; + + // These are used for audio resampling. + scoped_ptr<media::MultiChannelResampler> audio_resampler_; + scoped_ptr<media::AudioFifo> audio_fifo_; + scoped_ptr<media::AudioBus> audio_fifo_input_bus_; + media::AudioRendererAlgorithm audio_algo_; + + // Track the timestamp of audio sent to the receiver. + scoped_ptr<media::AudioTimestampHelper> audio_sent_ts_; + + std::queue<scoped_refptr<VideoFrame> > video_frame_queue_; + int64 video_first_pts_; + bool video_first_pts_set_; + + std::queue<AudioBus*> audio_bus_queue_; + + DISALLOW_COPY_AND_ASSIGN(FakeMediaSource); +}; + +} // namespace cast +} // namespace media + +#endif // MEDIA_CAST_TEST_FAKE_MEDIA_SOURCE_H_ diff --git a/media/cast/test/loopback_transport.cc b/media/cast/test/loopback_transport.cc new file mode 100644 index 0000000000..3b72a7ef5a --- /dev/null +++ b/media/cast/test/loopback_transport.cc @@ -0,0 +1,68 @@ +// Copyright 2014 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. + +#include "media/cast/test/loopback_transport.h" + +#include "base/single_thread_task_runner.h" +#include "base/time/tick_clock.h" +#include "media/cast/test/utility/udp_proxy.h" + +namespace media { +namespace cast { +namespace { + +// Shim that turns forwards packets from a test::PacketPipe to a +// PacketReceiverCallback. +class LoopBackPacketPipe : public test::PacketPipe { + public: + LoopBackPacketPipe( + const PacketReceiverCallback& packet_receiver) + : packet_receiver_(packet_receiver) {} + + virtual ~LoopBackPacketPipe() {} + + // PacketPipe implementations. + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { + packet_receiver_.Run(packet.Pass()); + } + + private: + PacketReceiverCallback packet_receiver_; + + DISALLOW_COPY_AND_ASSIGN(LoopBackPacketPipe); +}; + +} // namespace + +LoopBackTransport::LoopBackTransport( + scoped_refptr<CastEnvironment> cast_environment) + : cast_environment_(cast_environment) { +} + +LoopBackTransport::~LoopBackTransport() { +} + +bool LoopBackTransport::SendPacket(PacketRef packet, + const base::Closure& cb) { + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + scoped_ptr<Packet> packet_copy(new Packet(packet->data)); + packet_pipe_->Send(packet_copy.Pass()); + return true; +} + +void LoopBackTransport::Initialize( + scoped_ptr<test::PacketPipe> pipe, + const PacketReceiverCallback& packet_receiver, + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, + base::TickClock* clock) { + scoped_ptr<test::PacketPipe> loopback_pipe( + new LoopBackPacketPipe(packet_receiver)); + // Append the loopback pipe to the end. + pipe->AppendToPipe(loopback_pipe.Pass()); + packet_pipe_ = pipe.Pass(); + packet_pipe_->InitOnIOThread(task_runner, clock); +} + +} // namespace cast +} // namespace media diff --git a/media/cast/test/loopback_transport.h b/media/cast/test/loopback_transport.h new file mode 100644 index 0000000000..8942caa4b9 --- /dev/null +++ b/media/cast/test/loopback_transport.h @@ -0,0 +1,55 @@ +// Copyright 2014 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 MEDIA_CAST_TEST_LOOPBACK_TRANSPORT_H_ +#define MEDIA_CAST_TEST_LOOPBACK_TRANSPORT_H_ + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "media/cast/cast_environment.h" +#include "media/cast/net/cast_transport_config.h" + +namespace base { +class SingleThreadTaskRunner; +class TickClock; +} // namespace base + +namespace media { +namespace cast { + +namespace test { +class PacketPipe; +} // namespace test + +// Class that sends the packet to a receiver through a stack of PacketPipes. +class LoopBackTransport : public PacketSender { + public: + explicit LoopBackTransport( + scoped_refptr<CastEnvironment> cast_environment); + virtual ~LoopBackTransport(); + + virtual bool SendPacket(PacketRef packet, + const base::Closure& cb) OVERRIDE; + + // Initiailize this loopback transport. + // Establish a flow of packets from |pipe| to |packet_receiver|. + // The data flow looks like: + // SendPacket() -> |pipe| -> Fake loopback pipe -> |packet_receiver|. + void Initialize( + scoped_ptr<test::PacketPipe> pipe, + const PacketReceiverCallback& packet_receiver, + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, + base::TickClock* clock); + + private: + const scoped_refptr<CastEnvironment> cast_environment_; + scoped_ptr<test::PacketPipe> packet_pipe_; + + DISALLOW_COPY_AND_ASSIGN(LoopBackTransport); +}; + +} // namespace cast +} // namespace media + +#endif // MEDIA_CAST_TEST_LOOPBACK_TRANSPORT_H_ diff --git a/media/cast/test/proto/BUILD.gn b/media/cast/test/proto/BUILD.gn new file mode 100644 index 0000000000..7ac71d2e7f --- /dev/null +++ b/media/cast/test/proto/BUILD.gn @@ -0,0 +1,14 @@ +# Copyright 2014 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. + +import("//third_party/protobuf/proto_library.gni") + +# GYP version: media/cast/cast.gyp:cast_logging_proto +proto_library("cast_network_simulation_proto") { + visibility = ":proto" + sources = [ + "network_simulation_model.proto", + ] +} + diff --git a/media/cast/test/proto/network_simulation_model.proto b/media/cast/test/proto/network_simulation_model.proto new file mode 100644 index 0000000000..902712f7fa --- /dev/null +++ b/media/cast/test/proto/network_simulation_model.proto @@ -0,0 +1,27 @@ +// Copyright 2014 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. + +// Contains parameters for a network simulation model. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package media.cast.proto; + +message NetworkSimulationModel { + optional NetworkSimulationModelType type = 1; + optional IPPModel ipp = 2; +} + +enum NetworkSimulationModelType { + INTERRUPTED_POISSON_PROCESS = 1; +} + +message IPPModel { + optional double coef_burstiness = 1; + optional double coef_variance = 2; + repeated double average_rate = 3; +} + diff --git a/media/cast/test/receiver.cc b/media/cast/test/receiver.cc index 9861d3834e..e87055420f 100644 --- a/media/cast/test/receiver.cc +++ b/media/cast/test/receiver.cc @@ -33,13 +33,13 @@ #include "media/cast/cast_environment.h" #include "media/cast/cast_receiver.h" #include "media/cast/logging/logging_defines.h" +#include "media/cast/net/udp_transport.h" #include "media/cast/test/utility/audio_utility.h" #include "media/cast/test/utility/barcode.h" #include "media/cast/test/utility/default_config.h" #include "media/cast/test/utility/in_process_receiver.h" #include "media/cast/test/utility/input_builder.h" #include "media/cast/test/utility/standalone_cast_environment.h" -#include "media/cast/transport/transport/udp_transport.h" #include "net/base/net_util.h" #if defined(OS_LINUX) diff --git a/media/cast/test/sender.cc b/media/cast/test/sender.cc index e457e2c9fe..6f9074f17e 100644 --- a/media/cast/test/sender.cc +++ b/media/cast/test/sender.cc @@ -10,10 +10,7 @@ #include "base/at_exit.h" #include "base/base_paths.h" #include "base/command_line.h" -#include "base/file_util.h" #include "base/files/file_path.h" -#include "base/files/memory_mapped_file.h" -#include "base/files/scoped_file.h" #include "base/json/json_writer.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" @@ -22,15 +19,8 @@ #include "base/threading/thread.h" #include "base/time/default_tick_clock.h" #include "base/values.h" -#include "media/audio/audio_parameters.h" -#include "media/base/audio_buffer.h" -#include "media/base/audio_bus.h" -#include "media/base/audio_fifo.h" -#include "media/base/audio_timestamp_helper.h" #include "media/base/media.h" -#include "media/base/multi_channel_resampler.h" #include "media/base/video_frame.h" -#include "media/base/video_util.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" #include "media/cast/cast_sender.h" @@ -40,28 +30,16 @@ #include "media/cast/logging/proto/raw_events.pb.h" #include "media/cast/logging/receiver_time_offset_estimator_impl.h" #include "media/cast/logging/stats_event_subscriber.h" -#include "media/cast/test/utility/audio_utility.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/udp_transport.h" +#include "media/cast/test/fake_media_source.h" #include "media/cast/test/utility/default_config.h" #include "media/cast/test/utility/input_builder.h" -#include "media/cast/test/utility/video_utility.h" -#include "media/cast/transport/cast_transport_defines.h" -#include "media/cast/transport/cast_transport_sender.h" -#include "media/cast/transport/transport/udp_transport.h" -#include "media/ffmpeg/ffmpeg_common.h" -#include "media/ffmpeg/ffmpeg_deleters.h" -#include "media/filters/audio_renderer_algorithm.h" -#include "media/filters/ffmpeg_demuxer.h" -#include "media/filters/ffmpeg_glue.h" -#include "media/filters/in_memory_url_protocol.h" -#include "ui/gfx/size.h" namespace { static const int kAudioChannels = 2; static const int kAudioSamplingFrequency = 48000; -static const int kSoundFrequency = 1234; // Frequency of sinusoid wave. -static const float kSoundVolume = 0.5f; -static const int kAudioFrameMs = 10; // Each audio frame is exactly 10ms. -static const int kAudioPacketsPerSecond = 1000 / kAudioFrameMs; // The max allowed size of serialized log. const int kMaxSerializedLogBytes = 10 * 1000 * 1000; @@ -79,36 +57,32 @@ const int kMaxSerializedLogBytes = 10 * 1000 * 1000; // // --fps=xx // Override framerate of the video stream. - const char kSwitchAddress[] = "address"; const char kSwitchPort[] = "port"; const char kSwitchSourceFile[] = "source-file"; const char kSwitchFps[] = "fps"; -} // namespace - -namespace media { -namespace cast { - -AudioSenderConfig GetAudioSenderConfig() { - AudioSenderConfig audio_config; +media::cast::AudioSenderConfig GetAudioSenderConfig() { + media::cast::AudioSenderConfig audio_config; audio_config.rtcp_c_name = "audio_sender@a.b.c.d"; audio_config.use_external_encoder = false; audio_config.frequency = kAudioSamplingFrequency; audio_config.channels = kAudioChannels; - audio_config.bitrate = 64000; - audio_config.codec = transport::kOpus; - audio_config.rtp_config.ssrc = 1; + audio_config.bitrate = 0; // Use Opus auto-VBR mode. + audio_config.codec = media::cast::CODEC_AUDIO_OPUS; + audio_config.ssrc = 1; audio_config.incoming_feedback_ssrc = 2; - audio_config.rtp_config.payload_type = 127; - audio_config.rtp_config.max_delay_ms = 300; + audio_config.rtp_payload_type = 127; + // TODO(miu): The default in cast_defines.h is 100. Should this be 100, and + // should receiver.cc's config also be 100? + audio_config.target_playout_delay = base::TimeDelta::FromMilliseconds(300); return audio_config; } -VideoSenderConfig GetVideoSenderConfig() { - VideoSenderConfig video_config; +media::cast::VideoSenderConfig GetVideoSenderConfig() { + media::cast::VideoSenderConfig video_config; video_config.rtcp_c_name = "video_sender@a.b.c.d"; video_config.use_external_encoder = false; @@ -124,7 +98,7 @@ VideoSenderConfig GetVideoSenderConfig() { video_config.start_bitrate = video_config.min_bitrate; // Codec. - video_config.codec = transport::kVp8; + video_config.codec = media::cast::CODEC_VIDEO_VP8; video_config.max_number_of_video_buffers_used = 1; video_config.number_of_encode_threads = 2; @@ -133,620 +107,17 @@ VideoSenderConfig GetVideoSenderConfig() { video_config.max_qp = 40; // SSRCs and payload type. Don't change them. - video_config.rtp_config.ssrc = 11; + video_config.ssrc = 11; video_config.incoming_feedback_ssrc = 12; - video_config.rtp_config.payload_type = 96; - video_config.rtp_config.max_delay_ms = 300; + video_config.rtp_payload_type = 96; + // TODO(miu): The default in cast_defines.h is 100. Should this be 100, and + // should receiver.cc's config also be 100? + video_config.target_playout_delay = base::TimeDelta::FromMilliseconds(300); return video_config; } -void AVFreeFrame(AVFrame* frame) { av_frame_free(&frame); } - -class SendProcess { - public: - SendProcess(scoped_refptr<base::SingleThreadTaskRunner> thread_proxy, - base::TickClock* clock, - const VideoSenderConfig& video_config) - : test_app_thread_proxy_(thread_proxy), - video_config_(video_config), - synthetic_count_(0), - clock_(clock), - audio_frame_count_(0), - video_frame_count_(0), - weak_factory_(this), - av_format_context_(NULL), - audio_stream_index_(-1), - playback_rate_(1.0), - video_stream_index_(-1), - video_frame_rate_numerator_(video_config.max_frame_rate), - video_frame_rate_denominator_(1), - video_first_pts_(0), - video_first_pts_set_(false) { - audio_bus_factory_.reset(new TestAudioBusFactory(kAudioChannels, - kAudioSamplingFrequency, - kSoundFrequency, - kSoundVolume)); - const CommandLine* cmd = CommandLine::ForCurrentProcess(); - int override_fps = 0; - if (base::StringToInt(cmd->GetSwitchValueASCII(kSwitchFps), - &override_fps)) { - video_config_.max_frame_rate = override_fps; - video_frame_rate_numerator_ = override_fps; - } - - // Load source file and prepare FFmpeg demuxer. - base::FilePath source_path = cmd->GetSwitchValuePath(kSwitchSourceFile); - if (source_path.empty()) - return; - - LOG(INFO) << "Source: " << source_path.value(); - if (!file_data_.Initialize(source_path)) { - LOG(ERROR) << "Cannot load file."; - return; - } - protocol_.reset( - new InMemoryUrlProtocol(file_data_.data(), file_data_.length(), false)); - glue_.reset(new FFmpegGlue(protocol_.get())); - - if (!glue_->OpenContext()) { - LOG(ERROR) << "Cannot open file."; - return; - } - - // AVFormatContext is owned by the glue. - av_format_context_ = glue_->format_context(); - if (avformat_find_stream_info(av_format_context_, NULL) < 0) { - LOG(ERROR) << "Cannot find stream information."; - return; - } - - // Prepare FFmpeg decoders. - for (unsigned int i = 0; i < av_format_context_->nb_streams; ++i) { - AVStream* av_stream = av_format_context_->streams[i]; - AVCodecContext* av_codec_context = av_stream->codec; - AVCodec* av_codec = avcodec_find_decoder(av_codec_context->codec_id); - - if (!av_codec) { - LOG(ERROR) << "Cannot find decoder for the codec: " - << av_codec_context->codec_id; - continue; - } - - // Number of threads for decoding. - av_codec_context->thread_count = 2; - av_codec_context->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK; - av_codec_context->request_sample_fmt = AV_SAMPLE_FMT_S16; - - if (avcodec_open2(av_codec_context, av_codec, NULL) < 0) { - LOG(ERROR) << "Cannot open AVCodecContext for the codec: " - << av_codec_context->codec_id; - return; - } - - if (av_codec->type == AVMEDIA_TYPE_AUDIO) { - if (av_codec_context->sample_fmt == AV_SAMPLE_FMT_S16P) { - LOG(ERROR) << "Audio format not supported."; - continue; - } - ChannelLayout layout = ChannelLayoutToChromeChannelLayout( - av_codec_context->channel_layout, - av_codec_context->channels); - if (layout == CHANNEL_LAYOUT_UNSUPPORTED) { - LOG(ERROR) << "Unsupported audio channels layout."; - continue; - } - if (audio_stream_index_ != -1) { - LOG(WARNING) << "Found multiple audio streams."; - } - audio_stream_index_ = static_cast<int>(i); - audio_params_.Reset( - AudioParameters::AUDIO_PCM_LINEAR, - layout, - av_codec_context->channels, - av_codec_context->channels, - av_codec_context->sample_rate, - 8 * av_get_bytes_per_sample(av_codec_context->sample_fmt), - av_codec_context->sample_rate / kAudioPacketsPerSecond); - LOG(INFO) << "Source file has audio."; - } else if (av_codec->type == AVMEDIA_TYPE_VIDEO) { - VideoFrame::Format format = - PixelFormatToVideoFormat(av_codec_context->pix_fmt); - if (format != VideoFrame::YV12) { - LOG(ERROR) << "Cannot handle non YV12 video format: " << format; - continue; - } - if (video_stream_index_ != -1) { - LOG(WARNING) << "Found multiple video streams."; - } - video_stream_index_ = static_cast<int>(i); - if (!override_fps) { - video_frame_rate_numerator_ = av_stream->r_frame_rate.num; - video_frame_rate_denominator_ = av_stream->r_frame_rate.den; - // Max frame rate is rounded up. - video_config_.max_frame_rate = - video_frame_rate_denominator_ + - video_frame_rate_numerator_ - 1; - video_config_.max_frame_rate /= video_frame_rate_denominator_; - } else { - // If video is played at a manual speed audio needs to match. - playback_rate_ = 1.0 * override_fps * - av_stream->r_frame_rate.den / av_stream->r_frame_rate.num; - } - LOG(INFO) << "Source file has video."; - } else { - LOG(ERROR) << "Unknown stream type; ignore."; - } - } - - Rewind(); - } - - ~SendProcess() { - } - - void Start(scoped_refptr<AudioFrameInput> audio_frame_input, - scoped_refptr<VideoFrameInput> video_frame_input) { - audio_frame_input_ = audio_frame_input; - video_frame_input_ = video_frame_input; - - LOG(INFO) << "Max Frame rate: " << video_config_.max_frame_rate; - LOG(INFO) << "Real Frame rate: " - << video_frame_rate_numerator_ << "/" - << video_frame_rate_denominator_ << " fps."; - LOG(INFO) << "Audio playback rate: " << playback_rate_; - - if (!is_transcoding_audio() && !is_transcoding_video()) { - // Send fake patterns. - test_app_thread_proxy_->PostTask( - FROM_HERE, - base::Bind( - &SendProcess::SendNextFakeFrame, - base::Unretained(this))); - return; - } - - // Send transcoding streams. - audio_algo_.Initialize(playback_rate_, audio_params_); - audio_algo_.FlushBuffers(); - audio_fifo_input_bus_ = - AudioBus::Create( - audio_params_.channels(), audio_params_.frames_per_buffer()); - // Audio FIFO can carry all data fron AudioRendererAlgorithm. - audio_fifo_.reset( - new AudioFifo(audio_params_.channels(), - audio_algo_.QueueCapacity())); - audio_resampler_.reset(new media::MultiChannelResampler( - audio_params_.channels(), - static_cast<double>(audio_params_.sample_rate()) / - kAudioSamplingFrequency, - audio_params_.frames_per_buffer(), - base::Bind(&SendProcess::ProvideData, base::Unretained(this)))); - test_app_thread_proxy_->PostTask( - FROM_HERE, - base::Bind( - &SendProcess::SendNextFrame, - base::Unretained(this))); - } - - void SendNextFakeFrame() { - gfx::Size size(video_config_.width, video_config_.height); - scoped_refptr<VideoFrame> video_frame = - VideoFrame::CreateBlackFrame(size); - PopulateVideoFrame(video_frame, synthetic_count_); - ++synthetic_count_; - - base::TimeTicks now = clock_->NowTicks(); - if (start_time_.is_null()) - start_time_ = now; - - base::TimeDelta video_time = VideoFrameTime(video_frame_count_); - video_frame->set_timestamp(video_time); - video_frame_input_->InsertRawVideoFrame(video_frame, - start_time_ + video_time); - - // Send just enough audio data to match next video frame's time. - base::TimeDelta audio_time = AudioFrameTime(audio_frame_count_); - while (audio_time < video_time) { - if (is_transcoding_audio()) { - Decode(true); - CHECK(!audio_bus_queue_.empty()) << "No audio decoded."; - scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); - audio_bus_queue_.pop(); - audio_frame_input_->InsertAudio( - bus.Pass(), start_time_ + audio_time); - } else { - audio_frame_input_->InsertAudio( - audio_bus_factory_->NextAudioBus( - base::TimeDelta::FromMilliseconds(kAudioFrameMs)), - start_time_ + audio_time); - } - audio_time = AudioFrameTime(++audio_frame_count_); - } - - // This is the time since the stream started. - const base::TimeDelta elapsed_time = now - start_time_; - - // Handle the case when frame generation cannot keep up. - // Move the time ahead to match the next frame. - while (video_time < elapsed_time) { - LOG(WARNING) << "Skipping one frame."; - video_time = VideoFrameTime(++video_frame_count_); - } - - test_app_thread_proxy_->PostDelayedTask( - FROM_HERE, - base::Bind(&SendProcess::SendNextFakeFrame, - weak_factory_.GetWeakPtr()), - video_time - elapsed_time); - } - - // Return true if a frame was sent. - bool SendNextTranscodedVideo(base::TimeDelta elapsed_time) { - if (!is_transcoding_video()) - return false; - - Decode(false); - if (video_frame_queue_.empty()) - return false; - - scoped_refptr<VideoFrame> decoded_frame = - video_frame_queue_.front(); - if (elapsed_time < decoded_frame->timestamp()) - return false; - - gfx::Size size(video_config_.width, video_config_.height); - scoped_refptr<VideoFrame> video_frame = - VideoFrame::CreateBlackFrame(size); - video_frame_queue_.pop(); - media::CopyPlane(VideoFrame::kYPlane, - decoded_frame->data(VideoFrame::kYPlane), - decoded_frame->stride(VideoFrame::kYPlane), - decoded_frame->rows(VideoFrame::kYPlane), - video_frame); - media::CopyPlane(VideoFrame::kUPlane, - decoded_frame->data(VideoFrame::kUPlane), - decoded_frame->stride(VideoFrame::kUPlane), - decoded_frame->rows(VideoFrame::kUPlane), - video_frame); - media::CopyPlane(VideoFrame::kVPlane, - decoded_frame->data(VideoFrame::kVPlane), - decoded_frame->stride(VideoFrame::kVPlane), - decoded_frame->rows(VideoFrame::kVPlane), - video_frame); - - base::TimeDelta video_time; - // Use the timestamp from the file if we're transcoding. - video_time = ScaleTimestamp(decoded_frame->timestamp()); - video_frame_input_->InsertRawVideoFrame( - video_frame, start_time_ + video_time); - - // Make sure queue is not empty. - Decode(false); - return true; - } - - // Return true if a frame was sent. - bool SendNextTranscodedAudio(base::TimeDelta elapsed_time) { - if (!is_transcoding_audio()) - return false; - - Decode(true); - if (audio_bus_queue_.empty()) - return false; - - base::TimeDelta audio_time = audio_sent_ts_->GetTimestamp(); - if (elapsed_time < audio_time) - return false; - scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); - audio_bus_queue_.pop(); - audio_sent_ts_->AddFrames(bus->frames()); - audio_frame_input_->InsertAudio( - bus.Pass(), start_time_ + audio_time); - - // Make sure queue is not empty. - Decode(true); - return true; - } - - void SendNextFrame() { - if (start_time_.is_null()) - start_time_ = clock_->NowTicks(); - if (start_time_.is_null()) - start_time_ = clock_->NowTicks(); - - // Send as much as possible. Audio is sent according to - // system time. - while (SendNextTranscodedAudio(clock_->NowTicks() - start_time_)); - - // Video is sync'ed to audio. - while (SendNextTranscodedVideo(audio_sent_ts_->GetTimestamp())); - - if (audio_bus_queue_.empty() && video_frame_queue_.empty()) { - // Both queues are empty can only mean that we have reached - // the end of the stream. - LOG(INFO) << "Rewind."; - Rewind(); - start_time_ = base::TimeTicks(); - audio_sent_ts_.reset(); - video_first_pts_set_ = false; - } - - // Send next send. - test_app_thread_proxy_->PostDelayedTask( - FROM_HERE, - base::Bind( - &SendProcess::SendNextFrame, - base::Unretained(this)), - base::TimeDelta::FromMilliseconds(kAudioFrameMs)); - } - - const VideoSenderConfig& get_video_config() const { return video_config_; } - - private: - bool is_transcoding_audio() { return audio_stream_index_ >= 0; } - bool is_transcoding_video() { return video_stream_index_ >= 0; } - - // Helper methods to compute timestamps for the frame number specified. - base::TimeDelta VideoFrameTime(int frame_number) { - return frame_number * base::TimeDelta::FromSeconds(1) * - video_frame_rate_denominator_ / video_frame_rate_numerator_; - } - - base::TimeDelta ScaleTimestamp(base::TimeDelta timestamp) { - return base::TimeDelta::FromMicroseconds( - timestamp.InMicroseconds() / playback_rate_); - } - - base::TimeDelta AudioFrameTime(int frame_number) { - return frame_number * base::TimeDelta::FromMilliseconds(kAudioFrameMs); - } - - // Go to the beginning of the stream. - void Rewind() { - CHECK(av_seek_frame(av_format_context_, -1, 0, AVSEEK_FLAG_BACKWARD) >= 0) - << "Failed to rewind to the beginning."; - } - - // Call FFmpeg to fetch one packet. - ScopedAVPacket DemuxOnePacket(bool* audio) { - ScopedAVPacket packet(new AVPacket()); - if (av_read_frame(av_format_context_, packet.get()) < 0) { - LOG(ERROR) << "Failed to read one AVPacket."; - packet.reset(); - return packet.Pass(); - } - - int stream_index = static_cast<int>(packet->stream_index); - if (stream_index == audio_stream_index_) { - *audio = true; - } else if (stream_index == video_stream_index_) { - *audio = false; - } else { - // Ignore unknown packet. - LOG(INFO) << "Unknown packet."; - packet.reset(); - } - return packet.Pass(); - } - - void DecodeAudio(ScopedAVPacket packet) { - // Audio. - AVFrame* avframe = av_frame_alloc(); - - // Make a shallow copy of packet so we can slide packet.data as frames are - // decoded from the packet; otherwise av_free_packet() will corrupt memory. - AVPacket packet_temp = *packet.get(); - - do { - int frame_decoded = 0; - int result = avcodec_decode_audio4( - av_audio_context(), avframe, &frame_decoded, &packet_temp); - CHECK(result >= 0) << "Failed to decode audio."; - packet_temp.size -= result; - packet_temp.data += result; - if (!frame_decoded) - continue; - - int frames_read = avframe->nb_samples; - if (frames_read < 0) - break; - - if (!audio_sent_ts_) { - // Initialize the base time to the first packet in the file. - // This is set to the frequency we send to the receiver. - // Not the frequency of the source file. This is because we - // increment the frame count by samples we sent. - audio_sent_ts_.reset( - new AudioTimestampHelper(kAudioSamplingFrequency)); - // For some files this is an invalid value. - base::TimeDelta base_ts; - audio_sent_ts_->SetBaseTimestamp(base_ts); - } - - scoped_refptr<AudioBuffer> buffer = - AudioBuffer::CopyFrom( - AVSampleFormatToSampleFormat( - av_audio_context()->sample_fmt), - ChannelLayoutToChromeChannelLayout( - av_audio_context()->channel_layout, - av_audio_context()->channels), - av_audio_context()->channels, - av_audio_context()->sample_rate, - frames_read, - &avframe->data[0], - // Note: Not all files have correct values for pkt_pts. - base::TimeDelta::FromMilliseconds(avframe->pkt_pts)); - audio_algo_.EnqueueBuffer(buffer); - av_frame_unref(avframe); - } while (packet_temp.size > 0); - av_frame_free(&avframe); - - const int frames_needed_to_scale = - playback_rate_ * av_audio_context()->sample_rate / - kAudioPacketsPerSecond; - while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { - if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), - audio_fifo_input_bus_->frames())) { - // Nothing can be scaled. Decode some more. - return; - } - - // Prevent overflow of audio data in the FIFO. - if (audio_fifo_input_bus_->frames() + audio_fifo_->frames() - <= audio_fifo_->max_frames()) { - audio_fifo_->Push(audio_fifo_input_bus_.get()); - } else { - LOG(WARNING) << "Audio FIFO full; dropping samples."; - } - - // Make sure there's enough data to resample audio. - if (audio_fifo_->frames() < - 2 * audio_params_.sample_rate() / kAudioPacketsPerSecond) { - continue; - } - - scoped_ptr<media::AudioBus> resampled_bus( - media::AudioBus::Create( - audio_params_.channels(), - kAudioSamplingFrequency / kAudioPacketsPerSecond)); - audio_resampler_->Resample(resampled_bus->frames(), - resampled_bus.get()); - audio_bus_queue_.push(resampled_bus.release()); - } - } - - void DecodeVideo(ScopedAVPacket packet) { - // Video. - int got_picture; - AVFrame* avframe = av_frame_alloc(); - // Tell the decoder to reorder for us. - avframe->reordered_opaque = - av_video_context()->reordered_opaque = packet->pts; - CHECK(avcodec_decode_video2( - av_video_context(), avframe, &got_picture, packet.get()) >= 0) - << "Video decode error."; - if (!got_picture) { - av_frame_free(&avframe); - return; - } - gfx::Size size(av_video_context()->width, av_video_context()->height); - if (!video_first_pts_set_ || - avframe->reordered_opaque < video_first_pts_) { - video_first_pts_set_ = true; - video_first_pts_ = avframe->reordered_opaque; - } - int64 pts = avframe->reordered_opaque - video_first_pts_; - video_frame_queue_.push( - VideoFrame::WrapExternalYuvData( - media::VideoFrame::YV12, - size, - gfx::Rect(size), - size, - avframe->linesize[0], - avframe->linesize[1], - avframe->linesize[2], - avframe->data[0], - avframe->data[1], - avframe->data[2], - base::TimeDelta::FromMilliseconds(pts), - base::Bind(&AVFreeFrame, avframe))); - } - - void Decode(bool decode_audio) { - // Read the stream until one video frame can be decoded. - while (true) { - if (decode_audio && !audio_bus_queue_.empty()) - return; - if (!decode_audio && !video_frame_queue_.empty()) - return; - - bool audio_packet = false; - ScopedAVPacket packet = DemuxOnePacket(&audio_packet); - if (!packet) { - LOG(INFO) << "End of stream."; - return; - } - - if (audio_packet) - DecodeAudio(packet.Pass()); - else - DecodeVideo(packet.Pass()); - } - } - - void ProvideData(int frame_delay, media::AudioBus* output_bus) { - if (audio_fifo_->frames() >= output_bus->frames()) { - audio_fifo_->Consume(output_bus, 0, output_bus->frames()); - } else { - LOG(WARNING) << "Not enough audio data for resampling."; - output_bus->Zero(); - } - } - - AVStream* av_audio_stream() { - return av_format_context_->streams[audio_stream_index_]; - } - AVStream* av_video_stream() { - return av_format_context_->streams[video_stream_index_]; - } - AVCodecContext* av_audio_context() { return av_audio_stream()->codec; } - AVCodecContext* av_video_context() { return av_video_stream()->codec; } - - scoped_refptr<base::SingleThreadTaskRunner> test_app_thread_proxy_; - VideoSenderConfig video_config_; - scoped_refptr<AudioFrameInput> audio_frame_input_; - scoped_refptr<VideoFrameInput> video_frame_input_; - uint8 synthetic_count_; - base::TickClock* const clock_; // Not owned by this class. - - // Time when the stream starts. - base::TimeTicks start_time_; - - // The following three members are used only for fake frames. - int audio_frame_count_; // Each audio frame is exactly 10ms. - int video_frame_count_; - scoped_ptr<TestAudioBusFactory> audio_bus_factory_; - - // NOTE: Weak pointers must be invalidated before all other member variables. - base::WeakPtrFactory<SendProcess> weak_factory_; - - base::MemoryMappedFile file_data_; - scoped_ptr<InMemoryUrlProtocol> protocol_; - scoped_ptr<FFmpegGlue> glue_; - AVFormatContext* av_format_context_; - - int audio_stream_index_; - AudioParameters audio_params_; - double playback_rate_; - - int video_stream_index_; - int video_frame_rate_numerator_; - int video_frame_rate_denominator_; - - // These are used for audio resampling. - scoped_ptr<media::MultiChannelResampler> audio_resampler_; - scoped_ptr<media::AudioFifo> audio_fifo_; - scoped_ptr<media::AudioBus> audio_fifo_input_bus_; - media::AudioRendererAlgorithm audio_algo_; - - // Track the timestamp of audio sent to the receiver. - scoped_ptr<media::AudioTimestampHelper> audio_sent_ts_; - - std::queue<scoped_refptr<VideoFrame> > video_frame_queue_; - int64 video_first_pts_; - bool video_first_pts_set_; - - std::queue<AudioBus*> audio_bus_queue_; - - DISALLOW_COPY_AND_ASSIGN(SendProcess); -}; - -} // namespace cast -} // namespace media - -namespace { void UpdateCastTransportStatus( - media::cast::transport::CastTransportStatus status) { + media::cast::CastTransportStatus status) { VLOG(1) << "Transport status: " << status; } @@ -902,10 +273,8 @@ int main(int argc, char** argv) { LOG(INFO) << "Sending to " << remote_ip_address << ":" << remote_port << "."; - media::cast::AudioSenderConfig audio_config = - media::cast::GetAudioSenderConfig(); - media::cast::VideoSenderConfig video_config = - media::cast::GetVideoSenderConfig(); + media::cast::AudioSenderConfig audio_config = GetAudioSenderConfig(); + media::cast::VideoSenderConfig video_config = GetVideoSenderConfig(); // Running transport on the main thread. // Setting up transport config. @@ -922,14 +291,25 @@ int main(int argc, char** argv) { video_thread.message_loop_proxy())); // SendProcess initialization. - scoped_ptr<media::cast::SendProcess> send_process( - new media::cast::SendProcess(test_thread.message_loop_proxy(), - cast_environment->Clock(), - video_config)); + scoped_ptr<media::cast::FakeMediaSource> fake_media_source( + new media::cast::FakeMediaSource(test_thread.message_loop_proxy(), + cast_environment->Clock(), + video_config)); + + int override_fps = 0; + if (!base::StringToInt(cmd->GetSwitchValueASCII(kSwitchFps), + &override_fps)){ + override_fps = 0; + } + base::FilePath source_path = cmd->GetSwitchValuePath(kSwitchSourceFile); + if (!source_path.empty()) { + LOG(INFO) << "Source: " << source_path.value(); + fake_media_source->SetSourceFile(source_path, override_fps); + } // CastTransportSender initialization. - scoped_ptr<media::cast::transport::CastTransportSender> transport_sender = - media::cast::transport::CastTransportSender::Create( + scoped_ptr<media::cast::CastTransportSender> transport_sender = + media::cast::CastTransportSender::Create( NULL, // net log. cast_environment->Clock(), remote_endpoint, @@ -942,7 +322,7 @@ int main(int argc, char** argv) { scoped_ptr<media::cast::CastSender> cast_sender = media::cast::CastSender::Create(cast_environment, transport_sender.get()); cast_sender->InitializeVideo( - send_process->get_video_config(), + fake_media_source->get_video_config(), base::Bind(&InitializationResult), media::cast::CreateDefaultVideoEncodeAcceleratorCallback(), media::cast::CreateDefaultVideoEncodeMemoryCallback()); @@ -1014,8 +394,8 @@ int main(int argc, char** argv) { base::Passed(&offset_estimator)), base::TimeDelta::FromSeconds(logging_duration_seconds)); - send_process->Start(cast_sender->audio_frame_input(), - cast_sender->video_frame_input()); + fake_media_source->Start(cast_sender->audio_frame_input(), + cast_sender->video_frame_input()); io_message_loop.Run(); return 0; diff --git a/media/cast/test/simulator.cc b/media/cast/test/simulator.cc new file mode 100644 index 0000000000..43b3a02dc6 --- /dev/null +++ b/media/cast/test/simulator.cc @@ -0,0 +1,445 @@ +// Copyright 2014 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. + +// Simulate end to end streaming. +// +// Input: +// --source= +// WebM used as the source of video and audio frames. +// --output= +// File path to writing out the raw event log of the simulation session. +// --sim-id= +// Unique simulation ID. +// +// Output: +// - Raw event log of the simulation session tagged with the unique test ID, +// written out to the specified file path. + +#include "base/at_exit.h" +#include "base/base_paths.h" +#include "base/command_line.h" +#include "base/file_util.h" +#include "base/files/file_path.h" +#include "base/files/memory_mapped_file.h" +#include "base/files/scoped_file.h" +#include "base/json/json_writer.h" +#include "base/logging.h" +#include "base/path_service.h" +#include "base/test/simple_test_tick_clock.h" +#include "base/thread_task_runner_handle.h" +#include "base/time/tick_clock.h" +#include "base/values.h" +#include "media/base/audio_bus.h" +#include "media/base/media.h" +#include "media/base/video_frame.h" +#include "media/cast/cast_config.h" +#include "media/cast/cast_environment.h" +#include "media/cast/cast_receiver.h" +#include "media/cast/cast_sender.h" +#include "media/cast/logging/encoding_event_subscriber.h" +#include "media/cast/logging/log_serializer.h" +#include "media/cast/logging/logging_defines.h" +#include "media/cast/logging/proto/raw_events.pb.h" +#include "media/cast/logging/raw_event_subscriber_bundle.h" +#include "media/cast/logging/simple_event_subscriber.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/cast_transport_defines.h" +#include "media/cast/net/cast_transport_sender.h" +#include "media/cast/net/cast_transport_sender_impl.h" +#include "media/cast/test/fake_media_source.h" +#include "media/cast/test/fake_single_thread_task_runner.h" +#include "media/cast/test/loopback_transport.h" +#include "media/cast/test/proto/network_simulation_model.pb.h" +#include "media/cast/test/skewed_tick_clock.h" +#include "media/cast/test/utility/audio_utility.h" +#include "media/cast/test/utility/default_config.h" +#include "media/cast/test/utility/test_util.h" +#include "media/cast/test/utility/udp_proxy.h" +#include "media/cast/test/utility/video_utility.h" + +using media::cast::proto::IPPModel; +using media::cast::proto::NetworkSimulationModel; +using media::cast::proto::NetworkSimulationModelType; + +namespace media { +namespace cast { +namespace { +const int kTargetDelay = 300; +const char kSourcePath[] = "source"; +const char kModelPath[] = "model"; +const char kOutputPath[] = "output"; +const char kSimulationId[] = "sim-id"; +const char kLibDir[] = "lib-dir"; + +void UpdateCastTransportStatus(CastTransportStatus status) { + LOG(INFO) << "Cast transport status: " << status; +} + +void AudioInitializationStatus(CastInitializationStatus status) { + LOG(INFO) << "Audio status: " << status; +} + +void VideoInitializationStatus(CastInitializationStatus status) { + LOG(INFO) << "Video status: " << status; +} + +void LogTransportEvents(const scoped_refptr<CastEnvironment>& env, + const std::vector<PacketEvent>& packet_events) { + for (std::vector<media::cast::PacketEvent>::const_iterator it = + packet_events.begin(); + it != packet_events.end(); + ++it) { + env->Logging()->InsertPacketEvent(it->timestamp, + it->type, + it->media_type, + it->rtp_timestamp, + it->frame_id, + it->packet_id, + it->max_packet_id, + it->size); + } +} + +void GotVideoFrame( + int* counter, + CastReceiver* cast_receiver, + const scoped_refptr<media::VideoFrame>& video_frame, + const base::TimeTicks& render_time, + bool continuous) { + ++*counter; + cast_receiver->RequestDecodedVideoFrame( + base::Bind(&GotVideoFrame, counter, cast_receiver)); +} + +void GotAudioFrame( + int* counter, + CastReceiver* cast_receiver, + scoped_ptr<AudioBus> audio_bus, + const base::TimeTicks& playout_time, + bool is_continuous) { + ++*counter; + cast_receiver->RequestDecodedAudioFrame( + base::Bind(&GotAudioFrame, counter, cast_receiver)); +} + +void AppendLog(EncodingEventSubscriber* subscriber, + const std::string& extra_data, + const base::FilePath& output_path) { + media::cast::proto::LogMetadata metadata; + metadata.set_extra_data(extra_data); + + media::cast::FrameEventList frame_events; + media::cast::PacketEventList packet_events; + subscriber->GetEventsAndReset( + &metadata, &frame_events, &packet_events); + media::cast::proto::GeneralDescription* gen_desc = + metadata.mutable_general_description(); + gen_desc->set_product("Cast Simulator"); + gen_desc->set_product_version("0.1"); + + scoped_ptr<char[]> serialized_log(new char[media::cast::kMaxSerializedBytes]); + int output_bytes; + bool success = media::cast::SerializeEvents(metadata, + frame_events, + packet_events, + true, + media::cast::kMaxSerializedBytes, + serialized_log.get(), + &output_bytes); + + if (!success) { + LOG(ERROR) << "Failed to serialize log."; + return; + } + + if (AppendToFile(output_path, serialized_log.get(), output_bytes) == -1) { + LOG(ERROR) << "Failed to append to log."; + } +} + +// Run simulation once. +// +// |output_path| is the path to write serialized log. +// |extra_data| is extra tagging information to write to log. +void RunSimulation(const base::FilePath& source_path, + const base::FilePath& output_path, + const std::string& extra_data, + const NetworkSimulationModel& model) { + // Fake clock. Make sure start time is non zero. + base::SimpleTestTickClock testing_clock; + testing_clock.Advance(base::TimeDelta::FromSeconds(1)); + + // Task runner. + scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner = + new test::FakeSingleThreadTaskRunner(&testing_clock); + base::ThreadTaskRunnerHandle task_runner_handle(task_runner); + + // CastEnvironments. + scoped_refptr<CastEnvironment> sender_env = + new CastEnvironment( + scoped_ptr<base::TickClock>( + new test::SkewedTickClock(&testing_clock)).Pass(), + task_runner, + task_runner, + task_runner); + scoped_refptr<CastEnvironment> receiver_env = + new CastEnvironment( + scoped_ptr<base::TickClock>( + new test::SkewedTickClock(&testing_clock)).Pass(), + task_runner, + task_runner, + task_runner); + + // Event subscriber. Store at most 1 hour of events. + EncodingEventSubscriber audio_event_subscriber(AUDIO_EVENT, + 100 * 60 * 60); + EncodingEventSubscriber video_event_subscriber(VIDEO_EVENT, + 30 * 60 * 60); + sender_env->Logging()->AddRawEventSubscriber(&audio_event_subscriber); + sender_env->Logging()->AddRawEventSubscriber(&video_event_subscriber); + + // Audio sender config. + AudioSenderConfig audio_sender_config = GetDefaultAudioSenderConfig(); + audio_sender_config.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetDelay); + + // Audio receiver config. + FrameReceiverConfig audio_receiver_config = + GetDefaultAudioReceiverConfig(); + audio_receiver_config.rtp_max_delay_ms = + audio_sender_config.target_playout_delay.InMilliseconds(); + + // Video sender config. + VideoSenderConfig video_sender_config = GetDefaultVideoSenderConfig(); + video_sender_config.max_bitrate = 4000000; + video_sender_config.min_bitrate = 2000000; + video_sender_config.start_bitrate = 4000000; + video_sender_config.target_playout_delay = + base::TimeDelta::FromMilliseconds(kTargetDelay); + + // Video receiver config. + FrameReceiverConfig video_receiver_config = + GetDefaultVideoReceiverConfig(); + video_receiver_config.rtp_max_delay_ms = + video_sender_config.target_playout_delay.InMilliseconds(); + + // Loopback transport. + LoopBackTransport receiver_to_sender(receiver_env); + LoopBackTransport sender_to_receiver(sender_env); + + // Cast receiver. + scoped_ptr<CastReceiver> cast_receiver( + CastReceiver::Create(receiver_env, + audio_receiver_config, + video_receiver_config, + &receiver_to_sender)); + + // Cast sender and transport sender. + scoped_ptr<CastTransportSender> transport_sender( + new CastTransportSenderImpl( + NULL, + &testing_clock, + net::IPEndPoint(), + base::Bind(&UpdateCastTransportStatus), + base::Bind(&LogTransportEvents, sender_env), + base::TimeDelta::FromSeconds(1), + task_runner, + &sender_to_receiver)); + scoped_ptr<CastSender> cast_sender( + CastSender::Create(sender_env, transport_sender.get())); + + // Build packet pipe. + if (model.type() != media::cast::proto::INTERRUPTED_POISSON_PROCESS) { + LOG(ERROR) << "Unknown model type " << model.type() << "."; + return; + } + + const IPPModel& ipp_model = model.ipp(); + + std::vector<double> average_rates(ipp_model.average_rate_size()); + std::copy(ipp_model.average_rate().begin(), ipp_model.average_rate().end(), + average_rates.begin()); + test::InterruptedPoissonProcess ipp(average_rates, + ipp_model.coef_burstiness(), ipp_model.coef_variance(), 0); + + // Connect sender to receiver. This initializes the pipe. + receiver_to_sender.Initialize( + ipp.NewBuffer(128 * 1024), cast_sender->packet_receiver(), task_runner, + &testing_clock); + sender_to_receiver.Initialize( + ipp.NewBuffer(128 * 1024), cast_receiver->packet_receiver(), task_runner, + &testing_clock); + + // Start receiver. + int audio_frame_count = 0; + int video_frame_count = 0; + cast_receiver->RequestDecodedVideoFrame( + base::Bind(&GotVideoFrame, &video_frame_count, cast_receiver.get())); + cast_receiver->RequestDecodedAudioFrame( + base::Bind(&GotAudioFrame, &audio_frame_count, cast_receiver.get())); + + FakeMediaSource media_source(task_runner, + &testing_clock, + video_sender_config); + + // Initializing audio and video senders. + cast_sender->InitializeAudio(audio_sender_config, + base::Bind(&AudioInitializationStatus)); + cast_sender->InitializeVideo(media_source.get_video_config(), + base::Bind(&VideoInitializationStatus), + CreateDefaultVideoEncodeAcceleratorCallback(), + CreateDefaultVideoEncodeMemoryCallback()); + + // Start sending. + if (!source_path.empty()) { + // 0 means using the FPS from the file. + media_source.SetSourceFile(source_path, 0); + } + media_source.Start(cast_sender->audio_frame_input(), + cast_sender->video_frame_input()); + + // Run for 3 minutes. + base::TimeDelta elapsed_time; + while (elapsed_time.InMinutes() < 3) { + // Each step is 100us. + base::TimeDelta step = base::TimeDelta::FromMicroseconds(100); + task_runner->Sleep(step); + elapsed_time += step; + } + + LOG(INFO) << "Audio frame count: " << audio_frame_count; + LOG(INFO) << "Video frame count: " << video_frame_count; + LOG(INFO) << "Writing log: " << output_path.value(); + + // Truncate file and then write serialized log. + { + base::ScopedFILE file(base::OpenFile(output_path, "wb")); + if (!file.get()) { + LOG(INFO) << "Cannot write to log."; + return; + } + } + AppendLog(&video_event_subscriber, extra_data, output_path); + AppendLog(&audio_event_subscriber, extra_data, output_path); +} + +NetworkSimulationModel DefaultModel() { + NetworkSimulationModel model; + model.set_type(cast::proto::INTERRUPTED_POISSON_PROCESS); + IPPModel* ipp = model.mutable_ipp(); + ipp->set_coef_burstiness(0.609); + ipp->set_coef_variance(4.1); + + ipp->add_average_rate(0.609); + ipp->add_average_rate(0.495); + ipp->add_average_rate(0.561); + ipp->add_average_rate(0.458); + ipp->add_average_rate(0.538); + ipp->add_average_rate(0.513); + ipp->add_average_rate(0.585); + ipp->add_average_rate(0.592); + ipp->add_average_rate(0.658); + ipp->add_average_rate(0.556); + ipp->add_average_rate(0.371); + ipp->add_average_rate(0.595); + ipp->add_average_rate(0.490); + ipp->add_average_rate(0.980); + ipp->add_average_rate(0.781); + ipp->add_average_rate(0.463); + + return model; +} + +bool IsModelValid(const NetworkSimulationModel& model) { + if (!model.has_type()) + return false; + NetworkSimulationModelType type = model.type(); + if (type == media::cast::proto::INTERRUPTED_POISSON_PROCESS) { + if (!model.has_ipp()) + return false; + const IPPModel& ipp = model.ipp(); + if (ipp.coef_burstiness() <= 0.0 || ipp.coef_variance() <= 0.0) + return false; + if (ipp.average_rate_size() == 0) + return false; + for (int i = 0; i < ipp.average_rate_size(); i++) { + if (ipp.average_rate(i) <= 0.0) + return false; + } + } + + return true; +} + +NetworkSimulationModel LoadModel(const base::FilePath& model_path) { + if (model_path.empty()) { + LOG(ERROR) << "Model path not set."; + return DefaultModel(); + } + std::string model_str; + if (!base::ReadFileToString(model_path, &model_str)) { + LOG(ERROR) << "Failed to read model file."; + return DefaultModel(); + } + + NetworkSimulationModel model; + if (!model.ParseFromString(model_str)) { + LOG(ERROR) << "Failed to parse model."; + return DefaultModel(); + } + if (!IsModelValid(model)) { + LOG(ERROR) << "Invalid model."; + return DefaultModel(); + } + + return model; +} + +} // namespace +} // namespace cast +} // namespace media + +int main(int argc, char** argv) { + base::AtExitManager at_exit; + CommandLine::Init(argc, argv); + InitLogging(logging::LoggingSettings()); + + const CommandLine* cmd = CommandLine::ForCurrentProcess(); + base::FilePath media_path = cmd->GetSwitchValuePath(media::cast::kLibDir); + if (media_path.empty()) { + if (!PathService::Get(base::DIR_MODULE, &media_path)) { + LOG(ERROR) << "Failed to load FFmpeg."; + return 1; + } + } + + if (!media::InitializeMediaLibrary(media_path)) { + LOG(ERROR) << "Failed to initialize FFmpeg."; + return 1; + } + + base::FilePath source_path = cmd->GetSwitchValuePath( + media::cast::kSourcePath); + base::FilePath output_path = cmd->GetSwitchValuePath( + media::cast::kOutputPath); + if (output_path.empty()) { + base::GetTempDir(&output_path); + output_path = output_path.AppendASCII("sim-events.gz"); + } + std::string sim_id = cmd->GetSwitchValueASCII(media::cast::kSimulationId); + + NetworkSimulationModel model = media::cast::LoadModel( + cmd->GetSwitchValuePath(media::cast::kModelPath)); + + base::DictionaryValue values; + values.SetBoolean("sim", true); + values.SetString("sim-id", sim_id); + + std::string extra_data; + base::JSONWriter::Write(&values, &extra_data); + + // Run. + media::cast::RunSimulation(source_path, output_path, extra_data, model); + return 0; +} diff --git a/media/cast/test/utility/default_config.cc b/media/cast/test/utility/default_config.cc index b5de5ed690..6743146b70 100644 --- a/media/cast/test/utility/default_config.cc +++ b/media/cast/test/utility/default_config.cc @@ -5,7 +5,7 @@ #include "media/cast/test/utility/default_config.h" #include "base/bind.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" namespace { @@ -35,7 +35,7 @@ FrameReceiverConfig GetDefaultAudioReceiverConfig() { config.frequency = 48000; config.channels = 2; config.max_frame_rate = 100; // 10ms of signal per frame - config.codec.audio = media::cast::transport::kOpus; + config.codec = media::cast::CODEC_AUDIO_OPUS; return config; } @@ -49,7 +49,44 @@ FrameReceiverConfig GetDefaultVideoReceiverConfig() { config.frequency = kVideoFrequency; config.channels = 1; config.max_frame_rate = kDefaultMaxFrameRate; - config.codec.video = media::cast::transport::kVp8; + config.codec = media::cast::CODEC_VIDEO_VP8; + return config; +} + +AudioSenderConfig GetDefaultAudioSenderConfig() { + FrameReceiverConfig recv_config = GetDefaultAudioReceiverConfig(); + AudioSenderConfig config; + config.ssrc = recv_config.incoming_ssrc; + config.incoming_feedback_ssrc = recv_config.feedback_ssrc; + config.rtp_payload_type = recv_config.rtp_payload_type; + config.use_external_encoder = false; + config.frequency = recv_config.frequency; + config.channels = recv_config.channels; + config.bitrate = kDefaultAudioEncoderBitrate; + config.codec = recv_config.codec; + config.target_playout_delay = + base::TimeDelta::FromMilliseconds(kDefaultRtpMaxDelayMs); + return config; +} + +VideoSenderConfig GetDefaultVideoSenderConfig() { + FrameReceiverConfig recv_config = GetDefaultVideoReceiverConfig(); + VideoSenderConfig config; + config.ssrc = recv_config.incoming_ssrc; + config.incoming_feedback_ssrc = recv_config.feedback_ssrc; + config.rtp_payload_type = recv_config.rtp_payload_type; + config.use_external_encoder = false; + config.width = 1280; + config.height = 720; + config.max_bitrate = 4000000; + config.min_bitrate = 2000000; + config.start_bitrate = 4000000; + config.max_frame_rate = recv_config.max_frame_rate; + config.max_number_of_video_buffers_used = 1; + config.codec = recv_config.codec; + config.number_of_encode_threads = 2; + config.target_playout_delay = + base::TimeDelta::FromMilliseconds(kDefaultRtpMaxDelayMs); return config; } diff --git a/media/cast/test/utility/default_config.h b/media/cast/test/utility/default_config.h index eaa3c96415..2cc52a7a72 100644 --- a/media/cast/test/utility/default_config.h +++ b/media/cast/test/utility/default_config.h @@ -20,6 +20,15 @@ FrameReceiverConfig GetDefaultAudioReceiverConfig(); // name. FrameReceiverConfig GetDefaultVideoReceiverConfig(); +// Returns a AudioSenderConfig initialized to default values. This means +// 48 kHz, 2-channel Opus-coded audio. Default values for SSRCs and payload +// type. +AudioSenderConfig GetDefaultAudioSenderConfig(); + +// Returns a VideoSenderConfig initialized to default values. This means +// 30 Hz VP8 coded code. Default values for SSRCs and payload type. +VideoSenderConfig GetDefaultVideoSenderConfig(); + // Returns a callback that does nothing. CreateVideoEncodeAcceleratorCallback CreateDefaultVideoEncodeAcceleratorCallback(); diff --git a/media/cast/test/utility/in_process_receiver.cc b/media/cast/test/utility/in_process_receiver.cc index cfcc1fcb46..6c739ecdb6 100644 --- a/media/cast/test/utility/in_process_receiver.cc +++ b/media/cast/test/utility/in_process_receiver.cc @@ -11,11 +11,11 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" #include "media/cast/cast_receiver.h" -#include "media/cast/transport/cast_transport_config.h" -#include "media/cast/transport/transport/udp_transport.h" +#include "media/cast/net/cast_transport_config.h" +#include "media/cast/net/udp_transport.h" -using media::cast::transport::CastTransportStatus; -using media::cast::transport::UdpTransport; +using media::cast::CastTransportStatus; +using media::cast::UdpTransport; namespace media { namespace cast { @@ -67,7 +67,7 @@ void InProcessReceiver::StopOnMainThread(base::WaitableEvent* event) { } void InProcessReceiver::UpdateCastTransportStatus(CastTransportStatus status) { - LOG_IF(ERROR, status == media::cast::transport::TRANSPORT_SOCKET_ERROR) + LOG_IF(ERROR, status == media::cast::TRANSPORT_SOCKET_ERROR) << "Transport socket error occurred. InProcessReceiver is likely dead."; VLOG(1) << "CastTransportStatus is now " << status; } diff --git a/media/cast/test/utility/in_process_receiver.h b/media/cast/test/utility/in_process_receiver.h index cf25da9cee..454dc937ae 100644 --- a/media/cast/test/utility/in_process_receiver.h +++ b/media/cast/test/utility/in_process_receiver.h @@ -10,7 +10,8 @@ #include "base/memory/weak_ptr.h" #include "media/base/audio_bus.h" #include "media/cast/cast_config.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" +#include "net/base/ip_endpoint.h" namespace base { class TimeTicks; @@ -29,10 +30,7 @@ namespace cast { class CastEnvironment; class CastReceiver; - -namespace transport { class UdpTransport; -} // namespace transport // Common base functionality for an in-process Cast receiver. This is meant to // be subclassed with the OnAudioFrame() and OnVideoFrame() methods implemented, @@ -85,7 +83,7 @@ class InProcessReceiver { // Callback for the transport to notify of status changes. A default // implementation is provided here that simply logs socket errors. - virtual void UpdateCastTransportStatus(transport::CastTransportStatus status); + virtual void UpdateCastTransportStatus(CastTransportStatus status); private: friend class base::RefCountedThreadSafe<InProcessReceiver>; @@ -108,7 +106,7 @@ class InProcessReceiver { const FrameReceiverConfig audio_config_; const FrameReceiverConfig video_config_; - scoped_ptr<transport::UdpTransport> transport_; + scoped_ptr<UdpTransport> transport_; scoped_ptr<CastReceiver> cast_receiver_; // NOTE: Weak pointers must be invalidated before all other member variables. diff --git a/media/cast/test/utility/udp_proxy.cc b/media/cast/test/utility/udp_proxy.cc index 9fc3b4a44d..4714b7ed67 100644 --- a/media/cast/test/utility/udp_proxy.cc +++ b/media/cast/test/utility/udp_proxy.cc @@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <math.h> #include <stdlib.h> +#include <vector> #include "media/cast/test/utility/udp_proxy.h" #include "base/logging.h" -#include "base/memory/linked_ptr.h" #include "base/rand_util.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" @@ -55,10 +56,10 @@ class Buffer : public PacketPipe { CHECK_GT(max_megabits_per_second, 0); } - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { if (packet->size() + buffer_size_ <= max_buffer_size_) { buffer_size_ += packet->size(); - buffer_.push_back(linked_ptr<transport::Packet>(packet.release())); + buffer_.push_back(linked_ptr<Packet>(packet.release())); if (buffer_.size() == 1) { Schedule(); } @@ -78,7 +79,7 @@ class Buffer : public PacketPipe { void ProcessBuffer() { CHECK(!buffer_.empty()); - scoped_ptr<transport::Packet> packet(buffer_.front().release()); + scoped_ptr<Packet> packet(buffer_.front().release()); buffer_size_ -= packet->size(); buffer_.pop_front(); pipe_->Send(packet.Pass()); @@ -87,7 +88,7 @@ class Buffer : public PacketPipe { } } - std::deque<linked_ptr<transport::Packet> > buffer_; + std::deque<linked_ptr<Packet> > buffer_; size_t buffer_size_; size_t max_buffer_size_; double max_megabits_per_second_; // megabits per second @@ -103,7 +104,7 @@ class RandomDrop : public PacketPipe { RandomDrop(double drop_fraction) : drop_fraction_(static_cast<int>(drop_fraction * RAND_MAX)) {} - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { if (rand() > drop_fraction_) { pipe_->Send(packet.Pass()); } @@ -122,7 +123,7 @@ class SimpleDelayBase : public PacketPipe { SimpleDelayBase() : weak_factory_(this) {} virtual ~SimpleDelayBase() {} - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { double seconds = GetDelay(); task_runner_->PostDelayedTask( FROM_HERE, @@ -135,7 +136,7 @@ class SimpleDelayBase : public PacketPipe { virtual double GetDelay() = 0; private: - virtual void SendInternal(scoped_ptr<transport::Packet> packet) { + virtual void SendInternal(scoped_ptr<Packet> packet) { pipe_->Send(packet.Pass()); } @@ -184,8 +185,8 @@ class RandomSortedDelay : public PacketPipe { seconds_between_extra_delay_(seconds_between_extra_delay), weak_factory_(this) {} - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { - buffer_.push_back(linked_ptr<transport::Packet>(packet.release())); + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { + buffer_.push_back(linked_ptr<Packet>(packet.release())); if (buffer_.size() == 1) { Schedule(); } @@ -238,7 +239,7 @@ class RandomSortedDelay : public PacketPipe { void ProcessBuffer() { CHECK(!buffer_.empty()); - scoped_ptr<transport::Packet> packet(buffer_.front().release()); + scoped_ptr<Packet> packet(buffer_.front().release()); pipe_->Send(packet.Pass()); buffer_.pop_front(); if (!buffer_.empty()) { @@ -247,7 +248,7 @@ class RandomSortedDelay : public PacketPipe { } base::TimeTicks block_until_; - std::deque<linked_ptr<transport::Packet> > buffer_; + std::deque<linked_ptr<Packet> > buffer_; double random_delay_; double extra_delay_; double seconds_between_extra_delay_; @@ -279,7 +280,7 @@ class NetworkGlitchPipe : public PacketPipe { Flip(); } - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { if (works_) { pipe_->Send(packet.Pass()); } @@ -310,13 +311,212 @@ scoped_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time, .Pass(); } + +// Internal buffer object for a client of the IPP model. +class InterruptedPoissonProcess::InternalBuffer : public PacketPipe { + public: + InternalBuffer(base::WeakPtr<InterruptedPoissonProcess> ipp, + size_t size) + : ipp_(ipp), + stored_size_(0), + stored_limit_(size), + clock_(NULL), + weak_factory_(this) { + } + + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE { + // Drop if buffer is full. + if (stored_size_ >= stored_limit_) + return; + stored_size_ += packet->size(); + buffer_.push_back(linked_ptr<Packet>(packet.release())); + buffer_time_.push_back(clock_->NowTicks()); + DCHECK(buffer_.size() == buffer_time_.size()); + } + + virtual void InitOnIOThread( + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, + base::TickClock* clock) OVERRIDE { + clock_ = clock; + if (ipp_) + ipp_->InitOnIOThread(task_runner, clock); + PacketPipe::InitOnIOThread(task_runner, clock); + } + + void SendOnePacket() { + scoped_ptr<Packet> packet(buffer_.front().release()); + stored_size_ -= packet->size(); + buffer_.pop_front(); + buffer_time_.pop_front(); + pipe_->Send(packet.Pass()); + DCHECK(buffer_.size() == buffer_time_.size()); + } + + bool Empty() const { + return buffer_.empty(); + } + + base::TimeTicks FirstPacketTime() const { + DCHECK(!buffer_time_.empty()); + return buffer_time_.front(); + } + + base::WeakPtr<InternalBuffer> GetWeakPtr() { + return weak_factory_.GetWeakPtr(); + + } + + private: + const base::WeakPtr<InterruptedPoissonProcess> ipp_; + size_t stored_size_; + const size_t stored_limit_; + std::deque<linked_ptr<Packet> > buffer_; + std::deque<base::TimeTicks> buffer_time_; + base::TickClock* clock_; + base::WeakPtrFactory<InternalBuffer> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(InternalBuffer); +}; + +InterruptedPoissonProcess::InterruptedPoissonProcess( + const std::vector<double>& average_rates, + double coef_burstiness, + double coef_variance, + uint32 rand_seed) + : clock_(NULL), + average_rates_(average_rates), + coef_burstiness_(coef_burstiness), + coef_variance_(coef_variance), + rate_index_(0), + on_state_(true), + weak_factory_(this) { + mt_rand_.init_genrand(rand_seed); + DCHECK(!average_rates.empty()); + ComputeRates(); +} + +InterruptedPoissonProcess::~InterruptedPoissonProcess() { +} + +void InterruptedPoissonProcess::InitOnIOThread( + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, + base::TickClock* clock) { + // Already initialized and started. + if (task_runner_ && clock_) + return; + task_runner_ = task_runner; + clock_ = clock; + UpdateRates(); + SwitchOn(); + SendPacket(); +} + +scoped_ptr<PacketPipe> InterruptedPoissonProcess::NewBuffer(size_t size) { + scoped_ptr<InternalBuffer> buffer( + new InternalBuffer(weak_factory_.GetWeakPtr(), size)); + send_buffers_.push_back(buffer->GetWeakPtr()); + return buffer.PassAs<PacketPipe>(); +} + +base::TimeDelta InterruptedPoissonProcess::NextEvent(double rate) { + // Rate is per milliseconds. + // The time until next event is exponentially distributed to the + // inverse of |rate|. + return base::TimeDelta::FromMillisecondsD( + fabs(-log(1.0 - RandDouble()) / rate)); +} + +double InterruptedPoissonProcess::RandDouble() { + // Generate a 64-bits random number from MT19937 and then convert + // it to double. + uint64 rand = mt_rand_.genrand_int32(); + rand <<= 32; + rand |= mt_rand_.genrand_int32(); + return base::BitsToOpenEndedUnitInterval(rand); +} + +void InterruptedPoissonProcess::ComputeRates() { + double avg_rate = average_rates_[rate_index_]; + + send_rate_ = avg_rate / coef_burstiness_; + switch_off_rate_ = + 2 * avg_rate * (1 - coef_burstiness_) * (1 - coef_burstiness_) / + coef_burstiness_ / (coef_variance_ - 1); + switch_on_rate_ = + 2 * avg_rate * (1 - coef_burstiness_) / (coef_variance_ - 1); +} + +void InterruptedPoissonProcess::UpdateRates() { + ComputeRates(); + + // Rates are updated once per second. + rate_index_ = (rate_index_ + 1) % average_rates_.size(); + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&InterruptedPoissonProcess::UpdateRates, + weak_factory_.GetWeakPtr()), + base::TimeDelta::FromSeconds(1)); +} + +void InterruptedPoissonProcess::SwitchOff() { + on_state_ = false; + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&InterruptedPoissonProcess::SwitchOn, + weak_factory_.GetWeakPtr()), + NextEvent(switch_on_rate_)); +} + +void InterruptedPoissonProcess::SwitchOn() { + on_state_ = true; + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&InterruptedPoissonProcess::SwitchOff, + weak_factory_.GetWeakPtr()), + NextEvent(switch_off_rate_)); +} + +void InterruptedPoissonProcess::SendPacket() { + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&InterruptedPoissonProcess::SendPacket, + weak_factory_.GetWeakPtr()), + NextEvent(send_rate_)); + + // If OFF then don't send. + if (!on_state_) + return; + + // Find the earliest packet to send. + base::TimeTicks earliest_time; + for (size_t i = 0; i < send_buffers_.size(); ++i) { + if (!send_buffers_[i]) + continue; + if (send_buffers_[i]->Empty()) + continue; + if (earliest_time.is_null() || + send_buffers_[i]->FirstPacketTime() < earliest_time) + earliest_time = send_buffers_[i]->FirstPacketTime(); + } + for (size_t i = 0; i < send_buffers_.size(); ++i) { + if (!send_buffers_[i]) + continue; + if (send_buffers_[i]->Empty()) + continue; + if (send_buffers_[i]->FirstPacketTime() != earliest_time) + continue; + send_buffers_[i]->SendOnePacket(); + break; + } +} + class UDPProxyImpl; class PacketSender : public PacketPipe { public: PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination) : udp_proxy_(udp_proxy), destination_(destination) {} - virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE; + virtual void Send(scoped_ptr<Packet> packet) OVERRIDE; virtual void AppendToPipe(scoped_ptr<PacketPipe> pipe) OVERRIDE { NOTREACHED(); } @@ -426,7 +626,7 @@ class UDPProxyImpl : public UDPProxy { proxy_thread_.Stop(); } - void Send(scoped_ptr<transport::Packet> packet, + void Send(scoped_ptr<Packet> packet, const net::IPEndPoint& destination) { if (blocked_) { LOG(ERROR) << "Cannot write packet right now: blocked"; @@ -522,7 +722,7 @@ class UDPProxyImpl : public UDPProxy { void PollRead() { while (true) { - packet_.reset(new transport::Packet(kMaxPacketSize)); + packet_.reset(new Packet(kMaxPacketSize)); scoped_refptr<net::IOBuffer> recv_buf = new net::WrappedIOBuffer(reinterpret_cast<char*>(&packet_->front())); int len = socket_->RecvFrom( @@ -539,7 +739,7 @@ class UDPProxyImpl : public UDPProxy { } void AllowWrite(scoped_refptr<net::IOBuffer> buf, - scoped_ptr<transport::Packet> packet, + scoped_ptr<Packet> packet, int unused_len) { DCHECK(blocked_); blocked_ = false; @@ -562,7 +762,7 @@ class UDPProxyImpl : public UDPProxy { // For receiving. net::IPEndPoint recv_address_; - scoped_ptr<transport::Packet> packet_; + scoped_ptr<Packet> packet_; // For sending. bool blocked_; @@ -570,7 +770,7 @@ class UDPProxyImpl : public UDPProxy { base::WeakPtrFactory<UDPProxyImpl> weak_factory_; }; -void PacketSender::Send(scoped_ptr<transport::Packet> packet) { +void PacketSender::Send(scoped_ptr<Packet> packet) { udp_proxy_->Send(packet.Pass(), *destination_); } diff --git a/media/cast/test/utility/udp_proxy.h b/media/cast/test/utility/udp_proxy.h index b102573a94..ea50a2c86a 100644 --- a/media/cast/test/utility/udp_proxy.h +++ b/media/cast/test/utility/udp_proxy.h @@ -8,11 +8,14 @@ #include <vector> #include "base/basictypes.h" +#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" -#include "media/cast/transport/cast_transport_config.h" +#include "media/cast/net/cast_transport_config.h" #include "net/base/ip_endpoint.h" +#include "third_party/mt19937ar/mt19937ar.h" namespace net { class NetLog; @@ -30,7 +33,7 @@ class PacketPipe { public: PacketPipe(); virtual ~PacketPipe(); - virtual void Send(scoped_ptr<transport::Packet> packet) = 0; + virtual void Send(scoped_ptr<Packet> packet) = 0; // Allows injection of fake test runner for testing. virtual void InitOnIOThread( const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, @@ -43,6 +46,63 @@ class PacketPipe { base::TickClock* clock_; }; +// Implements a Interrupted Poisson Process for packet delivery. +// The process has 2 states: ON and OFF, the rate of switching between +// these two states are defined. +// When in ON state packets are sent according to a defined rate. +// When in OFF state packets are not sent. +// The rate above is the average rate of a poisson distribution. +class InterruptedPoissonProcess { + public: + InterruptedPoissonProcess( + const std::vector<double>& average_rates, + double coef_burstiness, + double coef_variance, + uint32 rand_seed); + ~InterruptedPoissonProcess(); + + scoped_ptr<PacketPipe> NewBuffer(size_t size); + + private: + class InternalBuffer; + + // |task_runner| is the executor of the IO thread. + // |clock| is the system clock. + void InitOnIOThread( + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, + base::TickClock* clock); + + base::TimeDelta NextEvent(double rate); + double RandDouble(); + void ComputeRates(); + void UpdateRates(); + void SwitchOff(); + void SwitchOn(); + void SendPacket(); + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + base::TickClock* clock_; + const std::vector<double> average_rates_; + const double coef_burstiness_; + const double coef_variance_; + int rate_index_; + + // The following rates are per milliseconds. + double send_rate_; + double switch_off_rate_; + double switch_on_rate_; + bool on_state_; + + std::vector<base::WeakPtr<InternalBuffer> > send_buffers_; + + // Fast pseudo random number generator. + MersenneTwister mt_rand_; + + base::WeakPtrFactory<InterruptedPoissonProcess> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(InterruptedPoissonProcess); +}; + // A UDPProxy will set up a UDP socket and bind to |local_port|. // Packets send to that port will be forwarded to |destination|. // Packets send from |destination| to |local_port| will be returned diff --git a/media/cast/test/utility/udp_proxy_main.cc b/media/cast/test/utility/udp_proxy_main.cc index 800f09dc70..9dd047abfd 100644 --- a/media/cast/test/utility/udp_proxy_main.cc +++ b/media/cast/test/utility/udp_proxy_main.cc @@ -68,7 +68,7 @@ ByteCounter out_pipe_output_counter; class ByteCounterPipe : public media::cast::test::PacketPipe { public: ByteCounterPipe(ByteCounter* counter) : counter_(counter) {} - virtual void Send(scoped_ptr<media::cast::transport::Packet> packet) + virtual void Send(scoped_ptr<media::cast::Packet> packet) OVERRIDE { counter_->Increment(packet->size()); pipe_->Send(packet.Pass()); |