Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1187)

Side by Side Diff: media/cast/receiver/cast_receiver_impl.cc

Issue 765643006: Cast: Make receiver use cast_transport (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix end2end test Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 #include "media/cast/receiver/cast_receiver_impl.h" 5 #include "media/cast/receiver/cast_receiver_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "media/cast/receiver/audio_decoder.h" 13 #include "media/cast/receiver/audio_decoder.h"
14 #include "media/cast/receiver/video_decoder.h" 14 #include "media/cast/receiver/video_decoder.h"
15 15
16 namespace media { 16 namespace media {
17 namespace cast { 17 namespace cast {
18 18
19 scoped_ptr<CastReceiver> CastReceiver::Create( 19 scoped_ptr<CastReceiver> CastReceiver::Create(
20 scoped_refptr<CastEnvironment> cast_environment, 20 scoped_refptr<CastEnvironment> cast_environment,
21 const FrameReceiverConfig& audio_config, 21 const FrameReceiverConfig& audio_config,
22 const FrameReceiverConfig& video_config, 22 const FrameReceiverConfig& video_config,
23 PacketSender* const packet_sender) { 23 CastTransportSender* const transport) {
24 return scoped_ptr<CastReceiver>(new CastReceiverImpl( 24 return scoped_ptr<CastReceiver>(new CastReceiverImpl(
25 cast_environment, audio_config, video_config, packet_sender)); 25 cast_environment, audio_config, video_config, transport));
26 } 26 }
27 27
28 CastReceiverImpl::CastReceiverImpl( 28 CastReceiverImpl::CastReceiverImpl(
29 scoped_refptr<CastEnvironment> cast_environment, 29 scoped_refptr<CastEnvironment> cast_environment,
30 const FrameReceiverConfig& audio_config, 30 const FrameReceiverConfig& audio_config,
31 const FrameReceiverConfig& video_config, 31 const FrameReceiverConfig& video_config,
32 PacketSender* const packet_sender) 32 CastTransportSender* const transport)
33 : cast_environment_(cast_environment), 33 : cast_environment_(cast_environment),
34 pacer_(kTargetBurstSize, 34 audio_receiver_(cast_environment, audio_config, AUDIO_EVENT, transport),
35 kMaxBurstSize, 35 video_receiver_(cast_environment, video_config, VIDEO_EVENT, transport),
36 cast_environment->Clock(),
37 cast_environment->Logging(),
38 packet_sender,
39 cast_environment->GetTaskRunner(CastEnvironment::MAIN)),
40 audio_receiver_(cast_environment, audio_config, AUDIO_EVENT, &pacer_),
41 video_receiver_(cast_environment, video_config, VIDEO_EVENT, &pacer_),
42 ssrc_of_audio_sender_(audio_config.incoming_ssrc), 36 ssrc_of_audio_sender_(audio_config.incoming_ssrc),
43 ssrc_of_video_sender_(video_config.incoming_ssrc), 37 ssrc_of_video_sender_(video_config.incoming_ssrc),
44 num_audio_channels_(audio_config.channels), 38 num_audio_channels_(audio_config.channels),
45 audio_sampling_rate_(audio_config.frequency), 39 audio_sampling_rate_(audio_config.frequency),
46 audio_codec_(audio_config.codec), 40 audio_codec_(audio_config.codec),
47 video_codec_(video_config.codec) {} 41 video_codec_(video_config.codec) {}
48 42
49 CastReceiverImpl::~CastReceiverImpl() {} 43 CastReceiverImpl::~CastReceiverImpl() {}
50 44
51 void CastReceiverImpl::DispatchReceivedPacket(scoped_ptr<Packet> packet) { 45 void CastReceiverImpl::ReceivePacket(scoped_ptr<Packet> packet) {
52 const uint8_t* const data = &packet->front(); 46 const uint8_t* const data = &packet->front();
53 const size_t length = packet->size(); 47 const size_t length = packet->size();
54 48
55 uint32 ssrc_of_sender; 49 uint32 ssrc_of_sender;
56 if (Rtcp::IsRtcpPacket(data, length)) { 50 if (Rtcp::IsRtcpPacket(data, length)) {
57 ssrc_of_sender = Rtcp::GetSsrcOfSender(data, length); 51 ssrc_of_sender = Rtcp::GetSsrcOfSender(data, length);
58 } else if (!FrameReceiver::ParseSenderSsrc(data, length, &ssrc_of_sender)) { 52 } else if (!RtpParser::ParseSsrc(data, length, &ssrc_of_sender)) {
59 VLOG(1) << "Invalid RTP packet."; 53 VLOG(1) << "Invalid RTP packet.";
60 return; 54 return;
61 } 55 }
62 56
63 base::WeakPtr<FrameReceiver> target; 57 base::WeakPtr<FrameReceiver> target;
64 if (ssrc_of_sender == ssrc_of_video_sender_) { 58 if (ssrc_of_sender == ssrc_of_video_sender_) {
65 target = video_receiver_.AsWeakPtr(); 59 target = video_receiver_.AsWeakPtr();
66 } else if (ssrc_of_sender == ssrc_of_audio_sender_) { 60 } else if (ssrc_of_sender == ssrc_of_audio_sender_) {
67 target = audio_receiver_.AsWeakPtr(); 61 target = audio_receiver_.AsWeakPtr();
68 } else { 62 } else {
69 VLOG(1) << "Dropping packet with a non matching sender SSRC: " 63 VLOG(1) << "Dropping packet with a non matching sender SSRC: "
70 << ssrc_of_sender; 64 << ssrc_of_sender;
71 return; 65 return;
72 } 66 }
73 cast_environment_->PostTask( 67 cast_environment_->PostTask(
74 CastEnvironment::MAIN, 68 CastEnvironment::MAIN,
75 FROM_HERE, 69 FROM_HERE,
76 base::Bind(base::IgnoreResult(&FrameReceiver::ProcessPacket), 70 base::Bind(base::IgnoreResult(&FrameReceiver::ProcessPacket),
77 target, 71 target,
78 base::Passed(&packet))); 72 base::Passed(&packet)));
79 } 73 }
80 74
81 PacketReceiverCallback CastReceiverImpl::packet_receiver() {
82 return base::Bind(&CastReceiverImpl::DispatchReceivedPacket,
83 // TODO(miu): This code structure is dangerous, since the
84 // callback could be stored and then invoked after
85 // destruction of |this|.
86 base::Unretained(this));
87 }
88
89 void CastReceiverImpl::RequestDecodedAudioFrame( 75 void CastReceiverImpl::RequestDecodedAudioFrame(
90 const AudioFrameDecodedCallback& callback) { 76 const AudioFrameDecodedCallback& callback) {
91 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); 77 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
92 DCHECK(!callback.is_null()); 78 DCHECK(!callback.is_null());
93 audio_receiver_.RequestEncodedFrame(base::Bind( 79 audio_receiver_.RequestEncodedFrame(base::Bind(
94 &CastReceiverImpl::DecodeEncodedAudioFrame, 80 &CastReceiverImpl::DecodeEncodedAudioFrame,
95 // Note: Use of Unretained is safe since this Closure is guaranteed to be 81 // Note: Use of Unretained is safe since this Closure is guaranteed to be
96 // invoked or discarded by |audio_receiver_| before destruction of |this|. 82 // invoked or discarded by |audio_receiver_| before destruction of |this|.
97 base::Unretained(this), 83 base::Unretained(this),
98 callback)); 84 callback));
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 TRACE_EVENT_INSTANT1( 211 TRACE_EVENT_INSTANT1(
226 "cast_perf_test", "FrameDecoded", 212 "cast_perf_test", "FrameDecoded",
227 TRACE_EVENT_SCOPE_THREAD, 213 TRACE_EVENT_SCOPE_THREAD,
228 "rtp_timestamp", rtp_timestamp); 214 "rtp_timestamp", rtp_timestamp);
229 } 215 }
230 callback.Run(video_frame, playout_time, is_continuous); 216 callback.Run(video_frame, playout_time, is_continuous);
231 } 217 }
232 218
233 } // namespace cast 219 } // namespace cast
234 } // namespace media 220 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698