#include "media/cast/transport/cast_transport_sender_impl.h"
-#include "base/task_runner.h"
+#include "base/single_thread_task_runner.h"
#include "media/cast/transport/cast_transport_config.h"
#include "media/cast/transport/cast_transport_defines.h"
namespace cast {
namespace transport {
-CastTransportSender* CastTransportSender::CreateCastTransportSender(
+scoped_ptr<CastTransportSender> CastTransportSender::Create(
+ net::NetLog* net_log,
base::TickClock* clock,
- const CastTransportConfig& config,
+ const net::IPEndPoint& remote_end_point,
const CastTransportStatusCallback& status_callback,
- const scoped_refptr<base::TaskRunner>& transport_task_runner) {
- return new CastTransportSenderImpl(clock, config, status_callback,
- transport_task_runner.get());
+ const BulkRawEventsCallback& raw_events_callback,
+ base::TimeDelta raw_events_callback_interval,
+ const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
+ return scoped_ptr<CastTransportSender>(
+ new CastTransportSenderImpl(net_log,
+ clock,
+ remote_end_point,
+ status_callback,
+ raw_events_callback,
+ raw_events_callback_interval,
+ transport_task_runner.get(),
+ NULL));
}
CastTransportSenderImpl::CastTransportSenderImpl(
+ net::NetLog* net_log,
base::TickClock* clock,
- const CastTransportConfig& config,
+ const net::IPEndPoint& remote_end_point,
const CastTransportStatusCallback& status_callback,
- const scoped_refptr<base::TaskRunner>& transport_task_runner)
- : pacer_(clock, &config, NULL, transport_task_runner, status_callback),
+ const BulkRawEventsCallback& raw_events_callback,
+ base::TimeDelta raw_events_callback_interval,
+ const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
+ PacketSender* external_transport)
+ : clock_(clock),
+ status_callback_(status_callback),
+ transport_task_runner_(transport_task_runner),
+ transport_(external_transport ? NULL
+ : new UdpTransport(net_log,
+ transport_task_runner,
+ net::IPEndPoint(),
+ remote_end_point,
+ status_callback)),
+ logging_(),
+ pacer_(clock,
+ &logging_,
+ external_transport ? external_transport : transport_.get(),
+ transport_task_runner),
rtcp_builder_(&pacer_),
- audio_sender_(config, clock, &pacer_),
- video_sender_(config, clock, &pacer_) {
- if (audio_sender_.initialized() && video_sender_.initialized()) {
- status_callback.Run(TRANSPORT_INITIALIZED);
- } else {
- status_callback.Run(TRANSPORT_UNINITIALIZED);
+ raw_events_callback_(raw_events_callback) {
+ if (!raw_events_callback_.is_null()) {
+ DCHECK(raw_events_callback_interval > base::TimeDelta());
+ event_subscriber_.reset(new SimpleEventSubscriber);
+ logging_.AddRawEventSubscriber(event_subscriber_.get());
+ raw_events_timer_.Start(FROM_HERE,
+ raw_events_callback_interval,
+ this,
+ &CastTransportSenderImpl::SendRawEvents);
}
}
CastTransportSenderImpl::~CastTransportSenderImpl() {
+ if (event_subscriber_.get())
+ logging_.RemoveRawEventSubscriber(event_subscriber_.get());
+}
+
+void CastTransportSenderImpl::InitializeAudio(
+ const CastTransportAudioConfig& config) {
+ pacer_.RegisterAudioSsrc(config.rtp.config.ssrc);
+ audio_sender_.reset(new TransportAudioSender(
+ config, clock_, transport_task_runner_, &pacer_));
+ if (audio_sender_->initialized())
+ status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED);
+ else
+ status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED);
+}
+
+void CastTransportSenderImpl::InitializeVideo(
+ const CastTransportVideoConfig& config) {
+ pacer_.RegisterVideoSsrc(config.rtp.config.ssrc);
+ video_sender_.reset(new TransportVideoSender(
+ config, clock_, transport_task_runner_, &pacer_));
+ if (video_sender_->initialized())
+ status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED);
+ else
+ status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED);
}
void CastTransportSenderImpl::SetPacketReceiver(
- scoped_refptr<PacketReceiver> packet_receiver) {
- pacer_.SetPacketReceiver(packet_receiver);
+ const PacketReceiverCallback& packet_receiver) {
+ transport_->StartReceiving(packet_receiver);
}
void CastTransportSenderImpl::InsertCodedAudioFrame(
const EncodedAudioFrame* audio_frame,
const base::TimeTicks& recorded_time) {
- audio_sender_.InsertCodedAudioFrame(audio_frame, recorded_time);
+ DCHECK(audio_sender_) << "Audio sender uninitialized";
+ audio_sender_->InsertCodedAudioFrame(audio_frame, recorded_time);
}
void CastTransportSenderImpl::InsertCodedVideoFrame(
const EncodedVideoFrame* video_frame,
const base::TimeTicks& capture_time) {
- video_sender_.InsertCodedVideoFrame(video_frame, capture_time);
+ DCHECK(video_sender_) << "Video sender uninitialized";
+ video_sender_->InsertCodedVideoFrame(video_frame, capture_time);
}
void CastTransportSenderImpl::SendRtcpFromRtpSender(
const RtcpSenderLogMessage& sender_log,
uint32 sending_ssrc,
const std::string& c_name) {
- rtcp_builder_.SendRtcpFromRtpSender(packet_type_flags,
- sender_info,
- dlrr,
- sender_log,
- sending_ssrc,
- c_name);
+ rtcp_builder_.SendRtcpFromRtpSender(
+ packet_type_flags, sender_info, dlrr, sender_log, sending_ssrc, c_name);
}
void CastTransportSenderImpl::ResendPackets(
- bool is_audio, const MissingFramesAndPacketsMap& missing_packets) {
+ bool is_audio,
+ const MissingFramesAndPacketsMap& missing_packets) {
if (is_audio) {
- audio_sender_.ResendPackets(missing_packets);
+ DCHECK(audio_sender_) << "Audio sender uninitialized";
+ audio_sender_->ResendPackets(missing_packets);
} else {
- video_sender_.ResendPackets(missing_packets);
+ DCHECK(video_sender_) << "Video sender uninitialized";
+ video_sender_->ResendPackets(missing_packets);
}
}
-void CastTransportSenderImpl::RtpAudioStatistics(
- const base::TimeTicks& now,
- RtcpSenderInfo* sender_info) {
- audio_sender_.GetStatistics(now, sender_info);
+void CastTransportSenderImpl::SubscribeAudioRtpStatsCallback(
+ const CastTransportRtpStatistics& callback) {
+ DCHECK(audio_sender_) << "Audio sender uninitialized";
+ audio_sender_->SubscribeAudioRtpStatsCallback(callback);
}
-void CastTransportSenderImpl::RtpVideoStatistics(
- const base::TimeTicks& now,
- RtcpSenderInfo* sender_info) {
- video_sender_.GetStatistics(now, sender_info);
+void CastTransportSenderImpl::SubscribeVideoRtpStatsCallback(
+ const CastTransportRtpStatistics& callback) {
+ DCHECK(video_sender_) << "Video sender uninitialized";
+ video_sender_->SubscribeVideoRtpStatsCallback(callback);
}
-void CastTransportSenderImpl::InsertFakeTransportForTesting(
- PacketSender* fake_transport) {
- pacer_.InsertFakeTransportForTesting(fake_transport);
+void CastTransportSenderImpl::SendRawEvents() {
+ DCHECK(event_subscriber_.get());
+ DCHECK(!raw_events_callback_.is_null());
+ std::vector<PacketEvent> packet_events;
+ event_subscriber_->GetPacketEventsAndReset(&packet_events);
+ raw_events_callback_.Run(packet_events);
}
} // namespace transport