# 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("//build/config/android/config.gni") import("//build/config/features.gni") import("//build/config/ui.gni") import("//testing/test.gni") import("//third_party/protobuf/proto_library.gni") proto_library("logging_proto") { sources = [ "logging/proto/raw_events.proto", ] } # Common code shared by all cast components. source_set("common") { sources = [ "cast_config.cc", "cast_config.h", "cast_defines.h", "cast_environment.cc", "cast_environment.h", "common/clock_drift_smoother.cc", "common/clock_drift_smoother.h", "common/expanded_value_base.h", "common/rtp_time.cc", "common/rtp_time.h", "common/transport_encryption_handler.cc", "common/transport_encryption_handler.h", "constants.h", "logging/encoding_event_subscriber.cc", "logging/encoding_event_subscriber.h", "logging/log_deserializer.cc", "logging/log_deserializer.h", "logging/log_event_dispatcher.cc", "logging/log_event_dispatcher.h", "logging/log_serializer.cc", "logging/log_serializer.h", "logging/logging_defines.cc", "logging/logging_defines.h", "logging/proto/proto_utils.cc", "logging/raw_event_subscriber.h", "logging/raw_event_subscriber_bundle.cc", "logging/raw_event_subscriber_bundle.h", "logging/receiver_time_offset_estimator.h", "logging/receiver_time_offset_estimator_impl.cc", "logging/receiver_time_offset_estimator_impl.h", "logging/simple_event_subscriber.cc", "logging/simple_event_subscriber.h", "logging/stats_event_subscriber.cc", "logging/stats_event_subscriber.h", ] deps = [ ":logging_proto", "//base", "//crypto", "//net", "//third_party/zlib", ] public_deps = [ # The generated headers reference headers within protobuf_lite, so # dependencies must be able to find those headers too. ":logging_proto", ] } source_set("net") { sources = [ "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/receiver_rtcp_session.cc", "net/rtcp/receiver_rtcp_session.h", "net/rtcp/rtcp_builder.cc", "net/rtcp/rtcp_builder.h", "net/rtcp/rtcp_defines.cc", "net/rtcp/rtcp_defines.h", "net/rtcp/rtcp_utility.cc", "net/rtcp/rtcp_utility.h", "net/rtcp/sender_rtcp_session.cc", "net/rtcp/sender_rtcp_session.h", "net/rtp/packet_storage.cc", "net/rtp/packet_storage.h", "net/rtp/rtp_defines.cc", "net/rtp/rtp_defines.h", "net/rtp/rtp_packetizer.cc", "net/rtp/rtp_packetizer.h", "net/rtp/rtp_parser.cc", "net/rtp/rtp_parser.h", "net/rtp/rtp_sender.cc", "net/rtp/rtp_sender.h", "net/udp_transport.cc", "net/udp_transport.h", ] deps = [ ":common", ] public_deps = [ ":common", ] } source_set("sender") { sources = [ "cast_sender.h", "cast_sender_impl.cc", "cast_sender_impl.h", "sender/audio_encoder.cc", "sender/audio_encoder.h", "sender/audio_sender.cc", "sender/audio_sender.h", "sender/congestion_control.cc", "sender/congestion_control.h", "sender/external_video_encoder.cc", "sender/external_video_encoder.h", "sender/fake_software_video_encoder.cc", "sender/fake_software_video_encoder.h", "sender/frame_sender.cc", "sender/frame_sender.h", "sender/performance_metrics_overlay.cc", "sender/performance_metrics_overlay.h", "sender/sender_encoded_frame.cc", "sender/sender_encoded_frame.h", "sender/size_adaptable_video_encoder_base.cc", "sender/size_adaptable_video_encoder_base.h", "sender/software_video_encoder.h", "sender/video_encoder.cc", "sender/video_encoder.h", "sender/video_encoder_impl.cc", "sender/video_encoder_impl.h", "sender/video_frame_factory.h", "sender/video_sender.cc", "sender/video_sender.h", "sender/vp8_encoder.cc", "sender/vp8_encoder.h", "sender/vp8_quantizer_parser.cc", "sender/vp8_quantizer_parser.h", ] deps = [ ":common", ":net", "//media", "//media:shared_memory_support", "//third_party/libvpx_new", "//third_party/opus", "//ui/gfx/geometry", ] # use a restricted subset of media and no software codecs on iOS if (is_ios) { deps += [ "//media:media_for_cast_ios" ] deps -= [ "//media", "//third_party/libvpx_new", "//third_party/opus", ] sources -= [ "sender/external_video_encoder.cc", "sender/external_video_encoder.h", "sender/video_encoder_impl.cc", "sender/video_encoder_impl.h", "sender/vp8_encoder.cc", "sender/vp8_encoder.h", "sender/vp8_quantizer_parser.cc", "sender/vp8_quantizer_parser.h", ] } libs = [] # iOS and OS X encoders if (is_ios || is_mac) { sources += [ "sender/h264_vt_encoder.cc", "sender/h264_vt_encoder.h", ] libs += [ "AudioToolbox.framework", "CoreVideo.framework", ] } } source_set("receiver") { sources = [ "cast_receiver.h", "net/rtp/cast_message_builder.cc", "net/rtp/cast_message_builder.h", "net/rtp/frame_buffer.cc", "net/rtp/frame_buffer.h", "net/rtp/framer.cc", "net/rtp/framer.h", "net/rtp/receiver_stats.cc", "net/rtp/receiver_stats.h", "receiver/audio_decoder.cc", "receiver/audio_decoder.h", "receiver/cast_receiver_impl.cc", "receiver/cast_receiver_impl.h", "receiver/frame_receiver.cc", "receiver/frame_receiver.h", "receiver/video_decoder.cc", "receiver/video_decoder.h", ] deps = [ ":common", ":net", "//media", "//media:shared_memory_support", "//third_party/libvpx_new", "//third_party/libyuv", "//third_party/opus", "//ui/gfx/geometry", ] # use a restricted subset of media and no software codecs on iOS if (is_ios) { deps += [ "//media:media_for_cast_ios" ] deps -= [ "//media", "//third_party/libvpx_new", "//third_party/opus", ] } } static_library("test_support") { testonly = true sources = [ "test/fake_receiver_time_offset_estimator.cc", "test/fake_receiver_time_offset_estimator.h", "test/fake_single_thread_task_runner.cc", "test/fake_single_thread_task_runner.h", "test/loopback_transport.cc", "test/loopback_transport.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/utility/audio_utility.cc", "test/utility/audio_utility.h", "test/utility/barcode.cc", "test/utility/barcode.h", "test/utility/default_config.cc", "test/utility/default_config.h", "test/utility/in_process_receiver.cc", "test/utility/in_process_receiver.h", "test/utility/input_builder.cc", "test/utility/input_builder.h", "test/utility/net_utility.cc", "test/utility/net_utility.h", "test/utility/standalone_cast_environment.cc", "test/utility/standalone_cast_environment.h", "test/utility/test_util.cc", "test/utility/test_util.h", "test/utility/udp_proxy.cc", "test/utility/udp_proxy.h", "test/utility/video_utility.cc", "test/utility/video_utility.h", ] deps = [ ":net", ":receiver", "//base/test:test_support", "//media:test_support", "//testing/gtest", "//third_party/libyuv", "//third_party/mt19937ar", "//ui/gfx:test_support", ] # FFMPEG software video decoders are not available on Android and/or # Chromecast content_shell builds. # # TODO(miu): There *are* hardware decoder APIs available via FFMPEG, and we # should use those for the Android receiver. See media's BUILD.gn for usage # details. http://crbug.com/558714 if (!is_android && !is_chromecast) { sources += [ "test/fake_media_source.cc", "test/fake_media_source.h", ] deps += [ "//third_party/ffmpeg" ] } } test("cast_unittests") { sources = [ "common/expanded_value_base_unittest.cc", "common/rtp_time_unittest.cc", "logging/encoding_event_subscriber_unittest.cc", "logging/receiver_time_offset_estimator_impl_unittest.cc", "logging/serialize_deserialize_test.cc", "logging/simple_event_subscriber_unittest.cc", "logging/stats_event_subscriber_unittest.cc", "net/cast_transport_sender_impl_unittest.cc", "net/frame_id_wrap_helper_test.cc", "net/mock_cast_transport_sender.cc", "net/mock_cast_transport_sender.h", "net/pacing/mock_paced_packet_sender.cc", "net/pacing/mock_paced_packet_sender.h", "net/pacing/paced_sender_unittest.cc", "net/rtcp/receiver_rtcp_event_subscriber_unittest.cc", "net/rtcp/rtcp_builder_unittest.cc", "net/rtcp/rtcp_unittest.cc", "net/rtcp/rtcp_utility_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_packet_builder.cc", "net/rtp/rtp_packetizer_unittest.cc", "net/rtp/rtp_parser_unittest.cc", "net/udp_transport_unittest.cc", "receiver/audio_decoder_unittest.cc", "receiver/frame_receiver_unittest.cc", "receiver/video_decoder_unittest.cc", "sender/audio_encoder_unittest.cc", "sender/audio_sender_unittest.cc", "sender/congestion_control_unittest.cc", "sender/external_video_encoder_unittest.cc", "sender/fake_video_encode_accelerator_factory.cc", "sender/fake_video_encode_accelerator_factory.h", "sender/video_encoder_unittest.cc", "sender/video_sender_unittest.cc", "sender/vp8_quantizer_parser_unittest.cc", "test/end2end_unittest.cc", "test/utility/audio_utility_unittest.cc", "test/utility/barcode_unittest.cc", ] deps = [ ":common", ":receiver", ":sender", ":test_support", "//base/test:run_all_unittests", "//testing/gmock", "//testing/gtest", ] if (is_android) { deps += [ "//testing/android/native_test:native_test_native_code" ] } } # TODO(miu): This can be rolled into cast_unittests now that FFMPEG dependency # issues are resolved for iOS; but there are bot/isolates to update too. if (is_ios || is_mac) { test("cast_h264_vt_encoder_unittests") { sources = [ "sender/h264_vt_encoder_unittest.cc", ] deps = [ ":common", ":sender", ":test_support", "//testing/gmock", "//testing/gtest", "//third_party/ffmpeg", ] } } if (is_win || is_mac || (is_linux && !is_chromeos)) { # This is a target for the collection of cast development tools. They are # not built/linked into the Chromium browser. group("testing_tools") { testonly = true deps = [ ":cast_benchmarks", ":cast_receiver_app", ":cast_sender_app", ":cast_simulator", ":generate_barcode_video", ":generate_timecode_audio", ":udp_proxy", ] } test("cast_benchmarks") { testonly = true sources = [ "test/cast_benchmarks.cc", ] deps = [ ":common", ":net", ":receiver", ":sender", ":test_support", "//net", "//testing/gtest", ] } executable("cast_receiver_app") { testonly = true sources = [ "test/receiver.cc", ] deps = [ ":common", ":net", ":receiver", ":test_support", ] if (is_linux && !is_chromeos && use_x11) { sources += [ "test/linux_output_window.cc", "test/linux_output_window.h", ] configs += [ "//build/config/linux:x11", "//build/config/linux:xext", ] deps += [ "//third_party/libyuv" ] } } executable("cast_sender_app") { testonly = true sources = [ "test/sender.cc", ] deps = [ ":common", ":net", ":sender", ":test_support", ] } proto_library("network_simulation_model_proto") { visibility = [ ":cast_simulator" ] sources = [ "test/proto/network_simulation_model.proto", ] } executable("cast_simulator") { testonly = true sources = [ "test/simulator.cc", ] deps = [ ":common", ":net", ":network_simulation_model_proto", ":sender", ":test_support", ] } executable("generate_barcode_video") { testonly = true sources = [ "test/utility/generate_barcode_video.cc", ] deps = [ ":test_support", "//base", "//build/config/sanitizers:deps", "//media", ] } executable("generate_timecode_audio") { testonly = true sources = [ "test/utility/generate_timecode_audio.cc", ] deps = [ ":test_support", "//base", "//build/config/sanitizers:deps", "//media", ] } executable("udp_proxy") { testonly = true sources = [ "test/utility/udp_proxy_main.cc", ] deps = [ ":test_support", "//base", "//build/config/sanitizers:deps", ] } } else { # !(is_win || is_mac || (is_linux && !is_chromeos)) # The testing tools are only built for the desktop platforms. group("testing_tools") { } } if (is_linux && !is_chromeos) { test("tap_proxy") { sources = [ "test/utility/tap_proxy.cc", ] deps = [ ":test_support", "//base", "//media", ] } } # Projects external to Chromium can build cast_sender and/or cast_receiver to # produce libraries to link with their applications. Chromium targets should # not reference these. static_library("cast_sender") { deps = [ ":sender", ] } static_library("cast_receiver") { deps = [ ":receiver", ] }