OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Test application that simulates a cast sender - Data can be either generated | 5 // Test application that simulates a cast sender - Data can be either generated |
6 // or read from a file. | 6 // or read from a file. |
7 | 7 |
8 #include <queue> | 8 #include <queue> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 AudioSenderConfig GetAudioSenderConfig() { | 93 AudioSenderConfig GetAudioSenderConfig() { |
94 AudioSenderConfig audio_config; | 94 AudioSenderConfig audio_config; |
95 | 95 |
96 audio_config.rtcp_c_name = "audio_sender@a.b.c.d"; | 96 audio_config.rtcp_c_name = "audio_sender@a.b.c.d"; |
97 | 97 |
98 audio_config.use_external_encoder = false; | 98 audio_config.use_external_encoder = false; |
99 audio_config.frequency = kAudioSamplingFrequency; | 99 audio_config.frequency = kAudioSamplingFrequency; |
100 audio_config.channels = kAudioChannels; | 100 audio_config.channels = kAudioChannels; |
101 audio_config.bitrate = 64000; | 101 audio_config.bitrate = 64000; |
102 audio_config.codec = transport::kOpus; | 102 audio_config.codec = transport::kOpus; |
103 audio_config.rtp_config.ssrc = 1; | 103 audio_config.sender_ssrc = 1; |
104 audio_config.incoming_feedback_ssrc = 2; | 104 audio_config.incoming_feedback_ssrc = 2; |
105 audio_config.rtp_config.payload_type = 127; | 105 audio_config.rtp_config.payload_type = 127; |
106 audio_config.rtp_config.max_delay_ms = 300; | 106 audio_config.rtp_config.max_delay_ms = 300; |
107 return audio_config; | 107 return audio_config; |
108 } | 108 } |
109 | 109 |
110 VideoSenderConfig GetVideoSenderConfig() { | 110 VideoSenderConfig GetVideoSenderConfig() { |
111 VideoSenderConfig video_config; | 111 VideoSenderConfig video_config; |
112 | 112 |
113 video_config.rtcp_c_name = "video_sender@a.b.c.d"; | 113 video_config.rtcp_c_name = "video_sender@a.b.c.d"; |
(...skipping 12 matching lines...) Expand all Loading... |
126 // Codec. | 126 // Codec. |
127 video_config.codec = transport::kVp8; | 127 video_config.codec = transport::kVp8; |
128 video_config.max_number_of_video_buffers_used = 1; | 128 video_config.max_number_of_video_buffers_used = 1; |
129 video_config.number_of_encode_threads = 2; | 129 video_config.number_of_encode_threads = 2; |
130 | 130 |
131 // Quality options. | 131 // Quality options. |
132 video_config.min_qp = 4; | 132 video_config.min_qp = 4; |
133 video_config.max_qp = 40; | 133 video_config.max_qp = 40; |
134 | 134 |
135 // SSRCs and payload type. Don't change them. | 135 // SSRCs and payload type. Don't change them. |
136 video_config.rtp_config.ssrc = 11; | 136 video_config.sender_ssrc = 11; |
137 video_config.incoming_feedback_ssrc = 12; | 137 video_config.incoming_feedback_ssrc = 12; |
138 video_config.rtp_config.payload_type = 96; | 138 video_config.rtp_config.payload_type = 96; |
139 video_config.rtp_config.max_delay_ms = 300; | 139 video_config.rtp_config.max_delay_ms = 300; |
140 return video_config; | 140 return video_config; |
141 } | 141 } |
142 | 142 |
143 void AVFreeFrame(AVFrame* frame) { avcodec_free_frame(&frame); } | 143 void AVFreeFrame(AVFrame* frame) { avcodec_free_frame(&frame); } |
144 | 144 |
145 class SendProcess { | 145 class SendProcess { |
146 public: | 146 public: |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 AVSampleFormatToSampleFormat( | 568 AVSampleFormatToSampleFormat( |
569 av_audio_context()->sample_fmt), | 569 av_audio_context()->sample_fmt), |
570 ChannelLayoutToChromeChannelLayout( | 570 ChannelLayoutToChromeChannelLayout( |
571 av_audio_context()->channel_layout, | 571 av_audio_context()->channel_layout, |
572 av_audio_context()->channels), | 572 av_audio_context()->channels), |
573 av_audio_context()->channels, | 573 av_audio_context()->channels, |
574 av_audio_context()->sample_rate, | 574 av_audio_context()->sample_rate, |
575 frames_read, | 575 frames_read, |
576 &avframe->data[0], | 576 &avframe->data[0], |
577 // Note: Not all files have correct values for pkt_pts. | 577 // Note: Not all files have correct values for pkt_pts. |
578 base::TimeDelta::FromMilliseconds(avframe->pkt_pts)); | 578 base::TimeDelta::FromMilliseconds(avframe->pkt_pts), |
| 579 // TODO(hclam): Give accurate duration based on samples. |
| 580 base::TimeDelta()); |
579 audio_algo_.EnqueueBuffer(buffer); | 581 audio_algo_.EnqueueBuffer(buffer); |
580 } while (packet_temp.size > 0); | 582 } while (packet_temp.size > 0); |
581 avcodec_free_frame(&avframe); | 583 avcodec_free_frame(&avframe); |
582 | 584 |
583 const int frames_needed_to_scale = | 585 const int frames_needed_to_scale = |
584 playback_rate_ * av_audio_context()->sample_rate / | 586 playback_rate_ * av_audio_context()->sample_rate / |
585 kAudioPacketsPerSecond; | 587 kAudioPacketsPerSecond; |
586 while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { | 588 while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { |
587 if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), | 589 if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), |
588 audio_fifo_input_bus_->frames())) { | 590 audio_fifo_input_bus_->frames())) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 std::queue<AudioBus*> audio_bus_queue_; | 739 std::queue<AudioBus*> audio_bus_queue_; |
738 | 740 |
739 DISALLOW_COPY_AND_ASSIGN(SendProcess); | 741 DISALLOW_COPY_AND_ASSIGN(SendProcess); |
740 }; | 742 }; |
741 | 743 |
742 } // namespace cast | 744 } // namespace cast |
743 } // namespace media | 745 } // namespace media |
744 | 746 |
745 namespace { | 747 namespace { |
746 void UpdateCastTransportStatus( | 748 void UpdateCastTransportStatus( |
747 media::cast::transport::CastTransportStatus status) { | 749 media::cast::transport::CastTransportStatus status) {} |
748 VLOG(21) << "Transport status: " << status; | |
749 } | |
750 | 750 |
751 void LogRawEvents( | 751 void LogRawEvents( |
752 const scoped_refptr<media::cast::CastEnvironment>& cast_environment, | 752 const scoped_refptr<media::cast::CastEnvironment>& cast_environment, |
753 const std::vector<media::cast::PacketEvent>& packet_events) { | 753 const std::vector<media::cast::PacketEvent>& packet_events) { |
754 VLOG(1) << "Got packet events from transport, size: " << packet_events.size(); | 754 VLOG(1) << "Got packet events from transport, size: " << packet_events.size(); |
755 for (std::vector<media::cast::PacketEvent>::const_iterator it = | 755 for (std::vector<media::cast::PacketEvent>::const_iterator it = |
756 packet_events.begin(); | 756 packet_events.begin(); |
757 it != packet_events.end(); | 757 it != packet_events.end(); |
758 ++it) { | 758 ++it) { |
759 cast_environment->Logging()->InsertPacketEvent(it->timestamp, | 759 cast_environment->Logging()->InsertPacketEvent(it->timestamp, |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 LOG(INFO) << "Sending to " << remote_ip_address << ":" << remote_port | 899 LOG(INFO) << "Sending to " << remote_ip_address << ":" << remote_port |
900 << "."; | 900 << "."; |
901 | 901 |
902 media::cast::AudioSenderConfig audio_config = | 902 media::cast::AudioSenderConfig audio_config = |
903 media::cast::GetAudioSenderConfig(); | 903 media::cast::GetAudioSenderConfig(); |
904 media::cast::VideoSenderConfig video_config = | 904 media::cast::VideoSenderConfig video_config = |
905 media::cast::GetVideoSenderConfig(); | 905 media::cast::GetVideoSenderConfig(); |
906 | 906 |
907 // Running transport on the main thread. | 907 // Running transport on the main thread. |
908 // Setting up transport config. | 908 // Setting up transport config. |
| 909 media::cast::transport::CastTransportAudioConfig transport_audio_config; |
| 910 media::cast::transport::CastTransportVideoConfig transport_video_config; |
909 net::IPEndPoint remote_endpoint = | 911 net::IPEndPoint remote_endpoint = |
910 CreateUDPAddress(remote_ip_address, remote_port); | 912 CreateUDPAddress(remote_ip_address, remote_port); |
| 913 transport_audio_config.base.ssrc = audio_config.sender_ssrc; |
| 914 transport_audio_config.base.rtp_config = audio_config.rtp_config; |
| 915 transport_video_config.base.ssrc = video_config.sender_ssrc; |
| 916 transport_video_config.base.rtp_config = video_config.rtp_config; |
911 | 917 |
912 // Enable raw event and stats logging. | 918 // Enable raw event and stats logging. |
913 // Running transport on the main thread. | 919 // Running transport on the main thread. |
914 scoped_refptr<media::cast::CastEnvironment> cast_environment( | 920 scoped_refptr<media::cast::CastEnvironment> cast_environment( |
915 new media::cast::CastEnvironment( | 921 new media::cast::CastEnvironment( |
916 make_scoped_ptr<base::TickClock>(new base::DefaultTickClock()), | 922 make_scoped_ptr<base::TickClock>(new base::DefaultTickClock()), |
917 io_message_loop.message_loop_proxy(), | 923 io_message_loop.message_loop_proxy(), |
918 audio_thread.message_loop_proxy(), | 924 audio_thread.message_loop_proxy(), |
919 video_thread.message_loop_proxy())); | 925 video_thread.message_loop_proxy())); |
920 | 926 |
921 // SendProcess initialization. | 927 // SendProcess initialization. |
922 scoped_ptr<media::cast::SendProcess> send_process( | 928 scoped_ptr<media::cast::SendProcess> send_process( |
923 new media::cast::SendProcess(test_thread.message_loop_proxy(), | 929 new media::cast::SendProcess(test_thread.message_loop_proxy(), |
924 cast_environment->Clock(), | 930 cast_environment->Clock(), |
925 video_config)); | 931 video_config)); |
926 | 932 |
927 // CastTransportSender initialization. | 933 // CastTransportSender initialization. |
928 scoped_ptr<media::cast::transport::CastTransportSender> transport_sender = | 934 scoped_ptr<media::cast::transport::CastTransportSender> transport_sender = |
929 media::cast::transport::CastTransportSender::Create( | 935 media::cast::transport::CastTransportSender::Create( |
930 NULL, // net log. | 936 NULL, // net log. |
931 cast_environment->Clock(), | 937 cast_environment->Clock(), |
932 remote_endpoint, | 938 remote_endpoint, |
933 base::Bind(&UpdateCastTransportStatus), | 939 base::Bind(&UpdateCastTransportStatus), |
934 base::Bind(&LogRawEvents, cast_environment), | 940 base::Bind(&LogRawEvents, cast_environment), |
935 base::TimeDelta::FromSeconds(1), | 941 base::TimeDelta::FromSeconds(1), |
936 io_message_loop.message_loop_proxy()); | 942 io_message_loop.message_loop_proxy()); |
| 943 transport_sender->InitializeAudio(transport_audio_config); |
| 944 transport_sender->InitializeVideo(transport_video_config); |
937 | 945 |
938 // CastSender initialization. | 946 // CastSender initialization. |
939 scoped_ptr<media::cast::CastSender> cast_sender = | 947 scoped_ptr<media::cast::CastSender> cast_sender = |
940 media::cast::CastSender::Create(cast_environment, transport_sender.get()); | 948 media::cast::CastSender::Create(cast_environment, transport_sender.get()); |
941 cast_sender->InitializeVideo( | 949 cast_sender->InitializeVideo( |
942 send_process->get_video_config(), | 950 send_process->get_video_config(), |
943 base::Bind(&InitializationResult), | 951 base::Bind(&InitializationResult), |
944 media::cast::CreateDefaultVideoEncodeAcceleratorCallback(), | 952 media::cast::CreateDefaultVideoEncodeAcceleratorCallback(), |
945 media::cast::CreateDefaultVideoEncodeMemoryCallback()); | 953 media::cast::CreateDefaultVideoEncodeMemoryCallback()); |
946 cast_sender->InitializeAudio(audio_config, base::Bind(&InitializationResult)); | 954 cast_sender->InitializeAudio(audio_config, base::Bind(&InitializationResult)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1010 base::Passed(&audio_stats_subscriber), | 1018 base::Passed(&audio_stats_subscriber), |
1011 base::Passed(&offset_estimator)), | 1019 base::Passed(&offset_estimator)), |
1012 base::TimeDelta::FromSeconds(logging_duration_seconds)); | 1020 base::TimeDelta::FromSeconds(logging_duration_seconds)); |
1013 | 1021 |
1014 send_process->Start(cast_sender->audio_frame_input(), | 1022 send_process->Start(cast_sender->audio_frame_input(), |
1015 cast_sender->video_frame_input()); | 1023 cast_sender->video_frame_input()); |
1016 | 1024 |
1017 io_message_loop.Run(); | 1025 io_message_loop.Run(); |
1018 return 0; | 1026 return 0; |
1019 } | 1027 } |
OLD | NEW |