fd7139993c6fc0638e9c17cb02d17643e7b398f6
[platform/framework/web/crosswalk.git] / src / media / cast / transport / cast_transport_sender_impl.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/cast/transport/cast_transport_sender_impl.h"
6
7 #include "base/single_thread_task_runner.h"
8 #include "media/cast/transport/cast_transport_config.h"
9 #include "media/cast/transport/cast_transport_defines.h"
10
11 namespace media {
12 namespace cast {
13 namespace transport {
14
15 CastTransportSender* CastTransportSender::CreateCastTransportSender(
16     base::TickClock* clock,
17     const CastTransportConfig& config,
18     const CastTransportStatusCallback& status_callback,
19     const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
20   return new CastTransportSenderImpl(
21       clock, config, status_callback, transport_task_runner.get(), NULL);
22 }
23
24 CastTransportSenderImpl::CastTransportSenderImpl(
25     base::TickClock* clock,
26     const CastTransportConfig& config,
27     const CastTransportStatusCallback& status_callback,
28     const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
29     PacketSender* external_transport)
30     : transport_(external_transport ? NULL
31                                     : new UdpTransport(transport_task_runner,
32                                                        config.local_endpoint,
33                                                        config.receiver_endpoint,
34                                                        status_callback)),
35       pacer_(clock,
36              external_transport ? external_transport : transport_.get(),
37              transport_task_runner),
38       rtcp_builder_(&pacer_),
39       audio_sender_(config, clock, transport_task_runner, &pacer_),
40       video_sender_(config, clock, transport_task_runner, &pacer_) {
41   if (audio_sender_.initialized() && video_sender_.initialized()) {
42     status_callback.Run(TRANSPORT_INITIALIZED);
43   } else {
44     status_callback.Run(TRANSPORT_UNINITIALIZED);
45   }
46 }
47
48 CastTransportSenderImpl::~CastTransportSenderImpl() {}
49
50 void CastTransportSenderImpl::SetPacketReceiver(
51     const PacketReceiverCallback& packet_receiver) {
52   transport_->StartReceiving(packet_receiver);
53 }
54
55 void CastTransportSenderImpl::InsertCodedAudioFrame(
56     const EncodedAudioFrame* audio_frame,
57     const base::TimeTicks& recorded_time) {
58   audio_sender_.InsertCodedAudioFrame(audio_frame, recorded_time);
59 }
60
61 void CastTransportSenderImpl::InsertCodedVideoFrame(
62     const EncodedVideoFrame* video_frame,
63     const base::TimeTicks& capture_time) {
64   video_sender_.InsertCodedVideoFrame(video_frame, capture_time);
65 }
66
67 void CastTransportSenderImpl::SendRtcpFromRtpSender(
68     uint32 packet_type_flags,
69     const RtcpSenderInfo& sender_info,
70     const RtcpDlrrReportBlock& dlrr,
71     const RtcpSenderLogMessage& sender_log,
72     uint32 sending_ssrc,
73     const std::string& c_name) {
74   rtcp_builder_.SendRtcpFromRtpSender(
75       packet_type_flags, sender_info, dlrr, sender_log, sending_ssrc, c_name);
76 }
77
78 void CastTransportSenderImpl::ResendPackets(
79     bool is_audio,
80     const MissingFramesAndPacketsMap& missing_packets) {
81   if (is_audio) {
82     audio_sender_.ResendPackets(missing_packets);
83   } else {
84     video_sender_.ResendPackets(missing_packets);
85   }
86 }
87
88 void CastTransportSenderImpl::SubscribeAudioRtpStatsCallback(
89     const CastTransportRtpStatistics& callback) {
90   audio_sender_.SubscribeAudioRtpStatsCallback(callback);
91 }
92
93 void CastTransportSenderImpl::SubscribeVideoRtpStatsCallback(
94     const CastTransportRtpStatistics& callback) {
95   video_sender_.SubscribeVideoRtpStatsCallback(callback);
96 }
97
98 }  // namespace transport
99 }  // namespace cast
100 }  // namespace media