OLD | NEW |
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/frame_receiver.h" | 5 #include "media/cast/receiver/frame_receiver.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/big_endian.h" | 10 #include "base/big_endian.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 cast_environment_->logger()->Unsubscribe(&event_subscriber_); | 74 cast_environment_->logger()->Unsubscribe(&event_subscriber_); |
75 } | 75 } |
76 | 76 |
77 void FrameReceiver::RequestEncodedFrame( | 77 void FrameReceiver::RequestEncodedFrame( |
78 const ReceiveEncodedFrameCallback& callback) { | 78 const ReceiveEncodedFrameCallback& callback) { |
79 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 79 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
80 frame_request_queue_.push_back(callback); | 80 frame_request_queue_.push_back(callback); |
81 EmitAvailableEncodedFrames(); | 81 EmitAvailableEncodedFrames(); |
82 } | 82 } |
83 | 83 |
84 bool FrameReceiver::ProcessPacket(scoped_ptr<Packet> packet) { | 84 bool FrameReceiver::ProcessPacket(std::unique_ptr<Packet> packet) { |
85 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 85 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
86 | 86 |
87 if (IsRtcpPacket(&packet->front(), packet->size())) { | 87 if (IsRtcpPacket(&packet->front(), packet->size())) { |
88 rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); | 88 rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); |
89 } else { | 89 } else { |
90 RtpCastHeader rtp_header; | 90 RtpCastHeader rtp_header; |
91 const uint8_t* payload_data; | 91 const uint8_t* payload_data; |
92 size_t payload_size; | 92 size_t payload_size; |
93 if (!packet_parser_.ParsePacket(&packet->front(), | 93 if (!packet_parser_.ParsePacket(&packet->front(), |
94 packet->size(), | 94 packet->size(), |
(...skipping 19 matching lines...) Expand all Loading... |
114 void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header, | 114 void FrameReceiver::ProcessParsedPacket(const RtpCastHeader& rtp_header, |
115 const uint8_t* payload_data, | 115 const uint8_t* payload_data, |
116 size_t payload_size) { | 116 size_t payload_size) { |
117 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 117 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
118 | 118 |
119 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 119 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
120 | 120 |
121 frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = | 121 frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = |
122 rtp_header.rtp_timestamp; | 122 rtp_header.rtp_timestamp; |
123 | 123 |
124 scoped_ptr<PacketEvent> receive_event(new PacketEvent()); | 124 std::unique_ptr<PacketEvent> receive_event(new PacketEvent()); |
125 receive_event->timestamp = now; | 125 receive_event->timestamp = now; |
126 receive_event->type = PACKET_RECEIVED; | 126 receive_event->type = PACKET_RECEIVED; |
127 receive_event->media_type = event_media_type_; | 127 receive_event->media_type = event_media_type_; |
128 receive_event->rtp_timestamp = rtp_header.rtp_timestamp; | 128 receive_event->rtp_timestamp = rtp_header.rtp_timestamp; |
129 receive_event->frame_id = rtp_header.frame_id; | 129 receive_event->frame_id = rtp_header.frame_id; |
130 receive_event->packet_id = rtp_header.packet_id; | 130 receive_event->packet_id = rtp_header.packet_id; |
131 receive_event->max_packet_id = rtp_header.max_packet_id; | 131 receive_event->max_packet_id = rtp_header.max_packet_id; |
132 receive_event->size = base::checked_cast<uint32_t>(payload_size); | 132 receive_event->size = base::checked_cast<uint32_t>(payload_size); |
133 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); | 133 cast_environment_->logger()->DispatchPacketEvent(std::move(receive_event)); |
134 | 134 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 EmitAvailableEncodedFrames(); | 177 EmitAvailableEncodedFrames(); |
178 } | 178 } |
179 | 179 |
180 void FrameReceiver::CastFeedback(const RtcpCastMessage& cast_message) { | 180 void FrameReceiver::CastFeedback(const RtcpCastMessage& cast_message) { |
181 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 181 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
182 | 182 |
183 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 183 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
184 RtpTimeTicks rtp_timestamp = | 184 RtpTimeTicks rtp_timestamp = |
185 frame_id_to_rtp_timestamp_[cast_message.ack_frame_id & 0xff]; | 185 frame_id_to_rtp_timestamp_[cast_message.ack_frame_id & 0xff]; |
186 | 186 |
187 scoped_ptr<FrameEvent> ack_sent_event(new FrameEvent()); | 187 std::unique_ptr<FrameEvent> ack_sent_event(new FrameEvent()); |
188 ack_sent_event->timestamp = now; | 188 ack_sent_event->timestamp = now; |
189 ack_sent_event->type = FRAME_ACK_SENT; | 189 ack_sent_event->type = FRAME_ACK_SENT; |
190 ack_sent_event->media_type = event_media_type_; | 190 ack_sent_event->media_type = event_media_type_; |
191 ack_sent_event->rtp_timestamp = rtp_timestamp; | 191 ack_sent_event->rtp_timestamp = rtp_timestamp; |
192 ack_sent_event->frame_id = cast_message.ack_frame_id; | 192 ack_sent_event->frame_id = cast_message.ack_frame_id; |
193 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event)); | 193 cast_environment_->logger()->DispatchFrameEvent(std::move(ack_sent_event)); |
194 | 194 |
195 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; | 195 ReceiverRtcpEventSubscriber::RtcpEvents rtcp_events; |
196 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events); | 196 event_subscriber_.GetRtcpEventsWithRedundancy(&rtcp_events); |
197 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), | 197 SendRtcpReport(rtcp_.local_ssrc(), rtcp_.remote_ssrc(), |
198 CreateRtcpTimeData(now), &cast_message, nullptr, | 198 CreateRtcpTimeData(now), &cast_message, nullptr, |
199 target_playout_delay_, &rtcp_events, nullptr); | 199 target_playout_delay_, &rtcp_events, nullptr); |
200 } | 200 } |
201 | 201 |
202 void FrameReceiver::EmitAvailableEncodedFrames() { | 202 void FrameReceiver::EmitAvailableEncodedFrames() { |
203 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 203 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
204 | 204 |
205 while (!frame_request_queue_.empty()) { | 205 while (!frame_request_queue_.empty()) { |
206 // Attempt to peek at the next completed frame from the |framer_|. | 206 // Attempt to peek at the next completed frame from the |framer_|. |
207 // TODO(miu): We should only be peeking at the metadata, and not copying the | 207 // TODO(miu): We should only be peeking at the metadata, and not copying the |
208 // payload yet! Or, at least, peek using a StringPiece instead of a copy. | 208 // payload yet! Or, at least, peek using a StringPiece instead of a copy. |
209 scoped_ptr<EncodedFrame> encoded_frame( | 209 std::unique_ptr<EncodedFrame> encoded_frame(new EncodedFrame()); |
210 new EncodedFrame()); | |
211 bool is_consecutively_next_frame = false; | 210 bool is_consecutively_next_frame = false; |
212 bool have_multiple_complete_frames = false; | 211 bool have_multiple_complete_frames = false; |
213 if (!framer_.GetEncodedFrame(encoded_frame.get(), | 212 if (!framer_.GetEncodedFrame(encoded_frame.get(), |
214 &is_consecutively_next_frame, | 213 &is_consecutively_next_frame, |
215 &have_multiple_complete_frames)) { | 214 &have_multiple_complete_frames)) { |
216 VLOG(1) << "Wait for more packets to produce a completed frame."; | 215 VLOG(1) << "Wait for more packets to produce a completed frame."; |
217 return; // ProcessParsedPacket() will invoke this method in the future. | 216 return; // ProcessParsedPacket() will invoke this method in the future. |
218 } | 217 } |
219 | 218 |
220 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 219 const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 } | 285 } |
287 } | 286 } |
288 | 287 |
289 void FrameReceiver::EmitAvailableEncodedFramesAfterWaiting() { | 288 void FrameReceiver::EmitAvailableEncodedFramesAfterWaiting() { |
290 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 289 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
291 DCHECK(is_waiting_for_consecutive_frame_); | 290 DCHECK(is_waiting_for_consecutive_frame_); |
292 is_waiting_for_consecutive_frame_ = false; | 291 is_waiting_for_consecutive_frame_ = false; |
293 EmitAvailableEncodedFrames(); | 292 EmitAvailableEncodedFrames(); |
294 } | 293 } |
295 | 294 |
296 void FrameReceiver::EmitOneFrame(const ReceiveEncodedFrameCallback& callback, | 295 void FrameReceiver::EmitOneFrame( |
297 scoped_ptr<EncodedFrame> encoded_frame) const { | 296 const ReceiveEncodedFrameCallback& callback, |
| 297 std::unique_ptr<EncodedFrame> encoded_frame) const { |
298 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); | 298 DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
299 if (!callback.is_null()) | 299 if (!callback.is_null()) |
300 callback.Run(std::move(encoded_frame)); | 300 callback.Run(std::move(encoded_frame)); |
301 } | 301 } |
302 | 302 |
303 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { | 303 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const { |
304 base::TimeDelta target_playout_delay = target_playout_delay_; | 304 base::TimeDelta target_playout_delay = target_playout_delay_; |
305 if (frame.new_playout_delay_ms) { | 305 if (frame.new_playout_delay_ms) { |
306 target_playout_delay = base::TimeDelta::FromMilliseconds( | 306 target_playout_delay = base::TimeDelta::FromMilliseconds( |
307 frame.new_playout_delay_ms); | 307 frame.new_playout_delay_ms); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 transport_->AddCastFeedback(*cast_message, target_delay); | 394 transport_->AddCastFeedback(*cast_message, target_delay); |
395 if (pli_message) | 395 if (pli_message) |
396 transport_->AddPli(*pli_message); | 396 transport_->AddPli(*pli_message); |
397 if (rtcp_events) | 397 if (rtcp_events) |
398 transport_->AddRtcpEvents(*rtcp_events); | 398 transport_->AddRtcpEvents(*rtcp_events); |
399 transport_->SendRtcpFromRtpReceiver(); | 399 transport_->SendRtcpFromRtpReceiver(); |
400 } | 400 } |
401 | 401 |
402 } // namespace cast | 402 } // namespace cast |
403 } // namespace media | 403 } // namespace media |
OLD | NEW |