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.sender_ssrc = 1; | 103 audio_config.rtp_config.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.sender_ssrc = 11; | 136 video_config.rtp_config.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()); | |
581 audio_algo_.EnqueueBuffer(buffer); | 579 audio_algo_.EnqueueBuffer(buffer); |
582 } while (packet_temp.size > 0); | 580 } while (packet_temp.size > 0); |
583 avcodec_free_frame(&avframe); | 581 avcodec_free_frame(&avframe); |
584 | 582 |
585 const int frames_needed_to_scale = | 583 const int frames_needed_to_scale = |
586 playback_rate_ * av_audio_context()->sample_rate / | 584 playback_rate_ * av_audio_context()->sample_rate / |
587 kAudioPacketsPerSecond; | 585 kAudioPacketsPerSecond; |
588 while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { | 586 while (frames_needed_to_scale <= audio_algo_.frames_buffered()) { |
589 if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), | 587 if (!audio_algo_.FillBuffer(audio_fifo_input_bus_.get(), |
590 audio_fifo_input_bus_->frames())) { | 588 audio_fifo_input_bus_->frames())) { |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 std::queue<AudioBus*> audio_bus_queue_; | 737 std::queue<AudioBus*> audio_bus_queue_; |
740 | 738 |
741 DISALLOW_COPY_AND_ASSIGN(SendProcess); | 739 DISALLOW_COPY_AND_ASSIGN(SendProcess); |
742 }; | 740 }; |
743 | 741 |
744 } // namespace cast | 742 } // namespace cast |
745 } // namespace media | 743 } // namespace media |
746 | 744 |
747 namespace { | 745 namespace { |
748 void UpdateCastTransportStatus( | 746 void UpdateCastTransportStatus( |
749 media::cast::transport::CastTransportStatus status) {} | 747 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; | |
911 net::IPEndPoint remote_endpoint = | 909 net::IPEndPoint remote_endpoint = |
912 CreateUDPAddress(remote_ip_address, remote_port); | 910 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; | |
917 | 911 |
918 // Enable raw event and stats logging. | 912 // Enable raw event and stats logging. |
919 // Running transport on the main thread. | 913 // Running transport on the main thread. |
920 scoped_refptr<media::cast::CastEnvironment> cast_environment( | 914 scoped_refptr<media::cast::CastEnvironment> cast_environment( |
921 new media::cast::CastEnvironment( | 915 new media::cast::CastEnvironment( |
922 make_scoped_ptr<base::TickClock>(new base::DefaultTickClock()), | 916 make_scoped_ptr<base::TickClock>(new base::DefaultTickClock()), |
923 io_message_loop.message_loop_proxy(), | 917 io_message_loop.message_loop_proxy(), |
924 audio_thread.message_loop_proxy(), | 918 audio_thread.message_loop_proxy(), |
925 video_thread.message_loop_proxy())); | 919 video_thread.message_loop_proxy())); |
926 | 920 |
927 // SendProcess initialization. | 921 // SendProcess initialization. |
928 scoped_ptr<media::cast::SendProcess> send_process( | 922 scoped_ptr<media::cast::SendProcess> send_process( |
929 new media::cast::SendProcess(test_thread.message_loop_proxy(), | 923 new media::cast::SendProcess(test_thread.message_loop_proxy(), |
930 cast_environment->Clock(), | 924 cast_environment->Clock(), |
931 video_config)); | 925 video_config)); |
932 | 926 |
933 // CastTransportSender initialization. | 927 // CastTransportSender initialization. |
934 scoped_ptr<media::cast::transport::CastTransportSender> transport_sender = | 928 scoped_ptr<media::cast::transport::CastTransportSender> transport_sender = |
935 media::cast::transport::CastTransportSender::Create( | 929 media::cast::transport::CastTransportSender::Create( |
936 NULL, // net log. | 930 NULL, // net log. |
937 cast_environment->Clock(), | 931 cast_environment->Clock(), |
938 remote_endpoint, | 932 remote_endpoint, |
939 base::Bind(&UpdateCastTransportStatus), | 933 base::Bind(&UpdateCastTransportStatus), |
940 base::Bind(&LogRawEvents, cast_environment), | 934 base::Bind(&LogRawEvents, cast_environment), |
941 base::TimeDelta::FromSeconds(1), | 935 base::TimeDelta::FromSeconds(1), |
942 io_message_loop.message_loop_proxy()); | 936 io_message_loop.message_loop_proxy()); |
943 transport_sender->InitializeAudio(transport_audio_config); | |
944 transport_sender->InitializeVideo(transport_video_config); | |
945 | 937 |
946 // CastSender initialization. | 938 // CastSender initialization. |
947 scoped_ptr<media::cast::CastSender> cast_sender = | 939 scoped_ptr<media::cast::CastSender> cast_sender = |
948 media::cast::CastSender::Create(cast_environment, transport_sender.get()); | 940 media::cast::CastSender::Create(cast_environment, transport_sender.get()); |
949 cast_sender->InitializeVideo( | 941 cast_sender->InitializeVideo( |
950 send_process->get_video_config(), | 942 send_process->get_video_config(), |
951 base::Bind(&InitializationResult), | 943 base::Bind(&InitializationResult), |
952 media::cast::CreateDefaultVideoEncodeAcceleratorCallback(), | 944 media::cast::CreateDefaultVideoEncodeAcceleratorCallback(), |
953 media::cast::CreateDefaultVideoEncodeMemoryCallback()); | 945 media::cast::CreateDefaultVideoEncodeMemoryCallback()); |
954 cast_sender->InitializeAudio(audio_config, base::Bind(&InitializationResult)); | 946 cast_sender->InitializeAudio(audio_config, base::Bind(&InitializationResult)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 base::Passed(&audio_stats_subscriber), | 1010 base::Passed(&audio_stats_subscriber), |
1019 base::Passed(&offset_estimator)), | 1011 base::Passed(&offset_estimator)), |
1020 base::TimeDelta::FromSeconds(logging_duration_seconds)); | 1012 base::TimeDelta::FromSeconds(logging_duration_seconds)); |
1021 | 1013 |
1022 send_process->Start(cast_sender->audio_frame_input(), | 1014 send_process->Start(cast_sender->audio_frame_input(), |
1023 cast_sender->video_frame_input()); | 1015 cast_sender->video_frame_input()); |
1024 | 1016 |
1025 io_message_loop.Run(); | 1017 io_message_loop.Run(); |
1026 return 0; | 1018 return 0; |
1027 } | 1019 } |
OLD | NEW |